diff options
Diffstat (limited to 'storage')
97 files changed, 4630 insertions, 3308 deletions
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 04926228aa4..03364ccd01e 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2015 +/* Copyright (C) Olivier Bertrand 2004 - 2016 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -169,7 +169,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.04.0005 December 11, 2015"; + char version[]= "Version 1.04.0005 January 24, 2016"; #if defined(__WIN__) char compver[]= "Version 1.04.0005 " __DATE__ " " __TIME__; char slash= '\\'; @@ -340,14 +340,21 @@ static MYSQL_THDVAR_ENUM( #endif // XMSG || NEWMSG /***********************************************************************/ +/* The CONNECT handlerton object. */ +/***********************************************************************/ +handlerton *connect_hton= NULL; + +/***********************************************************************/ /* Function to export session variable values to other source files. */ /***********************************************************************/ -extern "C" int GetTraceValue(void) {return THDVAR(current_thd, xtrace);} +extern "C" int GetTraceValue(void) + {return connect_hton ? THDVAR(current_thd, xtrace) : 0;} bool ExactInfo(void) {return THDVAR(current_thd, exact_info);} USETEMP UseTemp(void) {return (USETEMP)THDVAR(current_thd, use_tempfile);} int GetConvSize(void) {return THDVAR(current_thd, conv_size);} TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} -uint GetJsonGrpSize(void) {return THDVAR(current_thd, json_grp_size);} +uint GetJsonGrpSize(void) + {return connect_hton ? THDVAR(current_thd, json_grp_size) : 10;} uint GetWorkSize(void) {return THDVAR(current_thd, work_size);} void SetWorkSize(uint) { @@ -442,11 +449,6 @@ static int check_msg_path (MYSQL_THD thd, struct st_mysql_sys_var *var, } // end of check_msg_path #endif // 0 -/***********************************************************************/ -/* The CONNECT handlerton object. */ -/***********************************************************************/ -handlerton *connect_hton; - /** CREATE TABLE option list (table options) @@ -687,6 +689,7 @@ static int connect_done_func(void *) delete pc; } // endfor pc + connect_hton= NULL; DBUG_RETURN(error); } // end of connect_done_func @@ -4922,11 +4925,11 @@ static bool add_field(String *sql, const char *field_name, int typ, int len, error|= sql->append("` "); error|= sql->append(type); - if (len && typ != TYPE_DATE) { + if (len && typ != TYPE_DATE && (typ != TYPE_DOUBLE || dec >= 0)) { error|= sql->append('('); error|= sql->append_ulonglong(len); - if (!strcmp(type, "DOUBLE")) { + if (typ == TYPE_DOUBLE) { error|= sql->append(','); // dec must be < len and < 31 error|= sql->append_ulonglong(MY_MIN(dec, (MY_MIN(len, 31) - 1))); @@ -5512,6 +5515,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, dec= crp->Prec; flg= crp->Flag; v= crp->Var; + tm= (crp->Kdata->IsNullable()) ? 0 : NOT_NULL_FLAG; if (!len && typ == TYPE_STRING) len= 256; // STRBLK's have 0 length @@ -5519,9 +5523,9 @@ static int connect_assisted_discovery(handlerton *, THD* thd, // Now add the field #if defined(NEW_WAY) rc= add_fields(g, thd, &alter_info, cnm, typ, len, dec, - NOT_NULL_FLAG, "", flg, dbf, v); + tm, "", flg, dbf, v); #else // !NEW_WAY - if (add_field(&sql, cnm, typ, len, dec, NULL, NOT_NULL_FLAG, + if (add_field(&sql, cnm, typ, len, dec, NULL, tm, NULL, NULL, NULL, NULL, flg, dbf, v)) rc= HA_ERR_OUT_OF_MEM; #endif // !NEW_WAY @@ -5578,7 +5582,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, len= crp->Kdata->GetIntValue(i); break; case FLD_SCALE: - dec= crp->Kdata->GetIntValue(i); + dec = (!crp->Kdata->IsNull(i)) ? crp->Kdata->GetIntValue(i) : -1; break; case FLD_NULL: if (crp->Kdata->GetIntValue(i)) @@ -5671,14 +5675,14 @@ static int connect_assisted_discovery(handlerton *, THD* thd, dec= 0; } // endswitch typ - } // endif ttp + } else #endif // ODBC_SUPPORT - // Make the arguments as required by add_fields - if (typ == TYPE_DATE) + if (typ == TYPE_DOUBLE) + prec= len; + + if (typ == TYPE_DATE) prec= 0; - else if (typ == TYPE_DOUBLE) - prec= len; // Now add the field #if defined(NEW_WAY) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 215562af46e..25c77cea534 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -31,6 +31,8 @@ uint GetJsonGrpSize(void); static int IsJson(UDF_ARGS *args, uint i); static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i); +static uint JsonGrpSize = 10; + /* ----------------------------------- JSNX ------------------------------------ */ /*********************************************************************************/ @@ -1040,6 +1042,14 @@ static void SetChanged(PBSON bsp) } /* end of SetChanged */ /*********************************************************************************/ +/* Replaces GetJsonGrpSize not usable when CONNECT is not installed. */ +/*********************************************************************************/ +static uint GetJsonGroupSize(void) +{ + return (JsonGrpSize) ? JsonGrpSize : GetJsonGrpSize(); +} // end of GetJsonGroupSize + +/*********************************************************************************/ /* Program for SubSet re-initialization of the memory pool. */ /*********************************************************************************/ static my_bool JsonSubSet(PGLOBAL g) @@ -2394,11 +2404,50 @@ void json_object_list_deinit(UDF_INIT* initid) } // end of json_object_list_deinit /*********************************************************************************/ +/* Set the value of JsonGrpSize. */ +/*********************************************************************************/ +my_bool jsonset_grp_size_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + if (args->arg_count != 1 || args->arg_type[0] != INT_RESULT) { + strcpy(message, "This function must have 1 integer argument"); + return true; + } else + return false; + +} // end of jsonset_grp_size_init + +long long jsonset_grp_size(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +{ + long long n = *(long long*)args->args[0]; + + JsonGrpSize = (uint)n; + return (long long)GetJsonGroupSize(); +} // end of jsonset_grp_size + +/*********************************************************************************/ +/* Get the value of JsonGrpSize. */ +/*********************************************************************************/ +my_bool jsonget_grp_size_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + if (args->arg_count != 0) { + strcpy(message, "This function must have no arguments"); + return true; + } else + return false; + +} // end of jsonget_grp_size_init + +long long jsonget_grp_size(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +{ + return (long long)GetJsonGroupSize(); +} // end of jsonget_grp_size + +/*********************************************************************************/ /* Make a Json array from values coming from rows. */ /*********************************************************************************/ my_bool json_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen, n = GetJsonGrpSize(); + unsigned long reslen, memlen, n = GetJsonGroupSize(); if (args->arg_count != 1) { strcpy(message, "This function can only accept 1 argument"); @@ -2458,7 +2507,7 @@ void json_array_grp_clear(UDF_INIT *initid, char*, char*) PlugSubSet(g, g->Sarea, g->Sarea_Size); g->Activityp = (PACTIVITY)new(g) JARRAY; - g->N = GetJsonGrpSize(); + g->N = GetJsonGroupSize(); } // end of json_array_grp_clear void json_array_grp_deinit(UDF_INIT* initid) @@ -2471,7 +2520,7 @@ void json_array_grp_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool json_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen, n = GetJsonGrpSize(); + unsigned long reslen, memlen, n = GetJsonGroupSize(); if (args->arg_count != 2) { strcpy(message, "This function requires 2 arguments (key, value)"); @@ -2529,7 +2578,7 @@ void json_object_grp_clear(UDF_INIT *initid, char*, char*) PlugSubSet(g, g->Sarea, g->Sarea_Size); g->Activityp = (PACTIVITY)new(g) JOBJECT; - g->N = GetJsonGrpSize(); + g->N = GetJsonGroupSize(); } // end of json_object_grp_clear void json_object_grp_deinit(UDF_INIT* initid) diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index ecbbb778214..b7e9b8ecabb 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -77,6 +77,12 @@ extern "C" { DllExport char *json_object_list(UDF_EXEC_ARGS); DllExport void json_object_list_deinit(UDF_INIT*); + DllExport my_bool jsonset_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport long long jsonset_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); + + DllExport my_bool jsonget_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport long long jsonget_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport my_bool json_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); DllExport void json_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); DllExport char *json_array_grp(UDF_EXEC_ARGS); diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index 5089022c5ea..1e83834cb8f 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -217,7 +217,9 @@ DEPARTMENT Json_Array_Grp(NAME) 2452 ["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"] Warnings: Warning 1105 Result truncated to json_grp_size values -SET connect_json_grp_size=30; +SELECT JsonSet_Grp_Size(30); +JsonSet_Grp_Size(30) +30 SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title; Json_Object(title, Json_Array_Grp(name) `json_names`) {"title":"ADMINISTRATOR","names":["GOOSEPEN","FUNNIGUY","SHRINKY"]} diff --git a/storage/connect/mysql-test/connect/r/odbc.result b/storage/connect/mysql-test/connect/r/odbc.result index 8e1951f0b68..4ca7e2095df 100644 --- a/storage/connect/mysql-test/connect/r/odbc.result +++ b/storage/connect/mysql-test/connect/r/odbc.result @@ -5,7 +5,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `Name` varchar(256) NOT NULL, - `Description` varchar(256) NOT NULL + `Description` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources' DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Drivers; @@ -13,35 +13,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `Description` char(128) NOT NULL, - `Attributes` varchar(256) NOT NULL + `Attributes` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Drivers' DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Tables CONNECTION='Not important'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `Table_Cat` char(128) NOT NULL, - `Table_Schema` char(128) NOT NULL, + `Table_Cat` char(128) DEFAULT NULL, + `Table_Schema` char(128) DEFAULT NULL, `Table_Name` char(128) NOT NULL, `Table_Type` char(16) NOT NULL, - `Remark` char(255) NOT NULL + `Remark` char(255) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='Not important' `TABLE_TYPE`='ODBC' `CATFUNC`='Tables' DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Columns CONNECTION='Not important'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `Table_Cat` char(128) NOT NULL, - `Table_Schema` char(128) NOT NULL, + `Table_Cat` char(128) DEFAULT NULL, + `Table_Schema` char(128) DEFAULT NULL, `Table_Name` char(128) NOT NULL, `Column_Name` char(128) NOT NULL, `Data_Type` smallint(6) NOT NULL, `Type_Name` char(30) NOT NULL, `Column_Size` int(10) NOT NULL, `Buffer_Length` int(10) NOT NULL, - `Decimal_Digits` smallint(6) NOT NULL, - `Radix` smallint(6) NOT NULL, + `Decimal_Digits` smallint(6) DEFAULT NULL, + `Radix` smallint(6) DEFAULT NULL, `Nullable` smallint(6) NOT NULL, - `Remarks` char(255) NOT NULL + `Remarks` char(255) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='Not important' `TABLE_TYPE`='ODBC' `CATFUNC`='Columns' DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/r/odbc_oracle.result b/storage/connect/mysql-test/connect/r/odbc_oracle.result index 96d8e53b8e5..8dc7dc07bb1 100644 --- a/storage/connect/mysql-test/connect/r/odbc_oracle.result +++ b/storage/connect/mysql-test/connect/r/odbc_oracle.result @@ -1,7 +1,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `Name` varchar(256) NOT NULL, - `Description` varchar(256) NOT NULL + `Description` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources' SET NAMES utf8; # @@ -14,9 +14,9 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Tables; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark - MTR T1 TABLE - MTR T2 TABLE - MTR V1 VIEW +NULL MTR T1 TABLE NULL +NULL MTR T2 TABLE NULL +NULL MTR V1 VIEW NULL DROP TABLE t1; # All tables in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -24,9 +24,9 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark - MTR T1 TABLE - MTR T2 TABLE - MTR V1 VIEW +NULL MTR T1 TABLE NULL +NULL MTR T2 TABLE NULL +NULL MTR V1 VIEW NULL DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -34,7 +34,7 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark - MTR T1 TABLE +NULL MTR T1 TABLE NULL DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -42,7 +42,7 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark - MTR T1 TABLE +NULL MTR T1 TABLE NULL DROP TABLE t1; # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT @@ -50,7 +50,7 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark - MTR T1 TABLE +NULL MTR T1 TABLE NULL DROP TABLE t1; # All tables in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT @@ -58,9 +58,9 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='MTR.%'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark - MTR T1 TABLE - MTR T2 TABLE - MTR V1 VIEW +NULL MTR T1 TABLE NULL +NULL MTR T2 TABLE NULL +NULL MTR V1 VIEW NULL DROP TABLE t1; # # Checking CATFUNC=Columns @@ -73,10 +73,10 @@ CATFUNC=Columns; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 0 0 1 - MTR T2 A 12 VARCHAR2 64 64 0 0 1 + MTR T1 B 6 NUMBER 38 40 NULL NULL 1 + MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 MTR V1 A 3 DECIMAL 38 40 0 10 1 - MTR V1 B 6 NUMBER 38 40 0 0 1 + MTR V1 B 6 NUMBER 38 40 NULL NULL 1 DROP TABLE t1; # All columns in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -85,17 +85,17 @@ CATFUNC=Columns TABNAME='%.%'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 0 0 1 - MTR T2 A 12 VARCHAR2 64 64 0 0 1 + MTR T1 B 6 NUMBER 38 40 NULL NULL 1 + MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 MTR V1 A 3 DECIMAL 38 40 0 10 1 - MTR V1 B 6 NUMBER 38 40 0 0 1 + MTR V1 B 6 NUMBER 38 40 NULL NULL 1 DROP TABLE t1; # All tables "T1" in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 0 0 1 + MTR T1 B 6 NUMBER 38 40 NULL NULL 1 DROP TABLE t1; # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT @@ -104,7 +104,7 @@ CATFUNC=Columns TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 0 0 1 + MTR T1 B 6 NUMBER 38 40 NULL NULL 1 DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -113,7 +113,7 @@ CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 0 0 1 + MTR T1 B 6 NUMBER 38 40 NULL NULL 1 DROP TABLE t1; # # Checking tables @@ -127,32 +127,32 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` decimal(40,0) DEFAULT NULL, - `B` double(40,0) DEFAULT NULL + `B` double DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='T1' SELECT * FROM t1 ORDER BY A; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 CREATE TABLE t2 AS SELECT * FROM t1; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( `A` decimal(40,0) DEFAULT NULL, - `B` double(40,0) DEFAULT NULL + `B` double DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 SELECT * FROM t2; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 DROP TABLE t2; CREATE VIEW v1 AS SELECT * FROM t1; SELECT * FROM v1; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 DROP VIEW v1; DROP TABLE t1; # Table "T1" in the schema "MTR" @@ -163,13 +163,13 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` decimal(40,0) DEFAULT NULL, - `B` double(40,0) DEFAULT NULL + `B` double DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T1' SELECT * FROM t1; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 DROP TABLE t1; # View "V1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT @@ -179,32 +179,32 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` decimal(40,0) DEFAULT NULL, - `B` double(40,0) DEFAULT NULL + `B` double DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.V1' SELECT * FROM t1; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 CREATE TABLE t2 AS SELECT * FROM t1; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( `A` decimal(40,0) DEFAULT NULL, - `B` double(40,0) DEFAULT NULL + `B` double DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 SELECT * FROM t2; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 DROP TABLE t2; CREATE VIEW v1 AS SELECT * FROM t1; SELECT * FROM v1; A B 10 1000000000 20 1000000000000 -30 1000000000000000 +30 1e15 DROP VIEW v1; DROP TABLE t1; # Table "T2" in the schema "MTR" diff --git a/storage/connect/mysql-test/connect/r/odbc_postgresql.result b/storage/connect/mysql-test/connect/r/odbc_postgresql.result index 68ce03cb382..3426d23e29c 100644 --- a/storage/connect/mysql-test/connect/r/odbc_postgresql.result +++ b/storage/connect/mysql-test/connect/r/odbc_postgresql.result @@ -1,7 +1,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `Name` varchar(256) NOT NULL, - `Description` varchar(256) NOT NULL + `Description` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources' SET NAMES utf8; # @@ -99,9 +99,9 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu mtr public t1 a 4 int4 10 4 0 10 0 mtr public t2 a 4 int4 10 4 0 10 0 mtr public v1 a 4 int4 10 4 0 10 1 -mtr schema1 t1 a 1 bpchar 10 60 0 0 0 -mtr schema1 t2 a 1 bpchar 10 60 0 0 0 -mtr schema1 v1 a 1 bpchar 10 60 0 0 1 +mtr schema1 t1 a 1 bpchar 10 60 NULL NULL 0 +mtr schema1 t2 a 1 bpchar 10 60 NULL NULL 0 +mtr schema1 v1 a 1 bpchar 10 60 NULL NULL 1 DROP TABLE t1; # All columns in the schemas "public" and "schema1" CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%.%'; @@ -110,16 +110,16 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu mtr public t1 a 4 int4 10 4 0 10 0 mtr public t2 a 4 int4 10 4 0 10 0 mtr public v1 a 4 int4 10 4 0 10 1 -mtr schema1 t1 a 1 bpchar 10 60 0 0 0 -mtr schema1 t2 a 1 bpchar 10 60 0 0 0 -mtr schema1 v1 a 1 bpchar 10 60 0 0 1 +mtr schema1 t1 a 1 bpchar 10 60 NULL NULL 0 +mtr schema1 t2 a 1 bpchar 10 60 NULL NULL 0 +mtr schema1 v1 a 1 bpchar 10 60 NULL NULL 1 DROP TABLE t1; # All tables "t1" in all schemas CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%.t1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks mtr public t1 a 4 int4 10 4 0 10 0 -mtr schema1 t1 a 1 bpchar 10 60 0 0 0 +mtr schema1 t1 a 1 bpchar 10 60 NULL NULL 0 DROP TABLE t1; # Table "t1" in the schema "public" CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.public.t1'; @@ -131,14 +131,14 @@ DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.schema1.t1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks -mtr schema1 t1 a 1 bpchar 10 60 0 0 0 +mtr schema1 t1 a 1 bpchar 10 60 NULL NULL 0 DROP TABLE t1; # All tables "t1" in all schemas (Catalog name is ignored by PostgreSQL) CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='xxx.%.t1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks mtr public t1 a 4 int4 10 4 0 10 0 -mtr schema1 t1 a 1 bpchar 10 60 0 0 0 +mtr schema1 t1 a 1 bpchar 10 60 NULL NULL 0 DROP TABLE t1; # # Checking tables diff --git a/storage/connect/mysql-test/connect/r/odbc_sqlite3.result b/storage/connect/mysql-test/connect/r/odbc_sqlite3.result index 24de417792d..bce69227073 100644 --- a/storage/connect/mysql-test/connect/r/odbc_sqlite3.result +++ b/storage/connect/mysql-test/connect/r/odbc_sqlite3.result @@ -1,7 +1,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `Description` char(128) NOT NULL, - `Attributes` varchar(256) NOT NULL + `Attributes` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Drivers' SET NAMES utf8; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8;; @@ -44,2420 +44,2420 @@ DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - t1 a 12 varchar(64) 64 64 10 0 1 + t1 a 12 varchar(64) 64 64 10 0 1 NULL DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Table_Type Remark - t1 TABLE +NULL NULL t1 TABLE NULL DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; SELECT * FROM t1 ORDER BY Table_name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - t000 a 4 INT 9 10 10 0 1 - t000 b 4 INT 9 10 10 0 1 - t000 c 4 INT 9 10 10 0 1 - t000 d 4 INT 9 10 10 0 1 - t000 e 4 INT 9 10 10 0 1 - t001 a 4 INT 9 10 10 0 1 - t001 b 4 INT 9 10 10 0 1 - t001 c 4 INT 9 10 10 0 1 - t001 d 4 INT 9 10 10 0 1 - t001 e 4 INT 9 10 10 0 1 - t002 a 4 INT 9 10 10 0 1 - t002 b 4 INT 9 10 10 0 1 - t002 c 4 INT 9 10 10 0 1 - t002 d 4 INT 9 10 10 0 1 - t002 e 4 INT 9 10 10 0 1 - t003 a 4 INT 9 10 10 0 1 - t003 b 4 INT 9 10 10 0 1 - t003 c 4 INT 9 10 10 0 1 - t003 d 4 INT 9 10 10 0 1 - t003 e 4 INT 9 10 10 0 1 - t004 a 4 INT 9 10 10 0 1 - t004 b 4 INT 9 10 10 0 1 - t004 c 4 INT 9 10 10 0 1 - t004 d 4 INT 9 10 10 0 1 - t004 e 4 INT 9 10 10 0 1 - t005 a 4 INT 9 10 10 0 1 - t005 b 4 INT 9 10 10 0 1 - t005 c 4 INT 9 10 10 0 1 - t005 d 4 INT 9 10 10 0 1 - t005 e 4 INT 9 10 10 0 1 - t006 a 4 INT 9 10 10 0 1 - t006 b 4 INT 9 10 10 0 1 - t006 c 4 INT 9 10 10 0 1 - t006 d 4 INT 9 10 10 0 1 - t006 e 4 INT 9 10 10 0 1 - t007 a 4 INT 9 10 10 0 1 - t007 b 4 INT 9 10 10 0 1 - t007 c 4 INT 9 10 10 0 1 - t007 d 4 INT 9 10 10 0 1 - t007 e 4 INT 9 10 10 0 1 - t008 a 4 INT 9 10 10 0 1 - t008 b 4 INT 9 10 10 0 1 - t008 c 4 INT 9 10 10 0 1 - t008 d 4 INT 9 10 10 0 1 - t008 e 4 INT 9 10 10 0 1 - t009 a 4 INT 9 10 10 0 1 - t009 b 4 INT 9 10 10 0 1 - t009 c 4 INT 9 10 10 0 1 - t009 d 4 INT 9 10 10 0 1 - t009 e 4 INT 9 10 10 0 1 - t010 a 4 INT 9 10 10 0 1 - t010 b 4 INT 9 10 10 0 1 - t010 c 4 INT 9 10 10 0 1 - t010 d 4 INT 9 10 10 0 1 - t010 e 4 INT 9 10 10 0 1 - t011 a 4 INT 9 10 10 0 1 - t011 b 4 INT 9 10 10 0 1 - t011 c 4 INT 9 10 10 0 1 - t011 d 4 INT 9 10 10 0 1 - t011 e 4 INT 9 10 10 0 1 - t012 a 4 INT 9 10 10 0 1 - t012 b 4 INT 9 10 10 0 1 - t012 c 4 INT 9 10 10 0 1 - t012 d 4 INT 9 10 10 0 1 - t012 e 4 INT 9 10 10 0 1 - t013 a 4 INT 9 10 10 0 1 - t013 b 4 INT 9 10 10 0 1 - t013 c 4 INT 9 10 10 0 1 - t013 d 4 INT 9 10 10 0 1 - t013 e 4 INT 9 10 10 0 1 - t014 a 4 INT 9 10 10 0 1 - t014 b 4 INT 9 10 10 0 1 - t014 c 4 INT 9 10 10 0 1 - t014 d 4 INT 9 10 10 0 1 - t014 e 4 INT 9 10 10 0 1 - t015 a 4 INT 9 10 10 0 1 - t015 b 4 INT 9 10 10 0 1 - t015 c 4 INT 9 10 10 0 1 - t015 d 4 INT 9 10 10 0 1 - t015 e 4 INT 9 10 10 0 1 - t016 a 4 INT 9 10 10 0 1 - t016 b 4 INT 9 10 10 0 1 - t016 c 4 INT 9 10 10 0 1 - t016 d 4 INT 9 10 10 0 1 - t016 e 4 INT 9 10 10 0 1 - t017 a 4 INT 9 10 10 0 1 - t017 b 4 INT 9 10 10 0 1 - t017 c 4 INT 9 10 10 0 1 - t017 d 4 INT 9 10 10 0 1 - t017 e 4 INT 9 10 10 0 1 - t018 a 4 INT 9 10 10 0 1 - t018 b 4 INT 9 10 10 0 1 - t018 c 4 INT 9 10 10 0 1 - t018 d 4 INT 9 10 10 0 1 - t018 e 4 INT 9 10 10 0 1 - t019 a 4 INT 9 10 10 0 1 - t019 b 4 INT 9 10 10 0 1 - t019 c 4 INT 9 10 10 0 1 - t019 d 4 INT 9 10 10 0 1 - t019 e 4 INT 9 10 10 0 1 - t020 a 4 INT 9 10 10 0 1 - t020 b 4 INT 9 10 10 0 1 - t020 c 4 INT 9 10 10 0 1 - t020 d 4 INT 9 10 10 0 1 - t020 e 4 INT 9 10 10 0 1 - t021 a 4 INT 9 10 10 0 1 - t021 b 4 INT 9 10 10 0 1 - t021 c 4 INT 9 10 10 0 1 - t021 d 4 INT 9 10 10 0 1 - t021 e 4 INT 9 10 10 0 1 - t022 a 4 INT 9 10 10 0 1 - t022 b 4 INT 9 10 10 0 1 - t022 c 4 INT 9 10 10 0 1 - t022 d 4 INT 9 10 10 0 1 - t022 e 4 INT 9 10 10 0 1 - t023 a 4 INT 9 10 10 0 1 - t023 b 4 INT 9 10 10 0 1 - t023 c 4 INT 9 10 10 0 1 - t023 d 4 INT 9 10 10 0 1 - t023 e 4 INT 9 10 10 0 1 - t024 a 4 INT 9 10 10 0 1 - t024 b 4 INT 9 10 10 0 1 - t024 c 4 INT 9 10 10 0 1 - t024 d 4 INT 9 10 10 0 1 - t024 e 4 INT 9 10 10 0 1 - t025 a 4 INT 9 10 10 0 1 - t025 b 4 INT 9 10 10 0 1 - t025 c 4 INT 9 10 10 0 1 - t025 d 4 INT 9 10 10 0 1 - t025 e 4 INT 9 10 10 0 1 - t026 a 4 INT 9 10 10 0 1 - t026 b 4 INT 9 10 10 0 1 - t026 c 4 INT 9 10 10 0 1 - t026 d 4 INT 9 10 10 0 1 - t026 e 4 INT 9 10 10 0 1 - t027 a 4 INT 9 10 10 0 1 - t027 b 4 INT 9 10 10 0 1 - t027 c 4 INT 9 10 10 0 1 - t027 d 4 INT 9 10 10 0 1 - t027 e 4 INT 9 10 10 0 1 - t028 a 4 INT 9 10 10 0 1 - t028 b 4 INT 9 10 10 0 1 - t028 c 4 INT 9 10 10 0 1 - t028 d 4 INT 9 10 10 0 1 - t028 e 4 INT 9 10 10 0 1 - t029 a 4 INT 9 10 10 0 1 - t029 b 4 INT 9 10 10 0 1 - t029 c 4 INT 9 10 10 0 1 - t029 d 4 INT 9 10 10 0 1 - t029 e 4 INT 9 10 10 0 1 - t030 a 4 INT 9 10 10 0 1 - t030 b 4 INT 9 10 10 0 1 - t030 c 4 INT 9 10 10 0 1 - t030 d 4 INT 9 10 10 0 1 - t030 e 4 INT 9 10 10 0 1 - t031 a 4 INT 9 10 10 0 1 - t031 b 4 INT 9 10 10 0 1 - t031 c 4 INT 9 10 10 0 1 - t031 d 4 INT 9 10 10 0 1 - t031 e 4 INT 9 10 10 0 1 - t032 a 4 INT 9 10 10 0 1 - t032 b 4 INT 9 10 10 0 1 - t032 c 4 INT 9 10 10 0 1 - t032 d 4 INT 9 10 10 0 1 - t032 e 4 INT 9 10 10 0 1 - t033 a 4 INT 9 10 10 0 1 - t033 b 4 INT 9 10 10 0 1 - t033 c 4 INT 9 10 10 0 1 - t033 d 4 INT 9 10 10 0 1 - t033 e 4 INT 9 10 10 0 1 - t034 a 4 INT 9 10 10 0 1 - t034 b 4 INT 9 10 10 0 1 - t034 c 4 INT 9 10 10 0 1 - t034 d 4 INT 9 10 10 0 1 - t034 e 4 INT 9 10 10 0 1 - t035 a 4 INT 9 10 10 0 1 - t035 b 4 INT 9 10 10 0 1 - t035 c 4 INT 9 10 10 0 1 - t035 d 4 INT 9 10 10 0 1 - t035 e 4 INT 9 10 10 0 1 - t036 a 4 INT 9 10 10 0 1 - t036 b 4 INT 9 10 10 0 1 - t036 c 4 INT 9 10 10 0 1 - t036 d 4 INT 9 10 10 0 1 - t036 e 4 INT 9 10 10 0 1 - t037 a 4 INT 9 10 10 0 1 - t037 b 4 INT 9 10 10 0 1 - t037 c 4 INT 9 10 10 0 1 - t037 d 4 INT 9 10 10 0 1 - t037 e 4 INT 9 10 10 0 1 - t038 a 4 INT 9 10 10 0 1 - t038 b 4 INT 9 10 10 0 1 - t038 c 4 INT 9 10 10 0 1 - t038 d 4 INT 9 10 10 0 1 - t038 e 4 INT 9 10 10 0 1 - t039 a 4 INT 9 10 10 0 1 - t039 b 4 INT 9 10 10 0 1 - t039 c 4 INT 9 10 10 0 1 - t039 d 4 INT 9 10 10 0 1 - t039 e 4 INT 9 10 10 0 1 - t040 a 4 INT 9 10 10 0 1 - t040 b 4 INT 9 10 10 0 1 - t040 c 4 INT 9 10 10 0 1 - t040 d 4 INT 9 10 10 0 1 - t040 e 4 INT 9 10 10 0 1 - t041 a 4 INT 9 10 10 0 1 - t041 b 4 INT 9 10 10 0 1 - t041 c 4 INT 9 10 10 0 1 - t041 d 4 INT 9 10 10 0 1 - t041 e 4 INT 9 10 10 0 1 - t042 a 4 INT 9 10 10 0 1 - t042 b 4 INT 9 10 10 0 1 - t042 c 4 INT 9 10 10 0 1 - t042 d 4 INT 9 10 10 0 1 - t042 e 4 INT 9 10 10 0 1 - t043 a 4 INT 9 10 10 0 1 - t043 b 4 INT 9 10 10 0 1 - t043 c 4 INT 9 10 10 0 1 - t043 d 4 INT 9 10 10 0 1 - t043 e 4 INT 9 10 10 0 1 - t044 a 4 INT 9 10 10 0 1 - t044 b 4 INT 9 10 10 0 1 - t044 c 4 INT 9 10 10 0 1 - t044 d 4 INT 9 10 10 0 1 - t044 e 4 INT 9 10 10 0 1 - t045 a 4 INT 9 10 10 0 1 - t045 b 4 INT 9 10 10 0 1 - t045 c 4 INT 9 10 10 0 1 - t045 d 4 INT 9 10 10 0 1 - t045 e 4 INT 9 10 10 0 1 - t046 a 4 INT 9 10 10 0 1 - t046 b 4 INT 9 10 10 0 1 - t046 c 4 INT 9 10 10 0 1 - t046 d 4 INT 9 10 10 0 1 - t046 e 4 INT 9 10 10 0 1 - t047 a 4 INT 9 10 10 0 1 - t047 b 4 INT 9 10 10 0 1 - t047 c 4 INT 9 10 10 0 1 - t047 d 4 INT 9 10 10 0 1 - t047 e 4 INT 9 10 10 0 1 - t048 a 4 INT 9 10 10 0 1 - t048 b 4 INT 9 10 10 0 1 - t048 c 4 INT 9 10 10 0 1 - t048 d 4 INT 9 10 10 0 1 - t048 e 4 INT 9 10 10 0 1 - t049 a 4 INT 9 10 10 0 1 - t049 b 4 INT 9 10 10 0 1 - t049 c 4 INT 9 10 10 0 1 - t049 d 4 INT 9 10 10 0 1 - t049 e 4 INT 9 10 10 0 1 - t050 a 4 INT 9 10 10 0 1 - t050 b 4 INT 9 10 10 0 1 - t050 c 4 INT 9 10 10 0 1 - t050 d 4 INT 9 10 10 0 1 - t050 e 4 INT 9 10 10 0 1 - t051 a 4 INT 9 10 10 0 1 - t051 b 4 INT 9 10 10 0 1 - t051 c 4 INT 9 10 10 0 1 - t051 d 4 INT 9 10 10 0 1 - t051 e 4 INT 9 10 10 0 1 - t052 a 4 INT 9 10 10 0 1 - t052 b 4 INT 9 10 10 0 1 - t052 c 4 INT 9 10 10 0 1 - t052 d 4 INT 9 10 10 0 1 - t052 e 4 INT 9 10 10 0 1 - t053 a 4 INT 9 10 10 0 1 - t053 b 4 INT 9 10 10 0 1 - t053 c 4 INT 9 10 10 0 1 - t053 d 4 INT 9 10 10 0 1 - t053 e 4 INT 9 10 10 0 1 - t054 a 4 INT 9 10 10 0 1 - t054 b 4 INT 9 10 10 0 1 - t054 c 4 INT 9 10 10 0 1 - t054 d 4 INT 9 10 10 0 1 - t054 e 4 INT 9 10 10 0 1 - t055 a 4 INT 9 10 10 0 1 - t055 b 4 INT 9 10 10 0 1 - t055 c 4 INT 9 10 10 0 1 - t055 d 4 INT 9 10 10 0 1 - t055 e 4 INT 9 10 10 0 1 - t056 a 4 INT 9 10 10 0 1 - t056 b 4 INT 9 10 10 0 1 - t056 c 4 INT 9 10 10 0 1 - t056 d 4 INT 9 10 10 0 1 - t056 e 4 INT 9 10 10 0 1 - t057 a 4 INT 9 10 10 0 1 - t057 b 4 INT 9 10 10 0 1 - t057 c 4 INT 9 10 10 0 1 - t057 d 4 INT 9 10 10 0 1 - t057 e 4 INT 9 10 10 0 1 - t058 a 4 INT 9 10 10 0 1 - t058 b 4 INT 9 10 10 0 1 - t058 c 4 INT 9 10 10 0 1 - t058 d 4 INT 9 10 10 0 1 - t058 e 4 INT 9 10 10 0 1 - t059 a 4 INT 9 10 10 0 1 - t059 b 4 INT 9 10 10 0 1 - t059 c 4 INT 9 10 10 0 1 - t059 d 4 INT 9 10 10 0 1 - t059 e 4 INT 9 10 10 0 1 - t060 a 4 INT 9 10 10 0 1 - t060 b 4 INT 9 10 10 0 1 - t060 c 4 INT 9 10 10 0 1 - t060 d 4 INT 9 10 10 0 1 - t060 e 4 INT 9 10 10 0 1 - t061 a 4 INT 9 10 10 0 1 - t061 b 4 INT 9 10 10 0 1 - t061 c 4 INT 9 10 10 0 1 - t061 d 4 INT 9 10 10 0 1 - t061 e 4 INT 9 10 10 0 1 - t062 a 4 INT 9 10 10 0 1 - t062 b 4 INT 9 10 10 0 1 - t062 c 4 INT 9 10 10 0 1 - t062 d 4 INT 9 10 10 0 1 - t062 e 4 INT 9 10 10 0 1 - t063 a 4 INT 9 10 10 0 1 - t063 b 4 INT 9 10 10 0 1 - t063 c 4 INT 9 10 10 0 1 - t063 d 4 INT 9 10 10 0 1 - t063 e 4 INT 9 10 10 0 1 - t064 a 4 INT 9 10 10 0 1 - t064 b 4 INT 9 10 10 0 1 - t064 c 4 INT 9 10 10 0 1 - t064 d 4 INT 9 10 10 0 1 - t064 e 4 INT 9 10 10 0 1 - t065 a 4 INT 9 10 10 0 1 - t065 b 4 INT 9 10 10 0 1 - t065 c 4 INT 9 10 10 0 1 - t065 d 4 INT 9 10 10 0 1 - t065 e 4 INT 9 10 10 0 1 - t066 a 4 INT 9 10 10 0 1 - t066 b 4 INT 9 10 10 0 1 - t066 c 4 INT 9 10 10 0 1 - t066 d 4 INT 9 10 10 0 1 - t066 e 4 INT 9 10 10 0 1 - t067 a 4 INT 9 10 10 0 1 - t067 b 4 INT 9 10 10 0 1 - t067 c 4 INT 9 10 10 0 1 - t067 d 4 INT 9 10 10 0 1 - t067 e 4 INT 9 10 10 0 1 - t068 a 4 INT 9 10 10 0 1 - t068 b 4 INT 9 10 10 0 1 - t068 c 4 INT 9 10 10 0 1 - t068 d 4 INT 9 10 10 0 1 - t068 e 4 INT 9 10 10 0 1 - t069 a 4 INT 9 10 10 0 1 - t069 b 4 INT 9 10 10 0 1 - t069 c 4 INT 9 10 10 0 1 - t069 d 4 INT 9 10 10 0 1 - t069 e 4 INT 9 10 10 0 1 - t070 a 4 INT 9 10 10 0 1 - t070 b 4 INT 9 10 10 0 1 - t070 c 4 INT 9 10 10 0 1 - t070 d 4 INT 9 10 10 0 1 - t070 e 4 INT 9 10 10 0 1 - t071 a 4 INT 9 10 10 0 1 - t071 b 4 INT 9 10 10 0 1 - t071 c 4 INT 9 10 10 0 1 - t071 d 4 INT 9 10 10 0 1 - t071 e 4 INT 9 10 10 0 1 - t072 a 4 INT 9 10 10 0 1 - t072 b 4 INT 9 10 10 0 1 - t072 c 4 INT 9 10 10 0 1 - t072 d 4 INT 9 10 10 0 1 - t072 e 4 INT 9 10 10 0 1 - t073 a 4 INT 9 10 10 0 1 - t073 b 4 INT 9 10 10 0 1 - t073 c 4 INT 9 10 10 0 1 - t073 d 4 INT 9 10 10 0 1 - t073 e 4 INT 9 10 10 0 1 - t074 a 4 INT 9 10 10 0 1 - t074 b 4 INT 9 10 10 0 1 - t074 c 4 INT 9 10 10 0 1 - t074 d 4 INT 9 10 10 0 1 - t074 e 4 INT 9 10 10 0 1 - t075 a 4 INT 9 10 10 0 1 - t075 b 4 INT 9 10 10 0 1 - t075 c 4 INT 9 10 10 0 1 - t075 d 4 INT 9 10 10 0 1 - t075 e 4 INT 9 10 10 0 1 - t076 a 4 INT 9 10 10 0 1 - t076 b 4 INT 9 10 10 0 1 - t076 c 4 INT 9 10 10 0 1 - t076 d 4 INT 9 10 10 0 1 - t076 e 4 INT 9 10 10 0 1 - t077 a 4 INT 9 10 10 0 1 - t077 b 4 INT 9 10 10 0 1 - t077 c 4 INT 9 10 10 0 1 - t077 d 4 INT 9 10 10 0 1 - t077 e 4 INT 9 10 10 0 1 - t078 a 4 INT 9 10 10 0 1 - t078 b 4 INT 9 10 10 0 1 - t078 c 4 INT 9 10 10 0 1 - t078 d 4 INT 9 10 10 0 1 - t078 e 4 INT 9 10 10 0 1 - t079 a 4 INT 9 10 10 0 1 - t079 b 4 INT 9 10 10 0 1 - t079 c 4 INT 9 10 10 0 1 - t079 d 4 INT 9 10 10 0 1 - t079 e 4 INT 9 10 10 0 1 - t080 a 4 INT 9 10 10 0 1 - t080 b 4 INT 9 10 10 0 1 - t080 c 4 INT 9 10 10 0 1 - t080 d 4 INT 9 10 10 0 1 - t080 e 4 INT 9 10 10 0 1 - t081 a 4 INT 9 10 10 0 1 - t081 b 4 INT 9 10 10 0 1 - t081 c 4 INT 9 10 10 0 1 - t081 d 4 INT 9 10 10 0 1 - t081 e 4 INT 9 10 10 0 1 - t082 a 4 INT 9 10 10 0 1 - t082 b 4 INT 9 10 10 0 1 - t082 c 4 INT 9 10 10 0 1 - t082 d 4 INT 9 10 10 0 1 - t082 e 4 INT 9 10 10 0 1 - t083 a 4 INT 9 10 10 0 1 - t083 b 4 INT 9 10 10 0 1 - t083 c 4 INT 9 10 10 0 1 - t083 d 4 INT 9 10 10 0 1 - t083 e 4 INT 9 10 10 0 1 - t084 a 4 INT 9 10 10 0 1 - t084 b 4 INT 9 10 10 0 1 - t084 c 4 INT 9 10 10 0 1 - t084 d 4 INT 9 10 10 0 1 - t084 e 4 INT 9 10 10 0 1 - t085 a 4 INT 9 10 10 0 1 - t085 b 4 INT 9 10 10 0 1 - t085 c 4 INT 9 10 10 0 1 - t085 d 4 INT 9 10 10 0 1 - t085 e 4 INT 9 10 10 0 1 - t086 a 4 INT 9 10 10 0 1 - t086 b 4 INT 9 10 10 0 1 - t086 c 4 INT 9 10 10 0 1 - t086 d 4 INT 9 10 10 0 1 - t086 e 4 INT 9 10 10 0 1 - t087 a 4 INT 9 10 10 0 1 - t087 b 4 INT 9 10 10 0 1 - t087 c 4 INT 9 10 10 0 1 - t087 d 4 INT 9 10 10 0 1 - t087 e 4 INT 9 10 10 0 1 - t088 a 4 INT 9 10 10 0 1 - t088 b 4 INT 9 10 10 0 1 - t088 c 4 INT 9 10 10 0 1 - t088 d 4 INT 9 10 10 0 1 - t088 e 4 INT 9 10 10 0 1 - t089 a 4 INT 9 10 10 0 1 - t089 b 4 INT 9 10 10 0 1 - t089 c 4 INT 9 10 10 0 1 - t089 d 4 INT 9 10 10 0 1 - t089 e 4 INT 9 10 10 0 1 - t090 a 4 INT 9 10 10 0 1 - t090 b 4 INT 9 10 10 0 1 - t090 c 4 INT 9 10 10 0 1 - t090 d 4 INT 9 10 10 0 1 - t090 e 4 INT 9 10 10 0 1 - t091 a 4 INT 9 10 10 0 1 - t091 b 4 INT 9 10 10 0 1 - t091 c 4 INT 9 10 10 0 1 - t091 d 4 INT 9 10 10 0 1 - t091 e 4 INT 9 10 10 0 1 - t092 a 4 INT 9 10 10 0 1 - t092 b 4 INT 9 10 10 0 1 - t092 c 4 INT 9 10 10 0 1 - t092 d 4 INT 9 10 10 0 1 - t092 e 4 INT 9 10 10 0 1 - t093 a 4 INT 9 10 10 0 1 - t093 b 4 INT 9 10 10 0 1 - t093 c 4 INT 9 10 10 0 1 - t093 d 4 INT 9 10 10 0 1 - t093 e 4 INT 9 10 10 0 1 - t094 a 4 INT 9 10 10 0 1 - t094 b 4 INT 9 10 10 0 1 - t094 c 4 INT 9 10 10 0 1 - t094 d 4 INT 9 10 10 0 1 - t094 e 4 INT 9 10 10 0 1 - t095 a 4 INT 9 10 10 0 1 - t095 b 4 INT 9 10 10 0 1 - t095 c 4 INT 9 10 10 0 1 - t095 d 4 INT 9 10 10 0 1 - t095 e 4 INT 9 10 10 0 1 - t096 a 4 INT 9 10 10 0 1 - t096 b 4 INT 9 10 10 0 1 - t096 c 4 INT 9 10 10 0 1 - t096 d 4 INT 9 10 10 0 1 - t096 e 4 INT 9 10 10 0 1 - t097 a 4 INT 9 10 10 0 1 - t097 b 4 INT 9 10 10 0 1 - t097 c 4 INT 9 10 10 0 1 - t097 d 4 INT 9 10 10 0 1 - t097 e 4 INT 9 10 10 0 1 - t098 a 4 INT 9 10 10 0 1 - t098 b 4 INT 9 10 10 0 1 - t098 c 4 INT 9 10 10 0 1 - t098 d 4 INT 9 10 10 0 1 - t098 e 4 INT 9 10 10 0 1 - t099 a 4 INT 9 10 10 0 1 - t099 b 4 INT 9 10 10 0 1 - t099 c 4 INT 9 10 10 0 1 - t099 d 4 INT 9 10 10 0 1 - t099 e 4 INT 9 10 10 0 1 - t1 a 12 varchar(64) 64 64 10 0 1 - t100 a 4 INT 9 10 10 0 1 - t100 b 4 INT 9 10 10 0 1 - t100 c 4 INT 9 10 10 0 1 - t100 d 4 INT 9 10 10 0 1 - t100 e 4 INT 9 10 10 0 1 - t101 a 4 INT 9 10 10 0 1 - t101 b 4 INT 9 10 10 0 1 - t101 c 4 INT 9 10 10 0 1 - t101 d 4 INT 9 10 10 0 1 - t101 e 4 INT 9 10 10 0 1 - t102 a 4 INT 9 10 10 0 1 - t102 b 4 INT 9 10 10 0 1 - t102 c 4 INT 9 10 10 0 1 - t102 d 4 INT 9 10 10 0 1 - t102 e 4 INT 9 10 10 0 1 - t103 a 4 INT 9 10 10 0 1 - t103 b 4 INT 9 10 10 0 1 - t103 c 4 INT 9 10 10 0 1 - t103 d 4 INT 9 10 10 0 1 - t103 e 4 INT 9 10 10 0 1 - t104 a 4 INT 9 10 10 0 1 - t104 b 4 INT 9 10 10 0 1 - t104 c 4 INT 9 10 10 0 1 - t104 d 4 INT 9 10 10 0 1 - t104 e 4 INT 9 10 10 0 1 - t105 a 4 INT 9 10 10 0 1 - t105 b 4 INT 9 10 10 0 1 - t105 c 4 INT 9 10 10 0 1 - t105 d 4 INT 9 10 10 0 1 - t105 e 4 INT 9 10 10 0 1 - t106 a 4 INT 9 10 10 0 1 - t106 b 4 INT 9 10 10 0 1 - t106 c 4 INT 9 10 10 0 1 - t106 d 4 INT 9 10 10 0 1 - t106 e 4 INT 9 10 10 0 1 - t107 a 4 INT 9 10 10 0 1 - t107 b 4 INT 9 10 10 0 1 - t107 c 4 INT 9 10 10 0 1 - t107 d 4 INT 9 10 10 0 1 - t107 e 4 INT 9 10 10 0 1 - t108 a 4 INT 9 10 10 0 1 - t108 b 4 INT 9 10 10 0 1 - t108 c 4 INT 9 10 10 0 1 - t108 d 4 INT 9 10 10 0 1 - t108 e 4 INT 9 10 10 0 1 - t109 a 4 INT 9 10 10 0 1 - t109 b 4 INT 9 10 10 0 1 - t109 c 4 INT 9 10 10 0 1 - t109 d 4 INT 9 10 10 0 1 - t109 e 4 INT 9 10 10 0 1 - t110 a 4 INT 9 10 10 0 1 - t110 b 4 INT 9 10 10 0 1 - t110 c 4 INT 9 10 10 0 1 - t110 d 4 INT 9 10 10 0 1 - t110 e 4 INT 9 10 10 0 1 - t111 a 4 INT 9 10 10 0 1 - t111 b 4 INT 9 10 10 0 1 - t111 c 4 INT 9 10 10 0 1 - t111 d 4 INT 9 10 10 0 1 - t111 e 4 INT 9 10 10 0 1 - t112 a 4 INT 9 10 10 0 1 - t112 b 4 INT 9 10 10 0 1 - t112 c 4 INT 9 10 10 0 1 - t112 d 4 INT 9 10 10 0 1 - t112 e 4 INT 9 10 10 0 1 - t113 a 4 INT 9 10 10 0 1 - t113 b 4 INT 9 10 10 0 1 - t113 c 4 INT 9 10 10 0 1 - t113 d 4 INT 9 10 10 0 1 - t113 e 4 INT 9 10 10 0 1 - t114 a 4 INT 9 10 10 0 1 - t114 b 4 INT 9 10 10 0 1 - t114 c 4 INT 9 10 10 0 1 - t114 d 4 INT 9 10 10 0 1 - t114 e 4 INT 9 10 10 0 1 - t115 a 4 INT 9 10 10 0 1 - t115 b 4 INT 9 10 10 0 1 - t115 c 4 INT 9 10 10 0 1 - t115 d 4 INT 9 10 10 0 1 - t115 e 4 INT 9 10 10 0 1 - t116 a 4 INT 9 10 10 0 1 - t116 b 4 INT 9 10 10 0 1 - t116 c 4 INT 9 10 10 0 1 - t116 d 4 INT 9 10 10 0 1 - t116 e 4 INT 9 10 10 0 1 - t117 a 4 INT 9 10 10 0 1 - t117 b 4 INT 9 10 10 0 1 - t117 c 4 INT 9 10 10 0 1 - t117 d 4 INT 9 10 10 0 1 - t117 e 4 INT 9 10 10 0 1 - t118 a 4 INT 9 10 10 0 1 - t118 b 4 INT 9 10 10 0 1 - t118 c 4 INT 9 10 10 0 1 - t118 d 4 INT 9 10 10 0 1 - t118 e 4 INT 9 10 10 0 1 - t119 a 4 INT 9 10 10 0 1 - t119 b 4 INT 9 10 10 0 1 - t119 c 4 INT 9 10 10 0 1 - t119 d 4 INT 9 10 10 0 1 - t119 e 4 INT 9 10 10 0 1 - t120 a 4 INT 9 10 10 0 1 - t120 b 4 INT 9 10 10 0 1 - t120 c 4 INT 9 10 10 0 1 - t120 d 4 INT 9 10 10 0 1 - t120 e 4 INT 9 10 10 0 1 - t121 a 4 INT 9 10 10 0 1 - t121 b 4 INT 9 10 10 0 1 - t121 c 4 INT 9 10 10 0 1 - t121 d 4 INT 9 10 10 0 1 - t121 e 4 INT 9 10 10 0 1 - t122 a 4 INT 9 10 10 0 1 - t122 b 4 INT 9 10 10 0 1 - t122 c 4 INT 9 10 10 0 1 - t122 d 4 INT 9 10 10 0 1 - t122 e 4 INT 9 10 10 0 1 - t123 a 4 INT 9 10 10 0 1 - t123 b 4 INT 9 10 10 0 1 - t123 c 4 INT 9 10 10 0 1 - t123 d 4 INT 9 10 10 0 1 - t123 e 4 INT 9 10 10 0 1 - t124 a 4 INT 9 10 10 0 1 - t124 b 4 INT 9 10 10 0 1 - t124 c 4 INT 9 10 10 0 1 - t124 d 4 INT 9 10 10 0 1 - t124 e 4 INT 9 10 10 0 1 - t125 a 4 INT 9 10 10 0 1 - t125 b 4 INT 9 10 10 0 1 - t125 c 4 INT 9 10 10 0 1 - t125 d 4 INT 9 10 10 0 1 - t125 e 4 INT 9 10 10 0 1 - t126 a 4 INT 9 10 10 0 1 - t126 b 4 INT 9 10 10 0 1 - t126 c 4 INT 9 10 10 0 1 - t126 d 4 INT 9 10 10 0 1 - t126 e 4 INT 9 10 10 0 1 - t127 a 4 INT 9 10 10 0 1 - t127 b 4 INT 9 10 10 0 1 - t127 c 4 INT 9 10 10 0 1 - t127 d 4 INT 9 10 10 0 1 - t127 e 4 INT 9 10 10 0 1 - t128 a 4 INT 9 10 10 0 1 - t128 b 4 INT 9 10 10 0 1 - t128 c 4 INT 9 10 10 0 1 - t128 d 4 INT 9 10 10 0 1 - t128 e 4 INT 9 10 10 0 1 - t129 a 4 INT 9 10 10 0 1 - t129 b 4 INT 9 10 10 0 1 - t129 c 4 INT 9 10 10 0 1 - t129 d 4 INT 9 10 10 0 1 - t129 e 4 INT 9 10 10 0 1 - t130 a 4 INT 9 10 10 0 1 - t130 b 4 INT 9 10 10 0 1 - t130 c 4 INT 9 10 10 0 1 - t130 d 4 INT 9 10 10 0 1 - t130 e 4 INT 9 10 10 0 1 - t131 a 4 INT 9 10 10 0 1 - t131 b 4 INT 9 10 10 0 1 - t131 c 4 INT 9 10 10 0 1 - t131 d 4 INT 9 10 10 0 1 - t131 e 4 INT 9 10 10 0 1 - t132 a 4 INT 9 10 10 0 1 - t132 b 4 INT 9 10 10 0 1 - t132 c 4 INT 9 10 10 0 1 - t132 d 4 INT 9 10 10 0 1 - t132 e 4 INT 9 10 10 0 1 - t133 a 4 INT 9 10 10 0 1 - t133 b 4 INT 9 10 10 0 1 - t133 c 4 INT 9 10 10 0 1 - t133 d 4 INT 9 10 10 0 1 - t133 e 4 INT 9 10 10 0 1 - t134 a 4 INT 9 10 10 0 1 - t134 b 4 INT 9 10 10 0 1 - t134 c 4 INT 9 10 10 0 1 - t134 d 4 INT 9 10 10 0 1 - t134 e 4 INT 9 10 10 0 1 - t135 a 4 INT 9 10 10 0 1 - t135 b 4 INT 9 10 10 0 1 - t135 c 4 INT 9 10 10 0 1 - t135 d 4 INT 9 10 10 0 1 - t135 e 4 INT 9 10 10 0 1 - t136 a 4 INT 9 10 10 0 1 - t136 b 4 INT 9 10 10 0 1 - t136 c 4 INT 9 10 10 0 1 - t136 d 4 INT 9 10 10 0 1 - t136 e 4 INT 9 10 10 0 1 - t137 a 4 INT 9 10 10 0 1 - t137 b 4 INT 9 10 10 0 1 - t137 c 4 INT 9 10 10 0 1 - t137 d 4 INT 9 10 10 0 1 - t137 e 4 INT 9 10 10 0 1 - t138 a 4 INT 9 10 10 0 1 - t138 b 4 INT 9 10 10 0 1 - t138 c 4 INT 9 10 10 0 1 - t138 d 4 INT 9 10 10 0 1 - t138 e 4 INT 9 10 10 0 1 - t139 a 4 INT 9 10 10 0 1 - t139 b 4 INT 9 10 10 0 1 - t139 c 4 INT 9 10 10 0 1 - t139 d 4 INT 9 10 10 0 1 - t139 e 4 INT 9 10 10 0 1 - t140 a 4 INT 9 10 10 0 1 - t140 b 4 INT 9 10 10 0 1 - t140 c 4 INT 9 10 10 0 1 - t140 d 4 INT 9 10 10 0 1 - t140 e 4 INT 9 10 10 0 1 - t141 a 4 INT 9 10 10 0 1 - t141 b 4 INT 9 10 10 0 1 - t141 c 4 INT 9 10 10 0 1 - t141 d 4 INT 9 10 10 0 1 - t141 e 4 INT 9 10 10 0 1 - t142 a 4 INT 9 10 10 0 1 - t142 b 4 INT 9 10 10 0 1 - t142 c 4 INT 9 10 10 0 1 - t142 d 4 INT 9 10 10 0 1 - t142 e 4 INT 9 10 10 0 1 - t143 a 4 INT 9 10 10 0 1 - t143 b 4 INT 9 10 10 0 1 - t143 c 4 INT 9 10 10 0 1 - t143 d 4 INT 9 10 10 0 1 - t143 e 4 INT 9 10 10 0 1 - t144 a 4 INT 9 10 10 0 1 - t144 b 4 INT 9 10 10 0 1 - t144 c 4 INT 9 10 10 0 1 - t144 d 4 INT 9 10 10 0 1 - t144 e 4 INT 9 10 10 0 1 - t145 a 4 INT 9 10 10 0 1 - t145 b 4 INT 9 10 10 0 1 - t145 c 4 INT 9 10 10 0 1 - t145 d 4 INT 9 10 10 0 1 - t145 e 4 INT 9 10 10 0 1 - t146 a 4 INT 9 10 10 0 1 - t146 b 4 INT 9 10 10 0 1 - t146 c 4 INT 9 10 10 0 1 - t146 d 4 INT 9 10 10 0 1 - t146 e 4 INT 9 10 10 0 1 - t147 a 4 INT 9 10 10 0 1 - t147 b 4 INT 9 10 10 0 1 - t147 c 4 INT 9 10 10 0 1 - t147 d 4 INT 9 10 10 0 1 - t147 e 4 INT 9 10 10 0 1 - t148 a 4 INT 9 10 10 0 1 - t148 b 4 INT 9 10 10 0 1 - t148 c 4 INT 9 10 10 0 1 - t148 d 4 INT 9 10 10 0 1 - t148 e 4 INT 9 10 10 0 1 - t149 a 4 INT 9 10 10 0 1 - t149 b 4 INT 9 10 10 0 1 - t149 c 4 INT 9 10 10 0 1 - t149 d 4 INT 9 10 10 0 1 - t149 e 4 INT 9 10 10 0 1 - t150 a 4 INT 9 10 10 0 1 - t150 b 4 INT 9 10 10 0 1 - t150 c 4 INT 9 10 10 0 1 - t150 d 4 INT 9 10 10 0 1 - t150 e 4 INT 9 10 10 0 1 - t151 a 4 INT 9 10 10 0 1 - t151 b 4 INT 9 10 10 0 1 - t151 c 4 INT 9 10 10 0 1 - t151 d 4 INT 9 10 10 0 1 - t151 e 4 INT 9 10 10 0 1 - t152 a 4 INT 9 10 10 0 1 - t152 b 4 INT 9 10 10 0 1 - t152 c 4 INT 9 10 10 0 1 - t152 d 4 INT 9 10 10 0 1 - t152 e 4 INT 9 10 10 0 1 - t153 a 4 INT 9 10 10 0 1 - t153 b 4 INT 9 10 10 0 1 - t153 c 4 INT 9 10 10 0 1 - t153 d 4 INT 9 10 10 0 1 - t153 e 4 INT 9 10 10 0 1 - t154 a 4 INT 9 10 10 0 1 - t154 b 4 INT 9 10 10 0 1 - t154 c 4 INT 9 10 10 0 1 - t154 d 4 INT 9 10 10 0 1 - t154 e 4 INT 9 10 10 0 1 - t155 a 4 INT 9 10 10 0 1 - t155 b 4 INT 9 10 10 0 1 - t155 c 4 INT 9 10 10 0 1 - t155 d 4 INT 9 10 10 0 1 - t155 e 4 INT 9 10 10 0 1 - t156 a 4 INT 9 10 10 0 1 - t156 b 4 INT 9 10 10 0 1 - t156 c 4 INT 9 10 10 0 1 - t156 d 4 INT 9 10 10 0 1 - t156 e 4 INT 9 10 10 0 1 - t157 a 4 INT 9 10 10 0 1 - t157 b 4 INT 9 10 10 0 1 - t157 c 4 INT 9 10 10 0 1 - t157 d 4 INT 9 10 10 0 1 - t157 e 4 INT 9 10 10 0 1 - t158 a 4 INT 9 10 10 0 1 - t158 b 4 INT 9 10 10 0 1 - t158 c 4 INT 9 10 10 0 1 - t158 d 4 INT 9 10 10 0 1 - t158 e 4 INT 9 10 10 0 1 - t159 a 4 INT 9 10 10 0 1 - t159 b 4 INT 9 10 10 0 1 - t159 c 4 INT 9 10 10 0 1 - t159 d 4 INT 9 10 10 0 1 - t159 e 4 INT 9 10 10 0 1 - t160 a 4 INT 9 10 10 0 1 - t160 b 4 INT 9 10 10 0 1 - t160 c 4 INT 9 10 10 0 1 - t160 d 4 INT 9 10 10 0 1 - t160 e 4 INT 9 10 10 0 1 - t161 a 4 INT 9 10 10 0 1 - t161 b 4 INT 9 10 10 0 1 - t161 c 4 INT 9 10 10 0 1 - t161 d 4 INT 9 10 10 0 1 - t161 e 4 INT 9 10 10 0 1 - t162 a 4 INT 9 10 10 0 1 - t162 b 4 INT 9 10 10 0 1 - t162 c 4 INT 9 10 10 0 1 - t162 d 4 INT 9 10 10 0 1 - t162 e 4 INT 9 10 10 0 1 - t163 a 4 INT 9 10 10 0 1 - t163 b 4 INT 9 10 10 0 1 - t163 c 4 INT 9 10 10 0 1 - t163 d 4 INT 9 10 10 0 1 - t163 e 4 INT 9 10 10 0 1 - t164 a 4 INT 9 10 10 0 1 - t164 b 4 INT 9 10 10 0 1 - t164 c 4 INT 9 10 10 0 1 - t164 d 4 INT 9 10 10 0 1 - t164 e 4 INT 9 10 10 0 1 - t165 a 4 INT 9 10 10 0 1 - t165 b 4 INT 9 10 10 0 1 - t165 c 4 INT 9 10 10 0 1 - t165 d 4 INT 9 10 10 0 1 - t165 e 4 INT 9 10 10 0 1 - t166 a 4 INT 9 10 10 0 1 - t166 b 4 INT 9 10 10 0 1 - t166 c 4 INT 9 10 10 0 1 - t166 d 4 INT 9 10 10 0 1 - t166 e 4 INT 9 10 10 0 1 - t167 a 4 INT 9 10 10 0 1 - t167 b 4 INT 9 10 10 0 1 - t167 c 4 INT 9 10 10 0 1 - t167 d 4 INT 9 10 10 0 1 - t167 e 4 INT 9 10 10 0 1 - t168 a 4 INT 9 10 10 0 1 - t168 b 4 INT 9 10 10 0 1 - t168 c 4 INT 9 10 10 0 1 - t168 d 4 INT 9 10 10 0 1 - t168 e 4 INT 9 10 10 0 1 - t169 a 4 INT 9 10 10 0 1 - t169 b 4 INT 9 10 10 0 1 - t169 c 4 INT 9 10 10 0 1 - t169 d 4 INT 9 10 10 0 1 - t169 e 4 INT 9 10 10 0 1 - t170 a 4 INT 9 10 10 0 1 - t170 b 4 INT 9 10 10 0 1 - t170 c 4 INT 9 10 10 0 1 - t170 d 4 INT 9 10 10 0 1 - t170 e 4 INT 9 10 10 0 1 - t171 a 4 INT 9 10 10 0 1 - t171 b 4 INT 9 10 10 0 1 - t171 c 4 INT 9 10 10 0 1 - t171 d 4 INT 9 10 10 0 1 - t171 e 4 INT 9 10 10 0 1 - t172 a 4 INT 9 10 10 0 1 - t172 b 4 INT 9 10 10 0 1 - t172 c 4 INT 9 10 10 0 1 - t172 d 4 INT 9 10 10 0 1 - t172 e 4 INT 9 10 10 0 1 - t173 a 4 INT 9 10 10 0 1 - t173 b 4 INT 9 10 10 0 1 - t173 c 4 INT 9 10 10 0 1 - t173 d 4 INT 9 10 10 0 1 - t173 e 4 INT 9 10 10 0 1 - t174 a 4 INT 9 10 10 0 1 - t174 b 4 INT 9 10 10 0 1 - t174 c 4 INT 9 10 10 0 1 - t174 d 4 INT 9 10 10 0 1 - t174 e 4 INT 9 10 10 0 1 - t175 a 4 INT 9 10 10 0 1 - t175 b 4 INT 9 10 10 0 1 - t175 c 4 INT 9 10 10 0 1 - t175 d 4 INT 9 10 10 0 1 - t175 e 4 INT 9 10 10 0 1 - t176 a 4 INT 9 10 10 0 1 - t176 b 4 INT 9 10 10 0 1 - t176 c 4 INT 9 10 10 0 1 - t176 d 4 INT 9 10 10 0 1 - t176 e 4 INT 9 10 10 0 1 - t177 a 4 INT 9 10 10 0 1 - t177 b 4 INT 9 10 10 0 1 - t177 c 4 INT 9 10 10 0 1 - t177 d 4 INT 9 10 10 0 1 - t177 e 4 INT 9 10 10 0 1 - t178 a 4 INT 9 10 10 0 1 - t178 b 4 INT 9 10 10 0 1 - t178 c 4 INT 9 10 10 0 1 - t178 d 4 INT 9 10 10 0 1 - t178 e 4 INT 9 10 10 0 1 - t179 a 4 INT 9 10 10 0 1 - t179 b 4 INT 9 10 10 0 1 - t179 c 4 INT 9 10 10 0 1 - t179 d 4 INT 9 10 10 0 1 - t179 e 4 INT 9 10 10 0 1 - t180 a 4 INT 9 10 10 0 1 - t180 b 4 INT 9 10 10 0 1 - t180 c 4 INT 9 10 10 0 1 - t180 d 4 INT 9 10 10 0 1 - t180 e 4 INT 9 10 10 0 1 - t181 a 4 INT 9 10 10 0 1 - t181 b 4 INT 9 10 10 0 1 - t181 c 4 INT 9 10 10 0 1 - t181 d 4 INT 9 10 10 0 1 - t181 e 4 INT 9 10 10 0 1 - t182 a 4 INT 9 10 10 0 1 - t182 b 4 INT 9 10 10 0 1 - t182 c 4 INT 9 10 10 0 1 - t182 d 4 INT 9 10 10 0 1 - t182 e 4 INT 9 10 10 0 1 - t183 a 4 INT 9 10 10 0 1 - t183 b 4 INT 9 10 10 0 1 - t183 c 4 INT 9 10 10 0 1 - t183 d 4 INT 9 10 10 0 1 - t183 e 4 INT 9 10 10 0 1 - t184 a 4 INT 9 10 10 0 1 - t184 b 4 INT 9 10 10 0 1 - t184 c 4 INT 9 10 10 0 1 - t184 d 4 INT 9 10 10 0 1 - t184 e 4 INT 9 10 10 0 1 - t185 a 4 INT 9 10 10 0 1 - t185 b 4 INT 9 10 10 0 1 - t185 c 4 INT 9 10 10 0 1 - t185 d 4 INT 9 10 10 0 1 - t185 e 4 INT 9 10 10 0 1 - t186 a 4 INT 9 10 10 0 1 - t186 b 4 INT 9 10 10 0 1 - t186 c 4 INT 9 10 10 0 1 - t186 d 4 INT 9 10 10 0 1 - t186 e 4 INT 9 10 10 0 1 - t187 a 4 INT 9 10 10 0 1 - t187 b 4 INT 9 10 10 0 1 - t187 c 4 INT 9 10 10 0 1 - t187 d 4 INT 9 10 10 0 1 - t187 e 4 INT 9 10 10 0 1 - t188 a 4 INT 9 10 10 0 1 - t188 b 4 INT 9 10 10 0 1 - t188 c 4 INT 9 10 10 0 1 - t188 d 4 INT 9 10 10 0 1 - t188 e 4 INT 9 10 10 0 1 - t189 a 4 INT 9 10 10 0 1 - t189 b 4 INT 9 10 10 0 1 - t189 c 4 INT 9 10 10 0 1 - t189 d 4 INT 9 10 10 0 1 - t189 e 4 INT 9 10 10 0 1 - t190 a 4 INT 9 10 10 0 1 - t190 b 4 INT 9 10 10 0 1 - t190 c 4 INT 9 10 10 0 1 - t190 d 4 INT 9 10 10 0 1 - t190 e 4 INT 9 10 10 0 1 - t191 a 4 INT 9 10 10 0 1 - t191 b 4 INT 9 10 10 0 1 - t191 c 4 INT 9 10 10 0 1 - t191 d 4 INT 9 10 10 0 1 - t191 e 4 INT 9 10 10 0 1 - t192 a 4 INT 9 10 10 0 1 - t192 b 4 INT 9 10 10 0 1 - t192 c 4 INT 9 10 10 0 1 - t192 d 4 INT 9 10 10 0 1 - t192 e 4 INT 9 10 10 0 1 - t193 a 4 INT 9 10 10 0 1 - t193 b 4 INT 9 10 10 0 1 - t193 c 4 INT 9 10 10 0 1 - t193 d 4 INT 9 10 10 0 1 - t193 e 4 INT 9 10 10 0 1 - t194 a 4 INT 9 10 10 0 1 - t194 b 4 INT 9 10 10 0 1 - t194 c 4 INT 9 10 10 0 1 - t194 d 4 INT 9 10 10 0 1 - t194 e 4 INT 9 10 10 0 1 - t195 a 4 INT 9 10 10 0 1 - t195 b 4 INT 9 10 10 0 1 - t195 c 4 INT 9 10 10 0 1 - t195 d 4 INT 9 10 10 0 1 - t195 e 4 INT 9 10 10 0 1 - t196 a 4 INT 9 10 10 0 1 - t196 b 4 INT 9 10 10 0 1 - t196 c 4 INT 9 10 10 0 1 - t196 d 4 INT 9 10 10 0 1 - t196 e 4 INT 9 10 10 0 1 - t197 a 4 INT 9 10 10 0 1 - t197 b 4 INT 9 10 10 0 1 - t197 c 4 INT 9 10 10 0 1 - t197 d 4 INT 9 10 10 0 1 - t197 e 4 INT 9 10 10 0 1 - t198 a 4 INT 9 10 10 0 1 - t198 b 4 INT 9 10 10 0 1 - t198 c 4 INT 9 10 10 0 1 - t198 d 4 INT 9 10 10 0 1 - t198 e 4 INT 9 10 10 0 1 - t199 a 4 INT 9 10 10 0 1 - t199 b 4 INT 9 10 10 0 1 - t199 c 4 INT 9 10 10 0 1 - t199 d 4 INT 9 10 10 0 1 - t199 e 4 INT 9 10 10 0 1 - t200 a 4 INT 9 10 10 0 1 - t200 b 4 INT 9 10 10 0 1 - t200 c 4 INT 9 10 10 0 1 - t200 d 4 INT 9 10 10 0 1 - t200 e 4 INT 9 10 10 0 1 - t201 a 4 INT 9 10 10 0 1 - t201 b 4 INT 9 10 10 0 1 - t201 c 4 INT 9 10 10 0 1 - t201 d 4 INT 9 10 10 0 1 - t201 e 4 INT 9 10 10 0 1 - t202 a 4 INT 9 10 10 0 1 - t202 b 4 INT 9 10 10 0 1 - t202 c 4 INT 9 10 10 0 1 - t202 d 4 INT 9 10 10 0 1 - t202 e 4 INT 9 10 10 0 1 - t203 a 4 INT 9 10 10 0 1 - t203 b 4 INT 9 10 10 0 1 - t203 c 4 INT 9 10 10 0 1 - t203 d 4 INT 9 10 10 0 1 - t203 e 4 INT 9 10 10 0 1 - t204 a 4 INT 9 10 10 0 1 - t204 b 4 INT 9 10 10 0 1 - t204 c 4 INT 9 10 10 0 1 - t204 d 4 INT 9 10 10 0 1 - t204 e 4 INT 9 10 10 0 1 - t205 a 4 INT 9 10 10 0 1 - t205 b 4 INT 9 10 10 0 1 - t205 c 4 INT 9 10 10 0 1 - t205 d 4 INT 9 10 10 0 1 - t205 e 4 INT 9 10 10 0 1 - t206 a 4 INT 9 10 10 0 1 - t206 b 4 INT 9 10 10 0 1 - t206 c 4 INT 9 10 10 0 1 - t206 d 4 INT 9 10 10 0 1 - t206 e 4 INT 9 10 10 0 1 - t207 a 4 INT 9 10 10 0 1 - t207 b 4 INT 9 10 10 0 1 - t207 c 4 INT 9 10 10 0 1 - t207 d 4 INT 9 10 10 0 1 - t207 e 4 INT 9 10 10 0 1 - t208 a 4 INT 9 10 10 0 1 - t208 b 4 INT 9 10 10 0 1 - t208 c 4 INT 9 10 10 0 1 - t208 d 4 INT 9 10 10 0 1 - t208 e 4 INT 9 10 10 0 1 - t209 a 4 INT 9 10 10 0 1 - t209 b 4 INT 9 10 10 0 1 - t209 c 4 INT 9 10 10 0 1 - t209 d 4 INT 9 10 10 0 1 - t209 e 4 INT 9 10 10 0 1 - t210 a 4 INT 9 10 10 0 1 - t210 b 4 INT 9 10 10 0 1 - t210 c 4 INT 9 10 10 0 1 - t210 d 4 INT 9 10 10 0 1 - t210 e 4 INT 9 10 10 0 1 - t211 a 4 INT 9 10 10 0 1 - t211 b 4 INT 9 10 10 0 1 - t211 c 4 INT 9 10 10 0 1 - t211 d 4 INT 9 10 10 0 1 - t211 e 4 INT 9 10 10 0 1 - t212 a 4 INT 9 10 10 0 1 - t212 b 4 INT 9 10 10 0 1 - t212 c 4 INT 9 10 10 0 1 - t212 d 4 INT 9 10 10 0 1 - t212 e 4 INT 9 10 10 0 1 - t213 a 4 INT 9 10 10 0 1 - t213 b 4 INT 9 10 10 0 1 - t213 c 4 INT 9 10 10 0 1 - t213 d 4 INT 9 10 10 0 1 - t213 e 4 INT 9 10 10 0 1 - t214 a 4 INT 9 10 10 0 1 - t214 b 4 INT 9 10 10 0 1 - t214 c 4 INT 9 10 10 0 1 - t214 d 4 INT 9 10 10 0 1 - t214 e 4 INT 9 10 10 0 1 - t215 a 4 INT 9 10 10 0 1 - t215 b 4 INT 9 10 10 0 1 - t215 c 4 INT 9 10 10 0 1 - t215 d 4 INT 9 10 10 0 1 - t215 e 4 INT 9 10 10 0 1 - t216 a 4 INT 9 10 10 0 1 - t216 b 4 INT 9 10 10 0 1 - t216 c 4 INT 9 10 10 0 1 - t216 d 4 INT 9 10 10 0 1 - t216 e 4 INT 9 10 10 0 1 - t217 a 4 INT 9 10 10 0 1 - t217 b 4 INT 9 10 10 0 1 - t217 c 4 INT 9 10 10 0 1 - t217 d 4 INT 9 10 10 0 1 - t217 e 4 INT 9 10 10 0 1 - t218 a 4 INT 9 10 10 0 1 - t218 b 4 INT 9 10 10 0 1 - t218 c 4 INT 9 10 10 0 1 - t218 d 4 INT 9 10 10 0 1 - t218 e 4 INT 9 10 10 0 1 - t219 a 4 INT 9 10 10 0 1 - t219 b 4 INT 9 10 10 0 1 - t219 c 4 INT 9 10 10 0 1 - t219 d 4 INT 9 10 10 0 1 - t219 e 4 INT 9 10 10 0 1 - t220 a 4 INT 9 10 10 0 1 - t220 b 4 INT 9 10 10 0 1 - t220 c 4 INT 9 10 10 0 1 - t220 d 4 INT 9 10 10 0 1 - t220 e 4 INT 9 10 10 0 1 - t221 a 4 INT 9 10 10 0 1 - t221 b 4 INT 9 10 10 0 1 - t221 c 4 INT 9 10 10 0 1 - t221 d 4 INT 9 10 10 0 1 - t221 e 4 INT 9 10 10 0 1 - t222 a 4 INT 9 10 10 0 1 - t222 b 4 INT 9 10 10 0 1 - t222 c 4 INT 9 10 10 0 1 - t222 d 4 INT 9 10 10 0 1 - t222 e 4 INT 9 10 10 0 1 - t223 a 4 INT 9 10 10 0 1 - t223 b 4 INT 9 10 10 0 1 - t223 c 4 INT 9 10 10 0 1 - t223 d 4 INT 9 10 10 0 1 - t223 e 4 INT 9 10 10 0 1 - t224 a 4 INT 9 10 10 0 1 - t224 b 4 INT 9 10 10 0 1 - t224 c 4 INT 9 10 10 0 1 - t224 d 4 INT 9 10 10 0 1 - t224 e 4 INT 9 10 10 0 1 - t225 a 4 INT 9 10 10 0 1 - t225 b 4 INT 9 10 10 0 1 - t225 c 4 INT 9 10 10 0 1 - t225 d 4 INT 9 10 10 0 1 - t225 e 4 INT 9 10 10 0 1 - t226 a 4 INT 9 10 10 0 1 - t226 b 4 INT 9 10 10 0 1 - t226 c 4 INT 9 10 10 0 1 - t226 d 4 INT 9 10 10 0 1 - t226 e 4 INT 9 10 10 0 1 - t227 a 4 INT 9 10 10 0 1 - t227 b 4 INT 9 10 10 0 1 - t227 c 4 INT 9 10 10 0 1 - t227 d 4 INT 9 10 10 0 1 - t227 e 4 INT 9 10 10 0 1 - t228 a 4 INT 9 10 10 0 1 - t228 b 4 INT 9 10 10 0 1 - t228 c 4 INT 9 10 10 0 1 - t228 d 4 INT 9 10 10 0 1 - t228 e 4 INT 9 10 10 0 1 - t229 a 4 INT 9 10 10 0 1 - t229 b 4 INT 9 10 10 0 1 - t229 c 4 INT 9 10 10 0 1 - t229 d 4 INT 9 10 10 0 1 - t229 e 4 INT 9 10 10 0 1 - t230 a 4 INT 9 10 10 0 1 - t230 b 4 INT 9 10 10 0 1 - t230 c 4 INT 9 10 10 0 1 - t230 d 4 INT 9 10 10 0 1 - t230 e 4 INT 9 10 10 0 1 - t231 a 4 INT 9 10 10 0 1 - t231 b 4 INT 9 10 10 0 1 - t231 c 4 INT 9 10 10 0 1 - t231 d 4 INT 9 10 10 0 1 - t231 e 4 INT 9 10 10 0 1 - t232 a 4 INT 9 10 10 0 1 - t232 b 4 INT 9 10 10 0 1 - t232 c 4 INT 9 10 10 0 1 - t232 d 4 INT 9 10 10 0 1 - t232 e 4 INT 9 10 10 0 1 - t233 a 4 INT 9 10 10 0 1 - t233 b 4 INT 9 10 10 0 1 - t233 c 4 INT 9 10 10 0 1 - t233 d 4 INT 9 10 10 0 1 - t233 e 4 INT 9 10 10 0 1 - t234 a 4 INT 9 10 10 0 1 - t234 b 4 INT 9 10 10 0 1 - t234 c 4 INT 9 10 10 0 1 - t234 d 4 INT 9 10 10 0 1 - t234 e 4 INT 9 10 10 0 1 - t235 a 4 INT 9 10 10 0 1 - t235 b 4 INT 9 10 10 0 1 - t235 c 4 INT 9 10 10 0 1 - t235 d 4 INT 9 10 10 0 1 - t235 e 4 INT 9 10 10 0 1 - t236 a 4 INT 9 10 10 0 1 - t236 b 4 INT 9 10 10 0 1 - t236 c 4 INT 9 10 10 0 1 - t236 d 4 INT 9 10 10 0 1 - t236 e 4 INT 9 10 10 0 1 - t237 a 4 INT 9 10 10 0 1 - t237 b 4 INT 9 10 10 0 1 - t237 c 4 INT 9 10 10 0 1 - t237 d 4 INT 9 10 10 0 1 - t237 e 4 INT 9 10 10 0 1 - t238 a 4 INT 9 10 10 0 1 - t238 b 4 INT 9 10 10 0 1 - t238 c 4 INT 9 10 10 0 1 - t238 d 4 INT 9 10 10 0 1 - t238 e 4 INT 9 10 10 0 1 - t239 a 4 INT 9 10 10 0 1 - t239 b 4 INT 9 10 10 0 1 - t239 c 4 INT 9 10 10 0 1 - t239 d 4 INT 9 10 10 0 1 - t239 e 4 INT 9 10 10 0 1 - t240 a 4 INT 9 10 10 0 1 - t240 b 4 INT 9 10 10 0 1 - t240 c 4 INT 9 10 10 0 1 - t240 d 4 INT 9 10 10 0 1 - t240 e 4 INT 9 10 10 0 1 - t241 a 4 INT 9 10 10 0 1 - t241 b 4 INT 9 10 10 0 1 - t241 c 4 INT 9 10 10 0 1 - t241 d 4 INT 9 10 10 0 1 - t241 e 4 INT 9 10 10 0 1 - t242 a 4 INT 9 10 10 0 1 - t242 b 4 INT 9 10 10 0 1 - t242 c 4 INT 9 10 10 0 1 - t242 d 4 INT 9 10 10 0 1 - t242 e 4 INT 9 10 10 0 1 - t243 a 4 INT 9 10 10 0 1 - t243 b 4 INT 9 10 10 0 1 - t243 c 4 INT 9 10 10 0 1 - t243 d 4 INT 9 10 10 0 1 - t243 e 4 INT 9 10 10 0 1 - t244 a 4 INT 9 10 10 0 1 - t244 b 4 INT 9 10 10 0 1 - t244 c 4 INT 9 10 10 0 1 - t244 d 4 INT 9 10 10 0 1 - t244 e 4 INT 9 10 10 0 1 - t245 a 4 INT 9 10 10 0 1 - t245 b 4 INT 9 10 10 0 1 - t245 c 4 INT 9 10 10 0 1 - t245 d 4 INT 9 10 10 0 1 - t245 e 4 INT 9 10 10 0 1 - t246 a 4 INT 9 10 10 0 1 - t246 b 4 INT 9 10 10 0 1 - t246 c 4 INT 9 10 10 0 1 - t246 d 4 INT 9 10 10 0 1 - t246 e 4 INT 9 10 10 0 1 - t247 a 4 INT 9 10 10 0 1 - t247 b 4 INT 9 10 10 0 1 - t247 c 4 INT 9 10 10 0 1 - t247 d 4 INT 9 10 10 0 1 - t247 e 4 INT 9 10 10 0 1 - t248 a 4 INT 9 10 10 0 1 - t248 b 4 INT 9 10 10 0 1 - t248 c 4 INT 9 10 10 0 1 - t248 d 4 INT 9 10 10 0 1 - t248 e 4 INT 9 10 10 0 1 - t249 a 4 INT 9 10 10 0 1 - t249 b 4 INT 9 10 10 0 1 - t249 c 4 INT 9 10 10 0 1 - t249 d 4 INT 9 10 10 0 1 - t249 e 4 INT 9 10 10 0 1 - t250 a 4 INT 9 10 10 0 1 - t250 b 4 INT 9 10 10 0 1 - t250 c 4 INT 9 10 10 0 1 - t250 d 4 INT 9 10 10 0 1 - t250 e 4 INT 9 10 10 0 1 - t251 a 4 INT 9 10 10 0 1 - t251 b 4 INT 9 10 10 0 1 - t251 c 4 INT 9 10 10 0 1 - t251 d 4 INT 9 10 10 0 1 - t251 e 4 INT 9 10 10 0 1 - t252 a 4 INT 9 10 10 0 1 - t252 b 4 INT 9 10 10 0 1 - t252 c 4 INT 9 10 10 0 1 - t252 d 4 INT 9 10 10 0 1 - t252 e 4 INT 9 10 10 0 1 - t253 a 4 INT 9 10 10 0 1 - t253 b 4 INT 9 10 10 0 1 - t253 c 4 INT 9 10 10 0 1 - t253 d 4 INT 9 10 10 0 1 - t253 e 4 INT 9 10 10 0 1 - t254 a 4 INT 9 10 10 0 1 - t254 b 4 INT 9 10 10 0 1 - t254 c 4 INT 9 10 10 0 1 - t254 d 4 INT 9 10 10 0 1 - t254 e 4 INT 9 10 10 0 1 - t255 a 4 INT 9 10 10 0 1 - t255 b 4 INT 9 10 10 0 1 - t255 c 4 INT 9 10 10 0 1 - t255 d 4 INT 9 10 10 0 1 - t255 e 4 INT 9 10 10 0 1 - t256 a 4 INT 9 10 10 0 1 - t256 b 4 INT 9 10 10 0 1 - t256 c 4 INT 9 10 10 0 1 - t256 d 4 INT 9 10 10 0 1 - t256 e 4 INT 9 10 10 0 1 - t257 a 4 INT 9 10 10 0 1 - t257 b 4 INT 9 10 10 0 1 - t257 c 4 INT 9 10 10 0 1 - t257 d 4 INT 9 10 10 0 1 - t257 e 4 INT 9 10 10 0 1 - t258 a 4 INT 9 10 10 0 1 - t258 b 4 INT 9 10 10 0 1 - t258 c 4 INT 9 10 10 0 1 - t258 d 4 INT 9 10 10 0 1 - t258 e 4 INT 9 10 10 0 1 - t259 a 4 INT 9 10 10 0 1 - t259 b 4 INT 9 10 10 0 1 - t259 c 4 INT 9 10 10 0 1 - t259 d 4 INT 9 10 10 0 1 - t259 e 4 INT 9 10 10 0 1 - t260 a 4 INT 9 10 10 0 1 - t260 b 4 INT 9 10 10 0 1 - t260 c 4 INT 9 10 10 0 1 - t260 d 4 INT 9 10 10 0 1 - t260 e 4 INT 9 10 10 0 1 - t261 a 4 INT 9 10 10 0 1 - t261 b 4 INT 9 10 10 0 1 - t261 c 4 INT 9 10 10 0 1 - t261 d 4 INT 9 10 10 0 1 - t261 e 4 INT 9 10 10 0 1 - t262 a 4 INT 9 10 10 0 1 - t262 b 4 INT 9 10 10 0 1 - t262 c 4 INT 9 10 10 0 1 - t262 d 4 INT 9 10 10 0 1 - t262 e 4 INT 9 10 10 0 1 - t263 a 4 INT 9 10 10 0 1 - t263 b 4 INT 9 10 10 0 1 - t263 c 4 INT 9 10 10 0 1 - t263 d 4 INT 9 10 10 0 1 - t263 e 4 INT 9 10 10 0 1 - t264 a 4 INT 9 10 10 0 1 - t264 b 4 INT 9 10 10 0 1 - t264 c 4 INT 9 10 10 0 1 - t264 d 4 INT 9 10 10 0 1 - t264 e 4 INT 9 10 10 0 1 - t265 a 4 INT 9 10 10 0 1 - t265 b 4 INT 9 10 10 0 1 - t265 c 4 INT 9 10 10 0 1 - t265 d 4 INT 9 10 10 0 1 - t265 e 4 INT 9 10 10 0 1 - t266 a 4 INT 9 10 10 0 1 - t266 b 4 INT 9 10 10 0 1 - t266 c 4 INT 9 10 10 0 1 - t266 d 4 INT 9 10 10 0 1 - t266 e 4 INT 9 10 10 0 1 - t267 a 4 INT 9 10 10 0 1 - t267 b 4 INT 9 10 10 0 1 - t267 c 4 INT 9 10 10 0 1 - t267 d 4 INT 9 10 10 0 1 - t267 e 4 INT 9 10 10 0 1 - t268 a 4 INT 9 10 10 0 1 - t268 b 4 INT 9 10 10 0 1 - t268 c 4 INT 9 10 10 0 1 - t268 d 4 INT 9 10 10 0 1 - t268 e 4 INT 9 10 10 0 1 - t269 a 4 INT 9 10 10 0 1 - t269 b 4 INT 9 10 10 0 1 - t269 c 4 INT 9 10 10 0 1 - t269 d 4 INT 9 10 10 0 1 - t269 e 4 INT 9 10 10 0 1 - t270 a 4 INT 9 10 10 0 1 - t270 b 4 INT 9 10 10 0 1 - t270 c 4 INT 9 10 10 0 1 - t270 d 4 INT 9 10 10 0 1 - t270 e 4 INT 9 10 10 0 1 - t271 a 4 INT 9 10 10 0 1 - t271 b 4 INT 9 10 10 0 1 - t271 c 4 INT 9 10 10 0 1 - t271 d 4 INT 9 10 10 0 1 - t271 e 4 INT 9 10 10 0 1 - t272 a 4 INT 9 10 10 0 1 - t272 b 4 INT 9 10 10 0 1 - t272 c 4 INT 9 10 10 0 1 - t272 d 4 INT 9 10 10 0 1 - t272 e 4 INT 9 10 10 0 1 - t273 a 4 INT 9 10 10 0 1 - t273 b 4 INT 9 10 10 0 1 - t273 c 4 INT 9 10 10 0 1 - t273 d 4 INT 9 10 10 0 1 - t273 e 4 INT 9 10 10 0 1 - t274 a 4 INT 9 10 10 0 1 - t274 b 4 INT 9 10 10 0 1 - t274 c 4 INT 9 10 10 0 1 - t274 d 4 INT 9 10 10 0 1 - t274 e 4 INT 9 10 10 0 1 - t275 a 4 INT 9 10 10 0 1 - t275 b 4 INT 9 10 10 0 1 - t275 c 4 INT 9 10 10 0 1 - t275 d 4 INT 9 10 10 0 1 - t275 e 4 INT 9 10 10 0 1 - t276 a 4 INT 9 10 10 0 1 - t276 b 4 INT 9 10 10 0 1 - t276 c 4 INT 9 10 10 0 1 - t276 d 4 INT 9 10 10 0 1 - t276 e 4 INT 9 10 10 0 1 - t277 a 4 INT 9 10 10 0 1 - t277 b 4 INT 9 10 10 0 1 - t277 c 4 INT 9 10 10 0 1 - t277 d 4 INT 9 10 10 0 1 - t277 e 4 INT 9 10 10 0 1 - t278 a 4 INT 9 10 10 0 1 - t278 b 4 INT 9 10 10 0 1 - t278 c 4 INT 9 10 10 0 1 - t278 d 4 INT 9 10 10 0 1 - t278 e 4 INT 9 10 10 0 1 - t279 a 4 INT 9 10 10 0 1 - t279 b 4 INT 9 10 10 0 1 - t279 c 4 INT 9 10 10 0 1 - t279 d 4 INT 9 10 10 0 1 - t279 e 4 INT 9 10 10 0 1 - t280 a 4 INT 9 10 10 0 1 - t280 b 4 INT 9 10 10 0 1 - t280 c 4 INT 9 10 10 0 1 - t280 d 4 INT 9 10 10 0 1 - t280 e 4 INT 9 10 10 0 1 - t281 a 4 INT 9 10 10 0 1 - t281 b 4 INT 9 10 10 0 1 - t281 c 4 INT 9 10 10 0 1 - t281 d 4 INT 9 10 10 0 1 - t281 e 4 INT 9 10 10 0 1 - t282 a 4 INT 9 10 10 0 1 - t282 b 4 INT 9 10 10 0 1 - t282 c 4 INT 9 10 10 0 1 - t282 d 4 INT 9 10 10 0 1 - t282 e 4 INT 9 10 10 0 1 - t283 a 4 INT 9 10 10 0 1 - t283 b 4 INT 9 10 10 0 1 - t283 c 4 INT 9 10 10 0 1 - t283 d 4 INT 9 10 10 0 1 - t283 e 4 INT 9 10 10 0 1 - t284 a 4 INT 9 10 10 0 1 - t284 b 4 INT 9 10 10 0 1 - t284 c 4 INT 9 10 10 0 1 - t284 d 4 INT 9 10 10 0 1 - t284 e 4 INT 9 10 10 0 1 - t285 a 4 INT 9 10 10 0 1 - t285 b 4 INT 9 10 10 0 1 - t285 c 4 INT 9 10 10 0 1 - t285 d 4 INT 9 10 10 0 1 - t285 e 4 INT 9 10 10 0 1 - t286 a 4 INT 9 10 10 0 1 - t286 b 4 INT 9 10 10 0 1 - t286 c 4 INT 9 10 10 0 1 - t286 d 4 INT 9 10 10 0 1 - t286 e 4 INT 9 10 10 0 1 - t287 a 4 INT 9 10 10 0 1 - t287 b 4 INT 9 10 10 0 1 - t287 c 4 INT 9 10 10 0 1 - t287 d 4 INT 9 10 10 0 1 - t287 e 4 INT 9 10 10 0 1 - t288 a 4 INT 9 10 10 0 1 - t288 b 4 INT 9 10 10 0 1 - t288 c 4 INT 9 10 10 0 1 - t288 d 4 INT 9 10 10 0 1 - t288 e 4 INT 9 10 10 0 1 - t289 a 4 INT 9 10 10 0 1 - t289 b 4 INT 9 10 10 0 1 - t289 c 4 INT 9 10 10 0 1 - t289 d 4 INT 9 10 10 0 1 - t289 e 4 INT 9 10 10 0 1 - t290 a 4 INT 9 10 10 0 1 - t290 b 4 INT 9 10 10 0 1 - t290 c 4 INT 9 10 10 0 1 - t290 d 4 INT 9 10 10 0 1 - t290 e 4 INT 9 10 10 0 1 - t291 a 4 INT 9 10 10 0 1 - t291 b 4 INT 9 10 10 0 1 - t291 c 4 INT 9 10 10 0 1 - t291 d 4 INT 9 10 10 0 1 - t291 e 4 INT 9 10 10 0 1 - t292 a 4 INT 9 10 10 0 1 - t292 b 4 INT 9 10 10 0 1 - t292 c 4 INT 9 10 10 0 1 - t292 d 4 INT 9 10 10 0 1 - t292 e 4 INT 9 10 10 0 1 - t293 a 4 INT 9 10 10 0 1 - t293 b 4 INT 9 10 10 0 1 - t293 c 4 INT 9 10 10 0 1 - t293 d 4 INT 9 10 10 0 1 - t293 e 4 INT 9 10 10 0 1 - t294 a 4 INT 9 10 10 0 1 - t294 b 4 INT 9 10 10 0 1 - t294 c 4 INT 9 10 10 0 1 - t294 d 4 INT 9 10 10 0 1 - t294 e 4 INT 9 10 10 0 1 - t295 a 4 INT 9 10 10 0 1 - t295 b 4 INT 9 10 10 0 1 - t295 c 4 INT 9 10 10 0 1 - t295 d 4 INT 9 10 10 0 1 - t295 e 4 INT 9 10 10 0 1 - t296 a 4 INT 9 10 10 0 1 - t296 b 4 INT 9 10 10 0 1 - t296 c 4 INT 9 10 10 0 1 - t296 d 4 INT 9 10 10 0 1 - t296 e 4 INT 9 10 10 0 1 - t297 a 4 INT 9 10 10 0 1 - t297 b 4 INT 9 10 10 0 1 - t297 c 4 INT 9 10 10 0 1 - t297 d 4 INT 9 10 10 0 1 - t297 e 4 INT 9 10 10 0 1 - t298 a 4 INT 9 10 10 0 1 - t298 b 4 INT 9 10 10 0 1 - t298 c 4 INT 9 10 10 0 1 - t298 d 4 INT 9 10 10 0 1 - t298 e 4 INT 9 10 10 0 1 - t299 a 4 INT 9 10 10 0 1 - t299 b 4 INT 9 10 10 0 1 - t299 c 4 INT 9 10 10 0 1 - t299 d 4 INT 9 10 10 0 1 - t299 e 4 INT 9 10 10 0 1 - t300 a 4 INT 9 10 10 0 1 - t300 b 4 INT 9 10 10 0 1 - t300 c 4 INT 9 10 10 0 1 - t300 d 4 INT 9 10 10 0 1 - t300 e 4 INT 9 10 10 0 1 - t301 a 4 INT 9 10 10 0 1 - t301 b 4 INT 9 10 10 0 1 - t301 c 4 INT 9 10 10 0 1 - t301 d 4 INT 9 10 10 0 1 - t301 e 4 INT 9 10 10 0 1 - t302 a 4 INT 9 10 10 0 1 - t302 b 4 INT 9 10 10 0 1 - t302 c 4 INT 9 10 10 0 1 - t302 d 4 INT 9 10 10 0 1 - t302 e 4 INT 9 10 10 0 1 - t303 a 4 INT 9 10 10 0 1 - t303 b 4 INT 9 10 10 0 1 - t303 c 4 INT 9 10 10 0 1 - t303 d 4 INT 9 10 10 0 1 - t303 e 4 INT 9 10 10 0 1 - t304 a 4 INT 9 10 10 0 1 - t304 b 4 INT 9 10 10 0 1 - t304 c 4 INT 9 10 10 0 1 - t304 d 4 INT 9 10 10 0 1 - t304 e 4 INT 9 10 10 0 1 - t305 a 4 INT 9 10 10 0 1 - t305 b 4 INT 9 10 10 0 1 - t305 c 4 INT 9 10 10 0 1 - t305 d 4 INT 9 10 10 0 1 - t305 e 4 INT 9 10 10 0 1 - t306 a 4 INT 9 10 10 0 1 - t306 b 4 INT 9 10 10 0 1 - t306 c 4 INT 9 10 10 0 1 - t306 d 4 INT 9 10 10 0 1 - t306 e 4 INT 9 10 10 0 1 - t307 a 4 INT 9 10 10 0 1 - t307 b 4 INT 9 10 10 0 1 - t307 c 4 INT 9 10 10 0 1 - t307 d 4 INT 9 10 10 0 1 - t307 e 4 INT 9 10 10 0 1 - t308 a 4 INT 9 10 10 0 1 - t308 b 4 INT 9 10 10 0 1 - t308 c 4 INT 9 10 10 0 1 - t308 d 4 INT 9 10 10 0 1 - t308 e 4 INT 9 10 10 0 1 - t309 a 4 INT 9 10 10 0 1 - t309 b 4 INT 9 10 10 0 1 - t309 c 4 INT 9 10 10 0 1 - t309 d 4 INT 9 10 10 0 1 - t309 e 4 INT 9 10 10 0 1 - t310 a 4 INT 9 10 10 0 1 - t310 b 4 INT 9 10 10 0 1 - t310 c 4 INT 9 10 10 0 1 - t310 d 4 INT 9 10 10 0 1 - t310 e 4 INT 9 10 10 0 1 - t311 a 4 INT 9 10 10 0 1 - t311 b 4 INT 9 10 10 0 1 - t311 c 4 INT 9 10 10 0 1 - t311 d 4 INT 9 10 10 0 1 - t311 e 4 INT 9 10 10 0 1 - t312 a 4 INT 9 10 10 0 1 - t312 b 4 INT 9 10 10 0 1 - t312 c 4 INT 9 10 10 0 1 - t312 d 4 INT 9 10 10 0 1 - t312 e 4 INT 9 10 10 0 1 - t313 a 4 INT 9 10 10 0 1 - t313 b 4 INT 9 10 10 0 1 - t313 c 4 INT 9 10 10 0 1 - t313 d 4 INT 9 10 10 0 1 - t313 e 4 INT 9 10 10 0 1 - t314 a 4 INT 9 10 10 0 1 - t314 b 4 INT 9 10 10 0 1 - t314 c 4 INT 9 10 10 0 1 - t314 d 4 INT 9 10 10 0 1 - t314 e 4 INT 9 10 10 0 1 - t315 a 4 INT 9 10 10 0 1 - t315 b 4 INT 9 10 10 0 1 - t315 c 4 INT 9 10 10 0 1 - t315 d 4 INT 9 10 10 0 1 - t315 e 4 INT 9 10 10 0 1 - t316 a 4 INT 9 10 10 0 1 - t316 b 4 INT 9 10 10 0 1 - t316 c 4 INT 9 10 10 0 1 - t316 d 4 INT 9 10 10 0 1 - t316 e 4 INT 9 10 10 0 1 - t317 a 4 INT 9 10 10 0 1 - t317 b 4 INT 9 10 10 0 1 - t317 c 4 INT 9 10 10 0 1 - t317 d 4 INT 9 10 10 0 1 - t317 e 4 INT 9 10 10 0 1 - t318 a 4 INT 9 10 10 0 1 - t318 b 4 INT 9 10 10 0 1 - t318 c 4 INT 9 10 10 0 1 - t318 d 4 INT 9 10 10 0 1 - t318 e 4 INT 9 10 10 0 1 - t319 a 4 INT 9 10 10 0 1 - t319 b 4 INT 9 10 10 0 1 - t319 c 4 INT 9 10 10 0 1 - t319 d 4 INT 9 10 10 0 1 - t319 e 4 INT 9 10 10 0 1 - t320 a 4 INT 9 10 10 0 1 - t320 b 4 INT 9 10 10 0 1 - t320 c 4 INT 9 10 10 0 1 - t320 d 4 INT 9 10 10 0 1 - t320 e 4 INT 9 10 10 0 1 - t321 a 4 INT 9 10 10 0 1 - t321 b 4 INT 9 10 10 0 1 - t321 c 4 INT 9 10 10 0 1 - t321 d 4 INT 9 10 10 0 1 - t321 e 4 INT 9 10 10 0 1 - t322 a 4 INT 9 10 10 0 1 - t322 b 4 INT 9 10 10 0 1 - t322 c 4 INT 9 10 10 0 1 - t322 d 4 INT 9 10 10 0 1 - t322 e 4 INT 9 10 10 0 1 - t323 a 4 INT 9 10 10 0 1 - t323 b 4 INT 9 10 10 0 1 - t323 c 4 INT 9 10 10 0 1 - t323 d 4 INT 9 10 10 0 1 - t323 e 4 INT 9 10 10 0 1 - t324 a 4 INT 9 10 10 0 1 - t324 b 4 INT 9 10 10 0 1 - t324 c 4 INT 9 10 10 0 1 - t324 d 4 INT 9 10 10 0 1 - t324 e 4 INT 9 10 10 0 1 - t325 a 4 INT 9 10 10 0 1 - t325 b 4 INT 9 10 10 0 1 - t325 c 4 INT 9 10 10 0 1 - t325 d 4 INT 9 10 10 0 1 - t325 e 4 INT 9 10 10 0 1 - t326 a 4 INT 9 10 10 0 1 - t326 b 4 INT 9 10 10 0 1 - t326 c 4 INT 9 10 10 0 1 - t326 d 4 INT 9 10 10 0 1 - t326 e 4 INT 9 10 10 0 1 - t327 a 4 INT 9 10 10 0 1 - t327 b 4 INT 9 10 10 0 1 - t327 c 4 INT 9 10 10 0 1 - t327 d 4 INT 9 10 10 0 1 - t327 e 4 INT 9 10 10 0 1 - t328 a 4 INT 9 10 10 0 1 - t328 b 4 INT 9 10 10 0 1 - t328 c 4 INT 9 10 10 0 1 - t328 d 4 INT 9 10 10 0 1 - t328 e 4 INT 9 10 10 0 1 - t329 a 4 INT 9 10 10 0 1 - t329 b 4 INT 9 10 10 0 1 - t329 c 4 INT 9 10 10 0 1 - t329 d 4 INT 9 10 10 0 1 - t329 e 4 INT 9 10 10 0 1 - t330 a 4 INT 9 10 10 0 1 - t330 b 4 INT 9 10 10 0 1 - t330 c 4 INT 9 10 10 0 1 - t330 d 4 INT 9 10 10 0 1 - t330 e 4 INT 9 10 10 0 1 - t331 a 4 INT 9 10 10 0 1 - t331 b 4 INT 9 10 10 0 1 - t331 c 4 INT 9 10 10 0 1 - t331 d 4 INT 9 10 10 0 1 - t331 e 4 INT 9 10 10 0 1 - t332 a 4 INT 9 10 10 0 1 - t332 b 4 INT 9 10 10 0 1 - t332 c 4 INT 9 10 10 0 1 - t332 d 4 INT 9 10 10 0 1 - t332 e 4 INT 9 10 10 0 1 - t333 a 4 INT 9 10 10 0 1 - t333 b 4 INT 9 10 10 0 1 - t333 c 4 INT 9 10 10 0 1 - t333 d 4 INT 9 10 10 0 1 - t333 e 4 INT 9 10 10 0 1 - t334 a 4 INT 9 10 10 0 1 - t334 b 4 INT 9 10 10 0 1 - t334 c 4 INT 9 10 10 0 1 - t334 d 4 INT 9 10 10 0 1 - t334 e 4 INT 9 10 10 0 1 - t335 a 4 INT 9 10 10 0 1 - t335 b 4 INT 9 10 10 0 1 - t335 c 4 INT 9 10 10 0 1 - t335 d 4 INT 9 10 10 0 1 - t335 e 4 INT 9 10 10 0 1 - t336 a 4 INT 9 10 10 0 1 - t336 b 4 INT 9 10 10 0 1 - t336 c 4 INT 9 10 10 0 1 - t336 d 4 INT 9 10 10 0 1 - t336 e 4 INT 9 10 10 0 1 - t337 a 4 INT 9 10 10 0 1 - t337 b 4 INT 9 10 10 0 1 - t337 c 4 INT 9 10 10 0 1 - t337 d 4 INT 9 10 10 0 1 - t337 e 4 INT 9 10 10 0 1 - t338 a 4 INT 9 10 10 0 1 - t338 b 4 INT 9 10 10 0 1 - t338 c 4 INT 9 10 10 0 1 - t338 d 4 INT 9 10 10 0 1 - t338 e 4 INT 9 10 10 0 1 - t339 a 4 INT 9 10 10 0 1 - t339 b 4 INT 9 10 10 0 1 - t339 c 4 INT 9 10 10 0 1 - t339 d 4 INT 9 10 10 0 1 - t339 e 4 INT 9 10 10 0 1 - t340 a 4 INT 9 10 10 0 1 - t340 b 4 INT 9 10 10 0 1 - t340 c 4 INT 9 10 10 0 1 - t340 d 4 INT 9 10 10 0 1 - t340 e 4 INT 9 10 10 0 1 - t341 a 4 INT 9 10 10 0 1 - t341 b 4 INT 9 10 10 0 1 - t341 c 4 INT 9 10 10 0 1 - t341 d 4 INT 9 10 10 0 1 - t341 e 4 INT 9 10 10 0 1 - t342 a 4 INT 9 10 10 0 1 - t342 b 4 INT 9 10 10 0 1 - t342 c 4 INT 9 10 10 0 1 - t342 d 4 INT 9 10 10 0 1 - t342 e 4 INT 9 10 10 0 1 - t343 a 4 INT 9 10 10 0 1 - t343 b 4 INT 9 10 10 0 1 - t343 c 4 INT 9 10 10 0 1 - t343 d 4 INT 9 10 10 0 1 - t343 e 4 INT 9 10 10 0 1 - t344 a 4 INT 9 10 10 0 1 - t344 b 4 INT 9 10 10 0 1 - t344 c 4 INT 9 10 10 0 1 - t344 d 4 INT 9 10 10 0 1 - t344 e 4 INT 9 10 10 0 1 - t345 a 4 INT 9 10 10 0 1 - t345 b 4 INT 9 10 10 0 1 - t345 c 4 INT 9 10 10 0 1 - t345 d 4 INT 9 10 10 0 1 - t345 e 4 INT 9 10 10 0 1 - t346 a 4 INT 9 10 10 0 1 - t346 b 4 INT 9 10 10 0 1 - t346 c 4 INT 9 10 10 0 1 - t346 d 4 INT 9 10 10 0 1 - t346 e 4 INT 9 10 10 0 1 - t347 a 4 INT 9 10 10 0 1 - t347 b 4 INT 9 10 10 0 1 - t347 c 4 INT 9 10 10 0 1 - t347 d 4 INT 9 10 10 0 1 - t347 e 4 INT 9 10 10 0 1 - t348 a 4 INT 9 10 10 0 1 - t348 b 4 INT 9 10 10 0 1 - t348 c 4 INT 9 10 10 0 1 - t348 d 4 INT 9 10 10 0 1 - t348 e 4 INT 9 10 10 0 1 - t349 a 4 INT 9 10 10 0 1 - t349 b 4 INT 9 10 10 0 1 - t349 c 4 INT 9 10 10 0 1 - t349 d 4 INT 9 10 10 0 1 - t349 e 4 INT 9 10 10 0 1 - t350 a 4 INT 9 10 10 0 1 - t350 b 4 INT 9 10 10 0 1 - t350 c 4 INT 9 10 10 0 1 - t350 d 4 INT 9 10 10 0 1 - t350 e 4 INT 9 10 10 0 1 - t351 a 4 INT 9 10 10 0 1 - t351 b 4 INT 9 10 10 0 1 - t351 c 4 INT 9 10 10 0 1 - t351 d 4 INT 9 10 10 0 1 - t351 e 4 INT 9 10 10 0 1 - t352 a 4 INT 9 10 10 0 1 - t352 b 4 INT 9 10 10 0 1 - t352 c 4 INT 9 10 10 0 1 - t352 d 4 INT 9 10 10 0 1 - t352 e 4 INT 9 10 10 0 1 - t353 a 4 INT 9 10 10 0 1 - t353 b 4 INT 9 10 10 0 1 - t353 c 4 INT 9 10 10 0 1 - t353 d 4 INT 9 10 10 0 1 - t353 e 4 INT 9 10 10 0 1 - t354 a 4 INT 9 10 10 0 1 - t354 b 4 INT 9 10 10 0 1 - t354 c 4 INT 9 10 10 0 1 - t354 d 4 INT 9 10 10 0 1 - t354 e 4 INT 9 10 10 0 1 - t355 a 4 INT 9 10 10 0 1 - t355 b 4 INT 9 10 10 0 1 - t355 c 4 INT 9 10 10 0 1 - t355 d 4 INT 9 10 10 0 1 - t355 e 4 INT 9 10 10 0 1 - t356 a 4 INT 9 10 10 0 1 - t356 b 4 INT 9 10 10 0 1 - t356 c 4 INT 9 10 10 0 1 - t356 d 4 INT 9 10 10 0 1 - t356 e 4 INT 9 10 10 0 1 - t357 a 4 INT 9 10 10 0 1 - t357 b 4 INT 9 10 10 0 1 - t357 c 4 INT 9 10 10 0 1 - t357 d 4 INT 9 10 10 0 1 - t357 e 4 INT 9 10 10 0 1 - t358 a 4 INT 9 10 10 0 1 - t358 b 4 INT 9 10 10 0 1 - t358 c 4 INT 9 10 10 0 1 - t358 d 4 INT 9 10 10 0 1 - t358 e 4 INT 9 10 10 0 1 - t359 a 4 INT 9 10 10 0 1 - t359 b 4 INT 9 10 10 0 1 - t359 c 4 INT 9 10 10 0 1 - t359 d 4 INT 9 10 10 0 1 - t359 e 4 INT 9 10 10 0 1 - t360 a 4 INT 9 10 10 0 1 - t360 b 4 INT 9 10 10 0 1 - t360 c 4 INT 9 10 10 0 1 - t360 d 4 INT 9 10 10 0 1 - t360 e 4 INT 9 10 10 0 1 - t361 a 4 INT 9 10 10 0 1 - t361 b 4 INT 9 10 10 0 1 - t361 c 4 INT 9 10 10 0 1 - t361 d 4 INT 9 10 10 0 1 - t361 e 4 INT 9 10 10 0 1 - t362 a 4 INT 9 10 10 0 1 - t362 b 4 INT 9 10 10 0 1 - t362 c 4 INT 9 10 10 0 1 - t362 d 4 INT 9 10 10 0 1 - t362 e 4 INT 9 10 10 0 1 - t363 a 4 INT 9 10 10 0 1 - t363 b 4 INT 9 10 10 0 1 - t363 c 4 INT 9 10 10 0 1 - t363 d 4 INT 9 10 10 0 1 - t363 e 4 INT 9 10 10 0 1 - t364 a 4 INT 9 10 10 0 1 - t364 b 4 INT 9 10 10 0 1 - t364 c 4 INT 9 10 10 0 1 - t364 d 4 INT 9 10 10 0 1 - t364 e 4 INT 9 10 10 0 1 - t365 a 4 INT 9 10 10 0 1 - t365 b 4 INT 9 10 10 0 1 - t365 c 4 INT 9 10 10 0 1 - t365 d 4 INT 9 10 10 0 1 - t365 e 4 INT 9 10 10 0 1 - t366 a 4 INT 9 10 10 0 1 - t366 b 4 INT 9 10 10 0 1 - t366 c 4 INT 9 10 10 0 1 - t366 d 4 INT 9 10 10 0 1 - t366 e 4 INT 9 10 10 0 1 - t367 a 4 INT 9 10 10 0 1 - t367 b 4 INT 9 10 10 0 1 - t367 c 4 INT 9 10 10 0 1 - t367 d 4 INT 9 10 10 0 1 - t367 e 4 INT 9 10 10 0 1 - t368 a 4 INT 9 10 10 0 1 - t368 b 4 INT 9 10 10 0 1 - t368 c 4 INT 9 10 10 0 1 - t368 d 4 INT 9 10 10 0 1 - t368 e 4 INT 9 10 10 0 1 - t369 a 4 INT 9 10 10 0 1 - t369 b 4 INT 9 10 10 0 1 - t369 c 4 INT 9 10 10 0 1 - t369 d 4 INT 9 10 10 0 1 - t369 e 4 INT 9 10 10 0 1 - t370 a 4 INT 9 10 10 0 1 - t370 b 4 INT 9 10 10 0 1 - t370 c 4 INT 9 10 10 0 1 - t370 d 4 INT 9 10 10 0 1 - t370 e 4 INT 9 10 10 0 1 - t371 a 4 INT 9 10 10 0 1 - t371 b 4 INT 9 10 10 0 1 - t371 c 4 INT 9 10 10 0 1 - t371 d 4 INT 9 10 10 0 1 - t371 e 4 INT 9 10 10 0 1 - t372 a 4 INT 9 10 10 0 1 - t372 b 4 INT 9 10 10 0 1 - t372 c 4 INT 9 10 10 0 1 - t372 d 4 INT 9 10 10 0 1 - t372 e 4 INT 9 10 10 0 1 - t373 a 4 INT 9 10 10 0 1 - t373 b 4 INT 9 10 10 0 1 - t373 c 4 INT 9 10 10 0 1 - t373 d 4 INT 9 10 10 0 1 - t373 e 4 INT 9 10 10 0 1 - t374 a 4 INT 9 10 10 0 1 - t374 b 4 INT 9 10 10 0 1 - t374 c 4 INT 9 10 10 0 1 - t374 d 4 INT 9 10 10 0 1 - t374 e 4 INT 9 10 10 0 1 - t375 a 4 INT 9 10 10 0 1 - t375 b 4 INT 9 10 10 0 1 - t375 c 4 INT 9 10 10 0 1 - t375 d 4 INT 9 10 10 0 1 - t375 e 4 INT 9 10 10 0 1 - t376 a 4 INT 9 10 10 0 1 - t376 b 4 INT 9 10 10 0 1 - t376 c 4 INT 9 10 10 0 1 - t376 d 4 INT 9 10 10 0 1 - t376 e 4 INT 9 10 10 0 1 - t377 a 4 INT 9 10 10 0 1 - t377 b 4 INT 9 10 10 0 1 - t377 c 4 INT 9 10 10 0 1 - t377 d 4 INT 9 10 10 0 1 - t377 e 4 INT 9 10 10 0 1 - t378 a 4 INT 9 10 10 0 1 - t378 b 4 INT 9 10 10 0 1 - t378 c 4 INT 9 10 10 0 1 - t378 d 4 INT 9 10 10 0 1 - t378 e 4 INT 9 10 10 0 1 - t379 a 4 INT 9 10 10 0 1 - t379 b 4 INT 9 10 10 0 1 - t379 c 4 INT 9 10 10 0 1 - t379 d 4 INT 9 10 10 0 1 - t379 e 4 INT 9 10 10 0 1 - t380 a 4 INT 9 10 10 0 1 - t380 b 4 INT 9 10 10 0 1 - t380 c 4 INT 9 10 10 0 1 - t380 d 4 INT 9 10 10 0 1 - t380 e 4 INT 9 10 10 0 1 - t381 a 4 INT 9 10 10 0 1 - t381 b 4 INT 9 10 10 0 1 - t381 c 4 INT 9 10 10 0 1 - t381 d 4 INT 9 10 10 0 1 - t381 e 4 INT 9 10 10 0 1 - t382 a 4 INT 9 10 10 0 1 - t382 b 4 INT 9 10 10 0 1 - t382 c 4 INT 9 10 10 0 1 - t382 d 4 INT 9 10 10 0 1 - t382 e 4 INT 9 10 10 0 1 - t383 a 4 INT 9 10 10 0 1 - t383 b 4 INT 9 10 10 0 1 - t383 c 4 INT 9 10 10 0 1 - t383 d 4 INT 9 10 10 0 1 - t383 e 4 INT 9 10 10 0 1 - t384 a 4 INT 9 10 10 0 1 - t384 b 4 INT 9 10 10 0 1 - t384 c 4 INT 9 10 10 0 1 - t384 d 4 INT 9 10 10 0 1 - t384 e 4 INT 9 10 10 0 1 - t385 a 4 INT 9 10 10 0 1 - t385 b 4 INT 9 10 10 0 1 - t385 c 4 INT 9 10 10 0 1 - t385 d 4 INT 9 10 10 0 1 - t385 e 4 INT 9 10 10 0 1 - t386 a 4 INT 9 10 10 0 1 - t386 b 4 INT 9 10 10 0 1 - t386 c 4 INT 9 10 10 0 1 - t386 d 4 INT 9 10 10 0 1 - t386 e 4 INT 9 10 10 0 1 - t387 a 4 INT 9 10 10 0 1 - t387 b 4 INT 9 10 10 0 1 - t387 c 4 INT 9 10 10 0 1 - t387 d 4 INT 9 10 10 0 1 - t387 e 4 INT 9 10 10 0 1 - t388 a 4 INT 9 10 10 0 1 - t388 b 4 INT 9 10 10 0 1 - t388 c 4 INT 9 10 10 0 1 - t388 d 4 INT 9 10 10 0 1 - t388 e 4 INT 9 10 10 0 1 - t389 a 4 INT 9 10 10 0 1 - t389 b 4 INT 9 10 10 0 1 - t389 c 4 INT 9 10 10 0 1 - t389 d 4 INT 9 10 10 0 1 - t389 e 4 INT 9 10 10 0 1 - t390 a 4 INT 9 10 10 0 1 - t390 b 4 INT 9 10 10 0 1 - t390 c 4 INT 9 10 10 0 1 - t390 d 4 INT 9 10 10 0 1 - t390 e 4 INT 9 10 10 0 1 - t391 a 4 INT 9 10 10 0 1 - t391 b 4 INT 9 10 10 0 1 - t391 c 4 INT 9 10 10 0 1 - t391 d 4 INT 9 10 10 0 1 - t391 e 4 INT 9 10 10 0 1 - t392 a 4 INT 9 10 10 0 1 - t392 b 4 INT 9 10 10 0 1 - t392 c 4 INT 9 10 10 0 1 - t392 d 4 INT 9 10 10 0 1 - t392 e 4 INT 9 10 10 0 1 - t393 a 4 INT 9 10 10 0 1 - t393 b 4 INT 9 10 10 0 1 - t393 c 4 INT 9 10 10 0 1 - t393 d 4 INT 9 10 10 0 1 - t393 e 4 INT 9 10 10 0 1 - t394 a 4 INT 9 10 10 0 1 - t394 b 4 INT 9 10 10 0 1 - t394 c 4 INT 9 10 10 0 1 - t394 d 4 INT 9 10 10 0 1 - t394 e 4 INT 9 10 10 0 1 - t395 a 4 INT 9 10 10 0 1 - t395 b 4 INT 9 10 10 0 1 - t395 c 4 INT 9 10 10 0 1 - t395 d 4 INT 9 10 10 0 1 - t395 e 4 INT 9 10 10 0 1 - t396 a 4 INT 9 10 10 0 1 - t396 b 4 INT 9 10 10 0 1 - t396 c 4 INT 9 10 10 0 1 - t396 d 4 INT 9 10 10 0 1 - t396 e 4 INT 9 10 10 0 1 - t397 a 4 INT 9 10 10 0 1 - t397 b 4 INT 9 10 10 0 1 - t397 c 4 INT 9 10 10 0 1 - t397 d 4 INT 9 10 10 0 1 - t397 e 4 INT 9 10 10 0 1 - t398 a 4 INT 9 10 10 0 1 - t398 b 4 INT 9 10 10 0 1 - t398 c 4 INT 9 10 10 0 1 - t398 d 4 INT 9 10 10 0 1 - t398 e 4 INT 9 10 10 0 1 - t399 a 4 INT 9 10 10 0 1 - t399 b 4 INT 9 10 10 0 1 - t399 c 4 INT 9 10 10 0 1 - t399 d 4 INT 9 10 10 0 1 - t399 e 4 INT 9 10 10 0 1 + t000 a 4 INT 9 10 10 0 1 NULL + t000 b 4 INT 9 10 10 0 1 NULL + t000 c 4 INT 9 10 10 0 1 NULL + t000 d 4 INT 9 10 10 0 1 NULL + t000 e 4 INT 9 10 10 0 1 NULL + t001 a 4 INT 9 10 10 0 1 NULL + t001 b 4 INT 9 10 10 0 1 NULL + t001 c 4 INT 9 10 10 0 1 NULL + t001 d 4 INT 9 10 10 0 1 NULL + t001 e 4 INT 9 10 10 0 1 NULL + t002 a 4 INT 9 10 10 0 1 NULL + t002 b 4 INT 9 10 10 0 1 NULL + t002 c 4 INT 9 10 10 0 1 NULL + t002 d 4 INT 9 10 10 0 1 NULL + t002 e 4 INT 9 10 10 0 1 NULL + t003 a 4 INT 9 10 10 0 1 NULL + t003 b 4 INT 9 10 10 0 1 NULL + t003 c 4 INT 9 10 10 0 1 NULL + t003 d 4 INT 9 10 10 0 1 NULL + t003 e 4 INT 9 10 10 0 1 NULL + t004 a 4 INT 9 10 10 0 1 NULL + t004 b 4 INT 9 10 10 0 1 NULL + t004 c 4 INT 9 10 10 0 1 NULL + t004 d 4 INT 9 10 10 0 1 NULL + t004 e 4 INT 9 10 10 0 1 NULL + t005 a 4 INT 9 10 10 0 1 NULL + t005 b 4 INT 9 10 10 0 1 NULL + t005 c 4 INT 9 10 10 0 1 NULL + t005 d 4 INT 9 10 10 0 1 NULL + t005 e 4 INT 9 10 10 0 1 NULL + t006 a 4 INT 9 10 10 0 1 NULL + t006 b 4 INT 9 10 10 0 1 NULL + t006 c 4 INT 9 10 10 0 1 NULL + t006 d 4 INT 9 10 10 0 1 NULL + t006 e 4 INT 9 10 10 0 1 NULL + t007 a 4 INT 9 10 10 0 1 NULL + t007 b 4 INT 9 10 10 0 1 NULL + t007 c 4 INT 9 10 10 0 1 NULL + t007 d 4 INT 9 10 10 0 1 NULL + t007 e 4 INT 9 10 10 0 1 NULL + t008 a 4 INT 9 10 10 0 1 NULL + t008 b 4 INT 9 10 10 0 1 NULL + t008 c 4 INT 9 10 10 0 1 NULL + t008 d 4 INT 9 10 10 0 1 NULL + t008 e 4 INT 9 10 10 0 1 NULL + t009 a 4 INT 9 10 10 0 1 NULL + t009 b 4 INT 9 10 10 0 1 NULL + t009 c 4 INT 9 10 10 0 1 NULL + t009 d 4 INT 9 10 10 0 1 NULL + t009 e 4 INT 9 10 10 0 1 NULL + t010 a 4 INT 9 10 10 0 1 NULL + t010 b 4 INT 9 10 10 0 1 NULL + t010 c 4 INT 9 10 10 0 1 NULL + t010 d 4 INT 9 10 10 0 1 NULL + t010 e 4 INT 9 10 10 0 1 NULL + t011 a 4 INT 9 10 10 0 1 NULL + t011 b 4 INT 9 10 10 0 1 NULL + t011 c 4 INT 9 10 10 0 1 NULL + t011 d 4 INT 9 10 10 0 1 NULL + t011 e 4 INT 9 10 10 0 1 NULL + t012 a 4 INT 9 10 10 0 1 NULL + t012 b 4 INT 9 10 10 0 1 NULL + t012 c 4 INT 9 10 10 0 1 NULL + t012 d 4 INT 9 10 10 0 1 NULL + t012 e 4 INT 9 10 10 0 1 NULL + t013 a 4 INT 9 10 10 0 1 NULL + t013 b 4 INT 9 10 10 0 1 NULL + t013 c 4 INT 9 10 10 0 1 NULL + t013 d 4 INT 9 10 10 0 1 NULL + t013 e 4 INT 9 10 10 0 1 NULL + t014 a 4 INT 9 10 10 0 1 NULL + t014 b 4 INT 9 10 10 0 1 NULL + t014 c 4 INT 9 10 10 0 1 NULL + t014 d 4 INT 9 10 10 0 1 NULL + t014 e 4 INT 9 10 10 0 1 NULL + t015 a 4 INT 9 10 10 0 1 NULL + t015 b 4 INT 9 10 10 0 1 NULL + t015 c 4 INT 9 10 10 0 1 NULL + t015 d 4 INT 9 10 10 0 1 NULL + t015 e 4 INT 9 10 10 0 1 NULL + t016 a 4 INT 9 10 10 0 1 NULL + t016 b 4 INT 9 10 10 0 1 NULL + t016 c 4 INT 9 10 10 0 1 NULL + t016 d 4 INT 9 10 10 0 1 NULL + t016 e 4 INT 9 10 10 0 1 NULL + t017 a 4 INT 9 10 10 0 1 NULL + t017 b 4 INT 9 10 10 0 1 NULL + t017 c 4 INT 9 10 10 0 1 NULL + t017 d 4 INT 9 10 10 0 1 NULL + t017 e 4 INT 9 10 10 0 1 NULL + t018 a 4 INT 9 10 10 0 1 NULL + t018 b 4 INT 9 10 10 0 1 NULL + t018 c 4 INT 9 10 10 0 1 NULL + t018 d 4 INT 9 10 10 0 1 NULL + t018 e 4 INT 9 10 10 0 1 NULL + t019 a 4 INT 9 10 10 0 1 NULL + t019 b 4 INT 9 10 10 0 1 NULL + t019 c 4 INT 9 10 10 0 1 NULL + t019 d 4 INT 9 10 10 0 1 NULL + t019 e 4 INT 9 10 10 0 1 NULL + t020 a 4 INT 9 10 10 0 1 NULL + t020 b 4 INT 9 10 10 0 1 NULL + t020 c 4 INT 9 10 10 0 1 NULL + t020 d 4 INT 9 10 10 0 1 NULL + t020 e 4 INT 9 10 10 0 1 NULL + t021 a 4 INT 9 10 10 0 1 NULL + t021 b 4 INT 9 10 10 0 1 NULL + t021 c 4 INT 9 10 10 0 1 NULL + t021 d 4 INT 9 10 10 0 1 NULL + t021 e 4 INT 9 10 10 0 1 NULL + t022 a 4 INT 9 10 10 0 1 NULL + t022 b 4 INT 9 10 10 0 1 NULL + t022 c 4 INT 9 10 10 0 1 NULL + t022 d 4 INT 9 10 10 0 1 NULL + t022 e 4 INT 9 10 10 0 1 NULL + t023 a 4 INT 9 10 10 0 1 NULL + t023 b 4 INT 9 10 10 0 1 NULL + t023 c 4 INT 9 10 10 0 1 NULL + t023 d 4 INT 9 10 10 0 1 NULL + t023 e 4 INT 9 10 10 0 1 NULL + t024 a 4 INT 9 10 10 0 1 NULL + t024 b 4 INT 9 10 10 0 1 NULL + t024 c 4 INT 9 10 10 0 1 NULL + t024 d 4 INT 9 10 10 0 1 NULL + t024 e 4 INT 9 10 10 0 1 NULL + t025 a 4 INT 9 10 10 0 1 NULL + t025 b 4 INT 9 10 10 0 1 NULL + t025 c 4 INT 9 10 10 0 1 NULL + t025 d 4 INT 9 10 10 0 1 NULL + t025 e 4 INT 9 10 10 0 1 NULL + t026 a 4 INT 9 10 10 0 1 NULL + t026 b 4 INT 9 10 10 0 1 NULL + t026 c 4 INT 9 10 10 0 1 NULL + t026 d 4 INT 9 10 10 0 1 NULL + t026 e 4 INT 9 10 10 0 1 NULL + t027 a 4 INT 9 10 10 0 1 NULL + t027 b 4 INT 9 10 10 0 1 NULL + t027 c 4 INT 9 10 10 0 1 NULL + t027 d 4 INT 9 10 10 0 1 NULL + t027 e 4 INT 9 10 10 0 1 NULL + t028 a 4 INT 9 10 10 0 1 NULL + t028 b 4 INT 9 10 10 0 1 NULL + t028 c 4 INT 9 10 10 0 1 NULL + t028 d 4 INT 9 10 10 0 1 NULL + t028 e 4 INT 9 10 10 0 1 NULL + t029 a 4 INT 9 10 10 0 1 NULL + t029 b 4 INT 9 10 10 0 1 NULL + t029 c 4 INT 9 10 10 0 1 NULL + t029 d 4 INT 9 10 10 0 1 NULL + t029 e 4 INT 9 10 10 0 1 NULL + t030 a 4 INT 9 10 10 0 1 NULL + t030 b 4 INT 9 10 10 0 1 NULL + t030 c 4 INT 9 10 10 0 1 NULL + t030 d 4 INT 9 10 10 0 1 NULL + t030 e 4 INT 9 10 10 0 1 NULL + t031 a 4 INT 9 10 10 0 1 NULL + t031 b 4 INT 9 10 10 0 1 NULL + t031 c 4 INT 9 10 10 0 1 NULL + t031 d 4 INT 9 10 10 0 1 NULL + t031 e 4 INT 9 10 10 0 1 NULL + t032 a 4 INT 9 10 10 0 1 NULL + t032 b 4 INT 9 10 10 0 1 NULL + t032 c 4 INT 9 10 10 0 1 NULL + t032 d 4 INT 9 10 10 0 1 NULL + t032 e 4 INT 9 10 10 0 1 NULL + t033 a 4 INT 9 10 10 0 1 NULL + t033 b 4 INT 9 10 10 0 1 NULL + t033 c 4 INT 9 10 10 0 1 NULL + t033 d 4 INT 9 10 10 0 1 NULL + t033 e 4 INT 9 10 10 0 1 NULL + t034 a 4 INT 9 10 10 0 1 NULL + t034 b 4 INT 9 10 10 0 1 NULL + t034 c 4 INT 9 10 10 0 1 NULL + t034 d 4 INT 9 10 10 0 1 NULL + t034 e 4 INT 9 10 10 0 1 NULL + t035 a 4 INT 9 10 10 0 1 NULL + t035 b 4 INT 9 10 10 0 1 NULL + t035 c 4 INT 9 10 10 0 1 NULL + t035 d 4 INT 9 10 10 0 1 NULL + t035 e 4 INT 9 10 10 0 1 NULL + t036 a 4 INT 9 10 10 0 1 NULL + t036 b 4 INT 9 10 10 0 1 NULL + t036 c 4 INT 9 10 10 0 1 NULL + t036 d 4 INT 9 10 10 0 1 NULL + t036 e 4 INT 9 10 10 0 1 NULL + t037 a 4 INT 9 10 10 0 1 NULL + t037 b 4 INT 9 10 10 0 1 NULL + t037 c 4 INT 9 10 10 0 1 NULL + t037 d 4 INT 9 10 10 0 1 NULL + t037 e 4 INT 9 10 10 0 1 NULL + t038 a 4 INT 9 10 10 0 1 NULL + t038 b 4 INT 9 10 10 0 1 NULL + t038 c 4 INT 9 10 10 0 1 NULL + t038 d 4 INT 9 10 10 0 1 NULL + t038 e 4 INT 9 10 10 0 1 NULL + t039 a 4 INT 9 10 10 0 1 NULL + t039 b 4 INT 9 10 10 0 1 NULL + t039 c 4 INT 9 10 10 0 1 NULL + t039 d 4 INT 9 10 10 0 1 NULL + t039 e 4 INT 9 10 10 0 1 NULL + t040 a 4 INT 9 10 10 0 1 NULL + t040 b 4 INT 9 10 10 0 1 NULL + t040 c 4 INT 9 10 10 0 1 NULL + t040 d 4 INT 9 10 10 0 1 NULL + t040 e 4 INT 9 10 10 0 1 NULL + t041 a 4 INT 9 10 10 0 1 NULL + t041 b 4 INT 9 10 10 0 1 NULL + t041 c 4 INT 9 10 10 0 1 NULL + t041 d 4 INT 9 10 10 0 1 NULL + t041 e 4 INT 9 10 10 0 1 NULL + t042 a 4 INT 9 10 10 0 1 NULL + t042 b 4 INT 9 10 10 0 1 NULL + t042 c 4 INT 9 10 10 0 1 NULL + t042 d 4 INT 9 10 10 0 1 NULL + t042 e 4 INT 9 10 10 0 1 NULL + t043 a 4 INT 9 10 10 0 1 NULL + t043 b 4 INT 9 10 10 0 1 NULL + t043 c 4 INT 9 10 10 0 1 NULL + t043 d 4 INT 9 10 10 0 1 NULL + t043 e 4 INT 9 10 10 0 1 NULL + t044 a 4 INT 9 10 10 0 1 NULL + t044 b 4 INT 9 10 10 0 1 NULL + t044 c 4 INT 9 10 10 0 1 NULL + t044 d 4 INT 9 10 10 0 1 NULL + t044 e 4 INT 9 10 10 0 1 NULL + t045 a 4 INT 9 10 10 0 1 NULL + t045 b 4 INT 9 10 10 0 1 NULL + t045 c 4 INT 9 10 10 0 1 NULL + t045 d 4 INT 9 10 10 0 1 NULL + t045 e 4 INT 9 10 10 0 1 NULL + t046 a 4 INT 9 10 10 0 1 NULL + t046 b 4 INT 9 10 10 0 1 NULL + t046 c 4 INT 9 10 10 0 1 NULL + t046 d 4 INT 9 10 10 0 1 NULL + t046 e 4 INT 9 10 10 0 1 NULL + t047 a 4 INT 9 10 10 0 1 NULL + t047 b 4 INT 9 10 10 0 1 NULL + t047 c 4 INT 9 10 10 0 1 NULL + t047 d 4 INT 9 10 10 0 1 NULL + t047 e 4 INT 9 10 10 0 1 NULL + t048 a 4 INT 9 10 10 0 1 NULL + t048 b 4 INT 9 10 10 0 1 NULL + t048 c 4 INT 9 10 10 0 1 NULL + t048 d 4 INT 9 10 10 0 1 NULL + t048 e 4 INT 9 10 10 0 1 NULL + t049 a 4 INT 9 10 10 0 1 NULL + t049 b 4 INT 9 10 10 0 1 NULL + t049 c 4 INT 9 10 10 0 1 NULL + t049 d 4 INT 9 10 10 0 1 NULL + t049 e 4 INT 9 10 10 0 1 NULL + t050 a 4 INT 9 10 10 0 1 NULL + t050 b 4 INT 9 10 10 0 1 NULL + t050 c 4 INT 9 10 10 0 1 NULL + t050 d 4 INT 9 10 10 0 1 NULL + t050 e 4 INT 9 10 10 0 1 NULL + t051 a 4 INT 9 10 10 0 1 NULL + t051 b 4 INT 9 10 10 0 1 NULL + t051 c 4 INT 9 10 10 0 1 NULL + t051 d 4 INT 9 10 10 0 1 NULL + t051 e 4 INT 9 10 10 0 1 NULL + t052 a 4 INT 9 10 10 0 1 NULL + t052 b 4 INT 9 10 10 0 1 NULL + t052 c 4 INT 9 10 10 0 1 NULL + t052 d 4 INT 9 10 10 0 1 NULL + t052 e 4 INT 9 10 10 0 1 NULL + t053 a 4 INT 9 10 10 0 1 NULL + t053 b 4 INT 9 10 10 0 1 NULL + t053 c 4 INT 9 10 10 0 1 NULL + t053 d 4 INT 9 10 10 0 1 NULL + t053 e 4 INT 9 10 10 0 1 NULL + t054 a 4 INT 9 10 10 0 1 NULL + t054 b 4 INT 9 10 10 0 1 NULL + t054 c 4 INT 9 10 10 0 1 NULL + t054 d 4 INT 9 10 10 0 1 NULL + t054 e 4 INT 9 10 10 0 1 NULL + t055 a 4 INT 9 10 10 0 1 NULL + t055 b 4 INT 9 10 10 0 1 NULL + t055 c 4 INT 9 10 10 0 1 NULL + t055 d 4 INT 9 10 10 0 1 NULL + t055 e 4 INT 9 10 10 0 1 NULL + t056 a 4 INT 9 10 10 0 1 NULL + t056 b 4 INT 9 10 10 0 1 NULL + t056 c 4 INT 9 10 10 0 1 NULL + t056 d 4 INT 9 10 10 0 1 NULL + t056 e 4 INT 9 10 10 0 1 NULL + t057 a 4 INT 9 10 10 0 1 NULL + t057 b 4 INT 9 10 10 0 1 NULL + t057 c 4 INT 9 10 10 0 1 NULL + t057 d 4 INT 9 10 10 0 1 NULL + t057 e 4 INT 9 10 10 0 1 NULL + t058 a 4 INT 9 10 10 0 1 NULL + t058 b 4 INT 9 10 10 0 1 NULL + t058 c 4 INT 9 10 10 0 1 NULL + t058 d 4 INT 9 10 10 0 1 NULL + t058 e 4 INT 9 10 10 0 1 NULL + t059 a 4 INT 9 10 10 0 1 NULL + t059 b 4 INT 9 10 10 0 1 NULL + t059 c 4 INT 9 10 10 0 1 NULL + t059 d 4 INT 9 10 10 0 1 NULL + t059 e 4 INT 9 10 10 0 1 NULL + t060 a 4 INT 9 10 10 0 1 NULL + t060 b 4 INT 9 10 10 0 1 NULL + t060 c 4 INT 9 10 10 0 1 NULL + t060 d 4 INT 9 10 10 0 1 NULL + t060 e 4 INT 9 10 10 0 1 NULL + t061 a 4 INT 9 10 10 0 1 NULL + t061 b 4 INT 9 10 10 0 1 NULL + t061 c 4 INT 9 10 10 0 1 NULL + t061 d 4 INT 9 10 10 0 1 NULL + t061 e 4 INT 9 10 10 0 1 NULL + t062 a 4 INT 9 10 10 0 1 NULL + t062 b 4 INT 9 10 10 0 1 NULL + t062 c 4 INT 9 10 10 0 1 NULL + t062 d 4 INT 9 10 10 0 1 NULL + t062 e 4 INT 9 10 10 0 1 NULL + t063 a 4 INT 9 10 10 0 1 NULL + t063 b 4 INT 9 10 10 0 1 NULL + t063 c 4 INT 9 10 10 0 1 NULL + t063 d 4 INT 9 10 10 0 1 NULL + t063 e 4 INT 9 10 10 0 1 NULL + t064 a 4 INT 9 10 10 0 1 NULL + t064 b 4 INT 9 10 10 0 1 NULL + t064 c 4 INT 9 10 10 0 1 NULL + t064 d 4 INT 9 10 10 0 1 NULL + t064 e 4 INT 9 10 10 0 1 NULL + t065 a 4 INT 9 10 10 0 1 NULL + t065 b 4 INT 9 10 10 0 1 NULL + t065 c 4 INT 9 10 10 0 1 NULL + t065 d 4 INT 9 10 10 0 1 NULL + t065 e 4 INT 9 10 10 0 1 NULL + t066 a 4 INT 9 10 10 0 1 NULL + t066 b 4 INT 9 10 10 0 1 NULL + t066 c 4 INT 9 10 10 0 1 NULL + t066 d 4 INT 9 10 10 0 1 NULL + t066 e 4 INT 9 10 10 0 1 NULL + t067 a 4 INT 9 10 10 0 1 NULL + t067 b 4 INT 9 10 10 0 1 NULL + t067 c 4 INT 9 10 10 0 1 NULL + t067 d 4 INT 9 10 10 0 1 NULL + t067 e 4 INT 9 10 10 0 1 NULL + t068 a 4 INT 9 10 10 0 1 NULL + t068 b 4 INT 9 10 10 0 1 NULL + t068 c 4 INT 9 10 10 0 1 NULL + t068 d 4 INT 9 10 10 0 1 NULL + t068 e 4 INT 9 10 10 0 1 NULL + t069 a 4 INT 9 10 10 0 1 NULL + t069 b 4 INT 9 10 10 0 1 NULL + t069 c 4 INT 9 10 10 0 1 NULL + t069 d 4 INT 9 10 10 0 1 NULL + t069 e 4 INT 9 10 10 0 1 NULL + t070 a 4 INT 9 10 10 0 1 NULL + t070 b 4 INT 9 10 10 0 1 NULL + t070 c 4 INT 9 10 10 0 1 NULL + t070 d 4 INT 9 10 10 0 1 NULL + t070 e 4 INT 9 10 10 0 1 NULL + t071 a 4 INT 9 10 10 0 1 NULL + t071 b 4 INT 9 10 10 0 1 NULL + t071 c 4 INT 9 10 10 0 1 NULL + t071 d 4 INT 9 10 10 0 1 NULL + t071 e 4 INT 9 10 10 0 1 NULL + t072 a 4 INT 9 10 10 0 1 NULL + t072 b 4 INT 9 10 10 0 1 NULL + t072 c 4 INT 9 10 10 0 1 NULL + t072 d 4 INT 9 10 10 0 1 NULL + t072 e 4 INT 9 10 10 0 1 NULL + t073 a 4 INT 9 10 10 0 1 NULL + t073 b 4 INT 9 10 10 0 1 NULL + t073 c 4 INT 9 10 10 0 1 NULL + t073 d 4 INT 9 10 10 0 1 NULL + t073 e 4 INT 9 10 10 0 1 NULL + t074 a 4 INT 9 10 10 0 1 NULL + t074 b 4 INT 9 10 10 0 1 NULL + t074 c 4 INT 9 10 10 0 1 NULL + t074 d 4 INT 9 10 10 0 1 NULL + t074 e 4 INT 9 10 10 0 1 NULL + t075 a 4 INT 9 10 10 0 1 NULL + t075 b 4 INT 9 10 10 0 1 NULL + t075 c 4 INT 9 10 10 0 1 NULL + t075 d 4 INT 9 10 10 0 1 NULL + t075 e 4 INT 9 10 10 0 1 NULL + t076 a 4 INT 9 10 10 0 1 NULL + t076 b 4 INT 9 10 10 0 1 NULL + t076 c 4 INT 9 10 10 0 1 NULL + t076 d 4 INT 9 10 10 0 1 NULL + t076 e 4 INT 9 10 10 0 1 NULL + t077 a 4 INT 9 10 10 0 1 NULL + t077 b 4 INT 9 10 10 0 1 NULL + t077 c 4 INT 9 10 10 0 1 NULL + t077 d 4 INT 9 10 10 0 1 NULL + t077 e 4 INT 9 10 10 0 1 NULL + t078 a 4 INT 9 10 10 0 1 NULL + t078 b 4 INT 9 10 10 0 1 NULL + t078 c 4 INT 9 10 10 0 1 NULL + t078 d 4 INT 9 10 10 0 1 NULL + t078 e 4 INT 9 10 10 0 1 NULL + t079 a 4 INT 9 10 10 0 1 NULL + t079 b 4 INT 9 10 10 0 1 NULL + t079 c 4 INT 9 10 10 0 1 NULL + t079 d 4 INT 9 10 10 0 1 NULL + t079 e 4 INT 9 10 10 0 1 NULL + t080 a 4 INT 9 10 10 0 1 NULL + t080 b 4 INT 9 10 10 0 1 NULL + t080 c 4 INT 9 10 10 0 1 NULL + t080 d 4 INT 9 10 10 0 1 NULL + t080 e 4 INT 9 10 10 0 1 NULL + t081 a 4 INT 9 10 10 0 1 NULL + t081 b 4 INT 9 10 10 0 1 NULL + t081 c 4 INT 9 10 10 0 1 NULL + t081 d 4 INT 9 10 10 0 1 NULL + t081 e 4 INT 9 10 10 0 1 NULL + t082 a 4 INT 9 10 10 0 1 NULL + t082 b 4 INT 9 10 10 0 1 NULL + t082 c 4 INT 9 10 10 0 1 NULL + t082 d 4 INT 9 10 10 0 1 NULL + t082 e 4 INT 9 10 10 0 1 NULL + t083 a 4 INT 9 10 10 0 1 NULL + t083 b 4 INT 9 10 10 0 1 NULL + t083 c 4 INT 9 10 10 0 1 NULL + t083 d 4 INT 9 10 10 0 1 NULL + t083 e 4 INT 9 10 10 0 1 NULL + t084 a 4 INT 9 10 10 0 1 NULL + t084 b 4 INT 9 10 10 0 1 NULL + t084 c 4 INT 9 10 10 0 1 NULL + t084 d 4 INT 9 10 10 0 1 NULL + t084 e 4 INT 9 10 10 0 1 NULL + t085 a 4 INT 9 10 10 0 1 NULL + t085 b 4 INT 9 10 10 0 1 NULL + t085 c 4 INT 9 10 10 0 1 NULL + t085 d 4 INT 9 10 10 0 1 NULL + t085 e 4 INT 9 10 10 0 1 NULL + t086 a 4 INT 9 10 10 0 1 NULL + t086 b 4 INT 9 10 10 0 1 NULL + t086 c 4 INT 9 10 10 0 1 NULL + t086 d 4 INT 9 10 10 0 1 NULL + t086 e 4 INT 9 10 10 0 1 NULL + t087 a 4 INT 9 10 10 0 1 NULL + t087 b 4 INT 9 10 10 0 1 NULL + t087 c 4 INT 9 10 10 0 1 NULL + t087 d 4 INT 9 10 10 0 1 NULL + t087 e 4 INT 9 10 10 0 1 NULL + t088 a 4 INT 9 10 10 0 1 NULL + t088 b 4 INT 9 10 10 0 1 NULL + t088 c 4 INT 9 10 10 0 1 NULL + t088 d 4 INT 9 10 10 0 1 NULL + t088 e 4 INT 9 10 10 0 1 NULL + t089 a 4 INT 9 10 10 0 1 NULL + t089 b 4 INT 9 10 10 0 1 NULL + t089 c 4 INT 9 10 10 0 1 NULL + t089 d 4 INT 9 10 10 0 1 NULL + t089 e 4 INT 9 10 10 0 1 NULL + t090 a 4 INT 9 10 10 0 1 NULL + t090 b 4 INT 9 10 10 0 1 NULL + t090 c 4 INT 9 10 10 0 1 NULL + t090 d 4 INT 9 10 10 0 1 NULL + t090 e 4 INT 9 10 10 0 1 NULL + t091 a 4 INT 9 10 10 0 1 NULL + t091 b 4 INT 9 10 10 0 1 NULL + t091 c 4 INT 9 10 10 0 1 NULL + t091 d 4 INT 9 10 10 0 1 NULL + t091 e 4 INT 9 10 10 0 1 NULL + t092 a 4 INT 9 10 10 0 1 NULL + t092 b 4 INT 9 10 10 0 1 NULL + t092 c 4 INT 9 10 10 0 1 NULL + t092 d 4 INT 9 10 10 0 1 NULL + t092 e 4 INT 9 10 10 0 1 NULL + t093 a 4 INT 9 10 10 0 1 NULL + t093 b 4 INT 9 10 10 0 1 NULL + t093 c 4 INT 9 10 10 0 1 NULL + t093 d 4 INT 9 10 10 0 1 NULL + t093 e 4 INT 9 10 10 0 1 NULL + t094 a 4 INT 9 10 10 0 1 NULL + t094 b 4 INT 9 10 10 0 1 NULL + t094 c 4 INT 9 10 10 0 1 NULL + t094 d 4 INT 9 10 10 0 1 NULL + t094 e 4 INT 9 10 10 0 1 NULL + t095 a 4 INT 9 10 10 0 1 NULL + t095 b 4 INT 9 10 10 0 1 NULL + t095 c 4 INT 9 10 10 0 1 NULL + t095 d 4 INT 9 10 10 0 1 NULL + t095 e 4 INT 9 10 10 0 1 NULL + t096 a 4 INT 9 10 10 0 1 NULL + t096 b 4 INT 9 10 10 0 1 NULL + t096 c 4 INT 9 10 10 0 1 NULL + t096 d 4 INT 9 10 10 0 1 NULL + t096 e 4 INT 9 10 10 0 1 NULL + t097 a 4 INT 9 10 10 0 1 NULL + t097 b 4 INT 9 10 10 0 1 NULL + t097 c 4 INT 9 10 10 0 1 NULL + t097 d 4 INT 9 10 10 0 1 NULL + t097 e 4 INT 9 10 10 0 1 NULL + t098 a 4 INT 9 10 10 0 1 NULL + t098 b 4 INT 9 10 10 0 1 NULL + t098 c 4 INT 9 10 10 0 1 NULL + t098 d 4 INT 9 10 10 0 1 NULL + t098 e 4 INT 9 10 10 0 1 NULL + t099 a 4 INT 9 10 10 0 1 NULL + t099 b 4 INT 9 10 10 0 1 NULL + t099 c 4 INT 9 10 10 0 1 NULL + t099 d 4 INT 9 10 10 0 1 NULL + t099 e 4 INT 9 10 10 0 1 NULL + t1 a 12 varchar(64) 64 64 10 0 1 NULL + t100 a 4 INT 9 10 10 0 1 NULL + t100 b 4 INT 9 10 10 0 1 NULL + t100 c 4 INT 9 10 10 0 1 NULL + t100 d 4 INT 9 10 10 0 1 NULL + t100 e 4 INT 9 10 10 0 1 NULL + t101 a 4 INT 9 10 10 0 1 NULL + t101 b 4 INT 9 10 10 0 1 NULL + t101 c 4 INT 9 10 10 0 1 NULL + t101 d 4 INT 9 10 10 0 1 NULL + t101 e 4 INT 9 10 10 0 1 NULL + t102 a 4 INT 9 10 10 0 1 NULL + t102 b 4 INT 9 10 10 0 1 NULL + t102 c 4 INT 9 10 10 0 1 NULL + t102 d 4 INT 9 10 10 0 1 NULL + t102 e 4 INT 9 10 10 0 1 NULL + t103 a 4 INT 9 10 10 0 1 NULL + t103 b 4 INT 9 10 10 0 1 NULL + t103 c 4 INT 9 10 10 0 1 NULL + t103 d 4 INT 9 10 10 0 1 NULL + t103 e 4 INT 9 10 10 0 1 NULL + t104 a 4 INT 9 10 10 0 1 NULL + t104 b 4 INT 9 10 10 0 1 NULL + t104 c 4 INT 9 10 10 0 1 NULL + t104 d 4 INT 9 10 10 0 1 NULL + t104 e 4 INT 9 10 10 0 1 NULL + t105 a 4 INT 9 10 10 0 1 NULL + t105 b 4 INT 9 10 10 0 1 NULL + t105 c 4 INT 9 10 10 0 1 NULL + t105 d 4 INT 9 10 10 0 1 NULL + t105 e 4 INT 9 10 10 0 1 NULL + t106 a 4 INT 9 10 10 0 1 NULL + t106 b 4 INT 9 10 10 0 1 NULL + t106 c 4 INT 9 10 10 0 1 NULL + t106 d 4 INT 9 10 10 0 1 NULL + t106 e 4 INT 9 10 10 0 1 NULL + t107 a 4 INT 9 10 10 0 1 NULL + t107 b 4 INT 9 10 10 0 1 NULL + t107 c 4 INT 9 10 10 0 1 NULL + t107 d 4 INT 9 10 10 0 1 NULL + t107 e 4 INT 9 10 10 0 1 NULL + t108 a 4 INT 9 10 10 0 1 NULL + t108 b 4 INT 9 10 10 0 1 NULL + t108 c 4 INT 9 10 10 0 1 NULL + t108 d 4 INT 9 10 10 0 1 NULL + t108 e 4 INT 9 10 10 0 1 NULL + t109 a 4 INT 9 10 10 0 1 NULL + t109 b 4 INT 9 10 10 0 1 NULL + t109 c 4 INT 9 10 10 0 1 NULL + t109 d 4 INT 9 10 10 0 1 NULL + t109 e 4 INT 9 10 10 0 1 NULL + t110 a 4 INT 9 10 10 0 1 NULL + t110 b 4 INT 9 10 10 0 1 NULL + t110 c 4 INT 9 10 10 0 1 NULL + t110 d 4 INT 9 10 10 0 1 NULL + t110 e 4 INT 9 10 10 0 1 NULL + t111 a 4 INT 9 10 10 0 1 NULL + t111 b 4 INT 9 10 10 0 1 NULL + t111 c 4 INT 9 10 10 0 1 NULL + t111 d 4 INT 9 10 10 0 1 NULL + t111 e 4 INT 9 10 10 0 1 NULL + t112 a 4 INT 9 10 10 0 1 NULL + t112 b 4 INT 9 10 10 0 1 NULL + t112 c 4 INT 9 10 10 0 1 NULL + t112 d 4 INT 9 10 10 0 1 NULL + t112 e 4 INT 9 10 10 0 1 NULL + t113 a 4 INT 9 10 10 0 1 NULL + t113 b 4 INT 9 10 10 0 1 NULL + t113 c 4 INT 9 10 10 0 1 NULL + t113 d 4 INT 9 10 10 0 1 NULL + t113 e 4 INT 9 10 10 0 1 NULL + t114 a 4 INT 9 10 10 0 1 NULL + t114 b 4 INT 9 10 10 0 1 NULL + t114 c 4 INT 9 10 10 0 1 NULL + t114 d 4 INT 9 10 10 0 1 NULL + t114 e 4 INT 9 10 10 0 1 NULL + t115 a 4 INT 9 10 10 0 1 NULL + t115 b 4 INT 9 10 10 0 1 NULL + t115 c 4 INT 9 10 10 0 1 NULL + t115 d 4 INT 9 10 10 0 1 NULL + t115 e 4 INT 9 10 10 0 1 NULL + t116 a 4 INT 9 10 10 0 1 NULL + t116 b 4 INT 9 10 10 0 1 NULL + t116 c 4 INT 9 10 10 0 1 NULL + t116 d 4 INT 9 10 10 0 1 NULL + t116 e 4 INT 9 10 10 0 1 NULL + t117 a 4 INT 9 10 10 0 1 NULL + t117 b 4 INT 9 10 10 0 1 NULL + t117 c 4 INT 9 10 10 0 1 NULL + t117 d 4 INT 9 10 10 0 1 NULL + t117 e 4 INT 9 10 10 0 1 NULL + t118 a 4 INT 9 10 10 0 1 NULL + t118 b 4 INT 9 10 10 0 1 NULL + t118 c 4 INT 9 10 10 0 1 NULL + t118 d 4 INT 9 10 10 0 1 NULL + t118 e 4 INT 9 10 10 0 1 NULL + t119 a 4 INT 9 10 10 0 1 NULL + t119 b 4 INT 9 10 10 0 1 NULL + t119 c 4 INT 9 10 10 0 1 NULL + t119 d 4 INT 9 10 10 0 1 NULL + t119 e 4 INT 9 10 10 0 1 NULL + t120 a 4 INT 9 10 10 0 1 NULL + t120 b 4 INT 9 10 10 0 1 NULL + t120 c 4 INT 9 10 10 0 1 NULL + t120 d 4 INT 9 10 10 0 1 NULL + t120 e 4 INT 9 10 10 0 1 NULL + t121 a 4 INT 9 10 10 0 1 NULL + t121 b 4 INT 9 10 10 0 1 NULL + t121 c 4 INT 9 10 10 0 1 NULL + t121 d 4 INT 9 10 10 0 1 NULL + t121 e 4 INT 9 10 10 0 1 NULL + t122 a 4 INT 9 10 10 0 1 NULL + t122 b 4 INT 9 10 10 0 1 NULL + t122 c 4 INT 9 10 10 0 1 NULL + t122 d 4 INT 9 10 10 0 1 NULL + t122 e 4 INT 9 10 10 0 1 NULL + t123 a 4 INT 9 10 10 0 1 NULL + t123 b 4 INT 9 10 10 0 1 NULL + t123 c 4 INT 9 10 10 0 1 NULL + t123 d 4 INT 9 10 10 0 1 NULL + t123 e 4 INT 9 10 10 0 1 NULL + t124 a 4 INT 9 10 10 0 1 NULL + t124 b 4 INT 9 10 10 0 1 NULL + t124 c 4 INT 9 10 10 0 1 NULL + t124 d 4 INT 9 10 10 0 1 NULL + t124 e 4 INT 9 10 10 0 1 NULL + t125 a 4 INT 9 10 10 0 1 NULL + t125 b 4 INT 9 10 10 0 1 NULL + t125 c 4 INT 9 10 10 0 1 NULL + t125 d 4 INT 9 10 10 0 1 NULL + t125 e 4 INT 9 10 10 0 1 NULL + t126 a 4 INT 9 10 10 0 1 NULL + t126 b 4 INT 9 10 10 0 1 NULL + t126 c 4 INT 9 10 10 0 1 NULL + t126 d 4 INT 9 10 10 0 1 NULL + t126 e 4 INT 9 10 10 0 1 NULL + t127 a 4 INT 9 10 10 0 1 NULL + t127 b 4 INT 9 10 10 0 1 NULL + t127 c 4 INT 9 10 10 0 1 NULL + t127 d 4 INT 9 10 10 0 1 NULL + t127 e 4 INT 9 10 10 0 1 NULL + t128 a 4 INT 9 10 10 0 1 NULL + t128 b 4 INT 9 10 10 0 1 NULL + t128 c 4 INT 9 10 10 0 1 NULL + t128 d 4 INT 9 10 10 0 1 NULL + t128 e 4 INT 9 10 10 0 1 NULL + t129 a 4 INT 9 10 10 0 1 NULL + t129 b 4 INT 9 10 10 0 1 NULL + t129 c 4 INT 9 10 10 0 1 NULL + t129 d 4 INT 9 10 10 0 1 NULL + t129 e 4 INT 9 10 10 0 1 NULL + t130 a 4 INT 9 10 10 0 1 NULL + t130 b 4 INT 9 10 10 0 1 NULL + t130 c 4 INT 9 10 10 0 1 NULL + t130 d 4 INT 9 10 10 0 1 NULL + t130 e 4 INT 9 10 10 0 1 NULL + t131 a 4 INT 9 10 10 0 1 NULL + t131 b 4 INT 9 10 10 0 1 NULL + t131 c 4 INT 9 10 10 0 1 NULL + t131 d 4 INT 9 10 10 0 1 NULL + t131 e 4 INT 9 10 10 0 1 NULL + t132 a 4 INT 9 10 10 0 1 NULL + t132 b 4 INT 9 10 10 0 1 NULL + t132 c 4 INT 9 10 10 0 1 NULL + t132 d 4 INT 9 10 10 0 1 NULL + t132 e 4 INT 9 10 10 0 1 NULL + t133 a 4 INT 9 10 10 0 1 NULL + t133 b 4 INT 9 10 10 0 1 NULL + t133 c 4 INT 9 10 10 0 1 NULL + t133 d 4 INT 9 10 10 0 1 NULL + t133 e 4 INT 9 10 10 0 1 NULL + t134 a 4 INT 9 10 10 0 1 NULL + t134 b 4 INT 9 10 10 0 1 NULL + t134 c 4 INT 9 10 10 0 1 NULL + t134 d 4 INT 9 10 10 0 1 NULL + t134 e 4 INT 9 10 10 0 1 NULL + t135 a 4 INT 9 10 10 0 1 NULL + t135 b 4 INT 9 10 10 0 1 NULL + t135 c 4 INT 9 10 10 0 1 NULL + t135 d 4 INT 9 10 10 0 1 NULL + t135 e 4 INT 9 10 10 0 1 NULL + t136 a 4 INT 9 10 10 0 1 NULL + t136 b 4 INT 9 10 10 0 1 NULL + t136 c 4 INT 9 10 10 0 1 NULL + t136 d 4 INT 9 10 10 0 1 NULL + t136 e 4 INT 9 10 10 0 1 NULL + t137 a 4 INT 9 10 10 0 1 NULL + t137 b 4 INT 9 10 10 0 1 NULL + t137 c 4 INT 9 10 10 0 1 NULL + t137 d 4 INT 9 10 10 0 1 NULL + t137 e 4 INT 9 10 10 0 1 NULL + t138 a 4 INT 9 10 10 0 1 NULL + t138 b 4 INT 9 10 10 0 1 NULL + t138 c 4 INT 9 10 10 0 1 NULL + t138 d 4 INT 9 10 10 0 1 NULL + t138 e 4 INT 9 10 10 0 1 NULL + t139 a 4 INT 9 10 10 0 1 NULL + t139 b 4 INT 9 10 10 0 1 NULL + t139 c 4 INT 9 10 10 0 1 NULL + t139 d 4 INT 9 10 10 0 1 NULL + t139 e 4 INT 9 10 10 0 1 NULL + t140 a 4 INT 9 10 10 0 1 NULL + t140 b 4 INT 9 10 10 0 1 NULL + t140 c 4 INT 9 10 10 0 1 NULL + t140 d 4 INT 9 10 10 0 1 NULL + t140 e 4 INT 9 10 10 0 1 NULL + t141 a 4 INT 9 10 10 0 1 NULL + t141 b 4 INT 9 10 10 0 1 NULL + t141 c 4 INT 9 10 10 0 1 NULL + t141 d 4 INT 9 10 10 0 1 NULL + t141 e 4 INT 9 10 10 0 1 NULL + t142 a 4 INT 9 10 10 0 1 NULL + t142 b 4 INT 9 10 10 0 1 NULL + t142 c 4 INT 9 10 10 0 1 NULL + t142 d 4 INT 9 10 10 0 1 NULL + t142 e 4 INT 9 10 10 0 1 NULL + t143 a 4 INT 9 10 10 0 1 NULL + t143 b 4 INT 9 10 10 0 1 NULL + t143 c 4 INT 9 10 10 0 1 NULL + t143 d 4 INT 9 10 10 0 1 NULL + t143 e 4 INT 9 10 10 0 1 NULL + t144 a 4 INT 9 10 10 0 1 NULL + t144 b 4 INT 9 10 10 0 1 NULL + t144 c 4 INT 9 10 10 0 1 NULL + t144 d 4 INT 9 10 10 0 1 NULL + t144 e 4 INT 9 10 10 0 1 NULL + t145 a 4 INT 9 10 10 0 1 NULL + t145 b 4 INT 9 10 10 0 1 NULL + t145 c 4 INT 9 10 10 0 1 NULL + t145 d 4 INT 9 10 10 0 1 NULL + t145 e 4 INT 9 10 10 0 1 NULL + t146 a 4 INT 9 10 10 0 1 NULL + t146 b 4 INT 9 10 10 0 1 NULL + t146 c 4 INT 9 10 10 0 1 NULL + t146 d 4 INT 9 10 10 0 1 NULL + t146 e 4 INT 9 10 10 0 1 NULL + t147 a 4 INT 9 10 10 0 1 NULL + t147 b 4 INT 9 10 10 0 1 NULL + t147 c 4 INT 9 10 10 0 1 NULL + t147 d 4 INT 9 10 10 0 1 NULL + t147 e 4 INT 9 10 10 0 1 NULL + t148 a 4 INT 9 10 10 0 1 NULL + t148 b 4 INT 9 10 10 0 1 NULL + t148 c 4 INT 9 10 10 0 1 NULL + t148 d 4 INT 9 10 10 0 1 NULL + t148 e 4 INT 9 10 10 0 1 NULL + t149 a 4 INT 9 10 10 0 1 NULL + t149 b 4 INT 9 10 10 0 1 NULL + t149 c 4 INT 9 10 10 0 1 NULL + t149 d 4 INT 9 10 10 0 1 NULL + t149 e 4 INT 9 10 10 0 1 NULL + t150 a 4 INT 9 10 10 0 1 NULL + t150 b 4 INT 9 10 10 0 1 NULL + t150 c 4 INT 9 10 10 0 1 NULL + t150 d 4 INT 9 10 10 0 1 NULL + t150 e 4 INT 9 10 10 0 1 NULL + t151 a 4 INT 9 10 10 0 1 NULL + t151 b 4 INT 9 10 10 0 1 NULL + t151 c 4 INT 9 10 10 0 1 NULL + t151 d 4 INT 9 10 10 0 1 NULL + t151 e 4 INT 9 10 10 0 1 NULL + t152 a 4 INT 9 10 10 0 1 NULL + t152 b 4 INT 9 10 10 0 1 NULL + t152 c 4 INT 9 10 10 0 1 NULL + t152 d 4 INT 9 10 10 0 1 NULL + t152 e 4 INT 9 10 10 0 1 NULL + t153 a 4 INT 9 10 10 0 1 NULL + t153 b 4 INT 9 10 10 0 1 NULL + t153 c 4 INT 9 10 10 0 1 NULL + t153 d 4 INT 9 10 10 0 1 NULL + t153 e 4 INT 9 10 10 0 1 NULL + t154 a 4 INT 9 10 10 0 1 NULL + t154 b 4 INT 9 10 10 0 1 NULL + t154 c 4 INT 9 10 10 0 1 NULL + t154 d 4 INT 9 10 10 0 1 NULL + t154 e 4 INT 9 10 10 0 1 NULL + t155 a 4 INT 9 10 10 0 1 NULL + t155 b 4 INT 9 10 10 0 1 NULL + t155 c 4 INT 9 10 10 0 1 NULL + t155 d 4 INT 9 10 10 0 1 NULL + t155 e 4 INT 9 10 10 0 1 NULL + t156 a 4 INT 9 10 10 0 1 NULL + t156 b 4 INT 9 10 10 0 1 NULL + t156 c 4 INT 9 10 10 0 1 NULL + t156 d 4 INT 9 10 10 0 1 NULL + t156 e 4 INT 9 10 10 0 1 NULL + t157 a 4 INT 9 10 10 0 1 NULL + t157 b 4 INT 9 10 10 0 1 NULL + t157 c 4 INT 9 10 10 0 1 NULL + t157 d 4 INT 9 10 10 0 1 NULL + t157 e 4 INT 9 10 10 0 1 NULL + t158 a 4 INT 9 10 10 0 1 NULL + t158 b 4 INT 9 10 10 0 1 NULL + t158 c 4 INT 9 10 10 0 1 NULL + t158 d 4 INT 9 10 10 0 1 NULL + t158 e 4 INT 9 10 10 0 1 NULL + t159 a 4 INT 9 10 10 0 1 NULL + t159 b 4 INT 9 10 10 0 1 NULL + t159 c 4 INT 9 10 10 0 1 NULL + t159 d 4 INT 9 10 10 0 1 NULL + t159 e 4 INT 9 10 10 0 1 NULL + t160 a 4 INT 9 10 10 0 1 NULL + t160 b 4 INT 9 10 10 0 1 NULL + t160 c 4 INT 9 10 10 0 1 NULL + t160 d 4 INT 9 10 10 0 1 NULL + t160 e 4 INT 9 10 10 0 1 NULL + t161 a 4 INT 9 10 10 0 1 NULL + t161 b 4 INT 9 10 10 0 1 NULL + t161 c 4 INT 9 10 10 0 1 NULL + t161 d 4 INT 9 10 10 0 1 NULL + t161 e 4 INT 9 10 10 0 1 NULL + t162 a 4 INT 9 10 10 0 1 NULL + t162 b 4 INT 9 10 10 0 1 NULL + t162 c 4 INT 9 10 10 0 1 NULL + t162 d 4 INT 9 10 10 0 1 NULL + t162 e 4 INT 9 10 10 0 1 NULL + t163 a 4 INT 9 10 10 0 1 NULL + t163 b 4 INT 9 10 10 0 1 NULL + t163 c 4 INT 9 10 10 0 1 NULL + t163 d 4 INT 9 10 10 0 1 NULL + t163 e 4 INT 9 10 10 0 1 NULL + t164 a 4 INT 9 10 10 0 1 NULL + t164 b 4 INT 9 10 10 0 1 NULL + t164 c 4 INT 9 10 10 0 1 NULL + t164 d 4 INT 9 10 10 0 1 NULL + t164 e 4 INT 9 10 10 0 1 NULL + t165 a 4 INT 9 10 10 0 1 NULL + t165 b 4 INT 9 10 10 0 1 NULL + t165 c 4 INT 9 10 10 0 1 NULL + t165 d 4 INT 9 10 10 0 1 NULL + t165 e 4 INT 9 10 10 0 1 NULL + t166 a 4 INT 9 10 10 0 1 NULL + t166 b 4 INT 9 10 10 0 1 NULL + t166 c 4 INT 9 10 10 0 1 NULL + t166 d 4 INT 9 10 10 0 1 NULL + t166 e 4 INT 9 10 10 0 1 NULL + t167 a 4 INT 9 10 10 0 1 NULL + t167 b 4 INT 9 10 10 0 1 NULL + t167 c 4 INT 9 10 10 0 1 NULL + t167 d 4 INT 9 10 10 0 1 NULL + t167 e 4 INT 9 10 10 0 1 NULL + t168 a 4 INT 9 10 10 0 1 NULL + t168 b 4 INT 9 10 10 0 1 NULL + t168 c 4 INT 9 10 10 0 1 NULL + t168 d 4 INT 9 10 10 0 1 NULL + t168 e 4 INT 9 10 10 0 1 NULL + t169 a 4 INT 9 10 10 0 1 NULL + t169 b 4 INT 9 10 10 0 1 NULL + t169 c 4 INT 9 10 10 0 1 NULL + t169 d 4 INT 9 10 10 0 1 NULL + t169 e 4 INT 9 10 10 0 1 NULL + t170 a 4 INT 9 10 10 0 1 NULL + t170 b 4 INT 9 10 10 0 1 NULL + t170 c 4 INT 9 10 10 0 1 NULL + t170 d 4 INT 9 10 10 0 1 NULL + t170 e 4 INT 9 10 10 0 1 NULL + t171 a 4 INT 9 10 10 0 1 NULL + t171 b 4 INT 9 10 10 0 1 NULL + t171 c 4 INT 9 10 10 0 1 NULL + t171 d 4 INT 9 10 10 0 1 NULL + t171 e 4 INT 9 10 10 0 1 NULL + t172 a 4 INT 9 10 10 0 1 NULL + t172 b 4 INT 9 10 10 0 1 NULL + t172 c 4 INT 9 10 10 0 1 NULL + t172 d 4 INT 9 10 10 0 1 NULL + t172 e 4 INT 9 10 10 0 1 NULL + t173 a 4 INT 9 10 10 0 1 NULL + t173 b 4 INT 9 10 10 0 1 NULL + t173 c 4 INT 9 10 10 0 1 NULL + t173 d 4 INT 9 10 10 0 1 NULL + t173 e 4 INT 9 10 10 0 1 NULL + t174 a 4 INT 9 10 10 0 1 NULL + t174 b 4 INT 9 10 10 0 1 NULL + t174 c 4 INT 9 10 10 0 1 NULL + t174 d 4 INT 9 10 10 0 1 NULL + t174 e 4 INT 9 10 10 0 1 NULL + t175 a 4 INT 9 10 10 0 1 NULL + t175 b 4 INT 9 10 10 0 1 NULL + t175 c 4 INT 9 10 10 0 1 NULL + t175 d 4 INT 9 10 10 0 1 NULL + t175 e 4 INT 9 10 10 0 1 NULL + t176 a 4 INT 9 10 10 0 1 NULL + t176 b 4 INT 9 10 10 0 1 NULL + t176 c 4 INT 9 10 10 0 1 NULL + t176 d 4 INT 9 10 10 0 1 NULL + t176 e 4 INT 9 10 10 0 1 NULL + t177 a 4 INT 9 10 10 0 1 NULL + t177 b 4 INT 9 10 10 0 1 NULL + t177 c 4 INT 9 10 10 0 1 NULL + t177 d 4 INT 9 10 10 0 1 NULL + t177 e 4 INT 9 10 10 0 1 NULL + t178 a 4 INT 9 10 10 0 1 NULL + t178 b 4 INT 9 10 10 0 1 NULL + t178 c 4 INT 9 10 10 0 1 NULL + t178 d 4 INT 9 10 10 0 1 NULL + t178 e 4 INT 9 10 10 0 1 NULL + t179 a 4 INT 9 10 10 0 1 NULL + t179 b 4 INT 9 10 10 0 1 NULL + t179 c 4 INT 9 10 10 0 1 NULL + t179 d 4 INT 9 10 10 0 1 NULL + t179 e 4 INT 9 10 10 0 1 NULL + t180 a 4 INT 9 10 10 0 1 NULL + t180 b 4 INT 9 10 10 0 1 NULL + t180 c 4 INT 9 10 10 0 1 NULL + t180 d 4 INT 9 10 10 0 1 NULL + t180 e 4 INT 9 10 10 0 1 NULL + t181 a 4 INT 9 10 10 0 1 NULL + t181 b 4 INT 9 10 10 0 1 NULL + t181 c 4 INT 9 10 10 0 1 NULL + t181 d 4 INT 9 10 10 0 1 NULL + t181 e 4 INT 9 10 10 0 1 NULL + t182 a 4 INT 9 10 10 0 1 NULL + t182 b 4 INT 9 10 10 0 1 NULL + t182 c 4 INT 9 10 10 0 1 NULL + t182 d 4 INT 9 10 10 0 1 NULL + t182 e 4 INT 9 10 10 0 1 NULL + t183 a 4 INT 9 10 10 0 1 NULL + t183 b 4 INT 9 10 10 0 1 NULL + t183 c 4 INT 9 10 10 0 1 NULL + t183 d 4 INT 9 10 10 0 1 NULL + t183 e 4 INT 9 10 10 0 1 NULL + t184 a 4 INT 9 10 10 0 1 NULL + t184 b 4 INT 9 10 10 0 1 NULL + t184 c 4 INT 9 10 10 0 1 NULL + t184 d 4 INT 9 10 10 0 1 NULL + t184 e 4 INT 9 10 10 0 1 NULL + t185 a 4 INT 9 10 10 0 1 NULL + t185 b 4 INT 9 10 10 0 1 NULL + t185 c 4 INT 9 10 10 0 1 NULL + t185 d 4 INT 9 10 10 0 1 NULL + t185 e 4 INT 9 10 10 0 1 NULL + t186 a 4 INT 9 10 10 0 1 NULL + t186 b 4 INT 9 10 10 0 1 NULL + t186 c 4 INT 9 10 10 0 1 NULL + t186 d 4 INT 9 10 10 0 1 NULL + t186 e 4 INT 9 10 10 0 1 NULL + t187 a 4 INT 9 10 10 0 1 NULL + t187 b 4 INT 9 10 10 0 1 NULL + t187 c 4 INT 9 10 10 0 1 NULL + t187 d 4 INT 9 10 10 0 1 NULL + t187 e 4 INT 9 10 10 0 1 NULL + t188 a 4 INT 9 10 10 0 1 NULL + t188 b 4 INT 9 10 10 0 1 NULL + t188 c 4 INT 9 10 10 0 1 NULL + t188 d 4 INT 9 10 10 0 1 NULL + t188 e 4 INT 9 10 10 0 1 NULL + t189 a 4 INT 9 10 10 0 1 NULL + t189 b 4 INT 9 10 10 0 1 NULL + t189 c 4 INT 9 10 10 0 1 NULL + t189 d 4 INT 9 10 10 0 1 NULL + t189 e 4 INT 9 10 10 0 1 NULL + t190 a 4 INT 9 10 10 0 1 NULL + t190 b 4 INT 9 10 10 0 1 NULL + t190 c 4 INT 9 10 10 0 1 NULL + t190 d 4 INT 9 10 10 0 1 NULL + t190 e 4 INT 9 10 10 0 1 NULL + t191 a 4 INT 9 10 10 0 1 NULL + t191 b 4 INT 9 10 10 0 1 NULL + t191 c 4 INT 9 10 10 0 1 NULL + t191 d 4 INT 9 10 10 0 1 NULL + t191 e 4 INT 9 10 10 0 1 NULL + t192 a 4 INT 9 10 10 0 1 NULL + t192 b 4 INT 9 10 10 0 1 NULL + t192 c 4 INT 9 10 10 0 1 NULL + t192 d 4 INT 9 10 10 0 1 NULL + t192 e 4 INT 9 10 10 0 1 NULL + t193 a 4 INT 9 10 10 0 1 NULL + t193 b 4 INT 9 10 10 0 1 NULL + t193 c 4 INT 9 10 10 0 1 NULL + t193 d 4 INT 9 10 10 0 1 NULL + t193 e 4 INT 9 10 10 0 1 NULL + t194 a 4 INT 9 10 10 0 1 NULL + t194 b 4 INT 9 10 10 0 1 NULL + t194 c 4 INT 9 10 10 0 1 NULL + t194 d 4 INT 9 10 10 0 1 NULL + t194 e 4 INT 9 10 10 0 1 NULL + t195 a 4 INT 9 10 10 0 1 NULL + t195 b 4 INT 9 10 10 0 1 NULL + t195 c 4 INT 9 10 10 0 1 NULL + t195 d 4 INT 9 10 10 0 1 NULL + t195 e 4 INT 9 10 10 0 1 NULL + t196 a 4 INT 9 10 10 0 1 NULL + t196 b 4 INT 9 10 10 0 1 NULL + t196 c 4 INT 9 10 10 0 1 NULL + t196 d 4 INT 9 10 10 0 1 NULL + t196 e 4 INT 9 10 10 0 1 NULL + t197 a 4 INT 9 10 10 0 1 NULL + t197 b 4 INT 9 10 10 0 1 NULL + t197 c 4 INT 9 10 10 0 1 NULL + t197 d 4 INT 9 10 10 0 1 NULL + t197 e 4 INT 9 10 10 0 1 NULL + t198 a 4 INT 9 10 10 0 1 NULL + t198 b 4 INT 9 10 10 0 1 NULL + t198 c 4 INT 9 10 10 0 1 NULL + t198 d 4 INT 9 10 10 0 1 NULL + t198 e 4 INT 9 10 10 0 1 NULL + t199 a 4 INT 9 10 10 0 1 NULL + t199 b 4 INT 9 10 10 0 1 NULL + t199 c 4 INT 9 10 10 0 1 NULL + t199 d 4 INT 9 10 10 0 1 NULL + t199 e 4 INT 9 10 10 0 1 NULL + t200 a 4 INT 9 10 10 0 1 NULL + t200 b 4 INT 9 10 10 0 1 NULL + t200 c 4 INT 9 10 10 0 1 NULL + t200 d 4 INT 9 10 10 0 1 NULL + t200 e 4 INT 9 10 10 0 1 NULL + t201 a 4 INT 9 10 10 0 1 NULL + t201 b 4 INT 9 10 10 0 1 NULL + t201 c 4 INT 9 10 10 0 1 NULL + t201 d 4 INT 9 10 10 0 1 NULL + t201 e 4 INT 9 10 10 0 1 NULL + t202 a 4 INT 9 10 10 0 1 NULL + t202 b 4 INT 9 10 10 0 1 NULL + t202 c 4 INT 9 10 10 0 1 NULL + t202 d 4 INT 9 10 10 0 1 NULL + t202 e 4 INT 9 10 10 0 1 NULL + t203 a 4 INT 9 10 10 0 1 NULL + t203 b 4 INT 9 10 10 0 1 NULL + t203 c 4 INT 9 10 10 0 1 NULL + t203 d 4 INT 9 10 10 0 1 NULL + t203 e 4 INT 9 10 10 0 1 NULL + t204 a 4 INT 9 10 10 0 1 NULL + t204 b 4 INT 9 10 10 0 1 NULL + t204 c 4 INT 9 10 10 0 1 NULL + t204 d 4 INT 9 10 10 0 1 NULL + t204 e 4 INT 9 10 10 0 1 NULL + t205 a 4 INT 9 10 10 0 1 NULL + t205 b 4 INT 9 10 10 0 1 NULL + t205 c 4 INT 9 10 10 0 1 NULL + t205 d 4 INT 9 10 10 0 1 NULL + t205 e 4 INT 9 10 10 0 1 NULL + t206 a 4 INT 9 10 10 0 1 NULL + t206 b 4 INT 9 10 10 0 1 NULL + t206 c 4 INT 9 10 10 0 1 NULL + t206 d 4 INT 9 10 10 0 1 NULL + t206 e 4 INT 9 10 10 0 1 NULL + t207 a 4 INT 9 10 10 0 1 NULL + t207 b 4 INT 9 10 10 0 1 NULL + t207 c 4 INT 9 10 10 0 1 NULL + t207 d 4 INT 9 10 10 0 1 NULL + t207 e 4 INT 9 10 10 0 1 NULL + t208 a 4 INT 9 10 10 0 1 NULL + t208 b 4 INT 9 10 10 0 1 NULL + t208 c 4 INT 9 10 10 0 1 NULL + t208 d 4 INT 9 10 10 0 1 NULL + t208 e 4 INT 9 10 10 0 1 NULL + t209 a 4 INT 9 10 10 0 1 NULL + t209 b 4 INT 9 10 10 0 1 NULL + t209 c 4 INT 9 10 10 0 1 NULL + t209 d 4 INT 9 10 10 0 1 NULL + t209 e 4 INT 9 10 10 0 1 NULL + t210 a 4 INT 9 10 10 0 1 NULL + t210 b 4 INT 9 10 10 0 1 NULL + t210 c 4 INT 9 10 10 0 1 NULL + t210 d 4 INT 9 10 10 0 1 NULL + t210 e 4 INT 9 10 10 0 1 NULL + t211 a 4 INT 9 10 10 0 1 NULL + t211 b 4 INT 9 10 10 0 1 NULL + t211 c 4 INT 9 10 10 0 1 NULL + t211 d 4 INT 9 10 10 0 1 NULL + t211 e 4 INT 9 10 10 0 1 NULL + t212 a 4 INT 9 10 10 0 1 NULL + t212 b 4 INT 9 10 10 0 1 NULL + t212 c 4 INT 9 10 10 0 1 NULL + t212 d 4 INT 9 10 10 0 1 NULL + t212 e 4 INT 9 10 10 0 1 NULL + t213 a 4 INT 9 10 10 0 1 NULL + t213 b 4 INT 9 10 10 0 1 NULL + t213 c 4 INT 9 10 10 0 1 NULL + t213 d 4 INT 9 10 10 0 1 NULL + t213 e 4 INT 9 10 10 0 1 NULL + t214 a 4 INT 9 10 10 0 1 NULL + t214 b 4 INT 9 10 10 0 1 NULL + t214 c 4 INT 9 10 10 0 1 NULL + t214 d 4 INT 9 10 10 0 1 NULL + t214 e 4 INT 9 10 10 0 1 NULL + t215 a 4 INT 9 10 10 0 1 NULL + t215 b 4 INT 9 10 10 0 1 NULL + t215 c 4 INT 9 10 10 0 1 NULL + t215 d 4 INT 9 10 10 0 1 NULL + t215 e 4 INT 9 10 10 0 1 NULL + t216 a 4 INT 9 10 10 0 1 NULL + t216 b 4 INT 9 10 10 0 1 NULL + t216 c 4 INT 9 10 10 0 1 NULL + t216 d 4 INT 9 10 10 0 1 NULL + t216 e 4 INT 9 10 10 0 1 NULL + t217 a 4 INT 9 10 10 0 1 NULL + t217 b 4 INT 9 10 10 0 1 NULL + t217 c 4 INT 9 10 10 0 1 NULL + t217 d 4 INT 9 10 10 0 1 NULL + t217 e 4 INT 9 10 10 0 1 NULL + t218 a 4 INT 9 10 10 0 1 NULL + t218 b 4 INT 9 10 10 0 1 NULL + t218 c 4 INT 9 10 10 0 1 NULL + t218 d 4 INT 9 10 10 0 1 NULL + t218 e 4 INT 9 10 10 0 1 NULL + t219 a 4 INT 9 10 10 0 1 NULL + t219 b 4 INT 9 10 10 0 1 NULL + t219 c 4 INT 9 10 10 0 1 NULL + t219 d 4 INT 9 10 10 0 1 NULL + t219 e 4 INT 9 10 10 0 1 NULL + t220 a 4 INT 9 10 10 0 1 NULL + t220 b 4 INT 9 10 10 0 1 NULL + t220 c 4 INT 9 10 10 0 1 NULL + t220 d 4 INT 9 10 10 0 1 NULL + t220 e 4 INT 9 10 10 0 1 NULL + t221 a 4 INT 9 10 10 0 1 NULL + t221 b 4 INT 9 10 10 0 1 NULL + t221 c 4 INT 9 10 10 0 1 NULL + t221 d 4 INT 9 10 10 0 1 NULL + t221 e 4 INT 9 10 10 0 1 NULL + t222 a 4 INT 9 10 10 0 1 NULL + t222 b 4 INT 9 10 10 0 1 NULL + t222 c 4 INT 9 10 10 0 1 NULL + t222 d 4 INT 9 10 10 0 1 NULL + t222 e 4 INT 9 10 10 0 1 NULL + t223 a 4 INT 9 10 10 0 1 NULL + t223 b 4 INT 9 10 10 0 1 NULL + t223 c 4 INT 9 10 10 0 1 NULL + t223 d 4 INT 9 10 10 0 1 NULL + t223 e 4 INT 9 10 10 0 1 NULL + t224 a 4 INT 9 10 10 0 1 NULL + t224 b 4 INT 9 10 10 0 1 NULL + t224 c 4 INT 9 10 10 0 1 NULL + t224 d 4 INT 9 10 10 0 1 NULL + t224 e 4 INT 9 10 10 0 1 NULL + t225 a 4 INT 9 10 10 0 1 NULL + t225 b 4 INT 9 10 10 0 1 NULL + t225 c 4 INT 9 10 10 0 1 NULL + t225 d 4 INT 9 10 10 0 1 NULL + t225 e 4 INT 9 10 10 0 1 NULL + t226 a 4 INT 9 10 10 0 1 NULL + t226 b 4 INT 9 10 10 0 1 NULL + t226 c 4 INT 9 10 10 0 1 NULL + t226 d 4 INT 9 10 10 0 1 NULL + t226 e 4 INT 9 10 10 0 1 NULL + t227 a 4 INT 9 10 10 0 1 NULL + t227 b 4 INT 9 10 10 0 1 NULL + t227 c 4 INT 9 10 10 0 1 NULL + t227 d 4 INT 9 10 10 0 1 NULL + t227 e 4 INT 9 10 10 0 1 NULL + t228 a 4 INT 9 10 10 0 1 NULL + t228 b 4 INT 9 10 10 0 1 NULL + t228 c 4 INT 9 10 10 0 1 NULL + t228 d 4 INT 9 10 10 0 1 NULL + t228 e 4 INT 9 10 10 0 1 NULL + t229 a 4 INT 9 10 10 0 1 NULL + t229 b 4 INT 9 10 10 0 1 NULL + t229 c 4 INT 9 10 10 0 1 NULL + t229 d 4 INT 9 10 10 0 1 NULL + t229 e 4 INT 9 10 10 0 1 NULL + t230 a 4 INT 9 10 10 0 1 NULL + t230 b 4 INT 9 10 10 0 1 NULL + t230 c 4 INT 9 10 10 0 1 NULL + t230 d 4 INT 9 10 10 0 1 NULL + t230 e 4 INT 9 10 10 0 1 NULL + t231 a 4 INT 9 10 10 0 1 NULL + t231 b 4 INT 9 10 10 0 1 NULL + t231 c 4 INT 9 10 10 0 1 NULL + t231 d 4 INT 9 10 10 0 1 NULL + t231 e 4 INT 9 10 10 0 1 NULL + t232 a 4 INT 9 10 10 0 1 NULL + t232 b 4 INT 9 10 10 0 1 NULL + t232 c 4 INT 9 10 10 0 1 NULL + t232 d 4 INT 9 10 10 0 1 NULL + t232 e 4 INT 9 10 10 0 1 NULL + t233 a 4 INT 9 10 10 0 1 NULL + t233 b 4 INT 9 10 10 0 1 NULL + t233 c 4 INT 9 10 10 0 1 NULL + t233 d 4 INT 9 10 10 0 1 NULL + t233 e 4 INT 9 10 10 0 1 NULL + t234 a 4 INT 9 10 10 0 1 NULL + t234 b 4 INT 9 10 10 0 1 NULL + t234 c 4 INT 9 10 10 0 1 NULL + t234 d 4 INT 9 10 10 0 1 NULL + t234 e 4 INT 9 10 10 0 1 NULL + t235 a 4 INT 9 10 10 0 1 NULL + t235 b 4 INT 9 10 10 0 1 NULL + t235 c 4 INT 9 10 10 0 1 NULL + t235 d 4 INT 9 10 10 0 1 NULL + t235 e 4 INT 9 10 10 0 1 NULL + t236 a 4 INT 9 10 10 0 1 NULL + t236 b 4 INT 9 10 10 0 1 NULL + t236 c 4 INT 9 10 10 0 1 NULL + t236 d 4 INT 9 10 10 0 1 NULL + t236 e 4 INT 9 10 10 0 1 NULL + t237 a 4 INT 9 10 10 0 1 NULL + t237 b 4 INT 9 10 10 0 1 NULL + t237 c 4 INT 9 10 10 0 1 NULL + t237 d 4 INT 9 10 10 0 1 NULL + t237 e 4 INT 9 10 10 0 1 NULL + t238 a 4 INT 9 10 10 0 1 NULL + t238 b 4 INT 9 10 10 0 1 NULL + t238 c 4 INT 9 10 10 0 1 NULL + t238 d 4 INT 9 10 10 0 1 NULL + t238 e 4 INT 9 10 10 0 1 NULL + t239 a 4 INT 9 10 10 0 1 NULL + t239 b 4 INT 9 10 10 0 1 NULL + t239 c 4 INT 9 10 10 0 1 NULL + t239 d 4 INT 9 10 10 0 1 NULL + t239 e 4 INT 9 10 10 0 1 NULL + t240 a 4 INT 9 10 10 0 1 NULL + t240 b 4 INT 9 10 10 0 1 NULL + t240 c 4 INT 9 10 10 0 1 NULL + t240 d 4 INT 9 10 10 0 1 NULL + t240 e 4 INT 9 10 10 0 1 NULL + t241 a 4 INT 9 10 10 0 1 NULL + t241 b 4 INT 9 10 10 0 1 NULL + t241 c 4 INT 9 10 10 0 1 NULL + t241 d 4 INT 9 10 10 0 1 NULL + t241 e 4 INT 9 10 10 0 1 NULL + t242 a 4 INT 9 10 10 0 1 NULL + t242 b 4 INT 9 10 10 0 1 NULL + t242 c 4 INT 9 10 10 0 1 NULL + t242 d 4 INT 9 10 10 0 1 NULL + t242 e 4 INT 9 10 10 0 1 NULL + t243 a 4 INT 9 10 10 0 1 NULL + t243 b 4 INT 9 10 10 0 1 NULL + t243 c 4 INT 9 10 10 0 1 NULL + t243 d 4 INT 9 10 10 0 1 NULL + t243 e 4 INT 9 10 10 0 1 NULL + t244 a 4 INT 9 10 10 0 1 NULL + t244 b 4 INT 9 10 10 0 1 NULL + t244 c 4 INT 9 10 10 0 1 NULL + t244 d 4 INT 9 10 10 0 1 NULL + t244 e 4 INT 9 10 10 0 1 NULL + t245 a 4 INT 9 10 10 0 1 NULL + t245 b 4 INT 9 10 10 0 1 NULL + t245 c 4 INT 9 10 10 0 1 NULL + t245 d 4 INT 9 10 10 0 1 NULL + t245 e 4 INT 9 10 10 0 1 NULL + t246 a 4 INT 9 10 10 0 1 NULL + t246 b 4 INT 9 10 10 0 1 NULL + t246 c 4 INT 9 10 10 0 1 NULL + t246 d 4 INT 9 10 10 0 1 NULL + t246 e 4 INT 9 10 10 0 1 NULL + t247 a 4 INT 9 10 10 0 1 NULL + t247 b 4 INT 9 10 10 0 1 NULL + t247 c 4 INT 9 10 10 0 1 NULL + t247 d 4 INT 9 10 10 0 1 NULL + t247 e 4 INT 9 10 10 0 1 NULL + t248 a 4 INT 9 10 10 0 1 NULL + t248 b 4 INT 9 10 10 0 1 NULL + t248 c 4 INT 9 10 10 0 1 NULL + t248 d 4 INT 9 10 10 0 1 NULL + t248 e 4 INT 9 10 10 0 1 NULL + t249 a 4 INT 9 10 10 0 1 NULL + t249 b 4 INT 9 10 10 0 1 NULL + t249 c 4 INT 9 10 10 0 1 NULL + t249 d 4 INT 9 10 10 0 1 NULL + t249 e 4 INT 9 10 10 0 1 NULL + t250 a 4 INT 9 10 10 0 1 NULL + t250 b 4 INT 9 10 10 0 1 NULL + t250 c 4 INT 9 10 10 0 1 NULL + t250 d 4 INT 9 10 10 0 1 NULL + t250 e 4 INT 9 10 10 0 1 NULL + t251 a 4 INT 9 10 10 0 1 NULL + t251 b 4 INT 9 10 10 0 1 NULL + t251 c 4 INT 9 10 10 0 1 NULL + t251 d 4 INT 9 10 10 0 1 NULL + t251 e 4 INT 9 10 10 0 1 NULL + t252 a 4 INT 9 10 10 0 1 NULL + t252 b 4 INT 9 10 10 0 1 NULL + t252 c 4 INT 9 10 10 0 1 NULL + t252 d 4 INT 9 10 10 0 1 NULL + t252 e 4 INT 9 10 10 0 1 NULL + t253 a 4 INT 9 10 10 0 1 NULL + t253 b 4 INT 9 10 10 0 1 NULL + t253 c 4 INT 9 10 10 0 1 NULL + t253 d 4 INT 9 10 10 0 1 NULL + t253 e 4 INT 9 10 10 0 1 NULL + t254 a 4 INT 9 10 10 0 1 NULL + t254 b 4 INT 9 10 10 0 1 NULL + t254 c 4 INT 9 10 10 0 1 NULL + t254 d 4 INT 9 10 10 0 1 NULL + t254 e 4 INT 9 10 10 0 1 NULL + t255 a 4 INT 9 10 10 0 1 NULL + t255 b 4 INT 9 10 10 0 1 NULL + t255 c 4 INT 9 10 10 0 1 NULL + t255 d 4 INT 9 10 10 0 1 NULL + t255 e 4 INT 9 10 10 0 1 NULL + t256 a 4 INT 9 10 10 0 1 NULL + t256 b 4 INT 9 10 10 0 1 NULL + t256 c 4 INT 9 10 10 0 1 NULL + t256 d 4 INT 9 10 10 0 1 NULL + t256 e 4 INT 9 10 10 0 1 NULL + t257 a 4 INT 9 10 10 0 1 NULL + t257 b 4 INT 9 10 10 0 1 NULL + t257 c 4 INT 9 10 10 0 1 NULL + t257 d 4 INT 9 10 10 0 1 NULL + t257 e 4 INT 9 10 10 0 1 NULL + t258 a 4 INT 9 10 10 0 1 NULL + t258 b 4 INT 9 10 10 0 1 NULL + t258 c 4 INT 9 10 10 0 1 NULL + t258 d 4 INT 9 10 10 0 1 NULL + t258 e 4 INT 9 10 10 0 1 NULL + t259 a 4 INT 9 10 10 0 1 NULL + t259 b 4 INT 9 10 10 0 1 NULL + t259 c 4 INT 9 10 10 0 1 NULL + t259 d 4 INT 9 10 10 0 1 NULL + t259 e 4 INT 9 10 10 0 1 NULL + t260 a 4 INT 9 10 10 0 1 NULL + t260 b 4 INT 9 10 10 0 1 NULL + t260 c 4 INT 9 10 10 0 1 NULL + t260 d 4 INT 9 10 10 0 1 NULL + t260 e 4 INT 9 10 10 0 1 NULL + t261 a 4 INT 9 10 10 0 1 NULL + t261 b 4 INT 9 10 10 0 1 NULL + t261 c 4 INT 9 10 10 0 1 NULL + t261 d 4 INT 9 10 10 0 1 NULL + t261 e 4 INT 9 10 10 0 1 NULL + t262 a 4 INT 9 10 10 0 1 NULL + t262 b 4 INT 9 10 10 0 1 NULL + t262 c 4 INT 9 10 10 0 1 NULL + t262 d 4 INT 9 10 10 0 1 NULL + t262 e 4 INT 9 10 10 0 1 NULL + t263 a 4 INT 9 10 10 0 1 NULL + t263 b 4 INT 9 10 10 0 1 NULL + t263 c 4 INT 9 10 10 0 1 NULL + t263 d 4 INT 9 10 10 0 1 NULL + t263 e 4 INT 9 10 10 0 1 NULL + t264 a 4 INT 9 10 10 0 1 NULL + t264 b 4 INT 9 10 10 0 1 NULL + t264 c 4 INT 9 10 10 0 1 NULL + t264 d 4 INT 9 10 10 0 1 NULL + t264 e 4 INT 9 10 10 0 1 NULL + t265 a 4 INT 9 10 10 0 1 NULL + t265 b 4 INT 9 10 10 0 1 NULL + t265 c 4 INT 9 10 10 0 1 NULL + t265 d 4 INT 9 10 10 0 1 NULL + t265 e 4 INT 9 10 10 0 1 NULL + t266 a 4 INT 9 10 10 0 1 NULL + t266 b 4 INT 9 10 10 0 1 NULL + t266 c 4 INT 9 10 10 0 1 NULL + t266 d 4 INT 9 10 10 0 1 NULL + t266 e 4 INT 9 10 10 0 1 NULL + t267 a 4 INT 9 10 10 0 1 NULL + t267 b 4 INT 9 10 10 0 1 NULL + t267 c 4 INT 9 10 10 0 1 NULL + t267 d 4 INT 9 10 10 0 1 NULL + t267 e 4 INT 9 10 10 0 1 NULL + t268 a 4 INT 9 10 10 0 1 NULL + t268 b 4 INT 9 10 10 0 1 NULL + t268 c 4 INT 9 10 10 0 1 NULL + t268 d 4 INT 9 10 10 0 1 NULL + t268 e 4 INT 9 10 10 0 1 NULL + t269 a 4 INT 9 10 10 0 1 NULL + t269 b 4 INT 9 10 10 0 1 NULL + t269 c 4 INT 9 10 10 0 1 NULL + t269 d 4 INT 9 10 10 0 1 NULL + t269 e 4 INT 9 10 10 0 1 NULL + t270 a 4 INT 9 10 10 0 1 NULL + t270 b 4 INT 9 10 10 0 1 NULL + t270 c 4 INT 9 10 10 0 1 NULL + t270 d 4 INT 9 10 10 0 1 NULL + t270 e 4 INT 9 10 10 0 1 NULL + t271 a 4 INT 9 10 10 0 1 NULL + t271 b 4 INT 9 10 10 0 1 NULL + t271 c 4 INT 9 10 10 0 1 NULL + t271 d 4 INT 9 10 10 0 1 NULL + t271 e 4 INT 9 10 10 0 1 NULL + t272 a 4 INT 9 10 10 0 1 NULL + t272 b 4 INT 9 10 10 0 1 NULL + t272 c 4 INT 9 10 10 0 1 NULL + t272 d 4 INT 9 10 10 0 1 NULL + t272 e 4 INT 9 10 10 0 1 NULL + t273 a 4 INT 9 10 10 0 1 NULL + t273 b 4 INT 9 10 10 0 1 NULL + t273 c 4 INT 9 10 10 0 1 NULL + t273 d 4 INT 9 10 10 0 1 NULL + t273 e 4 INT 9 10 10 0 1 NULL + t274 a 4 INT 9 10 10 0 1 NULL + t274 b 4 INT 9 10 10 0 1 NULL + t274 c 4 INT 9 10 10 0 1 NULL + t274 d 4 INT 9 10 10 0 1 NULL + t274 e 4 INT 9 10 10 0 1 NULL + t275 a 4 INT 9 10 10 0 1 NULL + t275 b 4 INT 9 10 10 0 1 NULL + t275 c 4 INT 9 10 10 0 1 NULL + t275 d 4 INT 9 10 10 0 1 NULL + t275 e 4 INT 9 10 10 0 1 NULL + t276 a 4 INT 9 10 10 0 1 NULL + t276 b 4 INT 9 10 10 0 1 NULL + t276 c 4 INT 9 10 10 0 1 NULL + t276 d 4 INT 9 10 10 0 1 NULL + t276 e 4 INT 9 10 10 0 1 NULL + t277 a 4 INT 9 10 10 0 1 NULL + t277 b 4 INT 9 10 10 0 1 NULL + t277 c 4 INT 9 10 10 0 1 NULL + t277 d 4 INT 9 10 10 0 1 NULL + t277 e 4 INT 9 10 10 0 1 NULL + t278 a 4 INT 9 10 10 0 1 NULL + t278 b 4 INT 9 10 10 0 1 NULL + t278 c 4 INT 9 10 10 0 1 NULL + t278 d 4 INT 9 10 10 0 1 NULL + t278 e 4 INT 9 10 10 0 1 NULL + t279 a 4 INT 9 10 10 0 1 NULL + t279 b 4 INT 9 10 10 0 1 NULL + t279 c 4 INT 9 10 10 0 1 NULL + t279 d 4 INT 9 10 10 0 1 NULL + t279 e 4 INT 9 10 10 0 1 NULL + t280 a 4 INT 9 10 10 0 1 NULL + t280 b 4 INT 9 10 10 0 1 NULL + t280 c 4 INT 9 10 10 0 1 NULL + t280 d 4 INT 9 10 10 0 1 NULL + t280 e 4 INT 9 10 10 0 1 NULL + t281 a 4 INT 9 10 10 0 1 NULL + t281 b 4 INT 9 10 10 0 1 NULL + t281 c 4 INT 9 10 10 0 1 NULL + t281 d 4 INT 9 10 10 0 1 NULL + t281 e 4 INT 9 10 10 0 1 NULL + t282 a 4 INT 9 10 10 0 1 NULL + t282 b 4 INT 9 10 10 0 1 NULL + t282 c 4 INT 9 10 10 0 1 NULL + t282 d 4 INT 9 10 10 0 1 NULL + t282 e 4 INT 9 10 10 0 1 NULL + t283 a 4 INT 9 10 10 0 1 NULL + t283 b 4 INT 9 10 10 0 1 NULL + t283 c 4 INT 9 10 10 0 1 NULL + t283 d 4 INT 9 10 10 0 1 NULL + t283 e 4 INT 9 10 10 0 1 NULL + t284 a 4 INT 9 10 10 0 1 NULL + t284 b 4 INT 9 10 10 0 1 NULL + t284 c 4 INT 9 10 10 0 1 NULL + t284 d 4 INT 9 10 10 0 1 NULL + t284 e 4 INT 9 10 10 0 1 NULL + t285 a 4 INT 9 10 10 0 1 NULL + t285 b 4 INT 9 10 10 0 1 NULL + t285 c 4 INT 9 10 10 0 1 NULL + t285 d 4 INT 9 10 10 0 1 NULL + t285 e 4 INT 9 10 10 0 1 NULL + t286 a 4 INT 9 10 10 0 1 NULL + t286 b 4 INT 9 10 10 0 1 NULL + t286 c 4 INT 9 10 10 0 1 NULL + t286 d 4 INT 9 10 10 0 1 NULL + t286 e 4 INT 9 10 10 0 1 NULL + t287 a 4 INT 9 10 10 0 1 NULL + t287 b 4 INT 9 10 10 0 1 NULL + t287 c 4 INT 9 10 10 0 1 NULL + t287 d 4 INT 9 10 10 0 1 NULL + t287 e 4 INT 9 10 10 0 1 NULL + t288 a 4 INT 9 10 10 0 1 NULL + t288 b 4 INT 9 10 10 0 1 NULL + t288 c 4 INT 9 10 10 0 1 NULL + t288 d 4 INT 9 10 10 0 1 NULL + t288 e 4 INT 9 10 10 0 1 NULL + t289 a 4 INT 9 10 10 0 1 NULL + t289 b 4 INT 9 10 10 0 1 NULL + t289 c 4 INT 9 10 10 0 1 NULL + t289 d 4 INT 9 10 10 0 1 NULL + t289 e 4 INT 9 10 10 0 1 NULL + t290 a 4 INT 9 10 10 0 1 NULL + t290 b 4 INT 9 10 10 0 1 NULL + t290 c 4 INT 9 10 10 0 1 NULL + t290 d 4 INT 9 10 10 0 1 NULL + t290 e 4 INT 9 10 10 0 1 NULL + t291 a 4 INT 9 10 10 0 1 NULL + t291 b 4 INT 9 10 10 0 1 NULL + t291 c 4 INT 9 10 10 0 1 NULL + t291 d 4 INT 9 10 10 0 1 NULL + t291 e 4 INT 9 10 10 0 1 NULL + t292 a 4 INT 9 10 10 0 1 NULL + t292 b 4 INT 9 10 10 0 1 NULL + t292 c 4 INT 9 10 10 0 1 NULL + t292 d 4 INT 9 10 10 0 1 NULL + t292 e 4 INT 9 10 10 0 1 NULL + t293 a 4 INT 9 10 10 0 1 NULL + t293 b 4 INT 9 10 10 0 1 NULL + t293 c 4 INT 9 10 10 0 1 NULL + t293 d 4 INT 9 10 10 0 1 NULL + t293 e 4 INT 9 10 10 0 1 NULL + t294 a 4 INT 9 10 10 0 1 NULL + t294 b 4 INT 9 10 10 0 1 NULL + t294 c 4 INT 9 10 10 0 1 NULL + t294 d 4 INT 9 10 10 0 1 NULL + t294 e 4 INT 9 10 10 0 1 NULL + t295 a 4 INT 9 10 10 0 1 NULL + t295 b 4 INT 9 10 10 0 1 NULL + t295 c 4 INT 9 10 10 0 1 NULL + t295 d 4 INT 9 10 10 0 1 NULL + t295 e 4 INT 9 10 10 0 1 NULL + t296 a 4 INT 9 10 10 0 1 NULL + t296 b 4 INT 9 10 10 0 1 NULL + t296 c 4 INT 9 10 10 0 1 NULL + t296 d 4 INT 9 10 10 0 1 NULL + t296 e 4 INT 9 10 10 0 1 NULL + t297 a 4 INT 9 10 10 0 1 NULL + t297 b 4 INT 9 10 10 0 1 NULL + t297 c 4 INT 9 10 10 0 1 NULL + t297 d 4 INT 9 10 10 0 1 NULL + t297 e 4 INT 9 10 10 0 1 NULL + t298 a 4 INT 9 10 10 0 1 NULL + t298 b 4 INT 9 10 10 0 1 NULL + t298 c 4 INT 9 10 10 0 1 NULL + t298 d 4 INT 9 10 10 0 1 NULL + t298 e 4 INT 9 10 10 0 1 NULL + t299 a 4 INT 9 10 10 0 1 NULL + t299 b 4 INT 9 10 10 0 1 NULL + t299 c 4 INT 9 10 10 0 1 NULL + t299 d 4 INT 9 10 10 0 1 NULL + t299 e 4 INT 9 10 10 0 1 NULL + t300 a 4 INT 9 10 10 0 1 NULL + t300 b 4 INT 9 10 10 0 1 NULL + t300 c 4 INT 9 10 10 0 1 NULL + t300 d 4 INT 9 10 10 0 1 NULL + t300 e 4 INT 9 10 10 0 1 NULL + t301 a 4 INT 9 10 10 0 1 NULL + t301 b 4 INT 9 10 10 0 1 NULL + t301 c 4 INT 9 10 10 0 1 NULL + t301 d 4 INT 9 10 10 0 1 NULL + t301 e 4 INT 9 10 10 0 1 NULL + t302 a 4 INT 9 10 10 0 1 NULL + t302 b 4 INT 9 10 10 0 1 NULL + t302 c 4 INT 9 10 10 0 1 NULL + t302 d 4 INT 9 10 10 0 1 NULL + t302 e 4 INT 9 10 10 0 1 NULL + t303 a 4 INT 9 10 10 0 1 NULL + t303 b 4 INT 9 10 10 0 1 NULL + t303 c 4 INT 9 10 10 0 1 NULL + t303 d 4 INT 9 10 10 0 1 NULL + t303 e 4 INT 9 10 10 0 1 NULL + t304 a 4 INT 9 10 10 0 1 NULL + t304 b 4 INT 9 10 10 0 1 NULL + t304 c 4 INT 9 10 10 0 1 NULL + t304 d 4 INT 9 10 10 0 1 NULL + t304 e 4 INT 9 10 10 0 1 NULL + t305 a 4 INT 9 10 10 0 1 NULL + t305 b 4 INT 9 10 10 0 1 NULL + t305 c 4 INT 9 10 10 0 1 NULL + t305 d 4 INT 9 10 10 0 1 NULL + t305 e 4 INT 9 10 10 0 1 NULL + t306 a 4 INT 9 10 10 0 1 NULL + t306 b 4 INT 9 10 10 0 1 NULL + t306 c 4 INT 9 10 10 0 1 NULL + t306 d 4 INT 9 10 10 0 1 NULL + t306 e 4 INT 9 10 10 0 1 NULL + t307 a 4 INT 9 10 10 0 1 NULL + t307 b 4 INT 9 10 10 0 1 NULL + t307 c 4 INT 9 10 10 0 1 NULL + t307 d 4 INT 9 10 10 0 1 NULL + t307 e 4 INT 9 10 10 0 1 NULL + t308 a 4 INT 9 10 10 0 1 NULL + t308 b 4 INT 9 10 10 0 1 NULL + t308 c 4 INT 9 10 10 0 1 NULL + t308 d 4 INT 9 10 10 0 1 NULL + t308 e 4 INT 9 10 10 0 1 NULL + t309 a 4 INT 9 10 10 0 1 NULL + t309 b 4 INT 9 10 10 0 1 NULL + t309 c 4 INT 9 10 10 0 1 NULL + t309 d 4 INT 9 10 10 0 1 NULL + t309 e 4 INT 9 10 10 0 1 NULL + t310 a 4 INT 9 10 10 0 1 NULL + t310 b 4 INT 9 10 10 0 1 NULL + t310 c 4 INT 9 10 10 0 1 NULL + t310 d 4 INT 9 10 10 0 1 NULL + t310 e 4 INT 9 10 10 0 1 NULL + t311 a 4 INT 9 10 10 0 1 NULL + t311 b 4 INT 9 10 10 0 1 NULL + t311 c 4 INT 9 10 10 0 1 NULL + t311 d 4 INT 9 10 10 0 1 NULL + t311 e 4 INT 9 10 10 0 1 NULL + t312 a 4 INT 9 10 10 0 1 NULL + t312 b 4 INT 9 10 10 0 1 NULL + t312 c 4 INT 9 10 10 0 1 NULL + t312 d 4 INT 9 10 10 0 1 NULL + t312 e 4 INT 9 10 10 0 1 NULL + t313 a 4 INT 9 10 10 0 1 NULL + t313 b 4 INT 9 10 10 0 1 NULL + t313 c 4 INT 9 10 10 0 1 NULL + t313 d 4 INT 9 10 10 0 1 NULL + t313 e 4 INT 9 10 10 0 1 NULL + t314 a 4 INT 9 10 10 0 1 NULL + t314 b 4 INT 9 10 10 0 1 NULL + t314 c 4 INT 9 10 10 0 1 NULL + t314 d 4 INT 9 10 10 0 1 NULL + t314 e 4 INT 9 10 10 0 1 NULL + t315 a 4 INT 9 10 10 0 1 NULL + t315 b 4 INT 9 10 10 0 1 NULL + t315 c 4 INT 9 10 10 0 1 NULL + t315 d 4 INT 9 10 10 0 1 NULL + t315 e 4 INT 9 10 10 0 1 NULL + t316 a 4 INT 9 10 10 0 1 NULL + t316 b 4 INT 9 10 10 0 1 NULL + t316 c 4 INT 9 10 10 0 1 NULL + t316 d 4 INT 9 10 10 0 1 NULL + t316 e 4 INT 9 10 10 0 1 NULL + t317 a 4 INT 9 10 10 0 1 NULL + t317 b 4 INT 9 10 10 0 1 NULL + t317 c 4 INT 9 10 10 0 1 NULL + t317 d 4 INT 9 10 10 0 1 NULL + t317 e 4 INT 9 10 10 0 1 NULL + t318 a 4 INT 9 10 10 0 1 NULL + t318 b 4 INT 9 10 10 0 1 NULL + t318 c 4 INT 9 10 10 0 1 NULL + t318 d 4 INT 9 10 10 0 1 NULL + t318 e 4 INT 9 10 10 0 1 NULL + t319 a 4 INT 9 10 10 0 1 NULL + t319 b 4 INT 9 10 10 0 1 NULL + t319 c 4 INT 9 10 10 0 1 NULL + t319 d 4 INT 9 10 10 0 1 NULL + t319 e 4 INT 9 10 10 0 1 NULL + t320 a 4 INT 9 10 10 0 1 NULL + t320 b 4 INT 9 10 10 0 1 NULL + t320 c 4 INT 9 10 10 0 1 NULL + t320 d 4 INT 9 10 10 0 1 NULL + t320 e 4 INT 9 10 10 0 1 NULL + t321 a 4 INT 9 10 10 0 1 NULL + t321 b 4 INT 9 10 10 0 1 NULL + t321 c 4 INT 9 10 10 0 1 NULL + t321 d 4 INT 9 10 10 0 1 NULL + t321 e 4 INT 9 10 10 0 1 NULL + t322 a 4 INT 9 10 10 0 1 NULL + t322 b 4 INT 9 10 10 0 1 NULL + t322 c 4 INT 9 10 10 0 1 NULL + t322 d 4 INT 9 10 10 0 1 NULL + t322 e 4 INT 9 10 10 0 1 NULL + t323 a 4 INT 9 10 10 0 1 NULL + t323 b 4 INT 9 10 10 0 1 NULL + t323 c 4 INT 9 10 10 0 1 NULL + t323 d 4 INT 9 10 10 0 1 NULL + t323 e 4 INT 9 10 10 0 1 NULL + t324 a 4 INT 9 10 10 0 1 NULL + t324 b 4 INT 9 10 10 0 1 NULL + t324 c 4 INT 9 10 10 0 1 NULL + t324 d 4 INT 9 10 10 0 1 NULL + t324 e 4 INT 9 10 10 0 1 NULL + t325 a 4 INT 9 10 10 0 1 NULL + t325 b 4 INT 9 10 10 0 1 NULL + t325 c 4 INT 9 10 10 0 1 NULL + t325 d 4 INT 9 10 10 0 1 NULL + t325 e 4 INT 9 10 10 0 1 NULL + t326 a 4 INT 9 10 10 0 1 NULL + t326 b 4 INT 9 10 10 0 1 NULL + t326 c 4 INT 9 10 10 0 1 NULL + t326 d 4 INT 9 10 10 0 1 NULL + t326 e 4 INT 9 10 10 0 1 NULL + t327 a 4 INT 9 10 10 0 1 NULL + t327 b 4 INT 9 10 10 0 1 NULL + t327 c 4 INT 9 10 10 0 1 NULL + t327 d 4 INT 9 10 10 0 1 NULL + t327 e 4 INT 9 10 10 0 1 NULL + t328 a 4 INT 9 10 10 0 1 NULL + t328 b 4 INT 9 10 10 0 1 NULL + t328 c 4 INT 9 10 10 0 1 NULL + t328 d 4 INT 9 10 10 0 1 NULL + t328 e 4 INT 9 10 10 0 1 NULL + t329 a 4 INT 9 10 10 0 1 NULL + t329 b 4 INT 9 10 10 0 1 NULL + t329 c 4 INT 9 10 10 0 1 NULL + t329 d 4 INT 9 10 10 0 1 NULL + t329 e 4 INT 9 10 10 0 1 NULL + t330 a 4 INT 9 10 10 0 1 NULL + t330 b 4 INT 9 10 10 0 1 NULL + t330 c 4 INT 9 10 10 0 1 NULL + t330 d 4 INT 9 10 10 0 1 NULL + t330 e 4 INT 9 10 10 0 1 NULL + t331 a 4 INT 9 10 10 0 1 NULL + t331 b 4 INT 9 10 10 0 1 NULL + t331 c 4 INT 9 10 10 0 1 NULL + t331 d 4 INT 9 10 10 0 1 NULL + t331 e 4 INT 9 10 10 0 1 NULL + t332 a 4 INT 9 10 10 0 1 NULL + t332 b 4 INT 9 10 10 0 1 NULL + t332 c 4 INT 9 10 10 0 1 NULL + t332 d 4 INT 9 10 10 0 1 NULL + t332 e 4 INT 9 10 10 0 1 NULL + t333 a 4 INT 9 10 10 0 1 NULL + t333 b 4 INT 9 10 10 0 1 NULL + t333 c 4 INT 9 10 10 0 1 NULL + t333 d 4 INT 9 10 10 0 1 NULL + t333 e 4 INT 9 10 10 0 1 NULL + t334 a 4 INT 9 10 10 0 1 NULL + t334 b 4 INT 9 10 10 0 1 NULL + t334 c 4 INT 9 10 10 0 1 NULL + t334 d 4 INT 9 10 10 0 1 NULL + t334 e 4 INT 9 10 10 0 1 NULL + t335 a 4 INT 9 10 10 0 1 NULL + t335 b 4 INT 9 10 10 0 1 NULL + t335 c 4 INT 9 10 10 0 1 NULL + t335 d 4 INT 9 10 10 0 1 NULL + t335 e 4 INT 9 10 10 0 1 NULL + t336 a 4 INT 9 10 10 0 1 NULL + t336 b 4 INT 9 10 10 0 1 NULL + t336 c 4 INT 9 10 10 0 1 NULL + t336 d 4 INT 9 10 10 0 1 NULL + t336 e 4 INT 9 10 10 0 1 NULL + t337 a 4 INT 9 10 10 0 1 NULL + t337 b 4 INT 9 10 10 0 1 NULL + t337 c 4 INT 9 10 10 0 1 NULL + t337 d 4 INT 9 10 10 0 1 NULL + t337 e 4 INT 9 10 10 0 1 NULL + t338 a 4 INT 9 10 10 0 1 NULL + t338 b 4 INT 9 10 10 0 1 NULL + t338 c 4 INT 9 10 10 0 1 NULL + t338 d 4 INT 9 10 10 0 1 NULL + t338 e 4 INT 9 10 10 0 1 NULL + t339 a 4 INT 9 10 10 0 1 NULL + t339 b 4 INT 9 10 10 0 1 NULL + t339 c 4 INT 9 10 10 0 1 NULL + t339 d 4 INT 9 10 10 0 1 NULL + t339 e 4 INT 9 10 10 0 1 NULL + t340 a 4 INT 9 10 10 0 1 NULL + t340 b 4 INT 9 10 10 0 1 NULL + t340 c 4 INT 9 10 10 0 1 NULL + t340 d 4 INT 9 10 10 0 1 NULL + t340 e 4 INT 9 10 10 0 1 NULL + t341 a 4 INT 9 10 10 0 1 NULL + t341 b 4 INT 9 10 10 0 1 NULL + t341 c 4 INT 9 10 10 0 1 NULL + t341 d 4 INT 9 10 10 0 1 NULL + t341 e 4 INT 9 10 10 0 1 NULL + t342 a 4 INT 9 10 10 0 1 NULL + t342 b 4 INT 9 10 10 0 1 NULL + t342 c 4 INT 9 10 10 0 1 NULL + t342 d 4 INT 9 10 10 0 1 NULL + t342 e 4 INT 9 10 10 0 1 NULL + t343 a 4 INT 9 10 10 0 1 NULL + t343 b 4 INT 9 10 10 0 1 NULL + t343 c 4 INT 9 10 10 0 1 NULL + t343 d 4 INT 9 10 10 0 1 NULL + t343 e 4 INT 9 10 10 0 1 NULL + t344 a 4 INT 9 10 10 0 1 NULL + t344 b 4 INT 9 10 10 0 1 NULL + t344 c 4 INT 9 10 10 0 1 NULL + t344 d 4 INT 9 10 10 0 1 NULL + t344 e 4 INT 9 10 10 0 1 NULL + t345 a 4 INT 9 10 10 0 1 NULL + t345 b 4 INT 9 10 10 0 1 NULL + t345 c 4 INT 9 10 10 0 1 NULL + t345 d 4 INT 9 10 10 0 1 NULL + t345 e 4 INT 9 10 10 0 1 NULL + t346 a 4 INT 9 10 10 0 1 NULL + t346 b 4 INT 9 10 10 0 1 NULL + t346 c 4 INT 9 10 10 0 1 NULL + t346 d 4 INT 9 10 10 0 1 NULL + t346 e 4 INT 9 10 10 0 1 NULL + t347 a 4 INT 9 10 10 0 1 NULL + t347 b 4 INT 9 10 10 0 1 NULL + t347 c 4 INT 9 10 10 0 1 NULL + t347 d 4 INT 9 10 10 0 1 NULL + t347 e 4 INT 9 10 10 0 1 NULL + t348 a 4 INT 9 10 10 0 1 NULL + t348 b 4 INT 9 10 10 0 1 NULL + t348 c 4 INT 9 10 10 0 1 NULL + t348 d 4 INT 9 10 10 0 1 NULL + t348 e 4 INT 9 10 10 0 1 NULL + t349 a 4 INT 9 10 10 0 1 NULL + t349 b 4 INT 9 10 10 0 1 NULL + t349 c 4 INT 9 10 10 0 1 NULL + t349 d 4 INT 9 10 10 0 1 NULL + t349 e 4 INT 9 10 10 0 1 NULL + t350 a 4 INT 9 10 10 0 1 NULL + t350 b 4 INT 9 10 10 0 1 NULL + t350 c 4 INT 9 10 10 0 1 NULL + t350 d 4 INT 9 10 10 0 1 NULL + t350 e 4 INT 9 10 10 0 1 NULL + t351 a 4 INT 9 10 10 0 1 NULL + t351 b 4 INT 9 10 10 0 1 NULL + t351 c 4 INT 9 10 10 0 1 NULL + t351 d 4 INT 9 10 10 0 1 NULL + t351 e 4 INT 9 10 10 0 1 NULL + t352 a 4 INT 9 10 10 0 1 NULL + t352 b 4 INT 9 10 10 0 1 NULL + t352 c 4 INT 9 10 10 0 1 NULL + t352 d 4 INT 9 10 10 0 1 NULL + t352 e 4 INT 9 10 10 0 1 NULL + t353 a 4 INT 9 10 10 0 1 NULL + t353 b 4 INT 9 10 10 0 1 NULL + t353 c 4 INT 9 10 10 0 1 NULL + t353 d 4 INT 9 10 10 0 1 NULL + t353 e 4 INT 9 10 10 0 1 NULL + t354 a 4 INT 9 10 10 0 1 NULL + t354 b 4 INT 9 10 10 0 1 NULL + t354 c 4 INT 9 10 10 0 1 NULL + t354 d 4 INT 9 10 10 0 1 NULL + t354 e 4 INT 9 10 10 0 1 NULL + t355 a 4 INT 9 10 10 0 1 NULL + t355 b 4 INT 9 10 10 0 1 NULL + t355 c 4 INT 9 10 10 0 1 NULL + t355 d 4 INT 9 10 10 0 1 NULL + t355 e 4 INT 9 10 10 0 1 NULL + t356 a 4 INT 9 10 10 0 1 NULL + t356 b 4 INT 9 10 10 0 1 NULL + t356 c 4 INT 9 10 10 0 1 NULL + t356 d 4 INT 9 10 10 0 1 NULL + t356 e 4 INT 9 10 10 0 1 NULL + t357 a 4 INT 9 10 10 0 1 NULL + t357 b 4 INT 9 10 10 0 1 NULL + t357 c 4 INT 9 10 10 0 1 NULL + t357 d 4 INT 9 10 10 0 1 NULL + t357 e 4 INT 9 10 10 0 1 NULL + t358 a 4 INT 9 10 10 0 1 NULL + t358 b 4 INT 9 10 10 0 1 NULL + t358 c 4 INT 9 10 10 0 1 NULL + t358 d 4 INT 9 10 10 0 1 NULL + t358 e 4 INT 9 10 10 0 1 NULL + t359 a 4 INT 9 10 10 0 1 NULL + t359 b 4 INT 9 10 10 0 1 NULL + t359 c 4 INT 9 10 10 0 1 NULL + t359 d 4 INT 9 10 10 0 1 NULL + t359 e 4 INT 9 10 10 0 1 NULL + t360 a 4 INT 9 10 10 0 1 NULL + t360 b 4 INT 9 10 10 0 1 NULL + t360 c 4 INT 9 10 10 0 1 NULL + t360 d 4 INT 9 10 10 0 1 NULL + t360 e 4 INT 9 10 10 0 1 NULL + t361 a 4 INT 9 10 10 0 1 NULL + t361 b 4 INT 9 10 10 0 1 NULL + t361 c 4 INT 9 10 10 0 1 NULL + t361 d 4 INT 9 10 10 0 1 NULL + t361 e 4 INT 9 10 10 0 1 NULL + t362 a 4 INT 9 10 10 0 1 NULL + t362 b 4 INT 9 10 10 0 1 NULL + t362 c 4 INT 9 10 10 0 1 NULL + t362 d 4 INT 9 10 10 0 1 NULL + t362 e 4 INT 9 10 10 0 1 NULL + t363 a 4 INT 9 10 10 0 1 NULL + t363 b 4 INT 9 10 10 0 1 NULL + t363 c 4 INT 9 10 10 0 1 NULL + t363 d 4 INT 9 10 10 0 1 NULL + t363 e 4 INT 9 10 10 0 1 NULL + t364 a 4 INT 9 10 10 0 1 NULL + t364 b 4 INT 9 10 10 0 1 NULL + t364 c 4 INT 9 10 10 0 1 NULL + t364 d 4 INT 9 10 10 0 1 NULL + t364 e 4 INT 9 10 10 0 1 NULL + t365 a 4 INT 9 10 10 0 1 NULL + t365 b 4 INT 9 10 10 0 1 NULL + t365 c 4 INT 9 10 10 0 1 NULL + t365 d 4 INT 9 10 10 0 1 NULL + t365 e 4 INT 9 10 10 0 1 NULL + t366 a 4 INT 9 10 10 0 1 NULL + t366 b 4 INT 9 10 10 0 1 NULL + t366 c 4 INT 9 10 10 0 1 NULL + t366 d 4 INT 9 10 10 0 1 NULL + t366 e 4 INT 9 10 10 0 1 NULL + t367 a 4 INT 9 10 10 0 1 NULL + t367 b 4 INT 9 10 10 0 1 NULL + t367 c 4 INT 9 10 10 0 1 NULL + t367 d 4 INT 9 10 10 0 1 NULL + t367 e 4 INT 9 10 10 0 1 NULL + t368 a 4 INT 9 10 10 0 1 NULL + t368 b 4 INT 9 10 10 0 1 NULL + t368 c 4 INT 9 10 10 0 1 NULL + t368 d 4 INT 9 10 10 0 1 NULL + t368 e 4 INT 9 10 10 0 1 NULL + t369 a 4 INT 9 10 10 0 1 NULL + t369 b 4 INT 9 10 10 0 1 NULL + t369 c 4 INT 9 10 10 0 1 NULL + t369 d 4 INT 9 10 10 0 1 NULL + t369 e 4 INT 9 10 10 0 1 NULL + t370 a 4 INT 9 10 10 0 1 NULL + t370 b 4 INT 9 10 10 0 1 NULL + t370 c 4 INT 9 10 10 0 1 NULL + t370 d 4 INT 9 10 10 0 1 NULL + t370 e 4 INT 9 10 10 0 1 NULL + t371 a 4 INT 9 10 10 0 1 NULL + t371 b 4 INT 9 10 10 0 1 NULL + t371 c 4 INT 9 10 10 0 1 NULL + t371 d 4 INT 9 10 10 0 1 NULL + t371 e 4 INT 9 10 10 0 1 NULL + t372 a 4 INT 9 10 10 0 1 NULL + t372 b 4 INT 9 10 10 0 1 NULL + t372 c 4 INT 9 10 10 0 1 NULL + t372 d 4 INT 9 10 10 0 1 NULL + t372 e 4 INT 9 10 10 0 1 NULL + t373 a 4 INT 9 10 10 0 1 NULL + t373 b 4 INT 9 10 10 0 1 NULL + t373 c 4 INT 9 10 10 0 1 NULL + t373 d 4 INT 9 10 10 0 1 NULL + t373 e 4 INT 9 10 10 0 1 NULL + t374 a 4 INT 9 10 10 0 1 NULL + t374 b 4 INT 9 10 10 0 1 NULL + t374 c 4 INT 9 10 10 0 1 NULL + t374 d 4 INT 9 10 10 0 1 NULL + t374 e 4 INT 9 10 10 0 1 NULL + t375 a 4 INT 9 10 10 0 1 NULL + t375 b 4 INT 9 10 10 0 1 NULL + t375 c 4 INT 9 10 10 0 1 NULL + t375 d 4 INT 9 10 10 0 1 NULL + t375 e 4 INT 9 10 10 0 1 NULL + t376 a 4 INT 9 10 10 0 1 NULL + t376 b 4 INT 9 10 10 0 1 NULL + t376 c 4 INT 9 10 10 0 1 NULL + t376 d 4 INT 9 10 10 0 1 NULL + t376 e 4 INT 9 10 10 0 1 NULL + t377 a 4 INT 9 10 10 0 1 NULL + t377 b 4 INT 9 10 10 0 1 NULL + t377 c 4 INT 9 10 10 0 1 NULL + t377 d 4 INT 9 10 10 0 1 NULL + t377 e 4 INT 9 10 10 0 1 NULL + t378 a 4 INT 9 10 10 0 1 NULL + t378 b 4 INT 9 10 10 0 1 NULL + t378 c 4 INT 9 10 10 0 1 NULL + t378 d 4 INT 9 10 10 0 1 NULL + t378 e 4 INT 9 10 10 0 1 NULL + t379 a 4 INT 9 10 10 0 1 NULL + t379 b 4 INT 9 10 10 0 1 NULL + t379 c 4 INT 9 10 10 0 1 NULL + t379 d 4 INT 9 10 10 0 1 NULL + t379 e 4 INT 9 10 10 0 1 NULL + t380 a 4 INT 9 10 10 0 1 NULL + t380 b 4 INT 9 10 10 0 1 NULL + t380 c 4 INT 9 10 10 0 1 NULL + t380 d 4 INT 9 10 10 0 1 NULL + t380 e 4 INT 9 10 10 0 1 NULL + t381 a 4 INT 9 10 10 0 1 NULL + t381 b 4 INT 9 10 10 0 1 NULL + t381 c 4 INT 9 10 10 0 1 NULL + t381 d 4 INT 9 10 10 0 1 NULL + t381 e 4 INT 9 10 10 0 1 NULL + t382 a 4 INT 9 10 10 0 1 NULL + t382 b 4 INT 9 10 10 0 1 NULL + t382 c 4 INT 9 10 10 0 1 NULL + t382 d 4 INT 9 10 10 0 1 NULL + t382 e 4 INT 9 10 10 0 1 NULL + t383 a 4 INT 9 10 10 0 1 NULL + t383 b 4 INT 9 10 10 0 1 NULL + t383 c 4 INT 9 10 10 0 1 NULL + t383 d 4 INT 9 10 10 0 1 NULL + t383 e 4 INT 9 10 10 0 1 NULL + t384 a 4 INT 9 10 10 0 1 NULL + t384 b 4 INT 9 10 10 0 1 NULL + t384 c 4 INT 9 10 10 0 1 NULL + t384 d 4 INT 9 10 10 0 1 NULL + t384 e 4 INT 9 10 10 0 1 NULL + t385 a 4 INT 9 10 10 0 1 NULL + t385 b 4 INT 9 10 10 0 1 NULL + t385 c 4 INT 9 10 10 0 1 NULL + t385 d 4 INT 9 10 10 0 1 NULL + t385 e 4 INT 9 10 10 0 1 NULL + t386 a 4 INT 9 10 10 0 1 NULL + t386 b 4 INT 9 10 10 0 1 NULL + t386 c 4 INT 9 10 10 0 1 NULL + t386 d 4 INT 9 10 10 0 1 NULL + t386 e 4 INT 9 10 10 0 1 NULL + t387 a 4 INT 9 10 10 0 1 NULL + t387 b 4 INT 9 10 10 0 1 NULL + t387 c 4 INT 9 10 10 0 1 NULL + t387 d 4 INT 9 10 10 0 1 NULL + t387 e 4 INT 9 10 10 0 1 NULL + t388 a 4 INT 9 10 10 0 1 NULL + t388 b 4 INT 9 10 10 0 1 NULL + t388 c 4 INT 9 10 10 0 1 NULL + t388 d 4 INT 9 10 10 0 1 NULL + t388 e 4 INT 9 10 10 0 1 NULL + t389 a 4 INT 9 10 10 0 1 NULL + t389 b 4 INT 9 10 10 0 1 NULL + t389 c 4 INT 9 10 10 0 1 NULL + t389 d 4 INT 9 10 10 0 1 NULL + t389 e 4 INT 9 10 10 0 1 NULL + t390 a 4 INT 9 10 10 0 1 NULL + t390 b 4 INT 9 10 10 0 1 NULL + t390 c 4 INT 9 10 10 0 1 NULL + t390 d 4 INT 9 10 10 0 1 NULL + t390 e 4 INT 9 10 10 0 1 NULL + t391 a 4 INT 9 10 10 0 1 NULL + t391 b 4 INT 9 10 10 0 1 NULL + t391 c 4 INT 9 10 10 0 1 NULL + t391 d 4 INT 9 10 10 0 1 NULL + t391 e 4 INT 9 10 10 0 1 NULL + t392 a 4 INT 9 10 10 0 1 NULL + t392 b 4 INT 9 10 10 0 1 NULL + t392 c 4 INT 9 10 10 0 1 NULL + t392 d 4 INT 9 10 10 0 1 NULL + t392 e 4 INT 9 10 10 0 1 NULL + t393 a 4 INT 9 10 10 0 1 NULL + t393 b 4 INT 9 10 10 0 1 NULL + t393 c 4 INT 9 10 10 0 1 NULL + t393 d 4 INT 9 10 10 0 1 NULL + t393 e 4 INT 9 10 10 0 1 NULL + t394 a 4 INT 9 10 10 0 1 NULL + t394 b 4 INT 9 10 10 0 1 NULL + t394 c 4 INT 9 10 10 0 1 NULL + t394 d 4 INT 9 10 10 0 1 NULL + t394 e 4 INT 9 10 10 0 1 NULL + t395 a 4 INT 9 10 10 0 1 NULL + t395 b 4 INT 9 10 10 0 1 NULL + t395 c 4 INT 9 10 10 0 1 NULL + t395 d 4 INT 9 10 10 0 1 NULL + t395 e 4 INT 9 10 10 0 1 NULL + t396 a 4 INT 9 10 10 0 1 NULL + t396 b 4 INT 9 10 10 0 1 NULL + t396 c 4 INT 9 10 10 0 1 NULL + t396 d 4 INT 9 10 10 0 1 NULL + t396 e 4 INT 9 10 10 0 1 NULL + t397 a 4 INT 9 10 10 0 1 NULL + t397 b 4 INT 9 10 10 0 1 NULL + t397 c 4 INT 9 10 10 0 1 NULL + t397 d 4 INT 9 10 10 0 1 NULL + t397 e 4 INT 9 10 10 0 1 NULL + t398 a 4 INT 9 10 10 0 1 NULL + t398 b 4 INT 9 10 10 0 1 NULL + t398 c 4 INT 9 10 10 0 1 NULL + t398 d 4 INT 9 10 10 0 1 NULL + t398 e 4 INT 9 10 10 0 1 NULL + t399 a 4 INT 9 10 10 0 1 NULL + t399 b 4 INT 9 10 10 0 1 NULL + t399 c 4 INT 9 10 10 0 1 NULL + t399 d 4 INT 9 10 10 0 1 NULL + t399 e 4 INT 9 10 10 0 1 NULL DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; SELECT * FROM t1 ORDER BY Table_name; Table_Cat Table_Schema Table_Name Table_Type Remark - t000 TABLE - t001 TABLE - t002 TABLE - t003 TABLE - t004 TABLE - t005 TABLE - t006 TABLE - t007 TABLE - t008 TABLE - t009 TABLE - t010 TABLE - t011 TABLE - t012 TABLE - t013 TABLE - t014 TABLE - t015 TABLE - t016 TABLE - t017 TABLE - t018 TABLE - t019 TABLE - t020 TABLE - t021 TABLE - t022 TABLE - t023 TABLE - t024 TABLE - t025 TABLE - t026 TABLE - t027 TABLE - t028 TABLE - t029 TABLE - t030 TABLE - t031 TABLE - t032 TABLE - t033 TABLE - t034 TABLE - t035 TABLE - t036 TABLE - t037 TABLE - t038 TABLE - t039 TABLE - t040 TABLE - t041 TABLE - t042 TABLE - t043 TABLE - t044 TABLE - t045 TABLE - t046 TABLE - t047 TABLE - t048 TABLE - t049 TABLE - t050 TABLE - t051 TABLE - t052 TABLE - t053 TABLE - t054 TABLE - t055 TABLE - t056 TABLE - t057 TABLE - t058 TABLE - t059 TABLE - t060 TABLE - t061 TABLE - t062 TABLE - t063 TABLE - t064 TABLE - t065 TABLE - t066 TABLE - t067 TABLE - t068 TABLE - t069 TABLE - t070 TABLE - t071 TABLE - t072 TABLE - t073 TABLE - t074 TABLE - t075 TABLE - t076 TABLE - t077 TABLE - t078 TABLE - t079 TABLE - t080 TABLE - t081 TABLE - t082 TABLE - t083 TABLE - t084 TABLE - t085 TABLE - t086 TABLE - t087 TABLE - t088 TABLE - t089 TABLE - t090 TABLE - t091 TABLE - t092 TABLE - t093 TABLE - t094 TABLE - t095 TABLE - t096 TABLE - t097 TABLE - t098 TABLE - t099 TABLE - t1 TABLE - t100 TABLE - t101 TABLE - t102 TABLE - t103 TABLE - t104 TABLE - t105 TABLE - t106 TABLE - t107 TABLE - t108 TABLE - t109 TABLE - t110 TABLE - t111 TABLE - t112 TABLE - t113 TABLE - t114 TABLE - t115 TABLE - t116 TABLE - t117 TABLE - t118 TABLE - t119 TABLE - t120 TABLE - t121 TABLE - t122 TABLE - t123 TABLE - t124 TABLE - t125 TABLE - t126 TABLE - t127 TABLE - t128 TABLE - t129 TABLE - t130 TABLE - t131 TABLE - t132 TABLE - t133 TABLE - t134 TABLE - t135 TABLE - t136 TABLE - t137 TABLE - t138 TABLE - t139 TABLE - t140 TABLE - t141 TABLE - t142 TABLE - t143 TABLE - t144 TABLE - t145 TABLE - t146 TABLE - t147 TABLE - t148 TABLE - t149 TABLE - t150 TABLE - t151 TABLE - t152 TABLE - t153 TABLE - t154 TABLE - t155 TABLE - t156 TABLE - t157 TABLE - t158 TABLE - t159 TABLE - t160 TABLE - t161 TABLE - t162 TABLE - t163 TABLE - t164 TABLE - t165 TABLE - t166 TABLE - t167 TABLE - t168 TABLE - t169 TABLE - t170 TABLE - t171 TABLE - t172 TABLE - t173 TABLE - t174 TABLE - t175 TABLE - t176 TABLE - t177 TABLE - t178 TABLE - t179 TABLE - t180 TABLE - t181 TABLE - t182 TABLE - t183 TABLE - t184 TABLE - t185 TABLE - t186 TABLE - t187 TABLE - t188 TABLE - t189 TABLE - t190 TABLE - t191 TABLE - t192 TABLE - t193 TABLE - t194 TABLE - t195 TABLE - t196 TABLE - t197 TABLE - t198 TABLE - t199 TABLE - t200 TABLE - t201 TABLE - t202 TABLE - t203 TABLE - t204 TABLE - t205 TABLE - t206 TABLE - t207 TABLE - t208 TABLE - t209 TABLE - t210 TABLE - t211 TABLE - t212 TABLE - t213 TABLE - t214 TABLE - t215 TABLE - t216 TABLE - t217 TABLE - t218 TABLE - t219 TABLE - t220 TABLE - t221 TABLE - t222 TABLE - t223 TABLE - t224 TABLE - t225 TABLE - t226 TABLE - t227 TABLE - t228 TABLE - t229 TABLE - t230 TABLE - t231 TABLE - t232 TABLE - t233 TABLE - t234 TABLE - t235 TABLE - t236 TABLE - t237 TABLE - t238 TABLE - t239 TABLE - t240 TABLE - t241 TABLE - t242 TABLE - t243 TABLE - t244 TABLE - t245 TABLE - t246 TABLE - t247 TABLE - t248 TABLE - t249 TABLE - t250 TABLE - t251 TABLE - t252 TABLE - t253 TABLE - t254 TABLE - t255 TABLE - t256 TABLE - t257 TABLE - t258 TABLE - t259 TABLE - t260 TABLE - t261 TABLE - t262 TABLE - t263 TABLE - t264 TABLE - t265 TABLE - t266 TABLE - t267 TABLE - t268 TABLE - t269 TABLE - t270 TABLE - t271 TABLE - t272 TABLE - t273 TABLE - t274 TABLE - t275 TABLE - t276 TABLE - t277 TABLE - t278 TABLE - t279 TABLE - t280 TABLE - t281 TABLE - t282 TABLE - t283 TABLE - t284 TABLE - t285 TABLE - t286 TABLE - t287 TABLE - t288 TABLE - t289 TABLE - t290 TABLE - t291 TABLE - t292 TABLE - t293 TABLE - t294 TABLE - t295 TABLE - t296 TABLE - t297 TABLE - t298 TABLE - t299 TABLE - t300 TABLE - t301 TABLE - t302 TABLE - t303 TABLE - t304 TABLE - t305 TABLE - t306 TABLE - t307 TABLE - t308 TABLE - t309 TABLE - t310 TABLE - t311 TABLE - t312 TABLE - t313 TABLE - t314 TABLE - t315 TABLE - t316 TABLE - t317 TABLE - t318 TABLE - t319 TABLE - t320 TABLE - t321 TABLE - t322 TABLE - t323 TABLE - t324 TABLE - t325 TABLE - t326 TABLE - t327 TABLE - t328 TABLE - t329 TABLE - t330 TABLE - t331 TABLE - t332 TABLE - t333 TABLE - t334 TABLE - t335 TABLE - t336 TABLE - t337 TABLE - t338 TABLE - t339 TABLE - t340 TABLE - t341 TABLE - t342 TABLE - t343 TABLE - t344 TABLE - t345 TABLE - t346 TABLE - t347 TABLE - t348 TABLE - t349 TABLE - t350 TABLE - t351 TABLE - t352 TABLE - t353 TABLE - t354 TABLE - t355 TABLE - t356 TABLE - t357 TABLE - t358 TABLE - t359 TABLE - t360 TABLE - t361 TABLE - t362 TABLE - t363 TABLE - t364 TABLE - t365 TABLE - t366 TABLE - t367 TABLE - t368 TABLE - t369 TABLE - t370 TABLE - t371 TABLE - t372 TABLE - t373 TABLE - t374 TABLE - t375 TABLE - t376 TABLE - t377 TABLE - t378 TABLE - t379 TABLE - t380 TABLE - t381 TABLE - t382 TABLE - t383 TABLE - t384 TABLE - t385 TABLE - t386 TABLE - t387 TABLE - t388 TABLE - t389 TABLE - t390 TABLE - t391 TABLE - t392 TABLE - t393 TABLE - t394 TABLE - t395 TABLE - t396 TABLE - t397 TABLE - t398 TABLE - t399 TABLE +NULL NULL t000 TABLE NULL +NULL NULL t001 TABLE NULL +NULL NULL t002 TABLE NULL +NULL NULL t003 TABLE NULL +NULL NULL t004 TABLE NULL +NULL NULL t005 TABLE NULL +NULL NULL t006 TABLE NULL +NULL NULL t007 TABLE NULL +NULL NULL t008 TABLE NULL +NULL NULL t009 TABLE NULL +NULL NULL t010 TABLE NULL +NULL NULL t011 TABLE NULL +NULL NULL t012 TABLE NULL +NULL NULL t013 TABLE NULL +NULL NULL t014 TABLE NULL +NULL NULL t015 TABLE NULL +NULL NULL t016 TABLE NULL +NULL NULL t017 TABLE NULL +NULL NULL t018 TABLE NULL +NULL NULL t019 TABLE NULL +NULL NULL t020 TABLE NULL +NULL NULL t021 TABLE NULL +NULL NULL t022 TABLE NULL +NULL NULL t023 TABLE NULL +NULL NULL t024 TABLE NULL +NULL NULL t025 TABLE NULL +NULL NULL t026 TABLE NULL +NULL NULL t027 TABLE NULL +NULL NULL t028 TABLE NULL +NULL NULL t029 TABLE NULL +NULL NULL t030 TABLE NULL +NULL NULL t031 TABLE NULL +NULL NULL t032 TABLE NULL +NULL NULL t033 TABLE NULL +NULL NULL t034 TABLE NULL +NULL NULL t035 TABLE NULL +NULL NULL t036 TABLE NULL +NULL NULL t037 TABLE NULL +NULL NULL t038 TABLE NULL +NULL NULL t039 TABLE NULL +NULL NULL t040 TABLE NULL +NULL NULL t041 TABLE NULL +NULL NULL t042 TABLE NULL +NULL NULL t043 TABLE NULL +NULL NULL t044 TABLE NULL +NULL NULL t045 TABLE NULL +NULL NULL t046 TABLE NULL +NULL NULL t047 TABLE NULL +NULL NULL t048 TABLE NULL +NULL NULL t049 TABLE NULL +NULL NULL t050 TABLE NULL +NULL NULL t051 TABLE NULL +NULL NULL t052 TABLE NULL +NULL NULL t053 TABLE NULL +NULL NULL t054 TABLE NULL +NULL NULL t055 TABLE NULL +NULL NULL t056 TABLE NULL +NULL NULL t057 TABLE NULL +NULL NULL t058 TABLE NULL +NULL NULL t059 TABLE NULL +NULL NULL t060 TABLE NULL +NULL NULL t061 TABLE NULL +NULL NULL t062 TABLE NULL +NULL NULL t063 TABLE NULL +NULL NULL t064 TABLE NULL +NULL NULL t065 TABLE NULL +NULL NULL t066 TABLE NULL +NULL NULL t067 TABLE NULL +NULL NULL t068 TABLE NULL +NULL NULL t069 TABLE NULL +NULL NULL t070 TABLE NULL +NULL NULL t071 TABLE NULL +NULL NULL t072 TABLE NULL +NULL NULL t073 TABLE NULL +NULL NULL t074 TABLE NULL +NULL NULL t075 TABLE NULL +NULL NULL t076 TABLE NULL +NULL NULL t077 TABLE NULL +NULL NULL t078 TABLE NULL +NULL NULL t079 TABLE NULL +NULL NULL t080 TABLE NULL +NULL NULL t081 TABLE NULL +NULL NULL t082 TABLE NULL +NULL NULL t083 TABLE NULL +NULL NULL t084 TABLE NULL +NULL NULL t085 TABLE NULL +NULL NULL t086 TABLE NULL +NULL NULL t087 TABLE NULL +NULL NULL t088 TABLE NULL +NULL NULL t089 TABLE NULL +NULL NULL t090 TABLE NULL +NULL NULL t091 TABLE NULL +NULL NULL t092 TABLE NULL +NULL NULL t093 TABLE NULL +NULL NULL t094 TABLE NULL +NULL NULL t095 TABLE NULL +NULL NULL t096 TABLE NULL +NULL NULL t097 TABLE NULL +NULL NULL t098 TABLE NULL +NULL NULL t099 TABLE NULL +NULL NULL t1 TABLE NULL +NULL NULL t100 TABLE NULL +NULL NULL t101 TABLE NULL +NULL NULL t102 TABLE NULL +NULL NULL t103 TABLE NULL +NULL NULL t104 TABLE NULL +NULL NULL t105 TABLE NULL +NULL NULL t106 TABLE NULL +NULL NULL t107 TABLE NULL +NULL NULL t108 TABLE NULL +NULL NULL t109 TABLE NULL +NULL NULL t110 TABLE NULL +NULL NULL t111 TABLE NULL +NULL NULL t112 TABLE NULL +NULL NULL t113 TABLE NULL +NULL NULL t114 TABLE NULL +NULL NULL t115 TABLE NULL +NULL NULL t116 TABLE NULL +NULL NULL t117 TABLE NULL +NULL NULL t118 TABLE NULL +NULL NULL t119 TABLE NULL +NULL NULL t120 TABLE NULL +NULL NULL t121 TABLE NULL +NULL NULL t122 TABLE NULL +NULL NULL t123 TABLE NULL +NULL NULL t124 TABLE NULL +NULL NULL t125 TABLE NULL +NULL NULL t126 TABLE NULL +NULL NULL t127 TABLE NULL +NULL NULL t128 TABLE NULL +NULL NULL t129 TABLE NULL +NULL NULL t130 TABLE NULL +NULL NULL t131 TABLE NULL +NULL NULL t132 TABLE NULL +NULL NULL t133 TABLE NULL +NULL NULL t134 TABLE NULL +NULL NULL t135 TABLE NULL +NULL NULL t136 TABLE NULL +NULL NULL t137 TABLE NULL +NULL NULL t138 TABLE NULL +NULL NULL t139 TABLE NULL +NULL NULL t140 TABLE NULL +NULL NULL t141 TABLE NULL +NULL NULL t142 TABLE NULL +NULL NULL t143 TABLE NULL +NULL NULL t144 TABLE NULL +NULL NULL t145 TABLE NULL +NULL NULL t146 TABLE NULL +NULL NULL t147 TABLE NULL +NULL NULL t148 TABLE NULL +NULL NULL t149 TABLE NULL +NULL NULL t150 TABLE NULL +NULL NULL t151 TABLE NULL +NULL NULL t152 TABLE NULL +NULL NULL t153 TABLE NULL +NULL NULL t154 TABLE NULL +NULL NULL t155 TABLE NULL +NULL NULL t156 TABLE NULL +NULL NULL t157 TABLE NULL +NULL NULL t158 TABLE NULL +NULL NULL t159 TABLE NULL +NULL NULL t160 TABLE NULL +NULL NULL t161 TABLE NULL +NULL NULL t162 TABLE NULL +NULL NULL t163 TABLE NULL +NULL NULL t164 TABLE NULL +NULL NULL t165 TABLE NULL +NULL NULL t166 TABLE NULL +NULL NULL t167 TABLE NULL +NULL NULL t168 TABLE NULL +NULL NULL t169 TABLE NULL +NULL NULL t170 TABLE NULL +NULL NULL t171 TABLE NULL +NULL NULL t172 TABLE NULL +NULL NULL t173 TABLE NULL +NULL NULL t174 TABLE NULL +NULL NULL t175 TABLE NULL +NULL NULL t176 TABLE NULL +NULL NULL t177 TABLE NULL +NULL NULL t178 TABLE NULL +NULL NULL t179 TABLE NULL +NULL NULL t180 TABLE NULL +NULL NULL t181 TABLE NULL +NULL NULL t182 TABLE NULL +NULL NULL t183 TABLE NULL +NULL NULL t184 TABLE NULL +NULL NULL t185 TABLE NULL +NULL NULL t186 TABLE NULL +NULL NULL t187 TABLE NULL +NULL NULL t188 TABLE NULL +NULL NULL t189 TABLE NULL +NULL NULL t190 TABLE NULL +NULL NULL t191 TABLE NULL +NULL NULL t192 TABLE NULL +NULL NULL t193 TABLE NULL +NULL NULL t194 TABLE NULL +NULL NULL t195 TABLE NULL +NULL NULL t196 TABLE NULL +NULL NULL t197 TABLE NULL +NULL NULL t198 TABLE NULL +NULL NULL t199 TABLE NULL +NULL NULL t200 TABLE NULL +NULL NULL t201 TABLE NULL +NULL NULL t202 TABLE NULL +NULL NULL t203 TABLE NULL +NULL NULL t204 TABLE NULL +NULL NULL t205 TABLE NULL +NULL NULL t206 TABLE NULL +NULL NULL t207 TABLE NULL +NULL NULL t208 TABLE NULL +NULL NULL t209 TABLE NULL +NULL NULL t210 TABLE NULL +NULL NULL t211 TABLE NULL +NULL NULL t212 TABLE NULL +NULL NULL t213 TABLE NULL +NULL NULL t214 TABLE NULL +NULL NULL t215 TABLE NULL +NULL NULL t216 TABLE NULL +NULL NULL t217 TABLE NULL +NULL NULL t218 TABLE NULL +NULL NULL t219 TABLE NULL +NULL NULL t220 TABLE NULL +NULL NULL t221 TABLE NULL +NULL NULL t222 TABLE NULL +NULL NULL t223 TABLE NULL +NULL NULL t224 TABLE NULL +NULL NULL t225 TABLE NULL +NULL NULL t226 TABLE NULL +NULL NULL t227 TABLE NULL +NULL NULL t228 TABLE NULL +NULL NULL t229 TABLE NULL +NULL NULL t230 TABLE NULL +NULL NULL t231 TABLE NULL +NULL NULL t232 TABLE NULL +NULL NULL t233 TABLE NULL +NULL NULL t234 TABLE NULL +NULL NULL t235 TABLE NULL +NULL NULL t236 TABLE NULL +NULL NULL t237 TABLE NULL +NULL NULL t238 TABLE NULL +NULL NULL t239 TABLE NULL +NULL NULL t240 TABLE NULL +NULL NULL t241 TABLE NULL +NULL NULL t242 TABLE NULL +NULL NULL t243 TABLE NULL +NULL NULL t244 TABLE NULL +NULL NULL t245 TABLE NULL +NULL NULL t246 TABLE NULL +NULL NULL t247 TABLE NULL +NULL NULL t248 TABLE NULL +NULL NULL t249 TABLE NULL +NULL NULL t250 TABLE NULL +NULL NULL t251 TABLE NULL +NULL NULL t252 TABLE NULL +NULL NULL t253 TABLE NULL +NULL NULL t254 TABLE NULL +NULL NULL t255 TABLE NULL +NULL NULL t256 TABLE NULL +NULL NULL t257 TABLE NULL +NULL NULL t258 TABLE NULL +NULL NULL t259 TABLE NULL +NULL NULL t260 TABLE NULL +NULL NULL t261 TABLE NULL +NULL NULL t262 TABLE NULL +NULL NULL t263 TABLE NULL +NULL NULL t264 TABLE NULL +NULL NULL t265 TABLE NULL +NULL NULL t266 TABLE NULL +NULL NULL t267 TABLE NULL +NULL NULL t268 TABLE NULL +NULL NULL t269 TABLE NULL +NULL NULL t270 TABLE NULL +NULL NULL t271 TABLE NULL +NULL NULL t272 TABLE NULL +NULL NULL t273 TABLE NULL +NULL NULL t274 TABLE NULL +NULL NULL t275 TABLE NULL +NULL NULL t276 TABLE NULL +NULL NULL t277 TABLE NULL +NULL NULL t278 TABLE NULL +NULL NULL t279 TABLE NULL +NULL NULL t280 TABLE NULL +NULL NULL t281 TABLE NULL +NULL NULL t282 TABLE NULL +NULL NULL t283 TABLE NULL +NULL NULL t284 TABLE NULL +NULL NULL t285 TABLE NULL +NULL NULL t286 TABLE NULL +NULL NULL t287 TABLE NULL +NULL NULL t288 TABLE NULL +NULL NULL t289 TABLE NULL +NULL NULL t290 TABLE NULL +NULL NULL t291 TABLE NULL +NULL NULL t292 TABLE NULL +NULL NULL t293 TABLE NULL +NULL NULL t294 TABLE NULL +NULL NULL t295 TABLE NULL +NULL NULL t296 TABLE NULL +NULL NULL t297 TABLE NULL +NULL NULL t298 TABLE NULL +NULL NULL t299 TABLE NULL +NULL NULL t300 TABLE NULL +NULL NULL t301 TABLE NULL +NULL NULL t302 TABLE NULL +NULL NULL t303 TABLE NULL +NULL NULL t304 TABLE NULL +NULL NULL t305 TABLE NULL +NULL NULL t306 TABLE NULL +NULL NULL t307 TABLE NULL +NULL NULL t308 TABLE NULL +NULL NULL t309 TABLE NULL +NULL NULL t310 TABLE NULL +NULL NULL t311 TABLE NULL +NULL NULL t312 TABLE NULL +NULL NULL t313 TABLE NULL +NULL NULL t314 TABLE NULL +NULL NULL t315 TABLE NULL +NULL NULL t316 TABLE NULL +NULL NULL t317 TABLE NULL +NULL NULL t318 TABLE NULL +NULL NULL t319 TABLE NULL +NULL NULL t320 TABLE NULL +NULL NULL t321 TABLE NULL +NULL NULL t322 TABLE NULL +NULL NULL t323 TABLE NULL +NULL NULL t324 TABLE NULL +NULL NULL t325 TABLE NULL +NULL NULL t326 TABLE NULL +NULL NULL t327 TABLE NULL +NULL NULL t328 TABLE NULL +NULL NULL t329 TABLE NULL +NULL NULL t330 TABLE NULL +NULL NULL t331 TABLE NULL +NULL NULL t332 TABLE NULL +NULL NULL t333 TABLE NULL +NULL NULL t334 TABLE NULL +NULL NULL t335 TABLE NULL +NULL NULL t336 TABLE NULL +NULL NULL t337 TABLE NULL +NULL NULL t338 TABLE NULL +NULL NULL t339 TABLE NULL +NULL NULL t340 TABLE NULL +NULL NULL t341 TABLE NULL +NULL NULL t342 TABLE NULL +NULL NULL t343 TABLE NULL +NULL NULL t344 TABLE NULL +NULL NULL t345 TABLE NULL +NULL NULL t346 TABLE NULL +NULL NULL t347 TABLE NULL +NULL NULL t348 TABLE NULL +NULL NULL t349 TABLE NULL +NULL NULL t350 TABLE NULL +NULL NULL t351 TABLE NULL +NULL NULL t352 TABLE NULL +NULL NULL t353 TABLE NULL +NULL NULL t354 TABLE NULL +NULL NULL t355 TABLE NULL +NULL NULL t356 TABLE NULL +NULL NULL t357 TABLE NULL +NULL NULL t358 TABLE NULL +NULL NULL t359 TABLE NULL +NULL NULL t360 TABLE NULL +NULL NULL t361 TABLE NULL +NULL NULL t362 TABLE NULL +NULL NULL t363 TABLE NULL +NULL NULL t364 TABLE NULL +NULL NULL t365 TABLE NULL +NULL NULL t366 TABLE NULL +NULL NULL t367 TABLE NULL +NULL NULL t368 TABLE NULL +NULL NULL t369 TABLE NULL +NULL NULL t370 TABLE NULL +NULL NULL t371 TABLE NULL +NULL NULL t372 TABLE NULL +NULL NULL t373 TABLE NULL +NULL NULL t374 TABLE NULL +NULL NULL t375 TABLE NULL +NULL NULL t376 TABLE NULL +NULL NULL t377 TABLE NULL +NULL NULL t378 TABLE NULL +NULL NULL t379 TABLE NULL +NULL NULL t380 TABLE NULL +NULL NULL t381 TABLE NULL +NULL NULL t382 TABLE NULL +NULL NULL t383 TABLE NULL +NULL NULL t384 TABLE NULL +NULL NULL t385 TABLE NULL +NULL NULL t386 TABLE NULL +NULL NULL t387 TABLE NULL +NULL NULL t388 TABLE NULL +NULL NULL t389 TABLE NULL +NULL NULL t390 TABLE NULL +NULL NULL t391 TABLE NULL +NULL NULL t392 TABLE NULL +NULL NULL t393 TABLE NULL +NULL NULL t394 TABLE NULL +NULL NULL t395 TABLE NULL +NULL NULL t396 TABLE NULL +NULL NULL t397 TABLE NULL +NULL NULL t398 TABLE NULL +NULL NULL t399 TABLE NULL DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/r/odbc_sqlite3_grant.result b/storage/connect/mysql-test/connect/r/odbc_sqlite3_grant.result index 06b4239bd69..f9045e73862 100644 --- a/storage/connect/mysql-test/connect/r/odbc_sqlite3_grant.result +++ b/storage/connect/mysql-test/connect/r/odbc_sqlite3_grant.result @@ -1,7 +1,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `Description` char(128) NOT NULL, - `Attributes` varchar(256) NOT NULL + `Attributes` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Drivers' SET NAMES utf8; GRANT ALL PRIVILEGES ON *.* TO user@localhost; diff --git a/storage/connect/mysql-test/connect/r/odbc_xls.result b/storage/connect/mysql-test/connect/r/odbc_xls.result index 8c560ef013a..d379cb5b4bb 100644 --- a/storage/connect/mysql-test/connect/r/odbc_xls.result +++ b/storage/connect/mysql-test/connect/r/odbc_xls.result @@ -1,7 +1,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `Name` varchar(256) NOT NULL, - `Description` varchar(256) NOT NULL + `Description` varchar(256) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources' CREATE TABLE contact (Nom VARCHAR(128), Fonction VARCHAR(128), Company VARCHAR(128), Repertoire VARCHAR(30)) ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineXLS;DBQ=DATADIR/test/contacts.xls';; SELECT Nom, Fonction FROM contact WHERE Repertoire='ascii'; @@ -16,11 +16,11 @@ DROP TABLE contact; CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineXLS;DBQ=DATADIR/test/contacts.xls' CHARSET=utf8 DATA_CHARSET=latin1;; SELECT * FROM t1 WHERE Table_name='CONTACT'; Table_Cat Table_Schema Table_Name Table_Type Remark -DATADIR/test/contacts CONTACT TABLE +DATADIR/test/contacts NULL CONTACT TABLE NULL DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineXLS;DBQ=DATADIR/test/contacts.xls' CHARSET=utf8 DATA_CHARSET=latin1;; SELECT * FROM t1 WHERE Table_name='CONTACT' AND Column_name IN ('Nom','Fonction'); Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks -DATADIR/test/contacts CONTACT Nom 12 VARCHAR 255 510 0 0 1 -DATADIR/test/contacts CONTACT Fonction 12 VARCHAR 255 510 0 0 1 +DATADIR/test/contacts NULL CONTACT Nom 12 VARCHAR 255 510 NULL NULL 1 NULL +DATADIR/test/contacts NULL CONTACT Fonction 12 VARCHAR 255 510 NULL NULL 1 NULL DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc index f17d59832f3..2ade7ad02fe 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.inc +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -20,6 +20,8 @@ if (!$HA_CONNECT_SO) { --eval CREATE FUNCTION json_object_delete RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_object_list RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION jsonvalue RETURNS STRING SONAME '$HA_CONNECT_SO'; +--eval CREATE FUNCTION jsonset_grp_size RETURNS INTEGER SONAME '$HA_CONNECT_SO'; +--eval CREATE FUNCTION jsonget_grp_size RETURNS INTEGER SONAME '$HA_CONNECT_SO'; --eval CREATE AGGREGATE FUNCTION json_array_grp RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE AGGREGATE FUNCTION json_object_grp RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION jsonget_string RETURNS STRING SONAME '$HA_CONNECT_SO'; diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index cfd1fdae258..d11e2fd7cf6 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -108,7 +108,8 @@ CREATE TABLE t3 ( SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT; -SET connect_json_grp_size=30; +#SET connect_json_grp_size=30; Deprecated +SELECT JsonSet_Grp_Size(30); SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title; SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; diff --git a/storage/connect/mysql-test/connect/t/json_udf2.inc b/storage/connect/mysql-test/connect/t/json_udf2.inc index f62b178b003..4c74e2c11f2 100644 --- a/storage/connect/mysql-test/connect/t/json_udf2.inc +++ b/storage/connect/mysql-test/connect/t/json_udf2.inc @@ -11,6 +11,8 @@ DROP FUNCTION json_object_add; DROP FUNCTION json_object_delete; DROP FUNCTION json_object_list; DROP FUNCTION jsonvalue; +DROP FUNCTION jsonset_grp_size; +DROP FUNCTION jsonget_grp_size; DROP FUNCTION json_array_grp; DROP FUNCTION json_object_grp; DROP FUNCTION jsonget_string; diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 1ccdf231970..cb21a8bda15 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -1,7 +1,7 @@ /************ Odbconn C++ Functions Source Code File (.CPP) ************/ /* Name: ODBCONN.CPP Version 2.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2016 */ /* */ /* This file contains the ODBC connection classes functions. */ /***********************************************************************/ @@ -314,8 +314,10 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_REM}; unsigned int length[] = {0, 0, 0, 0, 6, 0, 10, 10, 6, 6, 6, 0}; - int n, ncol = 12; - PQRYRES qrp; + bool b[] = {true,true,false,false,false,false,false,false,true,true,false,true}; + int i, n, ncol = 12; + PCOLRES crp; + PQRYRES qrp; CATPARM *cap; ODBConn *ocp = NULL; @@ -363,6 +365,10 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, qrp = PlgAllocResult(g, ncol, maxres, IDS_COLUMNS, buftyp, fldtyp, length, false, true); + for (i = 0, crp = qrp->Colresp; crp; i++, crp = crp->Next) + if (b[i]) + crp->Kdata->SetNullable(true); + if (info || !qrp) // Info table return qrp; @@ -495,8 +501,10 @@ PQRYRES ODBCDrivers(PGLOBAL g, int maxres, bool info) int buftyp[] = {TYPE_STRING, TYPE_STRING}; XFLD fldtyp[] = {FLD_NAME, FLD_REM}; unsigned int length[] = {128, 256}; - int ncol = 2; - PQRYRES qrp; + bool b[] = {false, true}; + int i, ncol = 2; + PCOLRES crp; + PQRYRES qrp; ODBConn *ocp = NULL; /************************************************************************/ @@ -520,7 +528,11 @@ PQRYRES ODBCDrivers(PGLOBAL g, int maxres, bool info) qrp = PlgAllocResult(g, ncol, maxres, IDS_DRIVER, buftyp, fldtyp, length, false, true); - /************************************************************************/ + for (i = 0, crp = qrp->Colresp; crp; i++, crp = crp->Next) + if (b[i]) + crp->Kdata->SetNullable(true); + + /************************************************************************/ /* Now get the results into blocks. */ /************************************************************************/ if (!info && qrp && ocp->GetDrivers(qrp)) @@ -542,8 +554,10 @@ PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info) int buftyp[] = {TYPE_STRING, TYPE_STRING}; XFLD fldtyp[] = {FLD_NAME, FLD_REM}; unsigned int length[] = {0, 256}; - int n = 0, ncol = 2; - PQRYRES qrp; + bool b[] = {false, true}; + int i, n = 0, ncol = 2; + PCOLRES crp; + PQRYRES qrp; ODBConn *ocp = NULL; /************************************************************************/ @@ -571,7 +585,11 @@ PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info) qrp = PlgAllocResult(g, ncol, maxres, IDS_DSRC, buftyp, fldtyp, length, false, true); - /************************************************************************/ + for (i = 0, crp = qrp->Colresp; crp; i++, crp = crp->Next) + if (b[i]) + crp->Kdata->SetNullable(true); + + /************************************************************************/ /* Now get the results into blocks. */ /************************************************************************/ if (!info && qrp && ocp->GetDataSources(qrp)) @@ -595,8 +613,10 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, XFLD fldtyp[] = {FLD_CAT, FLD_SCHEM, FLD_NAME, FLD_TYPE, FLD_REM}; unsigned int length[] = {0, 0, 0, 16, 0}; - int n, ncol = 5; - PQRYRES qrp; + bool b[] ={ true, true, false, false, true }; + int i, n, ncol = 5; + PCOLRES crp; + PQRYRES qrp; CATPARM *cap; ODBConn *ocp = NULL; @@ -638,7 +658,11 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, qrp = PlgAllocResult(g, ncol, maxres, IDS_TABLES, buftyp, fldtyp, length, false, true); - if (info || !qrp) + for (i = 0, crp = qrp->Colresp; crp; i++, crp = crp->Next) + if (b[i]) + crp->Kdata->SetNullable(true); + + if (info || !qrp) return qrp; if (!(cap = AllocCatInfo(g, CAT_TAB, db, tabpat, qrp))) @@ -2249,7 +2273,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) rc = SQLTables(hstmt, name.ptr(2), name.length(2), name.ptr(1), name.length(1), name.ptr(0), name.length(0), - cap->Pat, SQL_NTS); + cap->Pat, cap->Pat ? SQL_NTS : 0); break; case CAT_COL: // rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID, @@ -2258,7 +2282,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) rc = SQLColumns(hstmt, name.ptr(2), name.length(2), name.ptr(1), name.length(1), name.ptr(0), name.length(0), - cap->Pat, SQL_NTS); + cap->Pat, cap->Pat ? SQL_NTS : 0); break; case CAT_KEY: fnc = "SQLPrimaryKeys"; diff --git a/storage/connect/table.cpp b/storage/connect/table.cpp index 933e072c1bb..c21bb1660ea 100644 --- a/storage/connect/table.cpp +++ b/storage/connect/table.cpp @@ -1,7 +1,7 @@ /************** Table C++ Functions Source Code File (.CPP) ************/ /* Name: TABLE.CPP Version 2.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2016 */ /* */ /* This file contains the TBX, TDB and OPJOIN classes functions. */ /***********************************************************************/ @@ -518,7 +518,8 @@ bool TDBCAT::InitCol(PGLOBAL g) sprintf(g->Message, "Invalid flag %d for column %s", colp->Flag, colp->Name); return true; - } // endif Crp + } else if (crp->Fld == FLD_SCALE || crp->Fld == FLD_RADIX) + colp->Value->SetNullable(true); } // endfor colp @@ -586,11 +587,14 @@ CATCOL::CATCOL(PCOLDEF cdp, PTDB tdbp, int n) /***********************************************************************/ void CATCOL::ReadColumn(PGLOBAL) { + bool b = (!Crp->Kdata || Crp->Kdata->IsNull(Tdbp->N)); + // Get the value of the Name or Description property - if (Crp->Kdata) + if (!b) Value->SetValue_pvblk(Crp->Kdata, Tdbp->N); else Value->Reset(); + Value->SetNull(b); } // end of ReadColumn diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index fd9a049a05a..501a814721d 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -912,19 +912,21 @@ bool TDBODBC::OpenDB(PGLOBAL g) if ((n = Ocp->GetResultSize(Query->GetStr(), Cnp)) < 0) { strcpy(g->Message, "Cannot get result size"); return true; - } // endif n + } else if (n) { + Ocp->m_Rows = n; - Ocp->m_Rows = n; + if ((Qrp = Ocp->AllocateResult(g))) + Memory = 2; // Must be filled + else { + strcpy(g->Message, "Result set memory allocation failed"); + return true; + } // endif n - if ((Qrp = Ocp->AllocateResult(g))) - Memory = 2; // Must be filled - else { - strcpy(g->Message, "Result set memory allocation failed"); - return true; - } // endif n + } else // Void result + Memory = 0; - Ocp->m_Rows = 0; - } else + Ocp->m_Rows = 0; + } else return true; } // endif Memory diff --git a/storage/connect/valblk.h b/storage/connect/valblk.h index f6eb7258a77..c3cad79b234 100644 --- a/storage/connect/valblk.h +++ b/storage/connect/valblk.h @@ -73,7 +73,8 @@ class VALBLK : public BLOCK { virtual void SetNull(int n, bool b) {if (To_Nulls) {To_Nulls[n] = (b) ? '*' : 0;}} virtual bool IsNull(int n) {return To_Nulls && To_Nulls[n];} - virtual void SetNullable(bool b); + virtual bool IsNullable(void) {return Nullable;} + virtual void SetNullable(bool b); virtual bool IsUnsigned(void) {return Unsigned;} virtual bool Init(PGLOBAL g, bool check) = 0; virtual int GetVlen(void) = 0; diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 68d5dd325ff..be5b04787dd 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -777,6 +777,10 @@ btr_root_get( buf_block_t* root = btr_root_block_get(index, RW_X_LATCH, mtr); + if (root && root->page.encrypted == true) { + root = NULL; + } + return(root ? buf_block_get_frame(root) : NULL); } diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index f4e7c0d0c6b..bd424b7b598 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2016, MariaDB Corporation. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -4674,10 +4674,10 @@ corrupt: ib_push_warning((void *)NULL, DB_DECRYPTION_FAILED, "Table in tablespace %lu encrypted." - "However key management plugin or used key_id %lu is not found or" + "However key management plugin or used key_id %u is not found or" " used encryption algorithm or method does not match." " Can't continue opening the table.", - bpage->key_version); + (ulint)bpage->space, bpage->key_version); if (bpage->space > TRX_SYS_SPACE) { if (corrupted) { @@ -4701,10 +4701,19 @@ corrupt: } if (uncompressed && !recv_no_ibuf_operations) { - ibuf_merge_or_delete_for_page( - (buf_block_t*) bpage, bpage->space, - bpage->offset, buf_page_get_zip_size(bpage), - TRUE); + if (bpage && bpage->encrypted) { + fprintf(stderr, + "InnoDB: Warning: Table in tablespace %lu encrypted." + "However key management plugin or used key_id %u is not found or" + " used encryption algorithm or method does not match." + " Can't continue opening the table.\n", + (ulint)bpage->space, bpage->key_version); + } else { + ibuf_merge_or_delete_for_page( + (buf_block_t*) bpage, bpage->space, + bpage->offset, buf_page_get_zip_size(bpage), + TRUE); + } } } else { /* io_type == BUF_IO_WRITE */ @@ -6156,6 +6165,7 @@ buf_page_decrypt_after_read( bool page_compressed = fil_page_is_compressed(dst_frame); bool page_compressed_encrypted = fil_page_is_compressed_encrypted(dst_frame); buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); + bool success = true; /* If page is encrypted read post-encryption checksum */ if (!page_compressed_encrypted && key_version != 0) { @@ -6214,16 +6224,21 @@ buf_page_decrypt_after_read( } /* decrypt using crypt_buf to dst_frame */ - fil_space_decrypt(bpage->space, - slot->crypt_buf, - size, - dst_frame); + byte* res = fil_space_decrypt(bpage->space, + slot->crypt_buf, + size, + dst_frame); + + if (!res) { + bpage->encrypted = true; + success = false; + } #ifdef UNIV_DEBUG fil_page_type_validate(dst_frame); #endif } - if (page_compressed_encrypted) { + if (page_compressed_encrypted && success) { if (!slot) { slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); } @@ -6236,11 +6251,11 @@ buf_page_decrypt_after_read( dst_frame, size, &bpage->write_size); - } #ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); + fil_page_type_validate(dst_frame); #endif + } /* Mark this slot as free */ if (slot) { @@ -6250,5 +6265,5 @@ buf_page_decrypt_after_read( bpage->key_version = key_version; - return (TRUE); + return (success); } diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index 9748b35e93b..6f3aca0e1fb 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2011, 2012, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -163,6 +163,25 @@ buf_load_status( va_end(ap); } +/** Returns the directory path where the buffer pool dump file will be created. +@return directory path */ +static +const char* +get_buf_dump_dir() +{ + const char* dump_dir; + + /* The dump file should be created in the default data directory if + innodb_data_home_dir is set as an empty string. */ + if (strcmp(srv_data_home, "") == 0) { + dump_dir = fil_path_to_mysql_datadir; + } else { + dump_dir = srv_data_home; + } + + return(dump_dir); +} + /*****************************************************************//** Perform a buffer pool dump into the file specified by innodb_buffer_pool_filename. If any errors occur then the value of @@ -186,7 +205,7 @@ buf_dump( int ret; ut_snprintf(full_filename, sizeof(full_filename), - "%s%c%s", srv_data_home, SRV_PATH_SEPARATOR, + "%s%c%s", get_buf_dump_dir(), SRV_PATH_SEPARATOR, srv_buf_dump_filename); ut_snprintf(tmp_filename, sizeof(tmp_filename), @@ -471,7 +490,7 @@ buf_load() buf_load_abort_flag = FALSE; ut_snprintf(full_filename, sizeof(full_filename), - "%s%c%s", srv_data_home, SRV_PATH_SEPARATOR, + "%s%c%s", get_buf_dump_dir(), SRV_PATH_SEPARATOR, srv_buf_dump_filename); buf_load_status(STATUS_NOTICE, diff --git a/storage/innobase/dict/dict0boot.cc b/storage/innobase/dict/dict0boot.cc index 1a1dd29a202..573357b54ee 100644 --- a/storage/innobase/dict/dict0boot.cc +++ b/storage/innobase/dict/dict0boot.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -450,27 +451,29 @@ dict_boot(void) /* Initialize the insert buffer table and index for each tablespace */ - ibuf_init_at_db_start(); - dberr_t err = DB_SUCCESS; - if (srv_read_only_mode && !ibuf_is_empty()) { + err = ibuf_init_at_db_start(); - ib_logf(IB_LOG_LEVEL_ERROR, - "Change buffer must be empty when --innodb-read-only " - "is set!"); + if (err == DB_SUCCESS) { + if (srv_read_only_mode && !ibuf_is_empty()) { - err = DB_ERROR; - } else { - /* Load definitions of other indexes on system tables */ + ib_logf(IB_LOG_LEVEL_ERROR, + "Change buffer must be empty when --innodb-read-only " + "is set!"); - dict_load_sys_table(dict_sys->sys_tables); - dict_load_sys_table(dict_sys->sys_columns); - dict_load_sys_table(dict_sys->sys_indexes); - dict_load_sys_table(dict_sys->sys_fields); - } + err = DB_ERROR; + } else { + /* Load definitions of other indexes on system tables */ - mutex_exit(&(dict_sys->mutex)); + dict_load_sys_table(dict_sys->sys_tables); + dict_load_sys_table(dict_sys->sys_columns); + dict_load_sys_table(dict_sys->sys_indexes); + dict_load_sys_table(dict_sys->sys_fields); + } + + mutex_exit(&(dict_sys->mutex)); + } return(err); } diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 2b728353d99..c51deb0a048 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -1116,7 +1116,7 @@ dict_init(void) &dict_operation_lock, SYNC_DICT_OPERATION); if (!srv_read_only_mode) { - dict_foreign_err_file = os_file_create_tmpfile(); + dict_foreign_err_file = os_file_create_tmpfile(NULL); ut_a(dict_foreign_err_file); mutex_create(dict_foreign_err_mutex_key, diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc index 12ead09d829..5c283f693d5 100644 --- a/storage/innobase/dict/dict0stats.cc +++ b/storage/innobase/dict/dict0stats.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2009, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2009, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1488,7 +1488,6 @@ on the leaf page. when comparing records @param[out] n_diff number of distinct records @param[out] n_external_pages number of external pages -@param[in,out] mtr mini-transaction @return number of distinct records on the leaf page */ static void @@ -1496,8 +1495,7 @@ dict_stats_analyze_index_below_cur( const btr_cur_t* cur, ulint n_prefix, ib_uint64_t* n_diff, - ib_uint64_t* n_external_pages, - mtr_t* mtr) + ib_uint64_t* n_external_pages) { dict_index_t* index; ulint space; @@ -1511,6 +1509,7 @@ dict_stats_analyze_index_below_cur( ulint* offsets2; ulint* offsets_rec; ulint size; + mtr_t mtr; index = btr_cur_get_index(cur); @@ -1549,12 +1548,14 @@ dict_stats_analyze_index_below_cur( function without analyzing any leaf pages */ *n_external_pages = 0; + mtr_start(&mtr); + /* descend to the leaf level on the B-tree */ for (;;) { block = buf_page_get_gen(space, zip_size, page_no, RW_S_LATCH, NULL /* no guessed block */, - BUF_GET, __FILE__, __LINE__, mtr); + BUF_GET, __FILE__, __LINE__, &mtr); page = buf_block_get_frame(block); @@ -1576,6 +1577,8 @@ dict_stats_analyze_index_below_cur( ut_a(*n_diff > 0); if (*n_diff == 1) { + mtr_commit(&mtr); + /* page has all keys equal and the end of the page was reached by dict_stats_scan_page(), no need to descend to the leaf level */ @@ -1600,7 +1603,7 @@ dict_stats_analyze_index_below_cur( } /* make sure we got a leaf page as a result from the above loop */ - ut_ad(btr_page_get_level(page, mtr) == 0); + ut_ad(btr_page_get_level(page, &mtr) == 0); /* scan the leaf page and find the number of distinct keys, when looking only at the first n_prefix columns; also estimate @@ -1617,6 +1620,7 @@ dict_stats_analyze_index_below_cur( __func__, page_no, n_diff); #endif + mtr_commit(&mtr); mem_heap_free(heap); } @@ -1826,8 +1830,7 @@ dict_stats_analyze_index_for_n_prefix( dict_stats_analyze_index_below_cur(btr_pcur_get_btr_cur(&pcur), n_prefix, &n_diff_on_leaf_page, - &n_external_pages, - mtr); + &n_external_pages); /* We adjust n_diff_on_leaf_page here to avoid counting one record twice - once as the last on some page and once diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 3d9d6a18122..03020896542 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -799,6 +799,7 @@ fil_space_decrypt( byte* src_frame) /*!< in/out: page buffer */ { dberr_t err = DB_SUCCESS; + byte* res = NULL; bool encrypted = fil_space_decrypt( fil_space_get_crypt_data(space), @@ -807,13 +808,17 @@ fil_space_decrypt( src_frame, &err); - if (encrypted) { - /* Copy the decrypted page back to page buffer, not - really any other options. */ - memcpy(src_frame, tmp_frame, page_size); + if (err == DB_SUCCESS) { + if (encrypted) { + /* Copy the decrypted page back to page buffer, not + really any other options. */ + memcpy(src_frame, tmp_frame, page_size); + } + + res = src_frame; } - return src_frame; + return res; } /****************************************************************** diff --git a/storage/innobase/fts/fts0opt.cc b/storage/innobase/fts/fts0opt.cc index e096b8bf6d6..2a0aa4daf12 100644 --- a/storage/innobase/fts/fts0opt.cc +++ b/storage/innobase/fts/fts0opt.cc @@ -580,7 +580,7 @@ fts_zip_read_word( #ifdef UNIV_DEBUG ulint i; #endif - byte len = 0; + short len = 0; void* null = NULL; byte* ptr = word->f_str; int flush = Z_NO_FLUSH; @@ -590,7 +590,7 @@ fts_zip_read_word( return(NULL); } - zip->zp->next_out = &len; + zip->zp->next_out = reinterpret_cast<byte*>(&len); zip->zp->avail_out = sizeof(len); while (zip->status == Z_OK && zip->zp->avail_out > 0) { @@ -688,11 +688,12 @@ fts_fetch_index_words( fts_zip_t* zip = static_cast<fts_zip_t*>(user_arg); que_node_t* exp = sel_node->select_list; dfield_t* dfield = que_node_get_val(exp); - byte len = (byte) dfield_get_len(dfield); + short len = static_cast<short>(dfield_get_len(dfield)); void* data = dfield_get_data(dfield); /* Skip the duplicate words. */ - if (zip->word.f_len == len && !memcmp(zip->word.f_str, data, len)) { + if (zip->word.f_len == static_cast<ulint>(len) + && !memcmp(zip->word.f_str, data, len)) { return(TRUE); } @@ -706,7 +707,7 @@ fts_fetch_index_words( ut_a(zip->zp->next_in == NULL); /* The string is prefixed by len. */ - zip->zp->next_in = &len; + zip->zp->next_in = reinterpret_cast<byte*>(&len); zip->zp->avail_in = sizeof(len); /* Compress the word, create output blocks as necessary. */ diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 3c8287a7be4..32999341691 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4,7 +4,7 @@ Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2016, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -33,6 +33,8 @@ this program; if not, write to the Free Software Foundation, Inc., *****************************************************************************/ +#define lower_case_file_system lower_case_file_system_server +#define mysql_unpacked_real_data_home mysql_unpacked_real_data_home_server #include <sql_table.h> // explain_filename, nz2, EXPLAIN_PARTITIONS_AS_COMMENT, // EXPLAIN_FILENAME_MAX_EXTRA_LENGTH @@ -44,6 +46,11 @@ this program; if not, write to the Free Software Foundation, Inc., #include <table_cache.h> #include <my_check_opt.h> +#undef lower_case_file_system +#undef mysql_unpacked_real_data_home +MYSQL_PLUGIN_IMPORT extern my_bool lower_case_file_system; +MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[]; + #ifdef _WIN32 #include <io.h> #endif @@ -553,6 +560,67 @@ ib_cb_t innodb_api_cb[] = { (ib_cb_t) ib_trx_read_only }; +/** + Test a file path whether it is same as mysql data directory path. + + @param path null terminated character string + + @return + @retval TRUE The path is different from mysql data directory. + @retval FALSE The path is same as mysql data directory. +*/ +static bool is_mysql_datadir_path(const char *path) +{ + if (path == NULL) + return false; + + char mysql_data_dir[FN_REFLEN], path_dir[FN_REFLEN]; + convert_dirname(path_dir, path, NullS); + convert_dirname(mysql_data_dir, mysql_unpacked_real_data_home, NullS); + size_t mysql_data_home_len= dirname_length(mysql_data_dir); + size_t path_len = dirname_length(path_dir); + + if (path_len < mysql_data_home_len) + return true; + + if (!lower_case_file_system) + return(memcmp(mysql_data_dir, path_dir, mysql_data_home_len)); + + return(files_charset_info->coll->strnncoll(files_charset_info, + (uchar *) path_dir, path_len, + (uchar *) mysql_data_dir, + mysql_data_home_len, + TRUE)); + +} + + +static int mysql_tmpfile_path(const char *path, const char *prefix) +{ + DBUG_ASSERT(path != NULL); + DBUG_ASSERT((strlen(path) + strlen(prefix)) <= FN_REFLEN); + + char filename[FN_REFLEN]; + File fd = create_temp_file(filename, path, prefix, +#ifdef __WIN__ + O_BINARY | O_TRUNC | O_SEQUENTIAL | + O_SHORT_LIVED | +#endif /* __WIN__ */ + O_CREAT | O_EXCL | O_RDWR | O_TEMPORARY, + MYF(MY_WME)); + if (fd >= 0) { +#ifndef __WIN__ + /* + This can be removed once the following bug is fixed: + Bug #28903 create_temp_file() doesn't honor O_TEMPORARY option + (file not removed) (Unix) + */ + unlink(filename); +#endif /* !__WIN__ */ + } + + return fd; +} static void innodb_remember_check_sysvar_funcs(); mysql_var_check_func check_sysvar_enum; @@ -588,7 +656,6 @@ ha_create_table_option innodb_table_option_list[]= HA_TOPTION_END }; - /*************************************************************//** Check whether valid argument given to innodb_ft_*_stopword_table. This function is registered as a callback with MySQL. @@ -604,6 +671,108 @@ innodb_stopword_table_validate( for update function */ struct st_mysql_value* value); /*!< in: incoming string */ +/** Validate passed-in "value" is a valid directory name. +This function is registered as a callback with MySQL. +@param[in,out] thd thread handle +@param[in] var pointer to system variable +@param[out] save immediate result for update +@param[in] value incoming string +@return 0 for valid name */ +static +int +innodb_tmpdir_validate( + THD* thd, + struct st_mysql_sys_var* var, + void* save, + struct st_mysql_value* value) +{ + + char* alter_tmp_dir; + char* innodb_tmp_dir; + char buff[OS_FILE_MAX_PATH]; + int len = sizeof(buff); + char tmp_abs_path[FN_REFLEN + 2]; + + ut_ad(save != NULL); + ut_ad(value != NULL); + + if (check_global_access(thd, FILE_ACL)) { + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + ER_WRONG_ARGUMENTS, + "InnoDB: FILE Permissions required"); + *static_cast<const char**>(save) = NULL; + return(1); + } + + alter_tmp_dir = (char*) value->val_str(value, buff, &len); + + if (!alter_tmp_dir) { + *static_cast<const char**>(save) = alter_tmp_dir; + return(0); + } + + if (strlen(alter_tmp_dir) > FN_REFLEN) { + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + ER_WRONG_ARGUMENTS, + "Path length should not exceed %d bytes", FN_REFLEN); + *static_cast<const char**>(save) = NULL; + return(1); + } + + my_realpath(tmp_abs_path, alter_tmp_dir, 0); + size_t tmp_abs_len = strlen(tmp_abs_path); + + if (my_access(tmp_abs_path, F_OK)) { + + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + ER_WRONG_ARGUMENTS, + "InnoDB: Path doesn't exist."); + *static_cast<const char**>(save) = NULL; + return(1); + } else if (my_access(tmp_abs_path, R_OK | W_OK)) { + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + ER_WRONG_ARGUMENTS, + "InnoDB: Server doesn't have permission in " + "the given location."); + *static_cast<const char**>(save) = NULL; + return(1); + } + + MY_STAT stat_info_dir; + + if (my_stat(tmp_abs_path, &stat_info_dir, MYF(0))) { + if ((stat_info_dir.st_mode & S_IFDIR) != S_IFDIR) { + + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + ER_WRONG_ARGUMENTS, + "Given path is not a directory. "); + *static_cast<const char**>(save) = NULL; + return(1); + } + } + + if (!is_mysql_datadir_path(tmp_abs_path)) { + + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + ER_WRONG_ARGUMENTS, + "InnoDB: Path Location should not be same as " + "mysql data directory location."); + *static_cast<const char**>(save) = NULL; + return(1); + } + + innodb_tmp_dir = static_cast<char*>( + thd_memdup(thd, tmp_abs_path, tmp_abs_len + 1)); + *static_cast<const char**>(save) = innodb_tmp_dir; + return(0); +} + /** "GEN_CLUST_INDEX" is the name reserved for InnoDB default system clustered index when there is no primary key. */ const char innobase_index_reserve_name[] = "GEN_CLUST_INDEX"; @@ -688,6 +857,11 @@ static MYSQL_THDVAR_STR(ft_user_stopword_table, "User supplied stopword table name, effective in the session level.", innodb_stopword_table_validate, NULL, NULL); +static MYSQL_THDVAR_STR(tmpdir, + PLUGIN_VAR_OPCMDARG|PLUGIN_VAR_MEMALLOC, + "Directory for temporary non-tablespace files.", + innodb_tmpdir_validate, NULL, NULL); + static SHOW_VAR innodb_status_variables[]= { {"buffer_pool_dump_status", (char*) &export_vars.innodb_buffer_pool_dump_status, SHOW_CHAR}, @@ -763,12 +937,6 @@ static SHOW_VAR innodb_status_variables[]= { (char*) &export_vars.innodb_os_log_pending_writes, SHOW_LONG}, {"os_log_written", (char*) &export_vars.innodb_os_log_written, SHOW_LONGLONG}, - {"os_merge_buffers_written", - (char*) &export_vars.innodb_merge_buffers_written, SHOW_LONGLONG}, - {"os_merge_buffers_read", - (char*) &export_vars.innodb_merge_buffers_read, SHOW_LONGLONG}, - {"os_merge_buffers_merged", - (char*) &export_vars.innodb_merge_buffers_merged, SHOW_LONGLONG}, {"page_size", (char*) &export_vars.innodb_page_size, SHOW_LONG}, {"pages_created", @@ -1273,7 +1441,6 @@ Normalizes a table name string. A normalized name consists of the database name catenated to '/' and table name. An example: test/mytable. On Windows normalization puts both the database name and the table name always to lower case if "set_lower_case" is set to TRUE. */ -static void normalize_table_name_low( /*=====================*/ @@ -1543,6 +1710,26 @@ thd_supports_xa( return(THDVAR(thd, support_xa)); } +/** Get the value of innodb_tmpdir. +@param[in] thd thread handle, or NULL to query + the global innodb_tmpdir. +@retval NULL if innodb_tmpdir="" */ +UNIV_INTERN +const char* +thd_innodb_tmpdir( + THD* thd) +{ +#ifdef UNIV_SYNC_DEBUG + ut_ad(!sync_thread_levels_nonempty_trx(false)); +#endif /* UNIV_SYNC_DEBUG */ + + const char* tmp_dir = THDVAR(thd, tmpdir); + if (tmp_dir != NULL && *tmp_dir == '\0') { + tmp_dir = NULL; + } + + return(tmp_dir); +} /******************************************************************//** Returns the lock wait timeout for the current connection. @return the lock wait timeout, in seconds */ @@ -2082,13 +2269,14 @@ innobase_get_lower_case_table_names(void) return(lower_case_table_names); } -/*********************************************************************//** -Creates a temporary file. +/** Create a temporary file in the location specified by the parameter +path. If the path is null, then it will be created in tmpdir. +@param[in] path location for creating temporary file @return temporary file descriptor, or < 0 on error */ UNIV_INTERN int -innobase_mysql_tmpfile(void) -/*========================*/ +innobase_mysql_tmpfile( + const char* path) { #ifdef WITH_INNODB_DISALLOW_WRITES os_event_wait(srv_allow_writes_event); @@ -2101,7 +2289,11 @@ innobase_mysql_tmpfile(void) return(-1); ); - fd = mysql_tmpfile("ib"); + if (path == NULL) { + fd = mysql_tmpfile("ib"); + } else { + fd = mysql_tmpfile_path(path, "ib"); + } if (fd >= 0) { /* Copy the file descriptor, so that the additional resources @@ -3030,6 +3222,13 @@ ha_innobase::reset_template(void) ut_ad(prebuilt->magic_n == ROW_PREBUILT_ALLOCATED); ut_ad(prebuilt->magic_n2 == prebuilt->magic_n); + /* Force table to be freed in close_thread_table(). */ + DBUG_EXECUTE_IF("free_table_in_fts_query", + if (prebuilt->in_fts_query) { + table->m_needs_reopen = true; + } + ); + prebuilt->keep_other_fields_on_keyread = 0; prebuilt->read_just_key = 0; prebuilt->in_fts_query = 0; @@ -4866,7 +5065,6 @@ Normalizes a table name string. A normalized name consists of the database name catenated to '/' and table name. Example: test/mytable. On Windows normalization puts both the database name and the table name always to lower case if "set_lower_case" is set to TRUE. */ -static void normalize_table_name_low( /*=====================*/ @@ -8105,7 +8303,7 @@ report_error: wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) && - !wsrep_thd_skip_append_keys(user_thd)) + !wsrep_thd_ignore_table(user_thd)) { if (wsrep_append_keys(user_thd, false, record, NULL)) { @@ -8627,7 +8825,7 @@ func_exit: if (error == DB_SUCCESS && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && - !wsrep_thd_skip_append_keys(user_thd)) + !wsrep_thd_ignore_table(user_thd)) { DBUG_PRINT("wsrep", ("update row key")); @@ -8693,7 +8891,7 @@ ha_innobase::delete_row( if (error == DB_SUCCESS && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && - !wsrep_thd_skip_append_keys(user_thd)) + !wsrep_thd_ignore_table(user_thd)) { if (wsrep_append_keys(user_thd, false, record, NULL)) { DBUG_PRINT("wsrep", ("delete fail")); @@ -17707,15 +17905,12 @@ innobase_fts_close_ranking( { fts_result_t* result; - ((NEW_FT_INFO*) fts_hdl)->ft_prebuilt->in_fts_query = false; - result = ((NEW_FT_INFO*) fts_hdl)->ft_result; fts_query_free_result(result); my_free((uchar*) fts_hdl); - return; } @@ -18144,6 +18339,15 @@ wsrep_innobase_kill_one_trx( (thd && wsrep_thd_query(thd)) ? wsrep_thd_query(thd) : "void"); wsrep_thd_LOCK(thd); + DBUG_EXECUTE_IF("sync.wsrep_after_BF_victim_lock", + { + const char act[]= + "now " + "wait_for signal.wsrep_after_BF_victim_lock"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, + STRING_WITH_LEN(act))); + };); + if (wsrep_thd_query_state(thd) == QUERY_EXITING) { WSREP_DEBUG("kill trx EXITING for %lu", victim_trx->id); @@ -19680,6 +19884,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(sync_array_size), MYSQL_SYSVAR(compression_failure_threshold_pct), MYSQL_SYSVAR(compression_pad_pct_max), + MYSQL_SYSVAR(simulate_comp_failures), #ifdef UNIV_DEBUG MYSQL_SYSVAR(trx_rseg_n_slots_debug), MYSQL_SYSVAR(limit_optimistic_insert_debug), @@ -19687,7 +19892,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(fil_make_page_dirty_debug), MYSQL_SYSVAR(saved_page_number_debug), #endif /* UNIV_DEBUG */ - MYSQL_SYSVAR(simulate_comp_failures), + MYSQL_SYSVAR(tmpdir), MYSQL_SYSVAR(force_primary_key), MYSQL_SYSVAR(fatal_semaphore_wait_threshold), /* Table page compression feature */ diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 0087b220d2f..332c5f319fa 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -201,12 +201,14 @@ innobase_fulltext_exist( /*******************************************************************//** Determine if ALTER TABLE needs to rebuild the table. @param ha_alter_info the DDL operation +@param altered_table MySQL original table @return whether it is necessary to rebuild the table */ static __attribute__((nonnull, warn_unused_result)) bool innobase_need_rebuild( /*==================*/ - const Alter_inplace_info* ha_alter_info) + const Alter_inplace_info* ha_alter_info, + const TABLE* altered_table) { if (ha_alter_info->handler_flags == Alter_inplace_info::CHANGE_CREATE_OPTION @@ -218,6 +220,34 @@ innobase_need_rebuild( return(false); } + /* If alter table changes column name and adds a new + index, we need to check is this new index created + to new column name. This is because column name + changes are done normally after creating indexes. */ + if ((ha_alter_info->handler_flags + & Alter_inplace_info::ALTER_COLUMN_NAME) && + ((ha_alter_info->handler_flags + & Alter_inplace_info::ADD_INDEX) || + (ha_alter_info->handler_flags + & Alter_inplace_info::ADD_FOREIGN_KEY))) { + for (ulint i = 0; i < ha_alter_info->key_count; i++) { + const KEY* key = &ha_alter_info->key_info_buffer[ + ha_alter_info->index_add_buffer[i]]; + + for (ulint j = 0; j < key->user_defined_key_parts; j++) { + const KEY_PART_INFO* key_part = &(key->key_part[j]); + const Field* field = altered_table->field[key_part->fieldnr]; + + /* Field used on added index is renamed on + this same alter table. We need table + rebuild. */ + if (field->flags & FIELD_IS_RENAMED) { + return (true); + } + } + } + } + return(!!(ha_alter_info->handler_flags & INNOBASE_ALTER_REBUILD)); } @@ -555,7 +585,7 @@ ha_innobase::check_if_supported_inplace_alter( operation is possible. */ } else if (((ha_alter_info->handler_flags & Alter_inplace_info::ADD_PK_INDEX) - || innobase_need_rebuild(ha_alter_info)) + || innobase_need_rebuild(ha_alter_info, table)) && (innobase_fulltext_exist(altered_table))) { /* Refuse to rebuild the table online, if fulltext indexes are to survive the rebuild. */ @@ -1558,7 +1588,8 @@ innobase_create_index_def( index_def_t* index, /*!< out: index definition */ mem_heap_t* heap, /*!< in: heap where memory is allocated */ - const Field** fields) /*!z in: MySQL table fields */ + const Field** fields) /*!< in: MySQL table fields + */ { const KEY* key = &keys[key_number]; ulint i; @@ -1853,9 +1884,11 @@ innobase_create_key_defs( bool& add_fts_doc_id, /*!< in: whether we need to add new DOC ID column for FTS index */ - bool& add_fts_doc_idx) + bool& add_fts_doc_idx, /*!< in: whether we need to add new DOC ID index for FTS index */ + const TABLE* table) + /*!< in: MySQL table that is being altered */ { index_def_t* indexdef; index_def_t* indexdefs; @@ -1905,7 +1938,8 @@ innobase_create_key_defs( } const bool rebuild = new_primary || add_fts_doc_id - || innobase_need_rebuild(ha_alter_info); + || innobase_need_rebuild(ha_alter_info, table); + /* Reserve one more space if new_primary is true, and we might need to add the FTS_DOC_ID_INDEX */ indexdef = indexdefs = static_cast<index_def_t*>( @@ -2738,11 +2772,16 @@ prepare_inplace_alter_table_dict( ctx->num_to_add_index = ha_alter_info->index_add_count; + ut_ad(ctx->prebuilt->trx->mysql_thd != NULL); + const char* path = thd_innodb_tmpdir( + ctx->prebuilt->trx->mysql_thd); + index_defs = innobase_create_key_defs( ctx->heap, ha_alter_info, altered_table, ctx->num_to_add_index, num_fts_index, row_table_got_default_clust_index(ctx->new_table), - fts_doc_id_col, add_fts_doc_id, add_fts_doc_id_idx); + fts_doc_id_col, add_fts_doc_id, add_fts_doc_id_idx, + old_table); new_clustered = DICT_CLUSTERED & index_defs[0].ind_type; @@ -2755,7 +2794,7 @@ prepare_inplace_alter_table_dict( /* This is not an online operation (LOCK=NONE). */ } else if (ctx->add_autoinc == ULINT_UNDEFINED && num_fts_index == 0 - && (!innobase_need_rebuild(ha_alter_info) + && (!innobase_need_rebuild(ha_alter_info, old_table) || !innobase_fulltext_exist(altered_table))) { /* InnoDB can perform an online operation (LOCK=NONE). */ } else { @@ -2772,7 +2811,7 @@ prepare_inplace_alter_table_dict( is just copied from old table and stored in indexdefs[0] */ DBUG_ASSERT(!add_fts_doc_id || new_clustered); DBUG_ASSERT(!!new_clustered == - (innobase_need_rebuild(ha_alter_info) + (innobase_need_rebuild(ha_alter_info, old_table) || add_fts_doc_id)); /* Allocate memory for dictionary index definitions */ @@ -3032,7 +3071,7 @@ prepare_inplace_alter_table_dict( add_cols, ctx->heap); ctx->add_cols = add_cols; } else { - DBUG_ASSERT(!innobase_need_rebuild(ha_alter_info)); + DBUG_ASSERT(!innobase_need_rebuild(ha_alter_info, old_table)); if (!ctx->new_table->fts && innobase_fulltext_exist(altered_table)) { @@ -3053,7 +3092,7 @@ prepare_inplace_alter_table_dict( ctx->add_index[a] = row_merge_create_index( ctx->trx, ctx->new_table, - &index_defs[a]); + &index_defs[a], ctx->col_names); add_key_nums[a] = index_defs[a].key_number; @@ -3090,8 +3129,10 @@ prepare_inplace_alter_table_dict( error = DB_OUT_OF_MEMORY; goto error_handling;); rw_lock_x_lock(&ctx->add_index[a]->lock); + bool ok = row_log_allocate(ctx->add_index[a], - NULL, true, NULL, NULL); + NULL, true, NULL, + NULL, path); rw_lock_x_unlock(&ctx->add_index[a]->lock); if (!ok) { @@ -3117,7 +3158,7 @@ prepare_inplace_alter_table_dict( clust_index, ctx->new_table, !(ha_alter_info->handler_flags & Alter_inplace_info::ADD_PK_INDEX), - ctx->add_cols, ctx->col_map); + ctx->add_cols, ctx->col_map, path); rw_lock_x_unlock(&clust_index->lock); if (!ok) { @@ -3914,7 +3955,7 @@ err_exit: if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA) || (ha_alter_info->handler_flags == Alter_inplace_info::CHANGE_CREATE_OPTION - && !innobase_need_rebuild(ha_alter_info))) { + && !innobase_need_rebuild(ha_alter_info, table))) { if (heap) { ha_alter_info->handler_ctx @@ -4088,7 +4129,7 @@ ok_exit: if (ha_alter_info->handler_flags == Alter_inplace_info::CHANGE_CREATE_OPTION - && !innobase_need_rebuild(ha_alter_info)) { + && !innobase_need_rebuild(ha_alter_info, table)) { goto ok_exit; } @@ -4110,6 +4151,7 @@ ok_exit: files and merge sort. */ DBUG_EXECUTE_IF("innodb_OOM_inplace_alter", error = DB_OUT_OF_MEMORY; goto oom;); + error = row_merge_build_indexes( prebuilt->trx, prebuilt->table, ctx->new_table, @@ -4800,9 +4842,11 @@ commit_get_autoinc( Field* autoinc_field = old_table->found_next_number_field; + KEY* autoinc_key = + old_table->key_info + old_table->s->next_number_index; - dict_index_t* index = dict_table_get_index_on_first_col( - ctx->old_table, autoinc_field->field_index); + dict_index_t* index = dict_table_get_index_on_name( + ctx->old_table, autoinc_key->name); max_autoinc = ha_alter_info->create_info->auto_increment_value; diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index c1e5051dc6f..9e8d8659739 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -383,12 +384,18 @@ ibuf_header_page_get( buf_block_t* block; ut_ad(!ibuf_inside(mtr)); + page_t* page = NULL; block = buf_page_get( IBUF_SPACE_ID, 0, FSP_IBUF_HEADER_PAGE_NO, RW_X_LATCH, mtr); - buf_block_dbg_add_level(block, SYNC_IBUF_HEADER); - return(buf_block_get_frame(block)); + if (!block->page.encrypted) { + buf_block_dbg_add_level(block, SYNC_IBUF_HEADER); + + page = buf_block_get_frame(block); + } + + return page; } /******************************************************************//** @@ -500,9 +507,10 @@ ibuf_size_update( /******************************************************************//** Creates the insert buffer data structure at a database startup and initializes -the data structures for the insert buffer. */ +the data structures for the insert buffer. +@return DB_SUCCESS or failure */ UNIV_INTERN -void +dberr_t ibuf_init_at_db_start(void) /*=======================*/ { @@ -513,7 +521,7 @@ ibuf_init_at_db_start(void) dict_index_t* index; ulint n_used; page_t* header_page; - dberr_t error; + dberr_t error= DB_SUCCESS; ibuf = static_cast<ibuf_t*>(mem_zalloc(sizeof(ibuf_t))); @@ -543,6 +551,10 @@ ibuf_init_at_db_start(void) header_page = ibuf_header_page_get(&mtr); + if (!header_page) { + return (DB_DECRYPTION_FAILED); + } + fseg_n_reserved_pages(header_page + IBUF_HEADER + IBUF_TREE_SEG_HEADER, &n_used, &mtr); ibuf_enter(&mtr); @@ -593,6 +605,7 @@ ibuf_init_at_db_start(void) ut_a(error == DB_SUCCESS); ibuf->index = dict_table_get_first_index(table); + return (error); } /*********************************************************************//** diff --git a/storage/innobase/include/fil0crypt.h b/storage/innobase/include/fil0crypt.h index cf2e022c006..aa601f28e25 100644 --- a/storage/innobase/include/fil0crypt.h +++ b/storage/innobase/include/fil0crypt.h @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2015, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -212,6 +212,7 @@ bool fil_space_check_encryption_read( /*============================*/ ulint space); /*!< in: tablespace id */ + /****************************************************************** Decrypt a page @return true if page is decrypted, false if not. */ @@ -226,7 +227,6 @@ fil_space_decrypt( dberr_t* err); /*!< in: out: DB_SUCCESS or error code */ - /********************************************************************* Encrypt buffer page @return encrypted page, or original not encrypted page if encrypt @@ -253,7 +253,8 @@ fil_space_decrypt( ulint space, /*!< in: tablespace id */ byte* src_frame, /*!< in: page frame */ ulint page_size, /*!< in: size of data to encrypt */ - byte* dst_frame); /*!< in: where to decrypt to */ + byte* dst_frame) /*!< in: where to decrypt to */ + __attribute__((warn_unused_result)); /********************************************************************* fil_space_verify_crypt_checksum diff --git a/storage/innobase/include/ha_prototypes.h b/storage/innobase/include/ha_prototypes.h index 59abb0863d9..427bfaf2c05 100644 --- a/storage/innobase/include/ha_prototypes.h +++ b/storage/innobase/include/ha_prototypes.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2006, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2006, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -351,6 +351,15 @@ thd_supports_xa( THD* thd); /*!< in: thread handle, or NULL to query the global innodb_supports_xa */ +/** Get status of innodb_tmpdir. +@param[in] thd thread handle, or NULL to query + the global innodb_tmpdir. +@retval NULL if innodb_tmpdir="" */ +UNIV_INTERN +const char* +thd_innodb_tmpdir( + THD* thd); + /******************************************************************//** Returns the lock wait timeout for the current connection. @return the lock wait timeout, in seconds */ @@ -634,6 +643,7 @@ ib_push_warning( ulint error, /*!< in: error code to push as warning */ const char *format,/*!< in: warning message */ ...); + /********************************************************************//** Helper function to push warnings from InnoDB internals to SQL-layer. */ UNIV_INTERN @@ -643,4 +653,19 @@ ib_push_warning( ulint error, /*!< in: error code to push as warning */ const char *format,/*!< in: warning message */ ...); + +/*****************************************************************//** +Normalizes a table name string. A normalized name consists of the +database name catenated to '/' and table name. An example: +test/mytable. On Windows normalization puts both the database name and the +table name always to lower case if "set_lower_case" is set to TRUE. */ +void +normalize_table_name_low( +/*=====================*/ + char* norm_name, /*!< out: normalized name as a + null-terminated string */ + const char* name, /*!< in: table name string */ + ibool set_lower_case); /*!< in: TRUE if we want to set + name to lower case */ + #endif /* HA_INNODB_PROTOTYPES_H */ diff --git a/storage/innobase/include/ibuf0ibuf.h b/storage/innobase/include/ibuf0ibuf.h index 9c3b686c998..badafe6befd 100644 --- a/storage/innobase/include/ibuf0ibuf.h +++ b/storage/innobase/include/ibuf0ibuf.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2013, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -91,9 +92,10 @@ separately committed mini-transaction, because in crash recovery, the free bits could momentarily be set too high. */ /******************************************************************//** -Creates the insert buffer data structure at a database startup. */ +Creates the insert buffer data structure at a database startup. +@return DB_SUCCESS or failure */ UNIV_INTERN -void +dberr_t ibuf_init_at_db_start(void); /*=======================*/ /*********************************************************************//** diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index c630e91e815..c610e1790eb 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -435,14 +435,19 @@ UNIV_INTERN void os_io_init_simple(void); /*===================*/ -/***********************************************************************//** -Creates a temporary file. This function is like tmpfile(3), but -the temporary file is created in the MySQL temporary directory. -@return temporary file handle, or NULL on error */ + +/** Create a temporary file. This function is like tmpfile(3), but +the temporary file is created in the given parameter path. If the path +is null then it will create the file in the mysql server configuration +parameter (--tmpdir). +@param[in] path location for creating temporary file +@return temporary file handle, or NULL on error */ +UNIV_INTERN FILE* -os_file_create_tmpfile(void); -/*========================*/ +os_file_create_tmpfile( + const char* path); + #endif /* !UNIV_HOTBACKUP */ /***********************************************************************//** The os_file_opendir() function opens a directory stream corresponding to the @@ -1271,14 +1276,14 @@ os_file_get_status( file can be opened in RW mode */ #if !defined(UNIV_HOTBACKUP) -/*********************************************************************//** -Creates a temporary file that will be deleted on close. -This function is defined in ha_innodb.cc. -@return temporary file descriptor, or < 0 on error */ +/** Create a temporary file in the location specified by the parameter +path. If the path is null, then it will be created in tmpdir. +@param[in] path location for creating temporary file +@return temporary file descriptor, or < 0 on error */ UNIV_INTERN int -innobase_mysql_tmpfile(void); -/*========================*/ +innobase_mysql_tmpfile( + const char* path); #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/include/row0log.h b/storage/innobase/include/row0log.h index f105838eece..e127504c484 100644 --- a/storage/innobase/include/row0log.h +++ b/storage/innobase/include/row0log.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2011, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -55,8 +55,9 @@ row_log_allocate( const dtuple_t* add_cols, /*!< in: default values of added columns, or NULL */ - const ulint* col_map)/*!< in: mapping of old column + const ulint* col_map,/*!< in: mapping of old column numbers to new ones, or NULL if !table */ + const char* path) /*!< in: where to create temporary file */ __attribute__((nonnull(1), warn_unused_result)); /******************************************************//** diff --git a/storage/innobase/include/row0merge.h b/storage/innobase/include/row0merge.h index 196543f25e1..53164b5197f 100644 --- a/storage/innobase/include/row0merge.h +++ b/storage/innobase/include/row0merge.h @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2005, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2005, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2015, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -187,14 +187,14 @@ void row_merge_drop_temp_indexes(void); /*=============================*/ -/*********************************************************************//** -Creates temporary merge files, and if UNIV_PFS_IO defined, register -the file descriptor with Performance Schema. +/** Create temporary merge files in the given paramater path, and if +UNIV_PFS_IO defined, register the file descriptor with Performance Schema. +@param[in] path location for creating temporary merge files. @return File descriptor */ UNIV_INTERN int -row_merge_file_create_low(void) -/*===========================*/ +row_merge_file_create_low( + const char* path) __attribute__((warn_unused_result)); /*********************************************************************//** Destroy a merge file. And de-register the file from Performance Schema @@ -268,8 +268,11 @@ row_merge_create_index( /*===================*/ trx_t* trx, /*!< in/out: trx (sets error_state) */ dict_table_t* table, /*!< in: the index is on this table */ - const index_def_t* index_def); + const index_def_t* index_def, /*!< in: the index definition */ + const char** col_names); + /*! in: column names if columns are + renamed or NULL */ /*********************************************************************//** Check if a transaction can use an index. @return TRUE if index can be used by the transaction else FALSE */ @@ -369,15 +372,17 @@ row_merge_buf_empty( /*================*/ row_merge_buf_t* buf) /*!< in,own: sort buffer */ __attribute__((warn_unused_result, nonnull)); -/*********************************************************************//** -Create a merge file. + +/** Create a merge file in the given location. +@param[out] merge_file merge file structure +@param[in] path location for creating temporary file @return file descriptor, or -1 on failure */ UNIV_INTERN int row_merge_file_create( -/*==================*/ - merge_file_t* merge_file) /*!< out: merge file structure */ - __attribute__((nonnull)); + merge_file_t* merge_file, + const char* path); + /*********************************************************************//** Merge disk files. @return DB_SUCCESS or error code */ diff --git a/storage/innobase/include/srv0mon.h b/storage/innobase/include/srv0mon.h index 8673a51b10f..422cfc3eaf6 100644 --- a/storage/innobase/include/srv0mon.h +++ b/storage/innobase/include/srv0mon.h @@ -2,7 +2,7 @@ Copyright (c) 2010, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -263,9 +263,6 @@ enum monitor_id_t { MONITOR_OVLD_OS_LOG_FSYNC, MONITOR_OVLD_OS_LOG_PENDING_FSYNC, MONITOR_OVLD_OS_LOG_PENDING_WRITES, - MONITOR_MERGE_BLOCKS_WRITTEN, - MONITOR_MERGE_BLOCKS_READ, - MONITOR_MERGE_BLOCKS_MERGED, /* Transaction related counters */ MONITOR_MODULE_TRX, diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index d8e7d484a18..9a6107f4330 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -3,7 +3,7 @@ Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, 2009, Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2016, MariaDB Corporation Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -174,15 +174,6 @@ struct srv_stats_t { /** Number of system rows inserted */ ulint_ctr_64_t n_system_rows_inserted; - /** Number of merge buffers written */ - ulint_ctr_64_t merge_buffers_written; - - /** Number of merge buffers read */ - ulint_ctr_64_t merge_buffers_read; - - /** Number of merge buffers merged */ - ulint_ctr_64_t merge_buffers_merged; - /** Number of times secondary index lookup triggered cluster lookup */ ulint_ctr_64_t n_sec_rec_cluster_reads; @@ -1001,9 +992,6 @@ struct export_var_t{ ulint innodb_purge_view_trx_id_age; /*!< rw_max_trx_id - purged view's min trx_id */ #endif /* UNIV_DEBUG */ - ib_int64_t innodb_merge_buffers_written; - ib_int64_t innodb_merge_buffers_read; - ib_int64_t innodb_merge_buffers_merged; ib_int64_t innodb_page_compression_saved;/*!< Number of bytes saved by page compression */ diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index a957b2cc98f..c2451fa8c21 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -45,7 +45,7 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 27 +#define INNODB_VERSION_BUGFIX 29 /* The following is the InnoDB version as shown in SELECT plugin_version FROM information_schema.plugins; diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 184b1a375ce..165db2d33ed 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -638,7 +638,7 @@ lock_sys_create( lock_sys->rec_hash = hash_create(n_cells); if (!srv_read_only_mode) { - lock_latest_err_file = os_file_create_tmpfile(); + lock_latest_err_file = os_file_create_tmpfile(NULL); ut_a(lock_latest_err_file); } } diff --git a/storage/innobase/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc index 4f4a0eb223b..a87adcf94c0 100644 --- a/storage/innobase/lock/lock0wait.cc +++ b/storage/innobase/lock/lock0wait.cc @@ -33,6 +33,8 @@ Created 25/5/2010 Sunny Bains #include "ha_prototypes.h" #include "lock0priv.h" +#include <mysql/service_wsrep.h> + /*********************************************************************//** Print the contents of the lock_sys_t::waiting_threads array. */ static @@ -184,6 +186,28 @@ lock_wait_table_reserve_slot( return(NULL); } +#ifdef WITH_WSREP +/*********************************************************************//** +check if lock timeout was for priority thread, +as a side effect trigger lock monitor +@return false for regular lock timeout */ +static ibool +wsrep_is_BF_lock_timeout( +/*====================*/ + trx_t* trx) /* in: trx to check for lock priority */ +{ + if (wsrep_on(trx->mysql_thd) && + wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + fprintf(stderr, "WSREP: BF lock wait long\n"); + srv_print_innodb_monitor = TRUE; + srv_print_innodb_lock_monitor = TRUE; + os_event_set(srv_monitor_event); + return TRUE; + } + return FALSE; + } +#endif /* WITH_WSREP */ + /***************************************************************//** Puts a user OS thread to wait for a lock to be released. If an error occurs during the wait trx->error_state associated with thr is @@ -371,9 +395,17 @@ lock_wait_suspend_thread( if (lock_wait_timeout < 100000000 && wait_time > (double) lock_wait_timeout) { +#ifdef WITH_WSREP + if (!wsrep_on(trx->mysql_thd) || + (!wsrep_is_BF_lock_timeout(trx) && + trx->error_state != DB_DEADLOCK)) { +#endif /* WITH_WSREP */ trx->error_state = DB_LOCK_WAIT_TIMEOUT; +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ MONITOR_INC(MONITOR_TIMEOUT); } @@ -457,8 +489,13 @@ lock_wait_check_and_cancel( if (trx->lock.wait_lock) { ut_a(trx->lock.que_state == TRX_QUE_LOCK_WAIT); - +#ifdef WITH_WSREP + if (!wsrep_is_BF_lock_timeout(trx)) { +#endif /* WITH_WSREP */ lock_cancel_waiting_and_release(trx->lock.wait_lock); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } lock_mutex_exit(); diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 2b9e877e765..dd6b066c647 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -918,19 +918,20 @@ os_io_init_simple(void) } } -/***********************************************************************//** -Creates a temporary file. This function is like tmpfile(3), but -the temporary file is created in the MySQL temporary directory. -@return temporary file handle, or NULL on error */ +/** Create a temporary file. This function is like tmpfile(3), but +the temporary file is created in the given parameter path. If the path +is null then it will create the file in the mysql server configuration +parameter (--tmpdir). +@param[in] path location for creating temporary file +@return temporary file handle, or NULL on error */ UNIV_INTERN FILE* -os_file_create_tmpfile(void) -/*========================*/ +os_file_create_tmpfile( + const char* path) { FILE* file = NULL; - int fd; WAIT_ALLOW_WRITES(); - fd = innobase_mysql_tmpfile(); + int fd = innobase_mysql_tmpfile(path); ut_ad(!srv_read_only_mode); @@ -3910,7 +3911,7 @@ os_aio_native_aio_supported(void) return(FALSE); } else if (!srv_read_only_mode) { /* Now check if tmpdir supports native aio ops. */ - fd = innobase_mysql_tmpfile(); + fd = innobase_mysql_tmpfile(NULL); if (fd < 0) { ib_logf(IB_LOG_LEVEL_WARN, diff --git a/storage/innobase/row/row0ftsort.cc b/storage/innobase/row/row0ftsort.cc index 4c021973b9a..9e340f24213 100644 --- a/storage/innobase/row/row0ftsort.cc +++ b/storage/innobase/row/row0ftsort.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2010, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2010, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2015, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -237,6 +237,9 @@ row_fts_psort_info_init( crypt_data = NULL; } + ut_ad(trx->mysql_thd != NULL); + const char* path = thd_innodb_tmpdir(trx->mysql_thd); + /* There will be FTS_NUM_AUX_INDEX number of "sort buckets" for each parallel sort thread. Each "sort bucket" holds records for a particular "FTS index partition" */ @@ -258,8 +261,8 @@ row_fts_psort_info_init( psort_info[j].merge_buf[i] = row_merge_buf_create( dup->index); - if (row_merge_file_create(psort_info[j].merge_file[i]) - < 0) { + if (row_merge_file_create(psort_info[j].merge_file[i], + path) < 0) { goto func_exit; } @@ -659,6 +662,11 @@ fts_parallel_tokenization( dberr_t error = DB_SUCCESS; fil_space_crypt_t* crypt_data = NULL; + ut_ad(psort_info->psort_common->trx->mysql_thd != NULL); + + const char* path = thd_innodb_tmpdir( + psort_info->psort_common->trx->mysql_thd); + ut_ad(psort_info); buf = psort_info->merge_buf; @@ -902,7 +910,7 @@ exit: continue; } - tmpfd[i] = row_merge_file_create_low(); + tmpfd[i] = row_merge_file_create_low(path); if (tmpfd[i] < 0) { error = DB_OUT_OF_MEMORY; goto func_exit; diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 16de943f901..bddc81d9fb3 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -198,8 +198,25 @@ struct row_log_t { or by index->lock X-latch only */ row_log_buf_t head; /*!< reader context; protected by MDL only; modifiable by row_log_apply_ops() */ + const char* path; /*!< where to create temporary file during + log operation */ }; +/** Create the file or online log if it does not exist. +@param[in,out] log online rebuild log +@return file descriptor. */ +static __attribute__((warn_unused_result)) +int +row_log_tmpfile( + row_log_t* log) +{ + DBUG_ENTER("row_log_tmpfile"); + if (log->fd < 0) { + log->fd = row_merge_file_create_low(log->path); + } + + DBUG_RETURN(log->fd); +} /** Allocate the memory for the log buffer. @param[in,out] log_buf Buffer used for log operation @@ -344,6 +361,12 @@ row_log_online_op( log->tail.buf, avail_size); } UNIV_MEM_ASSERT_RW(log->tail.block, srv_sort_buf_size); + + if (row_log_tmpfile(log) < 0) { + log->error = DB_OUT_OF_MEMORY; + goto err_exit; + } + ret = os_file_write( "(modification log)", OS_FILE_FROM_FD(log->fd), @@ -454,6 +477,12 @@ row_log_table_close_func( log->tail.buf, avail); } UNIV_MEM_ASSERT_RW(log->tail.block, srv_sort_buf_size); + + if (row_log_tmpfile(log) < 0) { + log->error = DB_OUT_OF_MEMORY; + goto err_exit; + } + ret = os_file_write( "(modification log)", OS_FILE_FROM_FD(log->fd), @@ -473,6 +502,7 @@ write_failed: log->tail.total += size; UNIV_MEM_INVALID(log->tail.buf, sizeof log->tail.buf); +err_exit: mutex_exit(&log->mutex); os_atomic_increment_ulint(&onlineddl_rowlog_rows, 1); @@ -2544,7 +2574,8 @@ corruption: if (index->online_log->head.blocks) { #ifdef HAVE_FTRUNCATE /* Truncate the file in order to save space. */ - if (ftruncate(index->online_log->fd, 0) == -1) { + if (index->online_log->fd != -1 + && ftruncate(index->online_log->fd, 0) == -1) { fprintf(stderr, "InnoDB: Error: Truncate of file " "\'%s\' failed with error %d:%s\n", index->name + 1, errno, strerror(errno)); @@ -2863,8 +2894,9 @@ row_log_allocate( const dtuple_t* add_cols, /*!< in: default values of added columns, or NULL */ - const ulint* col_map)/*!< in: mapping of old column + const ulint* col_map,/*!< in: mapping of old column numbers to new ones, or NULL if !table */ + const char* path) /*!< in: where to create temporary file */ { row_log_t* log; DBUG_ENTER("row_log_allocate"); @@ -2883,11 +2915,7 @@ row_log_allocate( DBUG_RETURN(false); } - log->fd = row_merge_file_create_low(); - if (log->fd < 0) { - ut_free(log); - DBUG_RETURN(false); - } + log->fd = -1; mutex_create(index_online_log_key, &log->mutex, SYNC_INDEX_ONLINE_LOG); log->blobs = NULL; @@ -2902,6 +2930,7 @@ row_log_allocate( log->tail.block = log->head.block = NULL; log->head.blocks = log->head.bytes = 0; log->head.total = 0; + log->path = path; dict_index_set_online_status(index, ONLINE_INDEX_CREATION); index->online_log = log; @@ -3379,7 +3408,8 @@ corruption: if (index->online_log->head.blocks) { #ifdef HAVE_FTRUNCATE /* Truncate the file in order to save space. */ - if (ftruncate(index->online_log->fd, 0) == -1) { + if (index->online_log->fd != -1 + && ftruncate(index->online_log->fd, 0) == -1) { fprintf(stderr, "InnoDB: Error: Truncate of file " "\'%s\' failed with error %d:%s\n", index->name + 1, errno, strerror(errno)); diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 13eeaeb72fa..94cf20b79f6 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -1,7 +1,6 @@ /***************************************************************************** Copyright (c) 2005, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2015, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -969,7 +968,6 @@ row_merge_read( success = os_file_read_no_error_handling(OS_FILE_FROM_FD(fd), buf, ofs, srv_sort_buf_size); - srv_stats.merge_buffers_read.inc(); /* For encrypted tables, decrypt data after reading and copy data */ if (crypt_data && crypt_buf) { @@ -1025,7 +1023,6 @@ row_merge_write( } ret = os_file_write("(merge)", OS_FILE_FROM_FD(fd), out_buf, ofs, buf_len); - srv_stats.merge_buffers_written.inc(); #ifdef UNIV_DEBUG if (row_merge_print_block_write) { @@ -1390,52 +1387,101 @@ row_merge_write_eof( return(&block[0]); } -/********************************************************************//** -Reads clustered index of the table and create temporary files +/** Create a temporary file if it has not been created already. +@param[in,out] tmpfd temporary file handle +@param[in] path path to create temporary file +@return file descriptor, or -1 on failure */ +static __attribute__((warn_unused_result)) +int +row_merge_tmpfile_if_needed( + int* tmpfd, + const char* path) +{ + if (*tmpfd < 0) { + *tmpfd = row_merge_file_create_low(path); + } + + return(*tmpfd); +} + +/** Create a temporary file for merge sort if it was not created already. +@param[in,out] file merge file structure +@param[in,out] tmpfd temporary file structure +@param[in] nrec number of records in the file +@param[in] path path to create temporary files +@return file descriptor, or -1 on failure */ +static __attribute__((warn_unused_result)) +int +row_merge_file_create_if_needed( + merge_file_t* file, + int* tmpfd, + ulint nrec, + const char* path) +{ + ut_ad(file->fd < 0 || *tmpfd >=0); + if (file->fd < 0 && row_merge_file_create(file, path) >= 0) { + if (row_merge_tmpfile_if_needed(tmpfd, path) < 0) { + return(-1); + } + + file->n_rec = nrec; + } + + ut_ad(file->fd < 0 || *tmpfd >=0); + return(file->fd); +} + +/** Reads clustered index of the table and create temporary files containing the index entries for the indexes to be built. -@return DB_SUCCESS or error */ +@param[in] trx transaction +@param[in,out] table MySQL table object, for reporting erroneous + records +@param[in] old_table table where rows are read from +@param[in] new_table table where indexes are created; identical to + old_table unless creating a PRIMARY KEY +@param[in] online true if creating indexes online +@param[in] index indexes to be created +@param[in] fts_sort_idx full-text index to be created, or NULL +@param[in] psort_info parallel sort info for fts_sort_idx creation, + or NULL +@param[in] files temporary files +@param[in] key_numbers MySQL key numbers to create +@param[in] n_index number of indexes to create +@param[in] add_cols default values of added columns, or NULL +@param[in] col_map mapping of old column numbers to new ones, or + NULL if old_table == new_table +@param[in] add_autoinc number of added AUTO_INCREMENT columns, or + ULINT_UNDEFINED if none is added +@param[in,out] sequence autoinc sequence +@param[in,out] block file buffer +@param[in,out] tmpfd temporary file handle +@param[in] pct_cost percent of task weight out of total alter job +@param[in] crypt_data crypt data or NULL +@param[in,out] crypt_block crypted file buffer +return DB_SUCCESS or error */ static __attribute__((nonnull(1,2,3,4,6,9,10,16), warn_unused_result)) dberr_t row_merge_read_clustered_index( -/*===========================*/ - trx_t* trx, /*!< in: transaction */ - struct TABLE* table, /*!< in/out: MySQL table object, - for reporting erroneous records */ - const dict_table_t* old_table,/*!< in: table where rows are - read from */ - const dict_table_t* new_table,/*!< in: table where indexes are - created; identical to old_table - unless creating a PRIMARY KEY */ - bool online, /*!< in: true if creating indexes - online */ - dict_index_t** index, /*!< in: indexes to be created */ + trx_t* trx, + struct TABLE* table, + const dict_table_t* old_table, + const dict_table_t* new_table, + bool online, + dict_index_t** index, dict_index_t* fts_sort_idx, - /*!< in: full-text index to be created, - or NULL */ fts_psort_t* psort_info, - /*!< in: parallel sort info for - fts_sort_idx creation, or NULL */ - merge_file_t* files, /*!< in: temporary files */ + merge_file_t* files, const ulint* key_numbers, - /*!< in: MySQL key numbers to create */ - ulint n_index,/*!< in: number of indexes to create */ + ulint n_index, const dtuple_t* add_cols, - /*!< in: default values of - added columns, or NULL */ - const ulint* col_map,/*!< in: mapping of old column - numbers to new ones, or NULL - if old_table == new_table */ + const ulint* col_map, ulint add_autoinc, - /*!< in: number of added - AUTO_INCREMENT column, or - ULINT_UNDEFINED if none is added */ - ib_sequence_t& sequence,/*!< in/out: autoinc sequence */ - row_merge_block_t* block, /*!< in/out: file buffer */ - float pct_cost, /*!< in: percent of task weight - out of total alter job */ - fil_space_crypt_t* crypt_data,/*!< in: crypt data or NULL */ - row_merge_block_t* crypt_block)/*!< in: in/out: crypted file - buffer */ + ib_sequence_t& sequence, + row_merge_block_t* block, + int* tmpfd, + float pct_cost, + fil_space_crypt_t* crypt_data, + row_merge_block_t* crypt_block) { dict_index_t* clust_index; /* Clustered index */ mem_heap_t* row_heap; /* Heap memory to create @@ -1478,6 +1524,9 @@ row_merge_read_clustered_index( DEBUG_FTS_SORT_PRINT("FTS_SORT: Start Create Index\n"); #endif + ut_ad(trx->mysql_thd != NULL); + const char* path = thd_innodb_tmpdir(trx->mysql_thd); + /* Create and initialize memory for record buffers */ merge_buf = static_cast<row_merge_buf_t**>( @@ -1908,7 +1957,7 @@ write_buffers: /* We have enough data tuples to form a block. Sort them and write to disk. */ - if (UNIV_LIKELY(buf->n_tuples)) { + if (buf->n_tuples) { if (dict_index_is_unique(buf->index)) { row_merge_dup_t dup = { buf->index, table, col_map, 0}; @@ -1949,8 +1998,16 @@ write_buffers: dict_index_get_lock(buf->index)); } - /* Do not write empty buffers to temporary file */ - if (buf->n_tuples) { + if (buf->n_tuples > 0) { + + if (row_merge_file_create_if_needed( + file, tmpfd, buf->n_tuples, path) < 0) { + err = DB_OUT_OF_MEMORY; + trx->error_key_num = i; + break; + } + + ut_ad(file->n_rec > 0); row_merge_buf_write(buf, file, block); @@ -2016,6 +2073,7 @@ write_buffers: func_exit: mtr_commit(&mtr); + mem_heap_free(row_heap); if (nonnull) { @@ -2277,8 +2335,6 @@ done1: b2, of->fd, &of->offset, crypt_data, crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, space); - srv_stats.merge_buffers_merged.inc(); - return(b2 ? DB_SUCCESS : DB_CORRUPTION); } @@ -3346,14 +3402,15 @@ row_merge_drop_temp_indexes(void) trx_free_for_background(trx); } -/*********************************************************************//** -Creates temporary merge files, and if UNIV_PFS_IO defined, register -the file descriptor with Performance Schema. -@return file descriptor, or -1 on failure */ + +/** Create temporary merge files in the given paramater path, and if +UNIV_PFS_IO defined, register the file descriptor with Performance Schema. +@param[in] path location for creating temporary merge files. +@return File descriptor */ UNIV_INTERN int -row_merge_file_create_low(void) -/*===========================*/ +row_merge_file_create_low( + const char* path) { int fd; #ifdef UNIV_PFS_IO @@ -3367,7 +3424,7 @@ row_merge_file_create_low(void) "Innodb Merge Temp File", __FILE__, __LINE__); #endif - fd = innobase_mysql_tmpfile(); + fd = innobase_mysql_tmpfile(path); #ifdef UNIV_PFS_IO register_pfs_file_open_end(locker, fd); #endif @@ -3380,16 +3437,18 @@ row_merge_file_create_low(void) return(fd); } -/*********************************************************************//** -Create a merge file. + +/** Create a merge file in the given location. +@param[out] merge_file merge file structure +@param[in] path location for creating temporary file @return file descriptor, or -1 on failure */ UNIV_INTERN int row_merge_file_create( -/*==================*/ - merge_file_t* merge_file) /*!< out: merge file structure */ + merge_file_t* merge_file, + const char* path) { - merge_file->fd = row_merge_file_create_low(); + merge_file->fd = row_merge_file_create_low(path); merge_file->offset = 0; merge_file->n_rec = 0; @@ -3739,8 +3798,11 @@ row_merge_create_index( /*===================*/ trx_t* trx, /*!< in/out: trx (sets error_state) */ dict_table_t* table, /*!< in: the index is on this table */ - const index_def_t* index_def) + const index_def_t* index_def, /*!< in: the index definition */ + const char** col_names) + /*! in: column names if columns are + renamed or NULL */ { dict_index_t* index; dberr_t err; @@ -3760,9 +3822,24 @@ row_merge_create_index( for (i = 0; i < n_fields; i++) { index_field_t* ifield = &index_def->fields[i]; - const char * col_name = ifield->col_name ? - dict_table_get_col_name_for_mysql(table, ifield->col_name) : - dict_table_get_col_name(table, ifield->col_no); + const char * col_name; + + /* + Alter table renaming a column and then adding a index + to this new name e.g ALTER TABLE t + CHANGE COLUMN b c INT NOT NULL, ADD UNIQUE INDEX (c); + requires additional check as column names are not yet + changed when new index definitions are created. Table's + new column names are on a array of column name pointers + if any of the column names are changed. */ + + if (col_names && col_names[i]) { + col_name = col_names[i]; + } else { + col_name = ifield->col_name ? + dict_table_get_col_name_for_mysql(table, ifield->col_name) : + dict_table_get_col_name(table, ifield->col_no); + } dict_mem_index_add_field( index, @@ -3942,10 +4019,6 @@ row_merge_build_indexes( total_dynamic_cost = COST_BUILD_INDEX_DYNAMIC * n_indexes; for (i = 0; i < n_indexes; i++) { - if (row_merge_file_create(&merge_files[i]) < 0) { - error = DB_OUT_OF_MEMORY; - goto func_exit; - } if (indexes[i]->type & DICT_FTS) { ibool opt_doc_id_size = FALSE; @@ -3974,13 +4047,6 @@ row_merge_build_indexes( } } - tmpfd = row_merge_file_create_low(); - - if (tmpfd < 0) { - error = DB_OUT_OF_MEMORY; - goto func_exit; - } - /* Reset the MySQL row buffer that is used when reporting duplicate keys. */ innobase_rec_reset(table); @@ -4006,11 +4072,11 @@ row_merge_build_indexes( secondary index entries for merge sort */ error = row_merge_read_clustered_index( - trx, table, old_table, new_table, online, indexes, - fts_sort_idx, psort_info, merge_files, key_numbers, - n_indexes, add_cols, col_map, - add_autoinc, sequence, block, pct_cost, - crypt_data, crypt_block); + trx, table, old_table, new_table, online, indexes, + fts_sort_idx, psort_info, merge_files, key_numbers, + n_indexes, add_cols, col_map, + add_autoinc, sequence, block, &tmpfd, + pct_cost, crypt_data, crypt_block); pct_progress += pct_cost; @@ -4103,71 +4169,67 @@ wait_again: #ifdef FTS_INTERNAL_DIAG_PRINT DEBUG_FTS_SORT_PRINT("FTS_SORT: Complete Insert\n"); #endif - } else { - /* Sorting and inserting is required only if - there really is records */ - if (UNIV_LIKELY(merge_files[i].n_rec)) { - char buf[3 * NAME_LEN]; - char *bufend; - row_merge_dup_t dup = { - sort_idx, table, col_map, 0}; + } else if (merge_files[i].fd != -1) { + char buf[3 * NAME_LEN]; + char *bufend; + row_merge_dup_t dup = { + sort_idx, table, col_map, 0}; - pct_cost = (COST_BUILD_INDEX_STATIC + - (total_dynamic_cost * merge_files[i].offset / - total_index_blocks)) / - (total_static_cost + total_dynamic_cost) - * PCT_COST_MERGESORT_INDEX * 100; + pct_cost = (COST_BUILD_INDEX_STATIC + + (total_dynamic_cost * merge_files[i].offset / + total_index_blocks)) / + (total_static_cost + total_dynamic_cost) + * PCT_COST_MERGESORT_INDEX * 100; + + bufend = innobase_convert_name(buf, sizeof buf, + indexes[i]->name, strlen(indexes[i]->name), + trx ? trx->mysql_thd : NULL, + FALSE); - bufend = innobase_convert_name(buf, sizeof buf, - indexes[i]->name, strlen(indexes[i]->name), - trx ? trx->mysql_thd : NULL, - FALSE); + buf[bufend - buf]='\0'; - buf[bufend - buf]='\0'; + sql_print_information("InnoDB: Online DDL : Start merge-sorting" + " index %s (%lu / %lu), estimated cost : %2.4f", + buf, (i+1), n_indexes, pct_cost); - sql_print_information("InnoDB: Online DDL : Start merge-sorting" - " index %s (%lu / %lu), estimated cost : %2.4f", - buf, (i+1), n_indexes, pct_cost); + error = row_merge_sort( + trx, &dup, &merge_files[i], + block, &tmpfd, true, + pct_progress, pct_cost, + crypt_data, crypt_block, new_table->space); - error = row_merge_sort( - trx, &dup, &merge_files[i], - block, &tmpfd, true, - pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space); + pct_progress += pct_cost; + sql_print_information("InnoDB: Online DDL : End of " + " merge-sorting index %s (%lu / %lu)", + buf, (i+1), n_indexes); + + DBUG_EXECUTE_IF( + "ib_merge_wait_after_sort", + os_thread_sleep(20000000);); /* 20 sec */ + + if (error == DB_SUCCESS) { + pct_cost = (COST_BUILD_INDEX_STATIC + + (total_dynamic_cost * merge_files[i].offset / + total_index_blocks)) / + (total_static_cost + total_dynamic_cost) * + PCT_COST_INSERT_INDEX * 100; + + sql_print_information("InnoDB: Online DDL : Start " + "building index %s (%lu / %lu), estimated " + "cost : %2.4f", buf, (i+1), + n_indexes, pct_cost); + + error = row_merge_insert_index_tuples( + trx->id, sort_idx, old_table, + merge_files[i].fd, block, + merge_files[i].n_rec, pct_progress, pct_cost, + crypt_data, crypt_block, new_table->space); pct_progress += pct_cost; - sql_print_information("InnoDB: Online DDL : End of " - " merge-sorting index %s (%lu / %lu)", + sql_print_information("InnoDB: Online DDL : " + "End of building index %s (%lu / %lu)", buf, (i+1), n_indexes); - - DBUG_EXECUTE_IF( - "ib_merge_wait_after_sort", - os_thread_sleep(20000000);); /* 20 sec */ - - if (error == DB_SUCCESS) { - pct_cost = (COST_BUILD_INDEX_STATIC + - (total_dynamic_cost * merge_files[i].offset / - total_index_blocks)) / - (total_static_cost + total_dynamic_cost) * - PCT_COST_INSERT_INDEX * 100; - - sql_print_information("InnoDB: Online DDL : Start " - "building index %s (%lu / %lu), estimated " - "cost : %2.4f", buf, (i+1), - n_indexes, pct_cost); - - error = row_merge_insert_index_tuples( - trx->id, sort_idx, old_table, - merge_files[i].fd, block, - merge_files[i].n_rec, pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space); - pct_progress += pct_cost; - - sql_print_information("InnoDB: Online DDL : " - "End of building index %s (%lu / %lu)", - buf, (i+1), n_indexes); - } } } diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index cf07362cdbf..24d25a0b2c8 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -4879,6 +4879,7 @@ row_rename_table_for_mysql( pars_info_t* info = NULL; int retry; bool aux_fts_rename = false; + char* is_part = NULL; ut_a(old_name != NULL); ut_a(new_name != NULL); @@ -4916,6 +4917,55 @@ row_rename_table_for_mysql( table = dict_table_open_on_name(old_name, dict_locked, FALSE, DICT_ERR_IGNORE_NONE); + /* We look for pattern #P# to see if the table is partitioned + MySQL table. */ +#ifdef __WIN__ + is_part = strstr((char *)old_name, (char *)"#p#"); +#else + is_part = strstr((char *)old_name, (char *)"#P#"); +#endif /* __WIN__ */ + + /* MySQL partition engine hard codes the file name + separator as "#P#". The text case is fixed even if + lower_case_table_names is set to 1 or 2. This is true + for sub-partition names as well. InnoDB always + normalises file names to lower case on Windows, this + can potentially cause problems when copying/moving + tables between platforms. + + 1) If boot against an installation from Windows + platform, then its partition table name could + be all be in lower case in system tables. So we + will need to check lower case name when load table. + + 2) If we boot an installation from other case + sensitive platform in Windows, we might need to + check the existence of table name without lowering + case them in the system table. */ + if (!table && + is_part && + innobase_get_lower_case_table_names() == 1) { + char par_case_name[MAX_FULL_NAME_LEN + 1]; +#ifndef __WIN__ + /* Check for the table using lower + case name, including the partition + separator "P" */ + memcpy(par_case_name, old_name, + strlen(old_name)); + par_case_name[strlen(old_name)] = 0; + innobase_casedn_str(par_case_name); +#else + /* On Windows platfrom, check + whether there exists table name in + system table whose name is + not being normalized to lower case */ + normalize_table_name_low( + par_case_name, old_name, FALSE); +#endif + table = dict_table_open_on_name(par_case_name, dict_locked, FALSE, + DICT_ERR_IGNORE_NONE); + } + if (!table) { err = DB_TABLE_NOT_FOUND; ut_print_timestamp(stderr); diff --git a/storage/innobase/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc index 0054070eed5..1d6a4c008e8 100644 --- a/storage/innobase/srv/srv0mon.cc +++ b/storage/innobase/srv/srv0mon.cc @@ -2,7 +2,7 @@ Copyright (c) 2010, 2014, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, MariaDB Corporation +Copyright (c) 2013, 2016, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -715,24 +715,6 @@ static monitor_info_t innodb_counter_info[] = MONITOR_EXISTING | MONITOR_DEFAULT_ON), MONITOR_DEFAULT_START, MONITOR_OVLD_OS_LOG_PENDING_WRITES}, - {"os_merge_blocks_written", "os", - "Number of merge blocks written (innodb_os_merge_blocks_written)", - static_cast<monitor_type_t>( - MONITOR_EXISTING | MONITOR_DEFAULT_ON), - MONITOR_DEFAULT_START, MONITOR_MERGE_BLOCKS_WRITTEN}, - - {"os_merge_blocks_read", "os", - "Number of merge blocks read (innodb_os_merge_blocks_read)", - static_cast<monitor_type_t>( - MONITOR_EXISTING | MONITOR_DEFAULT_ON), - MONITOR_DEFAULT_START, MONITOR_MERGE_BLOCKS_READ}, - - {"os_merge_blocks_merged", "os", - "Number of merge blocks merged (innodb_os_merge_blocks_merged)", - static_cast<monitor_type_t>( - MONITOR_EXISTING | MONITOR_DEFAULT_ON), - MONITOR_DEFAULT_START, MONITOR_MERGE_BLOCKS_MERGED}, - /* ========== Counters for Transaction Module ========== */ {"module_trx", "transaction", "Transaction Manager", MONITOR_MODULE, @@ -1790,21 +1772,6 @@ srv_mon_process_existing_counter( update_min = TRUE; break; - /* innodb_os_merge_blocks_written */ - case MONITOR_MERGE_BLOCKS_WRITTEN: - value = srv_stats.merge_buffers_written; - break; - - /* innodb_os_merge_blocks_read */ - case MONITOR_MERGE_BLOCKS_READ: - value = srv_stats.merge_buffers_read; - break; - - /* innodb_os_merge_blocks_merged */ - case MONITOR_MERGE_BLOCKS_MERGED: - value = srv_stats.merge_buffers_merged; - break; - /* innodb_log_waits */ case MONITOR_OVLD_LOG_WAITS: value = srv_stats.log_waits; diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index d8e8a615c07..c28f889dfcc 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -1,9 +1,9 @@ /***************************************************************************** -Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2014, SkySQL Ab. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -1647,10 +1647,6 @@ srv_export_innodb_status(void) } #endif /* UNIV_DEBUG */ - export_vars.innodb_merge_buffers_written = srv_stats.merge_buffers_written; - export_vars.innodb_merge_buffers_read = srv_stats.merge_buffers_read; - export_vars.innodb_merge_buffers_merged = srv_stats.merge_buffers_merged; - export_vars.innodb_sec_rec_cluster_reads = srv_stats.n_sec_rec_cluster_reads; export_vars.innodb_sec_rec_cluster_reads_avoided = @@ -1860,6 +1856,8 @@ exit_func: /*********************************************************************//** A thread which prints warnings about semaphore waits which have lasted too long. These can be used to track bugs which cause hangs. +Note: In order to make sync_arr_wake_threads_if_sema_free work as expected, +we should avoid waiting any mutexes in this function! @return a dummy parameter */ extern "C" UNIV_INTERN os_thread_ret_t @@ -1899,23 +1897,21 @@ loop: /* Try to track a strange bug reported by Harald Fuchs and others, where the lsn seems to decrease at times */ - /* We have to use nowait to ensure we don't block */ - new_lsn= log_get_lsn_nowait(); - - if (new_lsn && new_lsn < old_lsn) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Error: old log sequence number " LSN_PF - " was greater\n" - "InnoDB: than the new log sequence number " LSN_PF "!\n" - "InnoDB: Please submit a bug report" - " to http://bugs.mysql.com\n", - old_lsn, new_lsn); - ut_ad(0); - } + if (log_peek_lsn(&new_lsn)) { + if (new_lsn < old_lsn) { + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: Error: old log sequence number " LSN_PF + " was greater\n" + "InnoDB: than the new log sequence number " LSN_PF "!\n" + "InnoDB: Please submit a bug report" + " to http://bugs.mysql.com\n", + old_lsn, new_lsn); + ut_ad(0); + } - if (new_lsn) old_lsn = new_lsn; + } if (difftime(time(NULL), srv_last_monitor_time) > 60) { /* We referesh InnoDB Monitor values so that averages are diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index d7b37b5bc1e..4a457ae6f00 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -1915,7 +1915,7 @@ innobase_start_or_create_for_mysql(void) } } else { srv_monitor_file_name = NULL; - srv_monitor_file = os_file_create_tmpfile(); + srv_monitor_file = os_file_create_tmpfile(NULL); if (!srv_monitor_file) { return(DB_ERROR); @@ -1925,7 +1925,7 @@ innobase_start_or_create_for_mysql(void) mutex_create(srv_dict_tmpfile_mutex_key, &srv_dict_tmpfile_mutex, SYNC_DICT_OPERATION); - srv_dict_tmpfile = os_file_create_tmpfile(); + srv_dict_tmpfile = os_file_create_tmpfile(NULL); if (!srv_dict_tmpfile) { return(DB_ERROR); @@ -1934,7 +1934,7 @@ innobase_start_or_create_for_mysql(void) mutex_create(srv_misc_tmpfile_mutex_key, &srv_misc_tmpfile_mutex, SYNC_ANY_LATCH); - srv_misc_tmpfile = os_file_create_tmpfile(); + srv_misc_tmpfile = os_file_create_tmpfile(NULL); if (!srv_misc_tmpfile) { return(DB_ERROR); diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c index 967d4a151be..ef6e8506ac6 100644 --- a/storage/maria/ma_sort.c +++ b/storage/maria/ma_sort.c @@ -90,6 +90,27 @@ static inline int my_var_write(MARIA_SORT_PARAM *info, IO_CACHE *to_file, uchar *bufs); /* + Sets the appropriate read and write methods for the MARIA_SORT_PARAM + based on the variable length key flag. +*/ +static void set_sort_param_read_write(MARIA_SORT_PARAM *sort_param) +{ + if (sort_param->keyinfo->flag & HA_VAR_LENGTH_KEY) + { + sort_param->write_keys= write_keys_varlen; + sort_param->read_to_buffer= read_to_buffer_varlen; + sort_param->write_key= write_merge_key_varlen; + } + else + { + sort_param->write_keys= write_keys; + sort_param->read_to_buffer= read_to_buffer; + sort_param->write_key= write_merge_key; + } +} + + +/* Creates a index of sorted keys SYNOPSIS @@ -118,18 +139,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, (ulong) sortbuff_size, info->key_length, (ulong) info->sort_info->max_records)); - if (info->keyinfo->flag & HA_VAR_LENGTH_KEY) - { - info->write_keys= write_keys_varlen; - info->read_to_buffer= read_to_buffer_varlen; - info->write_key=write_merge_key_varlen; - } - else - { - info->write_keys= write_keys; - info->read_to_buffer=read_to_buffer; - info->write_key=write_merge_key; - } + set_sort_param_read_write(info); my_b_clear(&tempfile); my_b_clear(&tempfile_for_exceptions); @@ -378,18 +388,7 @@ pthread_handler_t _ma_thr_find_all_keys(void *arg) if (sort_param->sort_info->got_error) goto err; - if (sort_param->keyinfo->flag & HA_VAR_LENGTH_KEY) - { - sort_param->write_keys= write_keys_varlen; - sort_param->read_to_buffer= read_to_buffer_varlen; - sort_param->write_key= write_merge_key_varlen; - } - else - { - sort_param->write_keys= write_keys; - sort_param->read_to_buffer= read_to_buffer; - sort_param->write_key= write_merge_key; - } + set_sort_param_read_write(sort_param); my_b_clear(&sort_param->tempfile); my_b_clear(&sort_param->tempfile_for_exceptions); @@ -614,18 +613,9 @@ int _ma_thr_write_keys(MARIA_SORT_PARAM *sort_param) { if (got_error) continue; - if (sinfo->keyinfo->flag & HA_VAR_LENGTH_KEY) - { - sinfo->write_keys=write_keys_varlen; - sinfo->read_to_buffer=read_to_buffer_varlen; - sinfo->write_key=write_merge_key_varlen; - } - else - { - sinfo->write_keys=write_keys; - sinfo->read_to_buffer=read_to_buffer; - sinfo->write_key=write_merge_key; - } + + set_sort_param_read_write(sinfo); + if (sinfo->buffpek.elements) { uint maxbuffer=sinfo->buffpek.elements-1; diff --git a/storage/mroonga/vendor/groonga/lib/com.c b/storage/mroonga/vendor/groonga/lib/com.c index a7450ec31f0..a16a446022c 100644 --- a/storage/mroonga/vendor/groonga/lib/com.c +++ b/storage/mroonga/vendor/groonga/lib/com.c @@ -348,7 +348,7 @@ grn_com_event_add(grn_ctx *ctx, grn_com_event *ev, grn_sock fd, int events, grn_ struct epoll_event e; memset(&e, 0, sizeof(struct epoll_event)); e.data.fd = (fd); - e.events = (__uint32_t) events; + e.events = (uint32_t) events; if (epoll_ctl(ev->epfd, EPOLL_CTL_ADD, (fd), &e) == -1) { SERR("epoll_ctl"); return ctx->rc; @@ -396,7 +396,7 @@ grn_com_event_mod(grn_ctx *ctx, grn_com_event *ev, grn_sock fd, int events, grn_ struct epoll_event e; memset(&e, 0, sizeof(struct epoll_event)); e.data.fd = (fd); - e.events = (__uint32_t) events; + e.events = (uint32_t) events; if (epoll_ctl(ev->epfd, EPOLL_CTL_MOD, (fd), &e) == -1) { SERR("epoll_ctl"); return ctx->rc; diff --git a/storage/mroonga/vendor/groonga/lib/grn_com.h b/storage/mroonga/vendor/groonga/lib/grn_com.h index 203ed56c88d..e5ad58981cf 100644 --- a/storage/mroonga/vendor/groonga/lib/grn_com.h +++ b/storage/mroonga/vendor/groonga/lib/grn_com.h @@ -83,7 +83,11 @@ GRN_API grn_com_queue_entry *grn_com_queue_deque(grn_ctx *ctx, grn_com_queue *q) # define GRN_COM_POLLIN EVFILT_READ # define GRN_COM_POLLOUT EVFILT_WRITE # else /* USE_KQUEUE */ -# include <sys/poll.h> +# if defined(HAVE_POLL_H) +# include <poll.h> +# elif defined(HAVE_SYS_POLL_H) +# include <sys/poll.h> +# endif /* defined(HAVE_POLL_H) */ # define GRN_COM_POLLIN POLLIN # define GRN_COM_POLLOUT POLLOUT # endif /* USE_KQUEUE */ diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c index 604910e5099..f490e5f0b44 100644 --- a/storage/myisam/sort.c +++ b/storage/myisam/sort.c @@ -86,6 +86,28 @@ static int write_merge_key_varlen(MI_SORT_PARAM *info, static inline int my_var_write(MI_SORT_PARAM *info, IO_CACHE *to_file, uchar *bufs); + +/* + Sets the appropriate read and write methods for the MI_SORT_PARAM + based on the variable length key flag. +*/ +static void set_sort_param_read_write(MI_SORT_PARAM *sort_param) +{ + if (sort_param->keyinfo->flag & HA_VAR_LENGTH_KEY) + { + sort_param->write_keys= write_keys_varlen; + sort_param->read_to_buffer= read_to_buffer_varlen; + sort_param->write_key= write_merge_key_varlen; + } + else + { + sort_param->write_keys= write_keys; + sort_param->read_to_buffer= read_to_buffer; + sort_param->write_key= write_merge_key; + } +} + + /* Creates a index of sorted keys @@ -113,18 +135,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, DBUG_ENTER("_create_index_by_sort"); DBUG_PRINT("enter",("sort_length: %u", info->key_length)); - if (info->keyinfo->flag & HA_VAR_LENGTH_KEY) - { - info->write_keys=write_keys_varlen; - info->read_to_buffer=read_to_buffer_varlen; - info->write_key= write_merge_key_varlen; - } - else - { - info->write_keys=write_keys; - info->read_to_buffer=read_to_buffer; - info->write_key=write_merge_key; - } + set_sort_param_read_write(info); my_b_clear(&tempfile); my_b_clear(&tempfile_for_exceptions); @@ -333,7 +344,6 @@ static ha_rows find_all_keys(MI_SORT_PARAM *info, ha_rows keys, DBUG_RETURN((*maxbuffer)*(keys-1)+idx); } /* find_all_keys */ - /* Search after all keys and place them in a temp. file */ pthread_handler_t thr_find_all_keys(void *arg) @@ -357,18 +367,7 @@ pthread_handler_t thr_find_all_keys(void *arg) if (sort_param->sort_info->got_error) goto err; - if (sort_param->keyinfo->flag & HA_VAR_LENGTH_KEY) - { - sort_param->write_keys= write_keys_varlen; - sort_param->read_to_buffer= read_to_buffer_varlen; - sort_param->write_key= write_merge_key_varlen; - } - else - { - sort_param->write_keys= write_keys; - sort_param->read_to_buffer= read_to_buffer; - sort_param->write_key= write_merge_key; - } + set_sort_param_read_write(sort_param); my_b_clear(&sort_param->tempfile); my_b_clear(&sort_param->tempfile_for_exceptions); @@ -593,18 +592,9 @@ int thr_write_keys(MI_SORT_PARAM *sort_param) { if (got_error) continue; - if (sinfo->keyinfo->flag & HA_VAR_LENGTH_KEY) - { - sinfo->write_keys=write_keys_varlen; - sinfo->read_to_buffer=read_to_buffer_varlen; - sinfo->write_key=write_merge_key_varlen; - } - else - { - sinfo->write_keys=write_keys; - sinfo->read_to_buffer=read_to_buffer; - sinfo->write_key=write_merge_key; - } + + set_sort_param_read_write(sinfo); + if (sinfo->buffpek.elements) { uint maxbuffer=sinfo->buffpek.elements-1; diff --git a/storage/oqgraph/ha_oqgraph.cc b/storage/oqgraph/ha_oqgraph.cc index e220d64d962..6f142a213b7 100644 --- a/storage/oqgraph/ha_oqgraph.cc +++ b/storage/oqgraph/ha_oqgraph.cc @@ -1,5 +1,6 @@ /* Copyright (C) 2007-2015 Arjen G Lentz & Antony T Curtis for Open Query Copyright (C) 2013-2015 Andrew McDonnell + Copyright (C) 2014 Sergei Golubchik Portions of this file copyright (C) 2000-2006 MySQL AB This program is free software; you can redistribute it and/or modify diff --git a/storage/oqgraph/mysql-test/oqgraph/general.inc b/storage/oqgraph/mysql-test/oqgraph/general.inc index 357a8c786ee..f27b7585dd7 100644 --- a/storage/oqgraph/mysql-test/oqgraph/general.inc +++ b/storage/oqgraph/mysql-test/oqgraph/general.inc @@ -14,7 +14,7 @@ eval CREATE TABLE graph_base ( INDEX (to_id) ) ENGINE= $oqgraph_use_table_type ; - +# Since late June 2014 OQGraph supports 'assisted discovery' as per https://mariadb.atlassian.net/browse/MDEV-5871 CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id', DESTID='to_id'; # Regression for MDEV-5891 diff --git a/storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.result b/storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.result new file mode 100644 index 00000000000..d2dfc46d5ff --- /dev/null +++ b/storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.result @@ -0,0 +1,86 @@ +DROP TABLE IF EXISTS graph_base; +DROP TABLE IF EXISTS graph; +CREATE TABLE graph_base ( +from_id INT UNSIGNED NOT NULL, +to_id INT UNSIGNED NOT NULL, +weight DOUBLE NOT NULL, +PRIMARY KEY (from_id,to_id), +INDEX (to_id) +) ENGINE=MyISAM; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id'; +DESCRIBE graph; +Field Type Null Key Default Extra +latch varchar(32) YES MUL NULL +origid bigint(20) unsigned YES NULL +destid bigint(20) unsigned YES NULL +weight double YES NULL +seq bigint(20) unsigned YES NULL +linkid bigint(20) unsigned YES NULL +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id' WEIGHT='weight'; +DESCRIBE graph; +Field Type Null Key Default Extra +latch varchar(32) YES MUL NULL +origid bigint(20) unsigned YES NULL +destid bigint(20) unsigned YES NULL +weight double YES NULL +seq bigint(20) unsigned YES NULL +linkid bigint(20) unsigned YES NULL +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base_xxx' ORIGID='from_id' DESTID='to_id_xxx' WEIGHT='weight'; +# Expect 'Table 'test.graph_base_xxx' doesn't exist' +DESCRIBE graph; +ERROR 42S02: Table 'test.graph_base_xxx' doesn't exist +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id' WEIGHT='weight_xxx'; +# Expect 'Invalid OQGRAPH backing store description ('graph.weight' attribute not set to a valid column of 'graph_base')' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store ('graph.weight' attribute not set to a valid column of 'graph_base')' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id_xxx' WEIGHT='weight'; +# Expect 'Invalid OQGRAPH backing store description ('graph.destid' attribute not set to a valid column of 'graph_base')' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store ('graph.destid' attribute not set to a valid column of 'graph_base')' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id_xxx' DESTID='to_id' WEIGHT='weight'; +# Expect 'Invalid OQGRAPH backing store description ('graph.origid' attribute not set to a valid column of 'graph_base')' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store ('graph.origid' attribute not set to a valid column of 'graph_base')' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base'; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty origid attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty origid attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id'; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty destid attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty destid attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' DESTID='to_id'; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty origid attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty origid attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH ORIGID='from_id'; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH DESTID='to_id'; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +CREATE TABLE graph ENGINE=OQGRAPH ORIGID='from_id', DESTID='to_id'; +# Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +DESCRIBE graph; +ERROR HY000: Got error -1 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' from OQGRAPH +DROP TABLE IF EXISTS graph; +DROP TABLE IF EXISTS graph; +DROP TABLE IF EXISTS graph_base; diff --git a/storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.test b/storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.test new file mode 100644 index 00000000000..15d1eff0142 --- /dev/null +++ b/storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.test @@ -0,0 +1,121 @@ +--disable_warnings +DROP TABLE IF EXISTS graph_base; +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph_base ( + from_id INT UNSIGNED NOT NULL, + to_id INT UNSIGNED NOT NULL, + weight DOUBLE NOT NULL, + PRIMARY KEY (from_id,to_id), + INDEX (to_id) + ) ENGINE=MyISAM; + +# Since late June 2014 OQGraph supports 'assisted discovery' as per https://mariadb.atlassian.net/browse/MDEV-5871 + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id'; +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id' WEIGHT='weight'; +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base_xxx' ORIGID='from_id' DESTID='to_id_xxx' WEIGHT='weight'; +--echo # Expect 'Table 'test.graph_base_xxx' doesn't exist' +--error 1146 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id' WEIGHT='weight_xxx'; +--echo # Expect 'Invalid OQGRAPH backing store description ('graph.weight' attribute not set to a valid column of 'graph_base')' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id' DESTID='to_id_xxx' WEIGHT='weight'; +--echo # Expect 'Invalid OQGRAPH backing store description ('graph.destid' attribute not set to a valid column of 'graph_base')' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id_xxx' DESTID='to_id' WEIGHT='weight'; +--echo # Expect 'Invalid OQGRAPH backing store description ('graph.origid' attribute not set to a valid column of 'graph_base')' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +# The following combinations should be invalid +CREATE TABLE graph ENGINE=OQGRAPH; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base'; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty origid attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id'; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty destid attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DATA_TABLE='graph_base' DESTID='to_id'; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty origid attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH ORIGID='from_id'; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH DESTID='to_id'; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +CREATE TABLE graph ENGINE=OQGRAPH ORIGID='from_id', DESTID='to_id'; +--echo # Expect: 'Invalid OQGRAPH backing store description (unspecified or empty data_table attribute)' +--error 1296 +DESCRIBE graph; +--disable_warnings +DROP TABLE IF EXISTS graph; +--enable_warnings + +--disable_warnings +DROP TABLE IF EXISTS graph; +DROP TABLE IF EXISTS graph_base; +--enable_warnings + diff --git a/storage/perfschema/ha_perfschema.cc b/storage/perfschema/ha_perfschema.cc index dcdd9b90c56..2a87ffba999 100644 --- a/storage/perfschema/ha_perfschema.cc +++ b/storage/perfschema/ha_perfschema.cc @@ -225,7 +225,7 @@ maria_declare_plugin(perfschema) 0x0001, pfs_status_vars, NULL, - "5.6.27", + "5.6.29", MariaDB_PLUGIN_MATURITY_STABLE } maria_declare_plugin_end; diff --git a/storage/perfschema/table_session_connect.cc b/storage/perfschema/table_session_connect.cc index bbe99ffa794..17c608a7f4c 100644 --- a/storage/perfschema/table_session_connect.cc +++ b/storage/perfschema/table_session_connect.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -220,7 +220,8 @@ void table_session_connect::make_row(PFS_thread *pfs, uint ordinal) &m_row.m_attr_value_length)) { /* we don't expect internal threads to have connection attributes */ - DBUG_ASSERT(pfs->m_processlist_id != 0); + if (pfs->m_processlist_id == 0) + return; m_row.m_ordinal_position= ordinal; m_row.m_process_id= pfs->m_processlist_id; diff --git a/storage/sequence/mysql-test/sequence/group_by.result b/storage/sequence/mysql-test/sequence/group_by.result index 86bb158d9fc..b3b56338aef 100644 --- a/storage/sequence/mysql-test/sequence/group_by.result +++ b/storage/sequence/mysql-test/sequence/group_by.result @@ -85,4 +85,10 @@ id select_type table type possible_keys key key_len ref rows Extra explain select count(*) from seq_1_to_15_step_2 group by mod(seq,2); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE seq_1_to_15_step_2 index NULL PRIMARY 8 NULL 8 Using index; Using temporary; Using filesort -drop table seq_1_to_15_step_2; +create temporary table t1 select * from seq_1_to_3; +select count(NULL) from t1; +count(NULL) +0 +select count(NULL) from seq_1_to_3; +count(NULL) +0 diff --git a/storage/sequence/mysql-test/sequence/group_by.test b/storage/sequence/mysql-test/sequence/group_by.test index 870afd9ed89..b2e04037a8b 100644 --- a/storage/sequence/mysql-test/sequence/group_by.test +++ b/storage/sequence/mysql-test/sequence/group_by.test @@ -39,4 +39,9 @@ explain select count(*) from seq_1_to_15_step_2, seq_1_to_15_step_2 as t2; explain select count(*) from seq_1_to_15_step_2 where seq > 0; explain select count(*) from seq_1_to_15_step_2 group by mod(seq,2); -drop table seq_1_to_15_step_2; +# +# MDEV-9550 COUNT(NULL) returns incorrect result with sequence storage engine +# +create temporary table t1 select * from seq_1_to_3; +select count(NULL) from t1; +select count(NULL) from seq_1_to_3; diff --git a/storage/sequence/sequence.cc b/storage/sequence/sequence.cc index 7b20615b15f..8d9465f08c5 100644 --- a/storage/sequence/sequence.cc +++ b/storage/sequence/sequence.cc @@ -452,7 +452,11 @@ int ha_seq_group_by_handler::next_row() switch (item_sum->sum_func()) { case Item_sum::COUNT_FUNC: { - field->store((longlong) elements, 1); + Item *arg0= ((Item_sum*) item_sum)->get_arg(0); + if (arg0->basic_const_item() && arg0->is_null()) + field->store(0LL, 1); + else + field->store((longlong) elements, 1); break; } case Item_sum::SUM_FUNC: diff --git a/storage/sphinx/ha_sphinx.cc b/storage/sphinx/ha_sphinx.cc index 568d3695781..541ccf62260 100644 --- a/storage/sphinx/ha_sphinx.cc +++ b/storage/sphinx/ha_sphinx.cc @@ -634,8 +634,10 @@ protected: void SendFloat ( float v ) { SendDword ( sphF2DW(v) ); } }; +#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION template int CSphSEQuery::ParseArray<uint32> ( uint32 **, const char * ); template int CSphSEQuery::ParseArray<longlong> ( longlong **, const char * ); +#endif ////////////////////////////////////////////////////////////////////////////// @@ -1411,6 +1413,14 @@ static bool myismagic ( char c ) return c=='@'; } +static bool myisjson ( char c ) +{ + return + c=='.' || + c=='[' || + c==']'; +} + bool CSphSEQuery::ParseField ( char * sField ) { @@ -1622,7 +1632,7 @@ bool CSphSEQuery::ParseField ( char * sField ) break; tFilter.m_sAttrName = sValue; - while ( (*sValue) && ( myisattr(*sValue) || myismagic(*sValue) ) ) + while ( (*sValue) && ( myisattr(*sValue) || myismagic(*sValue) || myisjson(*sValue) ) ) sValue++; if ( !*sValue ) break; diff --git a/storage/sphinx/mysql-test/sphinx/sphinx.result b/storage/sphinx/mysql-test/sphinx/sphinx.result index 5fe11f4671b..3536ba42af8 100644 --- a/storage/sphinx/mysql-test/sphinx/sphinx.result +++ b/storage/sphinx/mysql-test/sphinx/sphinx.result @@ -4,17 +4,20 @@ id w q 1 2 test 2 2 test 4 1 test +5 1 test drop table ts; create table ts ( id bigint unsigned not null, w int not null, q varchar(255) not null, index(q) ) engine=sphinx connection="sphinx://127.0.0.1:SPHINXSEARCH_PORT/*"; select * from ts where q='test;filter=gid,1;mode=extended'; id w q -1 2421 test;filter=gid,1;mode=extended -2 2421 test;filter=gid,1;mode=extended +1 2379 test;filter=gid,1;mode=extended +2 2379 test;filter=gid,1;mode=extended +5 1412 test;filter=gid,1;mode=extended select * from ts where q='test|one;mode=extended'; id w q -1 3595 test|one;mode=extended -2 2460 test|one;mode=extended -4 1471 test|one;mode=extended +1 3579 test|one;mode=extended +2 2439 test|one;mode=extended +4 1456 test|one;mode=extended +5 1456 test|one;mode=extended select * from ts where q='test;offset=1;limit=1'; id w q 2 2 test;offset=1;limit=1 @@ -32,10 +35,11 @@ id w q gid _sph_count 2 1 1 0 3 1 2 0 4 1 2 0 +5 1 1 0 select * from ts where q=';groupby=attr:gid'; id w q gid _sph_count 3 1 ;groupby=attr:gid 2 2 -1 1 ;groupby=attr:gid 1 2 +1 1 ;groupby=attr:gid 1 3 explain select * from ts where q=';groupby=attr:gid'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE ts ref q q 257 const 3 Using where with pushed condition @@ -54,3 +58,20 @@ show status like "sphinx_word%"; Variable_name Value Sphinx_word_count 0 Sphinx_words +create table ts ( id bigint unsigned not null, w int not null, q varchar(255) not null, index(q) ) engine=sphinx connection="sphinx://127.0.0.1:SPHINXSEARCH_PORT/*"; +select * from ts where q=';filter=meta.foo_count,100'; +id w q +1 1 ;filter=meta.foo_count,100 +select * from ts where q='test;filter=meta.sub.int,7'; +id w q +5 1 test;filter=meta.sub.int,7 +select * from ts where q=';filter=meta.sub.list[0],4'; +id w q +select * from ts where q=';filter=meta.sub.list[1],4'; +id w q +5 1 ;filter=meta.sub.list[1],4 +select * from ts where q='test;range=meta.foo_count,100,500'; +id w q +1 2 test;range=meta.foo_count,100,500 +5 1 test;range=meta.foo_count,100,500 +drop table ts; diff --git a/storage/sphinx/mysql-test/sphinx/sphinx.test b/storage/sphinx/mysql-test/sphinx/sphinx.test index 126131209c5..fe388f7ddd2 100644 --- a/storage/sphinx/mysql-test/sphinx/sphinx.test +++ b/storage/sphinx/mysql-test/sphinx/sphinx.test @@ -32,3 +32,12 @@ drop table ts; show status like "sphinx_total%"; show status like "sphinx_word%"; + +--replace_result $SPHINXSEARCH_PORT SPHINXSEARCH_PORT +eval create table ts ( id bigint unsigned not null, w int not null, q varchar(255) not null, index(q) ) engine=sphinx connection="sphinx://127.0.0.1:$SPHINXSEARCH_PORT/*"; +select * from ts where q=';filter=meta.foo_count,100'; +select * from ts where q='test;filter=meta.sub.int,7'; +select * from ts where q=';filter=meta.sub.list[0],4'; +select * from ts where q=';filter=meta.sub.list[1],4'; +select * from ts where q='test;range=meta.foo_count,100,500'; +drop table ts; diff --git a/storage/sphinx/mysql-test/sphinx/testdata.xml b/storage/sphinx/mysql-test/sphinx/testdata.xml index e0d7394190f..7ef05bce808 100644 --- a/storage/sphinx/mysql-test/sphinx/testdata.xml +++ b/storage/sphinx/mysql-test/sphinx/testdata.xml @@ -5,12 +5,14 @@ <sphinx:field name="title"/> <sphinx:field name="content"/> <sphinx:attr name="gid" type="int"/> +<sphinx:attr name="meta" type="json"/> </sphinx:schema> <sphinx:document id="1"> <title>test one</title> <content>this is my test document number one. also checking search within phrases.</content> <gid>1</gid> +<meta>{ "foo_count": 100 }</meta> </sphinx:document> <sphinx:document id="2"> @@ -31,5 +33,12 @@ <gid>2</gid> </sphinx:document> +<sphinx:document id="5"> +<title>doc number five</title> +<content>this is to test json filtering</content> +<gid>1</gid> +<meta>{ "foo_count": 200, "sub": { "list": [ 3, 4 ], "int": 7 } }</meta> +</sphinx:document> + </sphinx:docset> diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index 2b605d14677..19a311731e5 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,18 +1,15 @@ SET(TOKUDB_VERSION 5.6.26-74.0) # PerconaFT only supports x86-64 and cmake-2.8.9+ -IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND - NOT CMAKE_VERSION VERSION_LESS "2.8.9") +IF(CMAKE_VERSION VERSION_LESS "2.8.9") + MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB") +ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") CHECK_CXX_SOURCE_COMPILES( " struct a {int b; int c; }; struct a d = { .b=1, .c=2 }; int main() { return 0; } " TOKUDB_OK) -ELSE() - IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND - CMAKE_VERSION VERSION_LESS "2.8.9") - MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB") - ENDIF() ENDIF() IF(NOT TOKUDB_OK) diff --git a/storage/tokudb/PerconaFT/cmake_modules/TokuFeatureDetection.cmake b/storage/tokudb/PerconaFT/cmake_modules/TokuFeatureDetection.cmake index 4c5004cd6a5..e3c900fbadb 100644 --- a/storage/tokudb/PerconaFT/cmake_modules/TokuFeatureDetection.cmake +++ b/storage/tokudb/PerconaFT/cmake_modules/TokuFeatureDetection.cmake @@ -93,7 +93,7 @@ if (NOT HAVE_BACKTRACE_WITHOUT_EXECINFO) if (HAVE_BACKTRACE_WITH_EXECINFO) list(APPEND EXTRA_SYSTEM_LIBS execinfo) else () - message(FATAL_ERROR "Cannot find backtrace(), even with -lexecinfo.") + message(WARNING "Cannot find backtrace(), even with -lexecinfo.") endif () endif () diff --git a/storage/xtradb/btr/btr0btr.cc b/storage/xtradb/btr/btr0btr.cc index c8018e6582b..caa35d31109 100644 --- a/storage/xtradb/btr/btr0btr.cc +++ b/storage/xtradb/btr/btr0btr.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1994, 2013, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. Copyright (c) 2014, 2015, MariaDB Corporation @@ -796,6 +796,10 @@ btr_root_get( buf_block_t* root = btr_root_block_get(index, RW_X_LATCH, mtr); + if (root && root->page.encrypted == true) { + root = NULL; + } + return(root ? buf_block_get_frame(root) : NULL); } @@ -2281,7 +2285,7 @@ the tuple. It is assumed that mtr contains an x-latch on the tree. NOTE that the operation of this function must always succeed, we cannot reverse it: therefore enough free disk space must be guaranteed to be available before this function is called. -@return inserted record */ +@return inserted record or NULL if run out of space */ UNIV_INTERN rec_t* btr_root_raise_and_insert( @@ -2342,6 +2346,11 @@ btr_root_raise_and_insert( level = btr_page_get_level(root, mtr); new_block = btr_page_alloc(index, 0, FSP_NO_DIR, level, mtr, mtr); + + if (new_block == NULL && os_has_said_disk_full) { + return(NULL); + } + new_page = buf_block_get_frame(new_block); new_page_zip = buf_block_get_page_zip(new_block); ut_a(!new_page_zip == !root_page_zip); @@ -3126,7 +3135,7 @@ this function is called. NOTE: jonaso added support for calling function with tuple == NULL which cause it to only split a page. -@return inserted record */ +@return inserted record or NULL if run out of space */ UNIV_INTERN rec_t* btr_page_split_and_insert( @@ -3240,9 +3249,18 @@ func_start: } } + DBUG_EXECUTE_IF("disk_is_full", + os_has_said_disk_full = true; + return(NULL);); + /* 2. Allocate a new page to the index */ new_block = btr_page_alloc(cursor->index, hint_page_no, direction, btr_page_get_level(page, mtr), mtr, mtr); + + if (new_block == NULL && os_has_said_disk_full) { + return(NULL); + } + new_page = buf_block_get_frame(new_block); new_page_zip = buf_block_get_page_zip(new_block); btr_page_create(new_block, new_page_zip, cursor->index, diff --git a/storage/xtradb/btr/btr0cur.cc b/storage/xtradb/btr/btr0cur.cc index c949bcae476..5bb94dfce2a 100644 --- a/storage/xtradb/btr/btr0cur.cc +++ b/storage/xtradb/btr/btr0cur.cc @@ -1785,6 +1785,10 @@ btr_cur_pessimistic_insert( flags, cursor, offsets, heap, entry, n_ext, mtr); } + if (*rec == NULL && os_has_said_disk_full) { + return(DB_OUT_OF_FILE_SPACE); + } + ut_ad(page_rec_get_next(btr_cur_get_rec(cursor)) == *rec); if (!(flags & BTR_NO_LOCKING_FLAG)) { diff --git a/storage/xtradb/buf/buf0buf.cc b/storage/xtradb/buf/buf0buf.cc index 72d078b3139..556096ca7e4 100644 --- a/storage/xtradb/buf/buf0buf.cc +++ b/storage/xtradb/buf/buf0buf.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2016, MariaDB Corporation. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -4790,10 +4790,10 @@ corrupt: ib_push_warning(innobase_get_trx(), DB_DECRYPTION_FAILED, "Table in tablespace %lu encrypted." - "However key management plugin or used key_id %lu is not found or" + "However key management plugin or used key_id %u is not found or" " used encryption algorithm or method does not match." " Can't continue opening the table.", - bpage->key_version); + (ulint)bpage->space, bpage->key_version); if (bpage->space > TRX_SYS_SPACE) { if (corrupted) { @@ -4827,17 +4827,26 @@ corrupt: block = NULL; update_ibuf_bitmap = FALSE; - } else { block = (buf_block_t *) bpage; update_ibuf_bitmap = TRUE; } - ibuf_merge_or_delete_for_page( - block, bpage->space, - bpage->offset, buf_page_get_zip_size(bpage), - update_ibuf_bitmap); + if (bpage && bpage->encrypted) { + fprintf(stderr, + "InnoDB: Warning: Table in tablespace %lu encrypted." + "However key management plugin or used key_id %u is not found or" + " used encryption algorithm or method does not match." + " Can't continue opening the table.\n", + (ulint)bpage->space, bpage->key_version); + } else { + ibuf_merge_or_delete_for_page( + block, bpage->space, + bpage->offset, buf_page_get_zip_size(bpage), + update_ibuf_bitmap); + } + } } else { /* io_type == BUF_IO_WRITE */ @@ -6333,6 +6342,7 @@ buf_page_decrypt_after_read( bool page_compressed = fil_page_is_compressed(dst_frame); bool page_compressed_encrypted = fil_page_is_compressed_encrypted(dst_frame); buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); + bool success = true; /* If page is encrypted read post-encryption checksum */ if (!page_compressed_encrypted && key_version != 0) { @@ -6391,16 +6401,21 @@ buf_page_decrypt_after_read( } /* decrypt using crypt_buf to dst_frame */ - fil_space_decrypt(bpage->space, - slot->crypt_buf, - size, - dst_frame); + byte* res = fil_space_decrypt(bpage->space, + slot->crypt_buf, + size, + dst_frame); + + if (!res) { + bpage->encrypted = true; + success = false; + } #ifdef UNIV_DEBUG fil_page_type_validate(dst_frame); #endif } - if (page_compressed_encrypted) { + if (page_compressed_encrypted && success) { if (!slot) { slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); } @@ -6413,11 +6428,11 @@ buf_page_decrypt_after_read( dst_frame, size, &bpage->write_size); - } #ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); + fil_page_type_validate(dst_frame); #endif + } /* Mark this slot as free */ if (slot) { @@ -6427,5 +6442,5 @@ buf_page_decrypt_after_read( bpage->key_version = key_version; - return (TRUE); + return (success); } diff --git a/storage/xtradb/buf/buf0flu.cc b/storage/xtradb/buf/buf0flu.cc index 037d94dd514..5d64b75784a 100644 --- a/storage/xtradb/buf/buf0flu.cc +++ b/storage/xtradb/buf/buf0flu.cc @@ -2251,7 +2251,7 @@ Clears up tail of the LRU lists: * Flush dirty pages at the tail of LRU to the disk The depth to which we scan each buffer pool is controlled by dynamic config parameter innodb_LRU_scan_depth. -@return total pages flushed */ +@return number of pages flushed */ UNIV_INTERN ulint buf_flush_LRU_tail(void) @@ -2671,19 +2671,24 @@ static void page_cleaner_adapt_lru_sleep_time( /*==============================*/ - ulint* lru_sleep_time) /*!< in/out: desired page cleaner thread sleep + ulint* lru_sleep_time, /*!< in/out: desired page cleaner thread sleep time for LRU flushes */ + ulint lru_n_flushed) /*!< in: number of flushed in previous batch */ + { ulint free_len = buf_get_total_free_list_length(); ulint max_free_len = srv_LRU_scan_depth * srv_buf_pool_instances; - if (free_len < max_free_len / 100) { + if (free_len < max_free_len / 100 && lru_n_flushed) { - /* Free lists filled less than 1%, no sleep */ + /* Free lists filled less than 1% + and iteration was able to flush, no sleep */ *lru_sleep_time = 0; - } else if (free_len > max_free_len / 5) { + } else if (free_len > max_free_len / 5 + || (free_len < max_free_len / 100 && lru_n_flushed == 0)) { - /* Free lists filled more than 20%, sleep a bit more */ + /* Free lists filled more than 20% + or no pages flushed in previous batch, sleep a bit more */ *lru_sleep_time += 50; if (*lru_sleep_time > srv_cleaner_max_lru_time) *lru_sleep_time = srv_cleaner_max_lru_time; @@ -2885,6 +2890,7 @@ DECLARE_THREAD(buf_flush_lru_manager_thread)( { ulint next_loop_time = ut_time_ms() + 1000; ulint lru_sleep_time = srv_cleaner_max_lru_time; + ulint lru_n_flushed = 1; #ifdef UNIV_PFS_THREAD pfs_register_thread(buf_lru_manager_thread_key); @@ -2911,11 +2917,11 @@ DECLARE_THREAD(buf_flush_lru_manager_thread)( page_cleaner_sleep_if_needed(next_loop_time); - page_cleaner_adapt_lru_sleep_time(&lru_sleep_time); + page_cleaner_adapt_lru_sleep_time(&lru_sleep_time, lru_n_flushed); next_loop_time = ut_time_ms() + lru_sleep_time; - buf_flush_LRU_tail(); + lru_n_flushed = buf_flush_LRU_tail(); } buf_lru_manager_is_active = false; diff --git a/storage/xtradb/dict/dict0boot.cc b/storage/xtradb/dict/dict0boot.cc index 94a3af2852b..0a21264e23d 100644 --- a/storage/xtradb/dict/dict0boot.cc +++ b/storage/xtradb/dict/dict0boot.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -456,27 +457,29 @@ dict_boot(void) /* Initialize the insert buffer table and index for each tablespace */ - ibuf_init_at_db_start(); - dberr_t err = DB_SUCCESS; - if (srv_read_only_mode && !ibuf_is_empty()) { + err = ibuf_init_at_db_start(); - ib_logf(IB_LOG_LEVEL_ERROR, - "Change buffer must be empty when --innodb-read-only " - "is set!"); + if (err == DB_SUCCESS) { + if (srv_read_only_mode && !ibuf_is_empty()) { - err = DB_ERROR; - } else { - /* Load definitions of other indexes on system tables */ + ib_logf(IB_LOG_LEVEL_ERROR, + "Change buffer must be empty when --innodb-read-only " + "is set!"); - dict_load_sys_table(dict_sys->sys_tables); - dict_load_sys_table(dict_sys->sys_columns); - dict_load_sys_table(dict_sys->sys_indexes); - dict_load_sys_table(dict_sys->sys_fields); - } + err = DB_ERROR; + } else { + /* Load definitions of other indexes on system tables */ - mutex_exit(&(dict_sys->mutex)); + dict_load_sys_table(dict_sys->sys_tables); + dict_load_sys_table(dict_sys->sys_columns); + dict_load_sys_table(dict_sys->sys_indexes); + dict_load_sys_table(dict_sys->sys_fields); + } + + mutex_exit(&(dict_sys->mutex)); + } return(err); } diff --git a/storage/xtradb/dict/dict0dict.cc b/storage/xtradb/dict/dict0dict.cc index f6621473077..206038d36c9 100644 --- a/storage/xtradb/dict/dict0dict.cc +++ b/storage/xtradb/dict/dict0dict.cc @@ -1659,10 +1659,13 @@ dict_table_rename_in_cache( to preserve the original table name in constraints which reference it */ { + dberr_t err; dict_foreign_t* foreign; dict_index_t* index; ulint fold; char old_name[MAX_FULL_NAME_LEN + 1]; + os_file_type_t ftype; + ibool exists; ut_ad(mutex_own(&(dict_sys->mutex))); @@ -1700,8 +1703,6 @@ dict_table_rename_in_cache( .ibd file and rebuild the .isl file if needed. */ if (dict_table_is_discarded(table)) { - os_file_type_t type; - ibool exists; char* filepath; ut_ad(table->space != TRX_SYS_SPACE); @@ -1720,7 +1721,7 @@ dict_table_rename_in_cache( fil_delete_tablespace(table->space, BUF_REMOVE_ALL_NO_WRITE); /* Delete any temp file hanging around. */ - if (os_file_status(filepath, &exists, &type) + if (os_file_status(filepath, &exists, &ftype) && exists && !os_file_delete_if_exists(innodb_file_temp_key, filepath)) { @@ -1732,8 +1733,6 @@ dict_table_rename_in_cache( mem_free(filepath); } else if (table->space != TRX_SYS_SPACE) { - char* new_path = NULL; - if (DICT_TF2_FLAG_IS_SET(table, DICT_TF2_TEMPORARY)) { ut_print_timestamp(stderr); fputs(" InnoDB: Error: trying to rename a" @@ -1747,34 +1746,43 @@ dict_table_rename_in_cache( } return(DB_ERROR); + } - } else if (DICT_TF_HAS_DATA_DIR(table->flags)) { - char* old_path; - - old_path = fil_space_get_first_path(table->space); + char* new_path = NULL; + char* old_path = fil_space_get_first_path(table->space); + if (DICT_TF_HAS_DATA_DIR(table->flags)) { new_path = os_file_make_new_pathname( old_path, new_name); - mem_free(old_path); - - dberr_t err = fil_create_link_file( - new_name, new_path); - + err = fil_create_link_file(new_name, new_path); if (err != DB_SUCCESS) { mem_free(new_path); + mem_free(old_path); return(DB_TABLESPACE_EXISTS); } + } else { + new_path = fil_make_ibd_name(new_name, false); + } + + /* New filepath must not exist. */ + err = fil_rename_tablespace_check( + table->space, old_path, new_path, false); + if (err != DB_SUCCESS) { + mem_free(old_path); + mem_free(new_path); + return(err); } ibool success = fil_rename_tablespace( old_name, table->space, new_name, new_path); + mem_free(old_path); + mem_free(new_path); + /* If the tablespace is remote, a new .isl file was created If success, delete the old one. If not, delete the new one. */ - if (new_path) { - - mem_free(new_path); + if (DICT_TF_HAS_DATA_DIR(table->flags)) { fil_delete_link_file(success ? old_name : new_name); } diff --git a/storage/xtradb/fil/fil0crypt.cc b/storage/xtradb/fil/fil0crypt.cc index 3d9d6a18122..03020896542 100644 --- a/storage/xtradb/fil/fil0crypt.cc +++ b/storage/xtradb/fil/fil0crypt.cc @@ -799,6 +799,7 @@ fil_space_decrypt( byte* src_frame) /*!< in/out: page buffer */ { dberr_t err = DB_SUCCESS; + byte* res = NULL; bool encrypted = fil_space_decrypt( fil_space_get_crypt_data(space), @@ -807,13 +808,17 @@ fil_space_decrypt( src_frame, &err); - if (encrypted) { - /* Copy the decrypted page back to page buffer, not - really any other options. */ - memcpy(src_frame, tmp_frame, page_size); + if (err == DB_SUCCESS) { + if (encrypted) { + /* Copy the decrypted page back to page buffer, not + really any other options. */ + memcpy(src_frame, tmp_frame, page_size); + } + + res = src_frame; } - return src_frame; + return res; } /****************************************************************** diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index 65827717230..5f0c52b5cc8 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/fil/fil0fil.cc @@ -2994,6 +2994,48 @@ fil_make_isl_name( return(filename); } +/** Test if a tablespace file can be renamed to a new filepath by checking +if that the old filepath exists and the new filepath does not exist. +@param[in] space_id tablespace id +@param[in] old_path old filepath +@param[in] new_path new filepath +@param[in] is_discarded whether the tablespace is discarded +@return innodb error code */ +dberr_t +fil_rename_tablespace_check( + ulint space_id, + const char* old_path, + const char* new_path, + bool is_discarded) +{ + ulint exists = false; + os_file_type_t ftype; + + if (!is_discarded + && os_file_status(old_path, &exists, &ftype) + && !exists) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Cannot rename '%s' to '%s' for space ID %lu" + " because the source file does not exist.", + old_path, new_path, space_id); + + return(DB_TABLESPACE_NOT_FOUND); + } + + exists = false; + if (!os_file_status(new_path, &exists, &ftype) || exists) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Cannot rename '%s' to '%s' for space ID %lu" + " because the target file exists." + " Remove the target file and try again.", + old_path, new_path, space_id); + + return(DB_TABLESPACE_EXISTS); + } + + return(DB_SUCCESS); +} + /*******************************************************************//** Renames a single-table tablespace. The tablespace must be cached in the tablespace memory cache. @@ -6918,31 +6960,110 @@ fil_get_space_names( return(err); } -/****************************************************************//** -Generate redo logs for swapping two .ibd files */ +/** Generate redo log for swapping two .ibd files +@param[in] old_table old table +@param[in] new_table new table +@param[in] tmp_name temporary table name +@param[in,out] mtr mini-transaction +@return innodb error code */ UNIV_INTERN -void +dberr_t fil_mtr_rename_log( -/*===============*/ - ulint old_space_id, /*!< in: tablespace id of the old - table. */ - const char* old_name, /*!< in: old table name */ - ulint new_space_id, /*!< in: tablespace id of the new - table */ - const char* new_name, /*!< in: new table name */ - const char* tmp_name, /*!< in: temp table name used while - swapping */ - mtr_t* mtr) /*!< in/out: mini-transaction */ + const dict_table_t* old_table, + const dict_table_t* new_table, + const char* tmp_name, + mtr_t* mtr) { - if (old_space_id != TRX_SYS_SPACE) { - fil_op_write_log(MLOG_FILE_RENAME, old_space_id, - 0, 0, old_name, tmp_name, mtr); + dberr_t err = DB_SUCCESS; + char* old_path; + + /* If neither table is file-per-table, + there will be no renaming of files. */ + if (old_table->space == TRX_SYS_SPACE + && new_table->space == TRX_SYS_SPACE) { + return(DB_SUCCESS); + } + + if (DICT_TF_HAS_DATA_DIR(old_table->flags)) { + old_path = os_file_make_remote_pathname( + old_table->data_dir_path, old_table->name, "ibd"); + } else { + old_path = fil_make_ibd_name(old_table->name, false); + } + if (old_path == NULL) { + return(DB_OUT_OF_MEMORY); + } + + if (old_table->space != TRX_SYS_SPACE) { + char* tmp_path; + + if (DICT_TF_HAS_DATA_DIR(old_table->flags)) { + tmp_path = os_file_make_remote_pathname( + old_table->data_dir_path, tmp_name, "ibd"); + } + else { + tmp_path = fil_make_ibd_name(tmp_name, false); + } + + if (tmp_path == NULL) { + mem_free(old_path); + return(DB_OUT_OF_MEMORY); + } + + /* Temp filepath must not exist. */ + err = fil_rename_tablespace_check( + old_table->space, old_path, tmp_path, + dict_table_is_discarded(old_table)); + mem_free(tmp_path); + if (err != DB_SUCCESS) { + mem_free(old_path); + return(err); + } + + fil_op_write_log(MLOG_FILE_RENAME, old_table->space, + 0, 0, old_table->name, tmp_name, mtr); } - if (new_space_id != TRX_SYS_SPACE) { - fil_op_write_log(MLOG_FILE_RENAME, new_space_id, - 0, 0, new_name, old_name, mtr); + if (new_table->space != TRX_SYS_SPACE) { + + /* Destination filepath must not exist unless this ALTER + TABLE starts and ends with a file_per-table tablespace. */ + if (old_table->space == TRX_SYS_SPACE) { + char* new_path = NULL; + + if (DICT_TF_HAS_DATA_DIR(new_table->flags)) { + new_path = os_file_make_remote_pathname( + new_table->data_dir_path, + new_table->name, "ibd"); + } + else { + new_path = fil_make_ibd_name( + new_table->name, false); + } + + if (new_path == NULL) { + mem_free(old_path); + return(DB_OUT_OF_MEMORY); + } + + err = fil_rename_tablespace_check( + new_table->space, new_path, old_path, + dict_table_is_discarded(new_table)); + mem_free(new_path); + if (err != DB_SUCCESS) { + mem_free(old_path); + return(err); + } + } + + fil_op_write_log(MLOG_FILE_RENAME, new_table->space, + 0, 0, new_table->name, old_table->name, mtr); + } + + mem_free(old_path); + + return(err); } /************************************************************************* diff --git a/storage/xtradb/fsp/fsp0fsp.cc b/storage/xtradb/fsp/fsp0fsp.cc index 9af25b53a90..790232edb66 100644 --- a/storage/xtradb/fsp/fsp0fsp.cc +++ b/storage/xtradb/fsp/fsp0fsp.cc @@ -961,10 +961,20 @@ fsp_try_extend_data_file( } } else { /* We extend single-table tablespaces first one extent - at a time, but for bigger tablespaces more. It is not - enough to extend always by one extent, because some - extents are frag page extents. */ + at a time, but 4 at a time for bigger tablespaces. It is + not enough to extend always by one extent, because we need + to add at least one extent to FSP_FREE. + A single extent descriptor page will track many extents. + And the extent that uses its extent descriptor page is + put onto the FSP_FREE_FRAG list. Extents that do not + use their extent descriptor page are added to FSP_FREE. + The physical page size is used to determine how many + extents are tracked on one extent descriptor page. */ ulint extent_size; /*!< one megabyte, in pages */ + ulint threshold; /*!< The size of the tablespace + (in number of pages) where we + start allocating more than one + extent at a time. */ if (!zip_size) { extent_size = FSP_EXTENT_SIZE; @@ -973,6 +983,14 @@ fsp_try_extend_data_file( * UNIV_PAGE_SIZE / zip_size; } + /* Threshold is set at 32mb except when the page + size is small enough that it must be done sooner. + For page size less than 4k, we may reach the + extent contains extent descriptor page before + 32 mb. */ + threshold = ut_min((32 * extent_size), + (zip_size ? zip_size : UNIV_PAGE_SIZE)); + if (size < extent_size) { /* Let us first extend the file to extent_size */ success = fsp_try_extend_data_file_with_pages( @@ -989,7 +1007,7 @@ fsp_try_extend_data_file( size = extent_size; } - if (size < 32 * extent_size) { + if (size < threshold) { size_increase = extent_size; } else { /* Below in fsp_fill_free_list() we assume diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index c50d3fd934b..517f7aa2636 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -5,7 +5,7 @@ Copyright (c) 2013, 2015, MariaDB Corporation. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2014 SkySQL Ab. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -944,12 +944,6 @@ static SHOW_VAR innodb_status_variables[]= { (char*) &export_vars.innodb_os_log_pending_writes, SHOW_LONG}, {"os_log_written", (char*) &export_vars.innodb_os_log_written, SHOW_LONGLONG}, - {"os_merge_buffers_written", - (char*) &export_vars.innodb_merge_buffers_written, SHOW_LONGLONG}, - {"os_merge_buffers_read", - (char*) &export_vars.innodb_merge_buffers_read, SHOW_LONGLONG}, - {"os_merge_buffers_merged", - (char*) &export_vars.innodb_merge_buffers_merged, SHOW_LONGLONG}, {"page_size", (char*) &export_vars.innodb_page_size, SHOW_LONG}, {"pages_created", @@ -1490,7 +1484,6 @@ Normalizes a table name string. A normalized name consists of the database name catenated to '/' and table name. An example: test/mytable. On Windows normalization puts both the database name and the table name always to lower case if "set_lower_case" is set to TRUE. */ -static void normalize_table_name_low( /*=====================*/ @@ -5386,7 +5379,6 @@ Normalizes a table name string. A normalized name consists of the database name catenated to '/' and table name. Example: test/mytable. On Windows normalization puts both the database name and the table name always to lower case if "set_lower_case" is set to TRUE. */ -static void normalize_table_name_low( /*=====================*/ @@ -8323,7 +8315,13 @@ ha_innobase::write_row( ha_statistic_increment(&SSV::ha_write_count); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -8651,7 +8649,7 @@ report_error: wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) && - !wsrep_thd_skip_append_keys(user_thd)) + !wsrep_thd_ignore_table(user_thd)) { if (wsrep_append_keys(user_thd, false, record, NULL)) { @@ -8670,7 +8668,13 @@ wsrep_error: func_exit: innobase_active_small(); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -9084,7 +9088,13 @@ ha_innobase::update_row( ha_statistic_increment(&SSV::ha_update_count); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -9185,7 +9195,7 @@ func_exit: if (error == DB_SUCCESS && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && - !wsrep_thd_skip_append_keys(user_thd)) + !wsrep_thd_ignore_table(user_thd)) { DBUG_PRINT("wsrep", ("update row key")); @@ -9199,7 +9209,13 @@ func_exit: wsrep_error: #endif /* WITH_WSREP */ - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -9265,7 +9281,7 @@ ha_innobase::delete_row( if (error == DB_SUCCESS && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && - !wsrep_thd_skip_append_keys(user_thd)) + !wsrep_thd_ignore_table(user_thd)) { if (wsrep_append_keys(user_thd, false, record, NULL)) { DBUG_PRINT("wsrep", ("delete fail")); @@ -12721,7 +12737,13 @@ ha_innobase::truncate() update_thd(ha_thd()); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -12736,7 +12758,13 @@ ha_innobase::truncate() err = row_truncate_table_for_mysql(prebuilt->table, prebuilt->trx); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -14126,7 +14154,13 @@ ha_innobase::analyze( { int ret; - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { return(HA_ADMIN_CORRUPT); } @@ -14136,7 +14170,13 @@ ha_innobase::analyze( HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE, true /* this is ANALYZE */); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { return(HA_ADMIN_CORRUPT); } @@ -15345,7 +15385,13 @@ ha_innobase::transactional_table_lock( update_thd(thd); - if (UNIV_UNLIKELY(share->ib_table->is_corrupt)) { + if (share->ib_table != prebuilt->table) { + fprintf(stderr, + "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %d.", + share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); + } + + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { DBUG_RETURN(HA_ERR_CRASHED); } @@ -18445,7 +18491,6 @@ innodb_sched_priority_purge_update( return; } - ut_ad(purge_sys->state == PURGE_STATE_RUN); for (ulint i = 0; i < srv_n_purge_threads; i++) { ulint nice = os_thread_get_priority(srv_purge_tids[i]); ulint actual_priority @@ -19203,6 +19248,15 @@ wsrep_innobase_kill_one_trx( (thd && wsrep_thd_query(thd)) ? wsrep_thd_query(thd) : "void"); wsrep_thd_LOCK(thd); + DBUG_EXECUTE_IF("sync.wsrep_after_BF_victim_lock", + { + const char act[]= + "now " + "wait_for signal.wsrep_after_BF_victim_lock"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, + STRING_WITH_LEN(act))); + };); + if (wsrep_thd_query_state(thd) == QUERY_EXITING) { WSREP_DEBUG("kill trx EXITING for %lu", victim_trx->id); diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc index 7ea581f99a2..c0d85451a9e 100644 --- a/storage/xtradb/handler/handler0alter.cc +++ b/storage/xtradb/handler/handler0alter.cc @@ -167,10 +167,13 @@ my_error_innodb( /* TODO: report the row, as we do for DB_DUPLICATE_KEY */ my_error(ER_INVALID_USE_OF_NULL, MYF(0)); break; + case DB_TABLESPACE_EXISTS: + my_error(ER_TABLESPACE_EXISTS, MYF(0), table); + break; + #ifdef UNIV_DEBUG case DB_SUCCESS: case DB_DUPLICATE_KEY: - case DB_TABLESPACE_EXISTS: case DB_ONLINE_LOG_TOO_BIG: /* These codes should not be passed here. */ ut_error; @@ -202,12 +205,14 @@ innobase_fulltext_exist( /*******************************************************************//** Determine if ALTER TABLE needs to rebuild the table. @param ha_alter_info the DDL operation +@param altered_table MySQL original table @return whether it is necessary to rebuild the table */ static __attribute__((nonnull, warn_unused_result)) bool innobase_need_rebuild( /*==================*/ - const Alter_inplace_info* ha_alter_info) + const Alter_inplace_info* ha_alter_info, + const TABLE* altered_table) { if (ha_alter_info->handler_flags == Alter_inplace_info::CHANGE_CREATE_OPTION @@ -219,6 +224,34 @@ innobase_need_rebuild( return(false); } + /* If alter table changes column name and adds a new + index, we need to check is this new index created + to new column name. This is because column name + changes are done normally after creating indexes. */ + if ((ha_alter_info->handler_flags + & Alter_inplace_info::ALTER_COLUMN_NAME) && + ((ha_alter_info->handler_flags + & Alter_inplace_info::ADD_INDEX) || + (ha_alter_info->handler_flags + & Alter_inplace_info::ADD_FOREIGN_KEY))) { + for (ulint i = 0; i < ha_alter_info->key_count; i++) { + const KEY* key = &ha_alter_info->key_info_buffer[ + ha_alter_info->index_add_buffer[i]]; + + for (ulint j = 0; j < key->user_defined_key_parts; j++) { + const KEY_PART_INFO* key_part = &(key->key_part[j]); + const Field* field = altered_table->field[key_part->fieldnr]; + + /* Field used on added index is renamed on + this same alter table. We need table + rebuild. */ + if (field->flags & FIELD_IS_RENAMED) { + return (true); + } + } + } + } + return(!!(ha_alter_info->handler_flags & INNOBASE_ALTER_REBUILD)); } @@ -557,7 +590,7 @@ ha_innobase::check_if_supported_inplace_alter( operation is possible. */ } else if (((ha_alter_info->handler_flags & Alter_inplace_info::ADD_PK_INDEX) - || innobase_need_rebuild(ha_alter_info)) + || innobase_need_rebuild(ha_alter_info, table)) && (innobase_fulltext_exist(altered_table))) { /* Refuse to rebuild the table online, if fulltext indexes are to survive the rebuild. */ @@ -1558,7 +1591,8 @@ innobase_create_index_def( index_def_t* index, /*!< out: index definition */ mem_heap_t* heap, /*!< in: heap where memory is allocated */ - const Field** fields) /*!z in: MySQL table fields */ + const Field** fields) /*!< in: MySQL table fields + */ { const KEY* key = &keys[key_number]; ulint i; @@ -1854,9 +1888,11 @@ innobase_create_key_defs( bool& add_fts_doc_id, /*!< in: whether we need to add new DOC ID column for FTS index */ - bool& add_fts_doc_idx) + bool& add_fts_doc_idx, /*!< in: whether we need to add new DOC ID index for FTS index */ + const TABLE* table) + /*!< in: MySQL table that is being altered */ { index_def_t* indexdef; index_def_t* indexdefs; @@ -1906,7 +1942,8 @@ innobase_create_key_defs( } const bool rebuild = new_primary || add_fts_doc_id - || innobase_need_rebuild(ha_alter_info); + || innobase_need_rebuild(ha_alter_info, table); + /* Reserve one more space if new_primary is true, and we might need to add the FTS_DOC_ID_INDEX */ indexdef = indexdefs = static_cast<index_def_t*>( @@ -2744,7 +2781,8 @@ prepare_inplace_alter_table_dict( ctx->heap, ha_alter_info, altered_table, ctx->num_to_add_index, num_fts_index, row_table_got_default_clust_index(ctx->new_table), - fts_doc_id_col, add_fts_doc_id, add_fts_doc_id_idx); + fts_doc_id_col, add_fts_doc_id, add_fts_doc_id_idx, + old_table); new_clustered = DICT_CLUSTERED & index_defs[0].ind_type; @@ -2757,7 +2795,7 @@ prepare_inplace_alter_table_dict( /* This is not an online operation (LOCK=NONE). */ } else if (ctx->add_autoinc == ULINT_UNDEFINED && num_fts_index == 0 - && (!innobase_need_rebuild(ha_alter_info) + && (!innobase_need_rebuild(ha_alter_info, old_table) || !innobase_fulltext_exist(altered_table))) { /* InnoDB can perform an online operation (LOCK=NONE). */ } else { @@ -2774,7 +2812,7 @@ prepare_inplace_alter_table_dict( is just copied from old table and stored in indexdefs[0] */ DBUG_ASSERT(!add_fts_doc_id || new_clustered); DBUG_ASSERT(!!new_clustered == - (innobase_need_rebuild(ha_alter_info) + (innobase_need_rebuild(ha_alter_info, old_table) || add_fts_doc_id)); /* Allocate memory for dictionary index definitions */ @@ -3034,7 +3072,7 @@ prepare_inplace_alter_table_dict( add_cols, ctx->heap); ctx->add_cols = add_cols; } else { - DBUG_ASSERT(!innobase_need_rebuild(ha_alter_info)); + DBUG_ASSERT(!innobase_need_rebuild(ha_alter_info, old_table)); if (!ctx->new_table->fts && innobase_fulltext_exist(altered_table)) { @@ -3055,7 +3093,7 @@ prepare_inplace_alter_table_dict( ctx->add_index[a] = row_merge_create_index( ctx->trx, ctx->new_table, - &index_defs[a]); + &index_defs[a], ctx->col_names); add_key_nums[a] = index_defs[a].key_number; @@ -3925,7 +3963,7 @@ err_exit: if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA) || (ha_alter_info->handler_flags == Alter_inplace_info::CHANGE_CREATE_OPTION - && !innobase_need_rebuild(ha_alter_info))) { + && !innobase_need_rebuild(ha_alter_info, table))) { if (heap) { ha_alter_info->handler_ctx @@ -4099,7 +4137,7 @@ ok_exit: if (ha_alter_info->handler_flags == Alter_inplace_info::CHANGE_CREATE_OPTION - && !innobase_need_rebuild(ha_alter_info)) { + && !innobase_need_rebuild(ha_alter_info, table)) { goto ok_exit; } @@ -4811,9 +4849,11 @@ commit_get_autoinc( Field* autoinc_field = old_table->found_next_number_field; + KEY* autoinc_key = + old_table->key_info + old_table->s->next_number_index; - dict_index_t* index = dict_table_get_index_on_first_col( - ctx->old_table, autoinc_field->field_index); + dict_index_t* index = dict_table_get_index_on_name( + ctx->old_table, autoinc_key->name); max_autoinc = ha_alter_info->create_info->auto_increment_value; @@ -5221,6 +5261,61 @@ commit_cache_rebuild( DBUG_VOID_RETURN; } +/** Store the column number of the columns in a list belonging +to indexes which are not being dropped. +@param[in] ctx In-place ALTER TABLE context +@param[out] drop_col_list list which will be set, containing columns + which is part of index being dropped */ +static +void +get_col_list_to_be_dropped( + ha_innobase_inplace_ctx* ctx, + std::set<ulint>& drop_col_list) +{ + for (ulint index_count = 0; index_count < ctx->num_to_drop_index; + index_count++) { + dict_index_t* index = ctx->drop_index[index_count]; + + for (ulint col = 0; col < index->n_user_defined_cols; col++) { + ulint col_no = dict_index_get_nth_col_no(index, col); + drop_col_list.insert(col_no); + } + } +} + +/** For each column, which is part of an index which is not going to be +dropped, it checks if the column number of the column is same as col_no +argument passed. +@param[in] table table object +@param[in] col_no column number of the column which is to be checked +@retval true column exists +@retval false column does not exist. */ +static +bool +check_col_exists_in_indexes( + const dict_table_t* table, + ulint col_no) +{ + for (dict_index_t* index = dict_table_get_first_index(table); index; + index = dict_table_get_next_index(index)) { + + if (index->to_be_dropped) { + continue; + } + + for (ulint col = 0; col < index->n_user_defined_cols; col++) { + + ulint index_col_no = dict_index_get_nth_col_no( + index, col); + if (col_no == index_col_no) { + return(true); + } + } + } + + return(false); +} + /** Commit the changes made during prepare_inplace_alter_table() and inplace_alter_table() inside the data dictionary tables, when not rebuilding the table. @@ -5356,6 +5451,20 @@ commit_cache_norebuild( DBUG_ASSERT(!ctx->need_rebuild()); + std::set<ulint> drop_list; + std::set<ulint>::const_iterator col_it; + + /* Check if the column, part of an index to be dropped is part of any + other index which is not being dropped. If it so, then set the ord_part + of the column to 0. */ + get_col_list_to_be_dropped(ctx, drop_list); + + for(col_it = drop_list.begin(); col_it != drop_list.end(); ++col_it) { + if (!check_col_exists_in_indexes(ctx->new_table, *col_it)) { + ctx->new_table->cols[*col_it].ord_part = 0; + } + } + for (ulint i = 0; i < ctx->num_to_add_index; i++) { dict_index_t* index = ctx->add_index[i]; DBUG_ASSERT(dict_index_get_online_status(index) @@ -5556,6 +5665,7 @@ ha_innobase::commit_inplace_alter_table( Alter_inplace_info* ha_alter_info, bool commit) { + dberr_t error; ha_innobase_inplace_ctx* ctx0 = static_cast<ha_innobase_inplace_ctx*> (ha_alter_info->handler_ctx); @@ -5637,7 +5747,7 @@ ha_innobase::commit_inplace_alter_table( transactions collected during crash recovery could be holding InnoDB locks only, not MySQL locks. */ - dberr_t error = row_merge_lock_table( + error = row_merge_lock_table( prebuilt->trx, ctx->old_table, LOCK_X); if (error != DB_SUCCESS) { @@ -5772,14 +5882,20 @@ ha_innobase::commit_inplace_alter_table( = static_cast<ha_innobase_inplace_ctx*>(*pctx); DBUG_ASSERT(ctx->need_rebuild()); - /* Generate the redo log for the file - operations that will be performed in - commit_cache_rebuild(). */ - fil_mtr_rename_log(ctx->old_table->space, - ctx->old_table->name, - ctx->new_table->space, - ctx->new_table->name, - ctx->tmp_name, &mtr); + /* Check for any possible problems for any + file operations that will be performed in + commit_cache_rebuild(), and if none, generate + the redo log for these operations. */ + error = fil_mtr_rename_log(ctx->old_table, + ctx->new_table, + ctx->tmp_name, &mtr); + if (error != DB_SUCCESS) { + /* Out of memory or a problem will occur + when renaming files. */ + fail = true; + my_error_innodb(error, ctx->old_table->name, + ctx->old_table->flags); + } DBUG_INJECT_CRASH("ib_commit_inplace_crash", crash_inject_count++); } @@ -5792,18 +5908,25 @@ ha_innobase::commit_inplace_alter_table( DBUG_EXECUTE_IF("innodb_alter_commit_crash_before_commit", log_buffer_flush_to_disk(); DBUG_SUICIDE();); - ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); ut_ad(!trx->fts_trx); - ut_ad(trx->insert_undo || trx->update_undo); - /* The following call commits the - mini-transaction, making the data dictionary - transaction committed at mtr.end_lsn. The - transaction becomes 'durable' by the time when - log_buffer_flush_to_disk() returns. In the - logical sense the commit in the file-based - data structures happens here. */ - trx_commit_low(trx, &mtr); + if (fail) { + mtr_set_log_mode(&mtr, MTR_LOG_NO_REDO); + mtr_commit(&mtr); + trx_rollback_for_mysql(trx); + } else { + /* The following call commits the + mini-transaction, making the data dictionary + transaction committed at mtr.end_lsn. The + transaction becomes 'durable' by the time when + log_buffer_flush_to_disk() returns. In the + logical sense the commit in the file-based + data structures happens here. */ + ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); + ut_ad(trx->insert_undo || trx->update_undo); + + trx_commit_low(trx, &mtr); + } /* If server crashes here, the dictionary in InnoDB and MySQL will differ. The .ibd files @@ -5825,7 +5948,6 @@ ha_innobase::commit_inplace_alter_table( update the in-memory structures, close some handles, release temporary files, and (unless we rolled back) update persistent statistics. */ - dberr_t error = DB_SUCCESS; for (inplace_alter_handler_ctx** pctx = ctx_array; *pctx; pctx++) { diff --git a/storage/xtradb/ibuf/ibuf0ibuf.cc b/storage/xtradb/ibuf/ibuf0ibuf.cc index 9ee22d4d0f7..bac2a92dd0b 100644 --- a/storage/xtradb/ibuf/ibuf0ibuf.cc +++ b/storage/xtradb/ibuf/ibuf0ibuf.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -384,12 +385,18 @@ ibuf_header_page_get( buf_block_t* block; ut_ad(!ibuf_inside(mtr)); + page_t* page = NULL; block = buf_page_get( IBUF_SPACE_ID, 0, FSP_IBUF_HEADER_PAGE_NO, RW_X_LATCH, mtr); - buf_block_dbg_add_level(block, SYNC_IBUF_HEADER); - return(buf_block_get_frame(block)); + if (!block->page.encrypted) { + buf_block_dbg_add_level(block, SYNC_IBUF_HEADER); + + page = buf_block_get_frame(block); + } + + return page; } /******************************************************************//** @@ -540,9 +547,10 @@ ibuf_size_update( /******************************************************************//** Creates the insert buffer data structure at a database startup and initializes -the data structures for the insert buffer. */ +the data structures for the insert buffer. +@return DB_SUCCESS or failure */ UNIV_INTERN -void +dberr_t ibuf_init_at_db_start(void) /*=======================*/ { @@ -553,7 +561,7 @@ ibuf_init_at_db_start(void) dict_index_t* index; ulint n_used; page_t* header_page; - dberr_t error; + dberr_t error= DB_SUCCESS; ibuf = static_cast<ibuf_t*>(mem_zalloc(sizeof(ibuf_t))); @@ -583,6 +591,10 @@ ibuf_init_at_db_start(void) header_page = ibuf_header_page_get(&mtr); + if (!header_page) { + return (DB_DECRYPTION_FAILED); + } + fseg_n_reserved_pages(header_page + IBUF_HEADER + IBUF_TREE_SEG_HEADER, &n_used, &mtr); ibuf_enter(&mtr); @@ -634,6 +646,7 @@ ibuf_init_at_db_start(void) ut_a(error == DB_SUCCESS); ibuf->index = dict_table_get_first_index(table); + return (error); } /*********************************************************************//** diff --git a/storage/xtradb/include/buf0flu.h b/storage/xtradb/include/buf0flu.h index c51010e33bc..87ce7d88bdf 100644 --- a/storage/xtradb/include/buf0flu.h +++ b/storage/xtradb/include/buf0flu.h @@ -211,7 +211,7 @@ Clears up tail of the LRU lists: * Flush dirty pages at the tail of LRU to the disk The depth to which we scan each buffer pool is controlled by dynamic config parameter innodb_LRU_scan_depth. -@return total pages flushed */ +@return number of pages flushed */ UNIV_INTERN ulint buf_flush_LRU_tail(void); diff --git a/storage/xtradb/include/fil0crypt.h b/storage/xtradb/include/fil0crypt.h index c42a0cf7e3f..32462661cd6 100644 --- a/storage/xtradb/include/fil0crypt.h +++ b/storage/xtradb/include/fil0crypt.h @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2015, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -212,6 +212,7 @@ bool fil_space_check_encryption_read( /*============================*/ ulint space); /*!< in: tablespace id */ + /****************************************************************** Decrypt a page @return true if page is decrypted, false if not. */ @@ -226,7 +227,6 @@ fil_space_decrypt( dberr_t* err); /*!< in: out: DB_SUCCESS or error code */ - /********************************************************************* Encrypt buffer page @return encrypted page, or original not encrypted page if encrypt @@ -253,7 +253,8 @@ fil_space_decrypt( ulint space, /*!< in: tablespace id */ byte* src_frame, /*!< in: page frame */ ulint page_size, /*!< in: size of data to encrypt */ - byte* dst_frame); /*!< in: where to decrypt to */ + byte* dst_frame) /*!< in: where to decrypt to */ + __attribute__((warn_unused_result)); /********************************************************************* fil_space_verify_crypt_checksum diff --git a/storage/xtradb/include/fil0fil.h b/storage/xtradb/include/fil0fil.h index 2a3995519a7..973882a50b4 100644 --- a/storage/xtradb/include/fil0fil.h +++ b/storage/xtradb/include/fil0fil.h @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2013, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -699,6 +699,21 @@ fil_discard_tablespace( ulint id) /*!< in: space id */ __attribute__((warn_unused_result)); #endif /* !UNIV_HOTBACKUP */ + +/** Test if a tablespace file can be renamed to a new filepath by checking +if that the old filepath exists and the new filepath does not exist. +@param[in] space_id tablespace id +@param[in] old_path old filepath +@param[in] new_path new filepath +@param[in] is_discarded whether the tablespace is discarded +@return innodb error code */ +dberr_t +fil_rename_tablespace_check( + ulint space_id, + const char* old_path, + const char* new_path, + bool is_discarded); + /*******************************************************************//** Renames a single-table tablespace. The tablespace must be cached in the tablespace memory cache. @@ -1223,21 +1238,19 @@ fil_get_space_names( /*!< in/out: Vector for collecting the names. */ __attribute__((warn_unused_result)); -/****************************************************************//** -Generate redo logs for swapping two .ibd files */ +/** Generate redo log for swapping two .ibd files +@param[in] old_table old table +@param[in] new_table new table +@param[in] tmp_name temporary table name +@param[in,out] mtr mini-transaction +@return innodb error code */ UNIV_INTERN -void +dberr_t fil_mtr_rename_log( -/*===============*/ - ulint old_space_id, /*!< in: tablespace id of the old - table. */ - const char* old_name, /*!< in: old table name */ - ulint new_space_id, /*!< in: tablespace id of the new - table */ - const char* new_name, /*!< in: new table name */ - const char* tmp_name, /*!< in: temp table name used while - swapping */ - mtr_t* mtr) /*!< in/out: mini-transaction */ + const dict_table_t* old_table, + const dict_table_t* new_table, + const char* tmp_name, + mtr_t* mtr) __attribute__((nonnull)); /*******************************************************************//** diff --git a/storage/xtradb/include/ha_prototypes.h b/storage/xtradb/include/ha_prototypes.h index 9ec6a7ff4b4..a9c003d5bb1 100644 --- a/storage/xtradb/include/ha_prototypes.h +++ b/storage/xtradb/include/ha_prototypes.h @@ -655,4 +655,18 @@ ib_push_warning( ulint error, /*!< in: error code to push as warning */ const char *format,/*!< in: warning message */ ...); + +/*****************************************************************//** +Normalizes a table name string. A normalized name consists of the +database name catenated to '/' and table name. An example: +test/mytable. On Windows normalization puts both the database name and the +table name always to lower case if "set_lower_case" is set to TRUE. */ +void +normalize_table_name_low( +/*=====================*/ + char* norm_name, /*!< out: normalized name as a + null-terminated string */ + const char* name, /*!< in: table name string */ + ibool set_lower_case); /*!< in: TRUE if we want to set + name to lower case */ #endif /* HA_INNODB_PROTOTYPES_H */ diff --git a/storage/xtradb/include/ibuf0ibuf.h b/storage/xtradb/include/ibuf0ibuf.h index ac16b10e097..3c8fa874dcf 100644 --- a/storage/xtradb/include/ibuf0ibuf.h +++ b/storage/xtradb/include/ibuf0ibuf.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2013, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -91,9 +92,10 @@ separately committed mini-transaction, because in crash recovery, the free bits could momentarily be set too high. */ /******************************************************************//** -Creates the insert buffer data structure at a database startup. */ +Creates the insert buffer data structure at a database startup. +@return DB_SUCCESS or failure */ UNIV_INTERN -void +dberr_t ibuf_init_at_db_start(void); /*=======================*/ /*********************************************************************//** diff --git a/storage/xtradb/include/row0merge.h b/storage/xtradb/include/row0merge.h index 196543f25e1..3e3459b8703 100644 --- a/storage/xtradb/include/row0merge.h +++ b/storage/xtradb/include/row0merge.h @@ -268,8 +268,11 @@ row_merge_create_index( /*===================*/ trx_t* trx, /*!< in/out: trx (sets error_state) */ dict_table_t* table, /*!< in: the index is on this table */ - const index_def_t* index_def); + const index_def_t* index_def, /*!< in: the index definition */ + const char** col_names); + /*! in: column names if columns are + renamed or NULL */ /*********************************************************************//** Check if a transaction can use an index. @return TRUE if index can be used by the transaction else FALSE */ diff --git a/storage/xtradb/include/srv0mon.h b/storage/xtradb/include/srv0mon.h index 658cd94d1ec..33ae7749ca5 100644 --- a/storage/xtradb/include/srv0mon.h +++ b/storage/xtradb/include/srv0mon.h @@ -2,7 +2,7 @@ Copyright (c) 2010, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -263,9 +263,6 @@ enum monitor_id_t { MONITOR_OVLD_OS_LOG_FSYNC, MONITOR_OVLD_OS_LOG_PENDING_FSYNC, MONITOR_OVLD_OS_LOG_PENDING_WRITES, - MONITOR_MERGE_BLOCKS_WRITTEN, - MONITOR_MERGE_BLOCKS_READ, - MONITOR_MERGE_BLOCKS_MERGED, /* Transaction related counters */ MONITOR_MODULE_TRX, diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h index 9a3bf4e74ae..a2d300957ba 100644 --- a/storage/xtradb/include/srv0srv.h +++ b/storage/xtradb/include/srv0srv.h @@ -3,7 +3,7 @@ Copyright (c) 1995, 2015, Oracle and/or its affiliates. Copyright (c) 2008, 2009, Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2014, SkySQL Ab. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -186,13 +186,6 @@ struct srv_stats_t { /** Number of lock waits that have been up to max time (i.e.) lock wait timeout */ ulint_ctr_1_t n_lock_max_wait_time; - - /** Number of merge buffers written */ - ulint_ctr_64_t merge_buffers_written; - /** Number of merge buffers read */ - ulint_ctr_64_t merge_buffers_read; - /** Number of merge buffers merged */ - ulint_ctr_64_t merge_buffers_merged; }; extern const char* srv_main_thread_op_info; @@ -1214,9 +1207,6 @@ struct export_var_t{ ulint innodb_purge_view_trx_id_age; /*!< rw_max_trx_id - purged view's min trx_id */ #endif /* UNIV_DEBUG */ - ib_int64_t innodb_merge_buffers_written; - ib_int64_t innodb_merge_buffers_read; - ib_int64_t innodb_merge_buffers_merged; ib_int64_t innodb_page_compression_saved;/*!< Number of bytes saved by page compression */ diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index dabaee4110c..f4a0da12476 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -45,10 +45,10 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 26 +#define INNODB_VERSION_BUGFIX 28 #ifndef PERCONA_INNODB_VERSION -#define PERCONA_INNODB_VERSION 76.0 +#define PERCONA_INNODB_VERSION 76.1 #endif /* Enable UNIV_LOG_ARCHIVE in XtraDB */ diff --git a/storage/xtradb/lock/lock0wait.cc b/storage/xtradb/lock/lock0wait.cc index 2482c88d3b7..a87adcf94c0 100644 --- a/storage/xtradb/lock/lock0wait.cc +++ b/storage/xtradb/lock/lock0wait.cc @@ -396,7 +396,9 @@ lock_wait_suspend_thread( if (lock_wait_timeout < 100000000 && wait_time > (double) lock_wait_timeout) { #ifdef WITH_WSREP - if (!wsrep_is_BF_lock_timeout(trx)) { + if (!wsrep_on(trx->mysql_thd) || + (!wsrep_is_BF_lock_timeout(trx) && + trx->error_state != DB_DEADLOCK)) { #endif /* WITH_WSREP */ trx->error_state = DB_LOCK_WAIT_TIMEOUT; diff --git a/storage/xtradb/log/log0recv.cc b/storage/xtradb/log/log0recv.cc index b0e69107723..c9bf5cf3f9e 100644 --- a/storage/xtradb/log/log0recv.cc +++ b/storage/xtradb/log/log0recv.cc @@ -849,6 +849,10 @@ not_consistent: fprintf(stderr, "InnoDB: No valid checkpoint found.\n" + "InnoDB: If you are attempting downgrade" + " from MySQL 5.7.9 or later,\n" + "InnoDB: please refer to " REFMAN + "upgrading-downgrading.html\n" "InnoDB: If this error appears when you are" " creating an InnoDB database,\n" "InnoDB: the problem may be that during" diff --git a/storage/xtradb/row/row0import.cc b/storage/xtradb/row/row0import.cc index ac6380e5a27..893ffcab3da 100644 --- a/storage/xtradb/row/row0import.cc +++ b/storage/xtradb/row/row0import.cc @@ -2070,8 +2070,20 @@ PageConverter::validate( return(IMPORT_PAGE_STATUS_CORRUPTED); } else if (offset > 0 && page_get_page_no(page) == 0) { - const byte* b = page; - const byte* e = b + m_page_size; + ulint checksum; + + checksum = mach_read_from_4(page + FIL_PAGE_SPACE_OR_CHKSUM); + if (checksum != 0) { + /* Checksum check passed in buf_page_is_corrupted(). */ + ib_logf(IB_LOG_LEVEL_WARN, + "%s: Page %lu checksum %lu should be zero.", + m_filepath, (ulong) (offset / m_page_size), + checksum); + } + + const byte* b = page + FIL_PAGE_OFFSET; + const byte* e = page + m_page_size + - FIL_PAGE_END_LSN_OLD_CHKSUM; /* If the page number is zero and offset > 0 then the entire page MUST consist of zeroes. If not then diff --git a/storage/xtradb/row/row0log.cc b/storage/xtradb/row/row0log.cc index 7014b8b99d2..b0c6f881f81 100644 --- a/storage/xtradb/row/row0log.cc +++ b/storage/xtradb/row/row0log.cc @@ -1462,6 +1462,7 @@ row_log_table_apply_insert_low( dtuple_t* entry; const row_log_t*log = dup->index->online_log; dict_index_t* index = dict_table_get_first_index(log->table); + ulint n_index = 0; ut_ad(dtuple_validate(row)); ut_ad(trx_id); @@ -1497,6 +1498,8 @@ row_log_table_apply_insert_low( } do { + n_index++; + if (!(index = dict_table_get_next_index(index))) { break; } @@ -1509,6 +1512,12 @@ row_log_table_apply_insert_low( error = row_ins_sec_index_entry_low( flags, BTR_MODIFY_TREE, index, offsets_heap, heap, entry, trx_id, thr); + + /* Report correct index name for duplicate key error. */ + if (error == DB_DUPLICATE_KEY) { + thr_get_trx(thr)->error_key_num = n_index; + } + } while (error == DB_SUCCESS); return(error); @@ -1816,6 +1825,7 @@ row_log_table_apply_update( mtr_t mtr; btr_pcur_t pcur; dberr_t error; + ulint n_index = 0; ut_ad(dtuple_get_n_fields_cmp(old_pk) == dict_index_get_n_unique(index)); @@ -2091,6 +2101,8 @@ func_exit_committed: break; } + n_index++; + if (index->type & DICT_FTS) { continue; } @@ -2134,6 +2146,11 @@ func_exit_committed: BTR_MODIFY_TREE, index, offsets_heap, heap, entry, trx_id, thr); + /* Report correct index name for duplicate key error. */ + if (error == DB_DUPLICATE_KEY) { + thr_get_trx(thr)->error_key_num = n_index; + } + mtr_start(&mtr); } diff --git a/storage/xtradb/row/row0merge.cc b/storage/xtradb/row/row0merge.cc index ad3e7619c8a..8d7fcd7388c 100644 --- a/storage/xtradb/row/row0merge.cc +++ b/storage/xtradb/row/row0merge.cc @@ -1,7 +1,6 @@ /***************************************************************************** Copyright (c) 2005, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2015, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -971,7 +970,6 @@ row_merge_read( success = os_file_read_no_error_handling(OS_FILE_FROM_FD(fd), buf, ofs, srv_sort_buf_size); - srv_stats.merge_buffers_read.inc(); /* For encrypted tables, decrypt data after reading and copy data */ if (crypt_data && crypt_buf) { @@ -1027,7 +1025,6 @@ row_merge_write( } ret = os_file_write("(merge)", OS_FILE_FROM_FD(fd), out_buf, ofs, buf_len); - srv_stats.merge_buffers_written.inc(); #ifdef UNIV_DEBUG if (row_merge_print_block_write) { @@ -1916,7 +1913,7 @@ write_buffers: /* We have enough data tuples to form a block. Sort them and write to disk. */ - if (UNIV_LIKELY(buf->n_tuples)) { + if (buf->n_tuples) { if (dict_index_is_unique(buf->index)) { row_merge_dup_t dup = { buf->index, table, col_map, 0}; @@ -1957,17 +1954,13 @@ write_buffers: dict_index_get_lock(buf->index)); } - /* Do not write empty buffers to temporary file */ - if (buf->n_tuples) { - - row_merge_buf_write(buf, file, block); + row_merge_buf_write(buf, file, block); - if (!row_merge_write(file->fd, file->offset++, block, - crypt_data, crypt_block, new_table->space)) { - err = DB_TEMP_FILE_WRITE_FAILURE; - trx->error_key_num = i; - break; - } + if (!row_merge_write(file->fd, file->offset++, block, + crypt_data, crypt_block, new_table->space)) { + err = DB_TEMP_FILE_WRITE_FAILURE; + trx->error_key_num = i; + break; } UNIV_MEM_INVALID(&block[0], srv_sort_buf_size); @@ -2284,8 +2277,6 @@ done1: b2, of->fd, &of->offset, crypt_data, crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, space); - srv_stats.merge_buffers_merged.inc(); - return(b2 ? DB_SUCCESS : DB_CORRUPTION); } @@ -3746,8 +3737,11 @@ row_merge_create_index( /*===================*/ trx_t* trx, /*!< in/out: trx (sets error_state) */ dict_table_t* table, /*!< in: the index is on this table */ - const index_def_t* index_def) + const index_def_t* index_def, /*!< in: the index definition */ + const char** col_names) + /*! in: column names if columns are + renamed or NULL */ { dict_index_t* index; dberr_t err; @@ -3767,9 +3761,24 @@ row_merge_create_index( for (i = 0; i < n_fields; i++) { index_field_t* ifield = &index_def->fields[i]; - const char * col_name = ifield->col_name ? - dict_table_get_col_name_for_mysql(table, ifield->col_name) : - dict_table_get_col_name(table, ifield->col_no); + const char * col_name; + + /* + Alter table renaming a column and then adding a index + to this new name e.g ALTER TABLE t + CHANGE COLUMN b c INT NOT NULL, ADD UNIQUE INDEX (c); + requires additional check as column names are not yet + changed when new index definitions are created. Table's + new column names are on a array of column name pointers + if any of the column names are changed. */ + + if (col_names && col_names[i]) { + col_name = col_names[i]; + } else { + col_name = ifield->col_name ? + dict_table_get_col_name_for_mysql(table, ifield->col_name) : + dict_table_get_col_name(table, ifield->col_no); + } dict_mem_index_add_field( index, @@ -4110,71 +4119,67 @@ wait_again: #ifdef FTS_INTERNAL_DIAG_PRINT DEBUG_FTS_SORT_PRINT("FTS_SORT: Complete Insert\n"); #endif - } else { - /* Sorting and inserting is required only if - there really is records */ - if (UNIV_LIKELY(merge_files[i].n_rec)) { - char buf[3 * NAME_LEN]; - char *bufend; - row_merge_dup_t dup = { - sort_idx, table, col_map, 0}; + } else if (UNIV_LIKELY(merge_files[i].n_rec)) { + char buf[3 * NAME_LEN]; + char *bufend; + row_merge_dup_t dup = { + sort_idx, table, col_map, 0}; - pct_cost = (COST_BUILD_INDEX_STATIC + - (total_dynamic_cost * merge_files[i].offset / - total_index_blocks)) / - (total_static_cost + total_dynamic_cost) - * PCT_COST_MERGESORT_INDEX * 100; + pct_cost = (COST_BUILD_INDEX_STATIC + + (total_dynamic_cost * merge_files[i].offset / + total_index_blocks)) / + (total_static_cost + total_dynamic_cost) + * PCT_COST_MERGESORT_INDEX * 100; + + bufend = innobase_convert_name(buf, sizeof buf, + indexes[i]->name, strlen(indexes[i]->name), + trx ? trx->mysql_thd : NULL, + FALSE); - bufend = innobase_convert_name(buf, sizeof buf, - indexes[i]->name, strlen(indexes[i]->name), - trx ? trx->mysql_thd : NULL, - FALSE); + buf[bufend - buf]='\0'; - buf[bufend - buf]='\0'; + sql_print_information("InnoDB: Online DDL : Start merge-sorting" + " index %s (%lu / %lu), estimated cost : %2.4f", + buf, (i+1), n_indexes, pct_cost); - sql_print_information("InnoDB: Online DDL : Start merge-sorting" - " index %s (%lu / %lu), estimated cost : %2.4f", - buf, (i+1), n_indexes, pct_cost); + error = row_merge_sort( + trx, &dup, &merge_files[i], + block, &tmpfd, true, + pct_progress, pct_cost, + crypt_data, crypt_block, new_table->space); - error = row_merge_sort( - trx, &dup, &merge_files[i], - block, &tmpfd, true, - pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space); + pct_progress += pct_cost; + + sql_print_information("InnoDB: Online DDL : End of " + " merge-sorting index %s (%lu / %lu)", + buf, (i+1), n_indexes); + + DBUG_EXECUTE_IF( + "ib_merge_wait_after_sort", + os_thread_sleep(20000000);); /* 20 sec */ + if (error == DB_SUCCESS) { + pct_cost = (COST_BUILD_INDEX_STATIC + + (total_dynamic_cost * merge_files[i].offset / + total_index_blocks)) / + (total_static_cost + total_dynamic_cost) * + PCT_COST_INSERT_INDEX * 100; + + sql_print_information("InnoDB: Online DDL : Start " + "building index %s (%lu / %lu), estimated " + "cost : %2.4f", buf, (i+1), + n_indexes, pct_cost); + + error = row_merge_insert_index_tuples( + trx->id, sort_idx, old_table, + merge_files[i].fd, block, + merge_files[i].n_rec, pct_progress, pct_cost, + crypt_data, crypt_block, new_table->space); pct_progress += pct_cost; - sql_print_information("InnoDB: Online DDL : End of " - " merge-sorting index %s (%lu / %lu)", + sql_print_information("InnoDB: Online DDL : " + "End of building index %s (%lu / %lu)", buf, (i+1), n_indexes); - - DBUG_EXECUTE_IF( - "ib_merge_wait_after_sort", - os_thread_sleep(20000000);); /* 20 sec */ - - if (error == DB_SUCCESS) { - pct_cost = (COST_BUILD_INDEX_STATIC + - (total_dynamic_cost * merge_files[i].offset / - total_index_blocks)) / - (total_static_cost + total_dynamic_cost) * - PCT_COST_INSERT_INDEX * 100; - - sql_print_information("InnoDB: Online DDL : Start " - "building index %s (%lu / %lu), estimated " - "cost : %2.4f", buf, (i+1), - n_indexes, pct_cost); - - error = row_merge_insert_index_tuples( - trx->id, sort_idx, old_table, - merge_files[i].fd, block, - merge_files[i].n_rec, pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space); - pct_progress += pct_cost; - - sql_print_information("InnoDB: Online DDL : " - "End of building index %s (%lu / %lu)", - buf, (i+1), n_indexes); - } } } diff --git a/storage/xtradb/row/row0mysql.cc b/storage/xtradb/row/row0mysql.cc index 55e685ac19c..9427b20daf9 100644 --- a/storage/xtradb/row/row0mysql.cc +++ b/storage/xtradb/row/row0mysql.cc @@ -4894,6 +4894,7 @@ row_rename_table_for_mysql( pars_info_t* info = NULL; int retry; bool aux_fts_rename = false; + char* is_part = NULL; ut_a(old_name != NULL); ut_a(new_name != NULL); @@ -4931,6 +4932,55 @@ row_rename_table_for_mysql( table = dict_table_open_on_name(old_name, dict_locked, FALSE, DICT_ERR_IGNORE_NONE); + /* We look for pattern #P# to see if the table is partitioned + MySQL table. */ +#ifdef __WIN__ + is_part = strstr((char *)old_name, (char *)"#p#"); +#else + is_part = strstr((char *)old_name, (char *)"#P#"); +#endif /* __WIN__ */ + + /* MySQL partition engine hard codes the file name + separator as "#P#". The text case is fixed even if + lower_case_table_names is set to 1 or 2. This is true + for sub-partition names as well. InnoDB always + normalises file names to lower case on Windows, this + can potentially cause problems when copying/moving + tables between platforms. + + 1) If boot against an installation from Windows + platform, then its partition table name could + be all be in lower case in system tables. So we + will need to check lower case name when load table. + + 2) If we boot an installation from other case + sensitive platform in Windows, we might need to + check the existence of table name without lowering + case them in the system table. */ + if (!table && + is_part && + innobase_get_lower_case_table_names() == 1) { + char par_case_name[MAX_FULL_NAME_LEN + 1]; +#ifndef __WIN__ + /* Check for the table using lower + case name, including the partition + separator "P" */ + memcpy(par_case_name, old_name, + strlen(old_name)); + par_case_name[strlen(old_name)] = 0; + innobase_casedn_str(par_case_name); +#else + /* On Windows platfrom, check + whether there exists table name in + system table whose name is + not being normalized to lower case */ + normalize_table_name_low( + par_case_name, old_name, FALSE); +#endif + table = dict_table_open_on_name(par_case_name, dict_locked, FALSE, + DICT_ERR_IGNORE_NONE); + } + if (!table) { err = DB_TABLE_NOT_FOUND; ut_print_timestamp(stderr); diff --git a/storage/xtradb/srv/srv0mon.cc b/storage/xtradb/srv/srv0mon.cc index 597e7cadc6a..e72868c6450 100644 --- a/storage/xtradb/srv/srv0mon.cc +++ b/storage/xtradb/srv/srv0mon.cc @@ -2,7 +2,7 @@ Copyright (c) 2010, 2014, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2016, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -715,24 +715,6 @@ static monitor_info_t innodb_counter_info[] = MONITOR_EXISTING | MONITOR_DEFAULT_ON), MONITOR_DEFAULT_START, MONITOR_OVLD_OS_LOG_PENDING_WRITES}, - {"os_merge_blocks_written", "os", - "Number of merge blocks written (innodb_os_merge_blocks_written)", - static_cast<monitor_type_t>( - MONITOR_EXISTING | MONITOR_DEFAULT_ON), - MONITOR_DEFAULT_START, MONITOR_MERGE_BLOCKS_WRITTEN}, - - {"os_merge_blocks_read", "os", - "Number of merge blocks read (innodb_os_merge_blocks_read)", - static_cast<monitor_type_t>( - MONITOR_EXISTING | MONITOR_DEFAULT_ON), - MONITOR_DEFAULT_START, MONITOR_MERGE_BLOCKS_READ}, - - {"os_merge_blocks_merged", "os", - "Number of merge blocks merged (innodb_os_merge_blocks_merged)", - static_cast<monitor_type_t>( - MONITOR_EXISTING | MONITOR_DEFAULT_ON), - MONITOR_DEFAULT_START, MONITOR_MERGE_BLOCKS_MERGED}, - /* ========== Counters for Transaction Module ========== */ {"module_trx", "transaction", "Transaction Manager", MONITOR_MODULE, @@ -1790,21 +1772,6 @@ srv_mon_process_existing_counter( update_min = TRUE; break; - /* innodb_os_merge_blocks_written */ - case MONITOR_MERGE_BLOCKS_WRITTEN: - value = srv_stats.merge_buffers_written; - break; - - /* innodb_os_merge_blocks_read */ - case MONITOR_MERGE_BLOCKS_READ: - value = srv_stats.merge_buffers_read; - break; - - /* innodb_os_merge_blocks_merged */ - case MONITOR_MERGE_BLOCKS_MERGED: - value = srv_stats.merge_buffers_merged; - break; - /* innodb_log_waits */ case MONITOR_OVLD_LOG_WAITS: value = srv_stats.log_waits; diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index 2164451225b..794b119a090 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -3,7 +3,7 @@ Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2015, MariaDB Corporation. +Copyright (c) 2013, 2014, SkySQL Ab. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -2034,10 +2034,6 @@ srv_export_innodb_status(void) } #endif /* UNIV_DEBUG */ - export_vars.innodb_merge_buffers_written = srv_stats.merge_buffers_written; - export_vars.innodb_merge_buffers_read = srv_stats.merge_buffers_read; - export_vars.innodb_merge_buffers_merged = srv_stats.merge_buffers_merged; - export_vars.innodb_sec_rec_cluster_reads = srv_stats.n_sec_rec_cluster_reads; export_vars.innodb_sec_rec_cluster_reads_avoided = diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc index e0f9bde63fa..17f9e53e76f 100644 --- a/storage/xtradb/srv/srv0start.cc +++ b/storage/xtradb/srv/srv0start.cc @@ -188,6 +188,9 @@ static const ulint SRV_UNDO_TABLESPACE_SIZE_IN_PAGES = #define SRV_N_PENDING_IOS_PER_THREAD OS_AIO_N_PENDING_IOS_PER_THREAD #define SRV_MAX_N_PENDING_SYNC_IOS 100 +/** The round off to MB is similar as done in srv_parse_megabytes() */ +#define CALC_NUMBER_OF_PAGES(size) ((size) / (1024 * 1024)) * \ + ((1024 * 1024) / (UNIV_PAGE_SIZE)) #ifdef UNIV_PFS_THREAD /* Keys to register InnoDB threads with performance schema */ UNIV_INTERN mysql_pfs_key_t io_handler_thread_key; @@ -1020,10 +1023,16 @@ open_or_create_data_files( size_check: size = os_file_get_size(files[i]); ut_a(size != (os_offset_t) -1); - /* Round size downward to megabytes */ - rounded_size_pages = (ulint) - (size >> UNIV_PAGE_SIZE_SHIFT); + /* Under some error conditions like disk full + narios or file size reaching filesystem + limit the data file could contain an incomplete + extent at the end. When we extend a data file + and if some failure happens, then also the data + file could contain an incomplete extent. So we + need to round the size downward to a megabyte.*/ + + rounded_size_pages = (ulint) CALC_NUMBER_OF_PAGES(size); if (i == srv_n_data_files - 1 && srv_auto_extend_last_data_file) { diff --git a/storage/xtradb/sync/sync0sync.cc b/storage/xtradb/sync/sync0sync.cc index 3facb99ac0a..702dd240f16 100644 --- a/storage/xtradb/sync/sync0sync.cc +++ b/storage/xtradb/sync/sync0sync.cc @@ -1657,34 +1657,49 @@ sync_print_wait_info( /*=================*/ FILE* file) /*!< in: file where to print */ { + // Sum counter values once + ib_int64_t mutex_spin_wait_count_val + = static_cast<ib_int64_t>(mutex_spin_wait_count); + ib_int64_t mutex_spin_round_count_val + = static_cast<ib_int64_t>(mutex_spin_round_count); + ib_int64_t mutex_os_wait_count_val + = static_cast<ib_int64_t>(mutex_os_wait_count); + ib_int64_t rw_s_spin_wait_count_val + = static_cast<ib_int64_t>(rw_lock_stats.rw_s_spin_wait_count); + ib_int64_t rw_s_spin_round_count_val + = static_cast<ib_int64_t>(rw_lock_stats.rw_s_spin_round_count); + ib_int64_t rw_s_os_wait_count_val + = static_cast<ib_int64_t>(rw_lock_stats.rw_s_os_wait_count); + ib_int64_t rw_x_spin_wait_count_val + = static_cast<ib_int64_t>(rw_lock_stats.rw_x_spin_wait_count); + ib_int64_t rw_x_spin_round_count_val + = static_cast<ib_int64_t>(rw_lock_stats.rw_x_spin_round_count); + ib_int64_t rw_x_os_wait_count_val + = static_cast<ib_int64_t>(rw_lock_stats.rw_x_os_wait_count); + fprintf(file, - "Mutex spin waits " UINT64PF ", rounds " UINT64PF ", " - "OS waits " UINT64PF "\n" - "RW-shared spins " UINT64PF ", rounds " UINT64PF ", " - "OS waits " UINT64PF "\n" - "RW-excl spins " UINT64PF ", rounds " UINT64PF ", " - "OS waits " UINT64PF "\n", - (ib_uint64_t) mutex_spin_wait_count, - (ib_uint64_t) mutex_spin_round_count, - (ib_uint64_t) mutex_os_wait_count, - (ib_uint64_t) rw_lock_stats.rw_s_spin_wait_count, - (ib_uint64_t) rw_lock_stats.rw_s_spin_round_count, - (ib_uint64_t) rw_lock_stats.rw_s_os_wait_count, - (ib_uint64_t) rw_lock_stats.rw_x_spin_wait_count, - (ib_uint64_t) rw_lock_stats.rw_x_spin_round_count, - (ib_uint64_t) rw_lock_stats.rw_x_os_wait_count); + "Mutex spin waits " INT64PF ", rounds " INT64PF ", " + "OS waits " INT64PF "\n" + "RW-shared spins " INT64PF ", rounds " INT64PF ", " + "OS waits " INT64PF "\n" + "RW-excl spins " INT64PF ", rounds " INT64PF ", " + "OS waits " INT64PF "\n", + mutex_spin_wait_count_val, mutex_spin_round_count_val, + mutex_os_wait_count_val, + rw_s_spin_wait_count_val, rw_s_spin_round_count_val, + rw_s_os_wait_count_val, + rw_x_spin_wait_count_val, rw_x_spin_round_count_val, + rw_x_os_wait_count_val); fprintf(file, "Spin rounds per wait: %.2f mutex, %.2f RW-shared, " "%.2f RW-excl\n", - (double) mutex_spin_round_count / - (mutex_spin_wait_count ? mutex_spin_wait_count : 1), - (double) rw_lock_stats.rw_s_spin_round_count / - (rw_lock_stats.rw_s_spin_wait_count - ? rw_lock_stats.rw_s_spin_wait_count : 1), - (double) rw_lock_stats.rw_x_spin_round_count / - (rw_lock_stats.rw_x_spin_wait_count - ? rw_lock_stats.rw_x_spin_wait_count : 1)); + (double) mutex_spin_round_count_val / + (mutex_spin_wait_count_val ? mutex_spin_wait_count_val : 1LL), + (double) rw_s_spin_round_count_val / + (rw_s_spin_wait_count_val ? rw_s_spin_wait_count_val : 1LL), + (double) rw_x_spin_round_count_val / + (rw_x_spin_wait_count_val ? rw_x_spin_wait_count_val : 1LL)); } /*******************************************************************//** |