summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2016-03-28 22:18:38 +0300
committerSergei Petrunia <psergey@askmonty.org>2016-03-28 22:18:38 +0300
commit2bd4dc38e0d5eb257e2e29413dd01239ce075d42 (patch)
treedad0557b1d927d012aebd1c36c8c3e00462adcb1 /storage
parent44fdb56c977259b2801c612116813beda403df78 (diff)
parent3df261dc31ab18ee1537f327b07320b0a07fb8f5 (diff)
downloadmariadb-git-2bd4dc38e0d5eb257e2e29413dd01239ce075d42.tar.gz
Merge branch '10.2' into bb-10.2-mdev9543
Diffstat (limited to 'storage')
-rw-r--r--storage/archive/ha_archive.cc2
-rw-r--r--storage/connect/catalog.h6
-rw-r--r--storage/connect/ha_connect.cc71
-rw-r--r--storage/connect/json.cpp2
-rw-r--r--storage/connect/jsonudf.cpp59
-rw-r--r--storage/connect/jsonudf.h6
-rw-r--r--storage/connect/mycat.cc31
-rw-r--r--storage/connect/mycat.h10
-rw-r--r--storage/connect/mysql-test/connect/r/infoschema-9739.result12
-rw-r--r--storage/connect/mysql-test/connect/r/json_udf.result4
-rw-r--r--storage/connect/mysql-test/connect/r/odbc.result20
-rw-r--r--storage/connect/mysql-test/connect/r/odbc_oracle.result68
-rw-r--r--storage/connect/mysql-test/connect/r/odbc_postgresql.result20
-rw-r--r--storage/connect/mysql-test/connect/r/odbc_sqlite3.result4810
-rw-r--r--storage/connect/mysql-test/connect/r/odbc_sqlite3_grant.result2
-rw-r--r--storage/connect/mysql-test/connect/r/odbc_xls.result8
-rw-r--r--storage/connect/mysql-test/connect/r/tbl.result45
-rw-r--r--storage/connect/mysql-test/connect/t/infoschema-9739.test9
-rw-r--r--storage/connect/mysql-test/connect/t/json_udf.inc2
-rw-r--r--storage/connect/mysql-test/connect/t/json_udf.test3
-rw-r--r--storage/connect/mysql-test/connect/t/json_udf2.inc2
-rw-r--r--storage/connect/mysql-test/connect/t/tbl.test45
-rw-r--r--storage/connect/odbconn.cpp61
-rw-r--r--storage/connect/plgcnx.h2
-rw-r--r--storage/connect/reldef.cpp13
-rw-r--r--storage/connect/reldef.h12
-rw-r--r--storage/connect/tabdos.cpp2
-rw-r--r--storage/connect/table.cpp10
-rw-r--r--storage/connect/tabmysql.cpp4
-rw-r--r--storage/connect/tabodbc.cpp26
-rw-r--r--storage/connect/tabpivot.cpp4
-rw-r--r--storage/connect/tabtbl.cpp10
-rw-r--r--storage/connect/tabtbl.h3
-rw-r--r--storage/connect/tabutil.cpp25
-rw-r--r--storage/connect/valblk.h3
-rw-r--r--storage/connect/value.cpp33
-rw-r--r--storage/csv/ha_tina.h2
-rw-r--r--storage/federated/ha_federated.cc2
-rw-r--r--storage/federatedx/ha_federatedx.cc2
-rw-r--r--storage/innobase/btr/btr0btr.cc4
-rw-r--r--storage/innobase/buf/buf0buf.cc45
-rw-r--r--storage/innobase/buf/buf0dump.cc25
-rw-r--r--storage/innobase/dict/dict0boot.cc33
-rw-r--r--storage/innobase/dict/dict0dict.cc2
-rw-r--r--storage/innobase/dict/dict0stats.cc19
-rw-r--r--storage/innobase/fil/fil0crypt.cc78
-rw-r--r--storage/innobase/fil/fil0fil.cc8
-rw-r--r--storage/innobase/fts/fts0fts.cc2
-rw-r--r--storage/innobase/fts/fts0opt.cc13
-rw-r--r--storage/innobase/handler/ha_innodb.cc261
-rw-r--r--storage/innobase/handler/handler0alter.cc76
-rw-r--r--storage/innobase/handler/i_s.cc77
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc23
-rw-r--r--storage/innobase/include/fil0crypt.h8
-rw-r--r--storage/innobase/include/fil0fil.ic4
-rw-r--r--storage/innobase/include/fts0priv.ic4
-rw-r--r--storage/innobase/include/ha_prototypes.h27
-rw-r--r--storage/innobase/include/ibuf0ibuf.h6
-rw-r--r--storage/innobase/include/log0recv.h12
-rw-r--r--storage/innobase/include/os0file.h36
-rw-r--r--storage/innobase/include/row0log.h5
-rw-r--r--storage/innobase/include/row0merge.h31
-rw-r--r--storage/innobase/include/srv0mon.h5
-rw-r--r--storage/innobase/include/srv0srv.h14
-rw-r--r--storage/innobase/include/univ.i2
-rw-r--r--storage/innobase/lock/lock0lock.cc2
-rw-r--r--storage/innobase/lock/lock0wait.cc39
-rw-r--r--storage/innobase/log/log0crypt.cc41
-rw-r--r--storage/innobase/log/log0log.cc21
-rw-r--r--storage/innobase/log/log0recv.cc32
-rw-r--r--storage/innobase/os/os0file.cc85
-rw-r--r--storage/innobase/row/row0ftsort.cc18
-rw-r--r--storage/innobase/row/row0log.cc46
-rw-r--r--storage/innobase/row/row0merge.cc330
-rw-r--r--storage/innobase/row/row0mysql.cc50
-rw-r--r--storage/innobase/srv/srv0mon.cc35
-rw-r--r--storage/innobase/srv/srv0srv.cc38
-rw-r--r--storage/innobase/srv/srv0start.cc8
-rw-r--r--storage/innobase/sync/sync0sync.cc8
-rw-r--r--storage/innobase/ut/crc32_power8/crc32.S51
-rw-r--r--storage/maria/ma_bitmap.c17
-rw-r--r--storage/maria/ma_check.c14
-rw-r--r--storage/maria/ma_crypt.c69
-rw-r--r--storage/maria/ma_packrec.c2
-rw-r--r--storage/maria/ma_pagecache.c41
-rw-r--r--storage/maria/ma_sort.c62
-rw-r--r--storage/maria/maria_def.h1
-rw-r--r--storage/mroonga/mrn_table.cpp13
-rw-r--r--storage/mroonga/vendor/groonga/lib/com.c4
-rw-r--r--storage/mroonga/vendor/groonga/lib/grn_com.h6
-rw-r--r--storage/myisam/ha_myisam.cc4
-rw-r--r--storage/myisam/mi_packrec.c2
-rw-r--r--storage/myisam/myisamlog.c2
-rw-r--r--storage/myisam/sort.c64
-rw-r--r--storage/oqgraph/graphcore.cc6
-rw-r--r--storage/oqgraph/ha_oqgraph.cc7
-rw-r--r--storage/oqgraph/mysql-test/oqgraph/general.inc2
-rw-r--r--storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.result86
-rw-r--r--storage/oqgraph/mysql-test/oqgraph/regression_mdev5871.test121
-rw-r--r--storage/perfschema/ha_perfschema.cc2
-rw-r--r--storage/perfschema/pfs.cc4
-rw-r--r--storage/perfschema/table_session_connect.cc5
-rw-r--r--storage/sequence/mysql-test/sequence/group_by.result8
-rw-r--r--storage/sequence/mysql-test/sequence/group_by.test7
-rw-r--r--storage/sequence/sequence.cc6
-rw-r--r--storage/sphinx/ha_sphinx.cc12
-rw-r--r--storage/sphinx/mysql-test/sphinx/sphinx.result33
-rw-r--r--storage/sphinx/mysql-test/sphinx/sphinx.test9
-rw-r--r--storage/sphinx/mysql-test/sphinx/testdata.xml9
-rw-r--r--storage/spider/spd_conn.cc18
-rw-r--r--storage/spider/spd_copy_tables.cc20
-rw-r--r--storage/spider/spd_db_conn.cc6
-rw-r--r--storage/spider/spd_db_mysql.cc14
-rw-r--r--storage/spider/spd_direct_sql.cc20
-rw-r--r--storage/spider/spd_table.cc38
-rw-r--r--storage/spider/spd_trx.cc3
-rw-r--r--storage/tokudb/CMakeLists.txt13
-rw-r--r--storage/tokudb/PerconaFT/buildheader/CMakeLists.txt4
-rw-r--r--storage/tokudb/PerconaFT/cmake_modules/TokuFeatureDetection.cmake2
-rw-r--r--storage/tokudb/mysql-test/tokudb/r/cluster_filter_unpack_varchar_hidden.result4
-rw-r--r--storage/tokudb/mysql-test/tokudb/t/change_column_bin.py1
-rw-r--r--storage/tokudb/mysql-test/tokudb/t/change_column_bin.test1
-rw-r--r--storage/tokudb/mysql-test/tokudb/t/change_column_char.py1
-rw-r--r--storage/tokudb/mysql-test/tokudb/t/change_column_char.test1
-rw-r--r--storage/tokudb/mysql-test/tokudb/t/cluster_filter_unpack_varchar_hidden.test4
-rw-r--r--storage/xtradb/btr/btr0btr.cc24
-rw-r--r--storage/xtradb/btr/btr0cur.cc4
-rw-r--r--storage/xtradb/buf/buf0buf.cc47
-rw-r--r--storage/xtradb/buf/buf0flu.cc22
-rw-r--r--storage/xtradb/dict/dict0boot.cc33
-rw-r--r--storage/xtradb/dict/dict0dict.cc42
-rw-r--r--storage/xtradb/fil/fil0crypt.cc78
-rw-r--r--storage/xtradb/fil/fil0fil.cc164
-rw-r--r--storage/xtradb/fsp/fsp0fsp.cc26
-rw-r--r--storage/xtradb/fts/fts0fts.cc2
-rw-r--r--storage/xtradb/fts/fts0opt.cc2
-rw-r--r--storage/xtradb/handler/ha_innodb.cc101
-rw-r--r--storage/xtradb/handler/handler0alter.cc192
-rw-r--r--storage/xtradb/handler/i_s.cc81
-rw-r--r--storage/xtradb/handler/xtradb_i_s.cc6
-rw-r--r--storage/xtradb/ibuf/ibuf0ibuf.cc23
-rw-r--r--storage/xtradb/include/buf0flu.h2
-rw-r--r--storage/xtradb/include/fil0crypt.h8
-rw-r--r--storage/xtradb/include/fil0fil.h43
-rw-r--r--storage/xtradb/include/fil0fil.ic4
-rw-r--r--storage/xtradb/include/fts0priv.ic4
-rw-r--r--storage/xtradb/include/ha_prototypes.h14
-rw-r--r--storage/xtradb/include/ibuf0ibuf.h6
-rw-r--r--storage/xtradb/include/log0recv.h3
-rw-r--r--storage/xtradb/include/row0merge.h5
-rw-r--r--storage/xtradb/include/srv0mon.h5
-rw-r--r--storage/xtradb/include/srv0srv.h12
-rw-r--r--storage/xtradb/include/univ.i4
-rw-r--r--storage/xtradb/lock/lock0wait.cc4
-rw-r--r--storage/xtradb/log/log0crypt.cc41
-rw-r--r--storage/xtradb/log/log0log.cc36
-rw-r--r--storage/xtradb/log/log0online.cc2
-rw-r--r--storage/xtradb/log/log0recv.cc41
-rw-r--r--storage/xtradb/os/os0file.cc24
-rw-r--r--storage/xtradb/row/row0import.cc16
-rw-r--r--storage/xtradb/row/row0log.cc17
-rw-r--r--storage/xtradb/row/row0merge.cc157
-rw-r--r--storage/xtradb/row/row0mysql.cc50
-rw-r--r--storage/xtradb/row/row0sel.cc6
-rw-r--r--storage/xtradb/srv/srv0mon.cc35
-rw-r--r--storage/xtradb/srv/srv0srv.cc6
-rw-r--r--storage/xtradb/srv/srv0start.cc17
-rw-r--r--storage/xtradb/sync/sync0sync.cc69
-rw-r--r--storage/xtradb/ut/crc32_power8/crc32.S51
169 files changed, 5549 insertions, 3823 deletions
diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc
index bbce62e0641..c322c8eee54 100644
--- a/storage/archive/ha_archive.cc
+++ b/storage/archive/ha_archive.cc
@@ -56,7 +56,7 @@
meta file is first opened it is marked as dirty. It is opened when the table
itself is opened for writing. When the table is closed the new count for rows
is written to the meta file and the file is marked as clean. If the meta file
- is opened and it is marked as dirty, it is assumed that a crash occured. At
+ is opened and it is marked as dirty, it is assumed that a crash occurred. At
this point an error occurs and the user is told to rebuild the file.
A rebuild scans the rows and rewrites the meta file. If corruption is found
in the data file then the meta file is not repaired.
diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h
index 6488b513ba9..70304c410cc 100644
--- a/storage/connect/catalog.h
+++ b/storage/connect/catalog.h
@@ -77,8 +77,8 @@ class DllExport CATALOG {
virtual bool ClearName(PGLOBAL, PSZ) {return true;}
virtual PRELDEF MakeOneTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;}
virtual PRELDEF GetTableDescEx(PGLOBAL, PTABLE) {return NULL;}
- virtual PRELDEF GetTableDesc(PGLOBAL, LPCSTR, LPCSTR,
- PRELDEF* = NULL) {return NULL;}
+ //virtual PRELDEF GetTableDesc(PGLOBAL, LPCSTR, LPCSTR,
+ // PRELDEF* = NULL) {return NULL;}
virtual PRELDEF GetFirstTable(PGLOBAL) {return NULL;}
virtual PRELDEF GetNextTable(PGLOBAL) {return NULL;}
virtual bool TestCond(PGLOBAL, const char*, const char*) {return true;}
@@ -95,7 +95,7 @@ class DllExport CATALOG {
protected:
virtual bool ClearSection(PGLOBAL, const char*, const char*) {return true;}
- virtual PRELDEF MakeTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;}
+ //virtual PRELDEF MakeTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;}
// Members
char *Cbuf; /* Buffer used for col section */
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 04926228aa4..d96d7455d8b 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,9 +169,9 @@
#define JSONMAX 10 // JSON Default max grp size
extern "C" {
- char version[]= "Version 1.04.0005 December 11, 2015";
+ char version[]= "Version 1.04.0006 March 12, 2016";
#if defined(__WIN__)
- char compver[]= "Version 1.04.0005 " __DATE__ " " __TIME__;
+ char compver[]= "Version 1.04.0006 " __DATE__ " " __TIME__;
char slash= '\\';
#else // !__WIN__
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)));
@@ -5156,7 +5159,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
fncn= topt->catfunc;
fnc= GetFuncID(fncn);
sep= topt->separator;
- spc= (!sep) ? ',' : (!strcmp(sep, "\\t")) ? '\t' : *sep;
+ spc= (!sep) ? ',' : *sep;
qch= topt->qchar ? *topt->qchar : (signed)topt->quoted >= 0 ? '"' : 0;
hdr= (int)topt->header;
tbl= topt->tablist;
@@ -5223,7 +5226,6 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
goto err;
} // endif rc
-
if (!tab) {
if (ttp == TAB_TBL) {
// Make tab the first table of the list
@@ -5292,8 +5294,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
case TAB_CSV:
if (!fn && fnc != FNC_NO)
sprintf(g->Message, "Missing %s file name", topt->type);
- else
- ok= true;
+ else if (sep && strlen(sep) > 1)
+ sprintf(g->Message, "Invalid separator %s", sep);
+ else
+ ok= true;
break;
case TAB_MYSQL:
@@ -5512,6 +5516,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 +5524,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 +5583,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 +5676,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)
@@ -5973,7 +5978,19 @@ int ha_connect::create(const char *name, TABLE *table_arg,
DBUG_RETURN(rc);
} // endif lrecl
- } // endif type
+ } // endif type JSON
+
+ if (type == TAB_CSV) {
+ const char *sep = options->separator;
+
+ if (sep && strlen(sep) > 1) {
+ sprintf(g->Message, "Invalid separator %s", sep);
+ my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
+ rc= HA_ERR_INTERNAL_ERROR;
+ DBUG_RETURN(rc);
+ } // endif sep
+
+ } // endif type CSV
// Check column types
for (field= table_arg->field; *field; field++) {
@@ -6761,7 +6778,7 @@ maria_declare_plugin(connect)
0x0104, /* version number (1.04) */
NULL, /* status variables */
connect_system_variables, /* system variables */
- "1.04.0005", /* string version */
- MariaDB_PLUGIN_MATURITY_BETA /* maturity */
+ "1.04.0006", /* string version */
+ MariaDB_PLUGIN_MATURITY_GAMMA /* maturity */
}
maria_declare_plugin_end;
diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp
index fc7edb84c0f..d99a021cdc9 100644
--- a/storage/connect/json.cpp
+++ b/storage/connect/json.cpp
@@ -594,7 +594,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty)
if (fs) {
fputs(EL, fs);
fclose(fs);
- str = (err) ? NULL : "Ok";
+ str = (err) ? NULL : strcpy(g->Message, "Ok");
} else if (!err) {
str = ((JOUTSTR*)jp)->Strp;
jp->WriteChr('\0');
diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp
index 40685ae0f0e..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)
@@ -3365,7 +3414,7 @@ my_bool jsoncontains_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
long long jsoncontains(UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long *res_length, char *is_null, char *error)
{
- char *p, res[256];
+ char *p __attribute__((unused)), res[256];
long long n;
unsigned long reslen;
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/mycat.cc b/storage/connect/mycat.cc
index 2e9085b4c87..97ad980dd6a 100644
--- a/storage/connect/mycat.cc
+++ b/storage/connect/mycat.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
@@ -18,7 +18,7 @@
/* ------------- */
/* Version 1.4 */
/* */
-/* Author: Olivier Bertrand 2012 - 2015 */
+/* Author: Olivier Bertrand 2012 - 2016 */
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
@@ -509,30 +509,33 @@ void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path)
/* GetTableDesc: retrieve a table descriptor. */
/* Look for a table descriptor matching the name and type. */
/***********************************************************************/
-PRELDEF MYCAT::GetTableDesc(PGLOBAL g, LPCSTR name,
+PRELDEF MYCAT::GetTableDesc(PGLOBAL g, PTABLE tablep,
LPCSTR type, PRELDEF *)
{
if (trace)
- printf("GetTableDesc: name=%s am=%s\n", name, SVP(type));
+ printf("GetTableDesc: name=%s am=%s\n", tablep->GetName(), SVP(type));
// If not specified get the type of this table
if (!type)
type= Hc->GetStringOption("Type","*");
- return MakeTableDesc(g, name, type);
+ return MakeTableDesc(g, tablep, type);
} // end of GetTableDesc
/***********************************************************************/
/* MakeTableDesc: make a table/view description. */
/* Note: caller must check if name already exists before calling it. */
/***********************************************************************/
-PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am)
+PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
{
TABTYPE tc;
+ LPCSTR name = (PSZ)PlugDup(g, tablep->GetName());
+ LPCSTR schema = (PSZ)PlugDup(g, tablep->GetSchema());
PRELDEF tdp= NULL;
if (trace)
- printf("MakeTableDesc: name=%s am=%s\n", name, SVP(am));
+ printf("MakeTableDesc: name=%s schema=%s am=%s\n",
+ name, SVP(schema), SVP(am));
/*********************************************************************/
/* Get a unique enum identifier for types. */
@@ -571,11 +574,11 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am)
case TAB_VIR: tdp= new(g) VIRDEF; break;
case TAB_JSON: tdp= new(g) JSONDEF; break;
default:
- sprintf(g->Message, MSG(BAD_TABLE_TYPE), am, name);
+ sprintf(g->Message, MSG(BAD_TABLE_TYPE), am, name);
} // endswitch
// Do make the table/view definition
- if (tdp && tdp->Define(g, this, name, am))
+ if (tdp && tdp->Define(g, this, name, schema, am))
tdp= NULL;
return tdp;
@@ -588,20 +591,20 @@ PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode, LPCSTR type)
{
PRELDEF tdp;
PTDB tdbp= NULL;
- LPCSTR name= tablep->GetName();
+// LPCSTR name= tablep->GetName();
if (trace)
- printf("GetTableDB: name=%s\n", name);
+ printf("GetTableDB: name=%s\n", tablep->GetName());
// Look for the description of the requested table
- tdp= GetTableDesc(g, name, type);
+ tdp= GetTableDesc(g, tablep, type);
if (tdp) {
if (trace)
printf("tdb=%p type=%s\n", tdp, tdp->GetType());
- if (tablep->GetQualifier())
- tdp->Database = SetPath(g, tablep->GetQualifier());
+ if (tablep->GetSchema())
+ tdp->Database = SetPath(g, tablep->GetSchema());
tdbp= tdp->GetTable(g, mode);
} // endif tdp
diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h
index dfcbb2f6766..05163f08f1b 100644
--- a/storage/connect/mycat.h
+++ b/storage/connect/mycat.h
@@ -100,15 +100,17 @@ class MYCAT : public CATALOG {
//void SetDataPath(PGLOBAL g, const char *path)
// {SetPath(g, &DataPath, path);}
bool StoreIndex(PGLOBAL, PTABDEF) {return false;} // Temporary
- PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name,
- LPCSTR type, PRELDEF *prp = NULL);
+// PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name,
+ PRELDEF GetTableDesc(PGLOBAL g, PTABLE tablep,
+ LPCSTR type, PRELDEF *prp = NULL);
PTDB GetTable(PGLOBAL g, PTABLE tablep,
MODE mode = MODE_READ, LPCSTR type = NULL);
void ClearDB(PGLOBAL g);
protected:
- PRELDEF MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am);
-//void SetPath(PGLOBAL g, LPCSTR *datapath, const char *path);
+// PRELDEF MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am);
+ PRELDEF MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am);
+ //void SetPath(PGLOBAL g, LPCSTR *datapath, const char *path);
// Members
ha_connect *Hc; // The Connect handler
diff --git a/storage/connect/mysql-test/connect/r/infoschema-9739.result b/storage/connect/mysql-test/connect/r/infoschema-9739.result
new file mode 100644
index 00000000000..bcebec1d0e0
--- /dev/null
+++ b/storage/connect/mysql-test/connect/r/infoschema-9739.result
@@ -0,0 +1,12 @@
+Warnings:
+Warning 1105 No file name. Table will use t1.xml
+create table t1 (i int) engine=Connect table_type=XML;
+Warnings:
+Warning 1105 No file name. Table will use t1.xml
+select * from information_schema.tables where create_options like '%table_type=XML%';
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
+Warnings:
+Warning 1286 Unknown storage engine 'InnoDB'
+Warning 1286 Unknown storage engine 'InnoDB'
+Warning 1296 Got error 174 'File t1.xml not found' from CONNECT
+drop table t1;
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/r/tbl.result b/storage/connect/mysql-test/connect/r/tbl.result
index bc77516c22d..f51b4dfa57f 100644
--- a/storage/connect/mysql-test/connect/r/tbl.result
+++ b/storage/connect/mysql-test/connect/r/tbl.result
@@ -44,8 +44,8 @@ ta message
1 Testing
2 myisam table
3 t4
-CREATE TABLE total (tabname CHAR(8) NOT NULL SPECIAL='TABID', ta TINYINT NOT NULL FLAG=1, message CHAR(20)) engine=CONNECT table_type=TBL table_list='t1,t2,t3,t4' option_list='port=PORT';
-select * from total;
+CREATE TABLE total (tabname CHAR(8) NOT NULL SPECIAL='TABID', ta TINYINT NOT NULL FLAG=1, message CHAR(20)) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3,t4' OPTION_LIST='port=PORT';
+SELECT * FROM total;
tabname ta message
t1 1 Testing
t1 2 dos table
@@ -59,15 +59,15 @@ t3 3 t3
t4 1 Testing
t4 2 myisam table
t4 3 t4
-select * from total where tabname = 't2';
+SELECT * FROM total WHERE tabname = 't2';
tabname ta message
t2 1 Testing
t2 2 NULL
t2 3 t2
-select * from total where tabname = 't2' and ta = 3;
+SELECT * FROM total WHERE tabname = 't2' AND ta = 3;
tabname ta message
t2 3 t2
-select * from total where tabname in ('t1','t4');
+SELECT * FROM total WHERE tabname IN ('t1','t4');
tabname ta message
t1 1 Testing
t1 2 dos table
@@ -75,11 +75,11 @@ t1 3 t1
t4 1 Testing
t4 2 myisam table
t4 3 t4
-select * from total where ta = 3 and tabname in ('t1','t2');
+SELECT * FROM total WHERE ta = 3 AND tabname IN ('t1','t2');
tabname ta message
t1 3 t1
t2 3 t2
-select * from total where tabname <> 't2';
+SELECT * FROM total WHERE tabname <> 't2';
tabname ta message
t1 1 Testing
t1 2 dos table
@@ -90,12 +90,12 @@ t3 3 t3
t4 1 Testing
t4 2 myisam table
t4 3 t4
-select * from total where tabname != 't2' and ta = 3;
+SELECT * FROM total WHERE tabname != 't2' AND ta = 3;
tabname ta message
t1 3 t1
t3 3 t3
t4 3 t4
-select * from total where tabname not in ('t2','t3');
+SELECT * FROM total WHERE tabname NOT IN ('t2','t3');
tabname ta message
t1 1 Testing
t1 2 dos table
@@ -103,11 +103,11 @@ t1 3 t1
t4 1 Testing
t4 2 myisam table
t4 3 t4
-select * from total where ta = 3 and tabname in ('t2','t3');
+SELECT * FROM total WHERE ta = 3 AND tabname IN ('t2','t3');
tabname ta message
t2 3 t2
t3 3 t3
-select * from total where ta = 3 or tabname in ('t2','t4');
+SELECT * FROM total WHERE ta = 3 OR tabname IN ('t2','t4');
tabname ta message
t1 3 t1
t2 1 Testing
@@ -117,7 +117,7 @@ t3 3 t3
t4 1 Testing
t4 2 myisam table
t4 3 t4
-select * from total where not tabname = 't2';
+SELECT * FROM total WHERE NOT tabname = 't2';
tabname ta message
t1 1 Testing
t1 2 dos table
@@ -128,7 +128,7 @@ t3 3 t3
t4 1 Testing
t4 2 myisam table
t4 3 t4
-select * from total where tabname = 't2' or tabname = 't1';
+SELECT * FROM total WHERE tabname = 't2' OR tabname = 't1';
tabname ta message
t1 1 Testing
t1 2 dos table
@@ -141,3 +141,22 @@ DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;
+#
+# Checking thread TBL tables
+#
+CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v';
+SELECT * FROM t1;
+v
+11
+CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v';
+SELECT * FROM t2;
+v
+22
+CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';;
+SELECT * FROM total order by v desc;
+v
+22
+11
+DROP TABLE total;
+DROP TABLE t1;
+DROP TABLE t2;
diff --git a/storage/connect/mysql-test/connect/t/infoschema-9739.test b/storage/connect/mysql-test/connect/t/infoschema-9739.test
new file mode 100644
index 00000000000..e9eb7fb796e
--- /dev/null
+++ b/storage/connect/mysql-test/connect/t/infoschema-9739.test
@@ -0,0 +1,9 @@
+#
+# MDEV-9739 Assertion `m_status == DA_ERROR || m_status == DA_OK' failed in Diagnostics_area::message() ; connect.xml* tests fail in buildbot
+#
+
+--source have_libxml2.inc
+
+create table t1 (i int) engine=Connect table_type=XML;
+select * from information_schema.tables where create_options like '%table_type=XML%';
+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/mysql-test/connect/t/tbl.test b/storage/connect/mysql-test/connect/t/tbl.test
index 43c506c9403..3dc4b2e64b0 100644
--- a/storage/connect/mysql-test/connect/t/tbl.test
+++ b/storage/connect/mysql-test/connect/t/tbl.test
@@ -31,23 +31,40 @@ INSERT INTO t4 (message) VALUES ('Testing'),('myisam table'),('t4');
SELECT * FROM t4;
--replace_result $PORT PORT
---eval CREATE TABLE total (tabname CHAR(8) NOT NULL SPECIAL='TABID', ta TINYINT NOT NULL FLAG=1, message CHAR(20)) engine=CONNECT table_type=TBL table_list='t1,t2,t3,t4' option_list='port=$PORT'
-
-select * from total;
-select * from total where tabname = 't2';
-select * from total where tabname = 't2' and ta = 3;
-select * from total where tabname in ('t1','t4');
-select * from total where ta = 3 and tabname in ('t1','t2');
-select * from total where tabname <> 't2';
-select * from total where tabname != 't2' and ta = 3;
-select * from total where tabname not in ('t2','t3');
-select * from total where ta = 3 and tabname in ('t2','t3');
-select * from total where ta = 3 or tabname in ('t2','t4');
-select * from total where not tabname = 't2';
-select * from total where tabname = 't2' or tabname = 't1';
+--eval CREATE TABLE total (tabname CHAR(8) NOT NULL SPECIAL='TABID', ta TINYINT NOT NULL FLAG=1, message CHAR(20)) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3,t4' OPTION_LIST='port=$PORT'
+
+SELECT * FROM total;
+SELECT * FROM total WHERE tabname = 't2';
+SELECT * FROM total WHERE tabname = 't2' AND ta = 3;
+SELECT * FROM total WHERE tabname IN ('t1','t4');
+SELECT * FROM total WHERE ta = 3 AND tabname IN ('t1','t2');
+SELECT * FROM total WHERE tabname <> 't2';
+SELECT * FROM total WHERE tabname != 't2' AND ta = 3;
+SELECT * FROM total WHERE tabname NOT IN ('t2','t3');
+SELECT * FROM total WHERE ta = 3 AND tabname IN ('t2','t3');
+SELECT * FROM total WHERE ta = 3 OR tabname IN ('t2','t4');
+SELECT * FROM total WHERE NOT tabname = 't2';
+SELECT * FROM total WHERE tabname = 't2' OR tabname = 't1';
DROP TABLE total;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;
+
+--echo #
+--echo # Checking thread TBL tables
+--echo #
+CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v';
+SELECT * FROM t1;
+
+CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v';
+SELECT * FROM t2;
+
+--replace_result $PORT PORT
+--eval CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=$PORT';
+SELECT * FROM total order by v desc;
+
+DROP TABLE total;
+DROP TABLE t1;
+DROP TABLE t2;
diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp
index 1ccdf231970..55ccbdbada1 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)))
@@ -1734,7 +1758,9 @@ bool ODBConn::BindParam(ODBCCOL *colp)
SQLLEN *strlen = colp->GetStrLen();
SQLRETURN rc;
+#if 0
try {
+ // This function is often not or badly implemented by data sources
rc = SQLDescribeParam(m_hstmt, n, &sqlt, &colsize, &dec, &nul);
if (!Check(rc))
@@ -1742,11 +1768,12 @@ bool ODBConn::BindParam(ODBCCOL *colp)
} catch(DBX *x) {
sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0));
+#endif // 0
colsize = colp->GetPrecision();
sqlt = GetSQLType(buftype);
- dec = IsTypeChar(buftype) ? 0 : colp->GetScale();
- nul = SQL_NULLABLE_UNKNOWN;
- } // end try/catch
+ dec = IsTypeNum(buftype) ? colp->GetScale() : 0;
+ nul = colp->IsNullable() ? SQL_NULLABLE : SQL_NO_NULLS;
+//} // end try/catch
buf = colp->GetBuffer(0);
len = IsTypeChar(buftype) ? colp->GetBuflen() : 0;
@@ -2249,7 +2276,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 +2285,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/plgcnx.h b/storage/connect/plgcnx.h
index a1208f9b885..1b341bc5275 100644
--- a/storage/connect/plgcnx.h
+++ b/storage/connect/plgcnx.h
@@ -25,7 +25,7 @@ enum FNRC {RC_LICENSE = 7, /* PLGConnect prompt for license key */
RC_SUCCESS = 0, /* Successful function (must be 0) */
RC_MEMORY = -1, /* Storage allocation error */
RC_TRUNCATED = -2, /* Result has been truncated */
- RC_TIMEOUT = -3, /* Connection timeout occured */
+ RC_TIMEOUT = -3, /* Connection timeout occurred */
RC_TOOBIG = -4, /* Data is too big for connection */
RC_KEY = -5, /* Null ptr to key in Connect */
/* or bad key in other functions */
diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp
index 8f9328c0b2f..e455bc8f1a5 100644
--- a/storage/connect/reldef.cpp
+++ b/storage/connect/reldef.cpp
@@ -1,11 +1,11 @@
/************* RelDef CPP Program Source Code File (.CPP) **************/
/* PROGRAM NAME: RELDEF */
/* ------------- */
-/* Version 1.4 */
+/* Version 1.5 */
/* */
/* COPYRIGHT: */
/* ---------- */
-/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */
+/* (C) Copyright to the author Olivier BERTRAND 2004-2016 */
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
@@ -37,6 +37,7 @@
#include "plgdbsem.h"
#include "reldef.h"
#include "colblk.h"
+#include "tabcol.h"
#include "filamap.h"
#include "filamfix.h"
#include "filamvct.h"
@@ -217,11 +218,13 @@ TABDEF::TABDEF(void)
/***********************************************************************/
/* Define: initialize the table definition block from XDB file. */
/***********************************************************************/
-bool TABDEF::Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am)
+bool TABDEF::Define(PGLOBAL g, PCATLG cat,
+ LPCSTR name, LPCSTR schema, LPCSTR am)
{
int poff = 0;
- Name = (PSZ)PlugDup(g, name);
+ Name = (PSZ)name;
+ Schema = (PSZ)schema;
Cat = cat;
Hc = ((MYCAT*)cat)->GetHandler();
Catfunc = GetFuncID(GetStringCatInfo(g, "Catfunc", NULL));
@@ -569,7 +572,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
} // endif Cbuf
// Here "OEM" should be replace by a more useful value
- if (xdefp->Define(g, cat, Name, "OEM"))
+ if (xdefp->Define(g, cat, Name, Schema, "OEM"))
return NULL;
// Ok, return external block
diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h
index dada5716dbe..bc1bd2ddd74 100644
--- a/storage/connect/reldef.h
+++ b/storage/connect/reldef.h
@@ -1,7 +1,7 @@
/*************** RelDef H Declares Source Code File (.H) ***************/
-/* Name: RELDEF.H Version 1.5 */
+/* Name: RELDEF.H Version 1.6 */
/* */
-/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */
+/* (C) Copyright to the author Olivier BERTRAND 2004-2016 */
/* */
/* This file contains the DEF classes definitions. */
/***********************************************************************/
@@ -50,7 +50,8 @@ class DllExport RELDEF : public BLOCK { // Relation definition block
int GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size);
char *GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef);
virtual int Indexable(void) {return 0;}
- virtual bool Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am) = 0;
+ virtual bool Define(PGLOBAL g, PCATLG cat,
+ LPCSTR name, LPCSTR schema, LPCSTR am) = 0;
virtual PTDB GetTable(PGLOBAL g, MODE mode) = 0;
protected:
@@ -97,8 +98,9 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */
int GetColCatInfo(PGLOBAL g);
void SetIndexInfo(void);
bool DropTable(PGLOBAL g, PSZ name);
- virtual bool Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am);
- virtual bool DefineAM(PGLOBAL, LPCSTR, int) = 0;
+ virtual bool Define(PGLOBAL g, PCATLG cat,
+ LPCSTR name, LPCSTR schema, LPCSTR am);
+ virtual bool DefineAM(PGLOBAL, LPCSTR, int) = 0;
protected:
// Members
diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp
index 7906f6c9219..98633f49d23 100644
--- a/storage/connect/tabdos.cpp
+++ b/storage/connect/tabdos.cpp
@@ -184,7 +184,7 @@ bool DOSDEF::GetOptFileName(PGLOBAL g, char *filename)
} // end of GetOptFileName
/***********************************************************************/
-/* After an optimize error occured, remove all set optimize values. */
+/* After an optimize error occurred, remove all set optimize values. */
/***********************************************************************/
void DOSDEF::RemoveOptValues(PGLOBAL g)
{
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/tabmysql.cpp b/storage/connect/tabmysql.cpp
index 658f3513b07..47497f465e3 100644
--- a/storage/connect/tabmysql.cpp
+++ b/storage/connect/tabmysql.cpp
@@ -334,7 +334,7 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
Delayed = !!GetIntCatInfo("Delayed", 0);
} else {
// MYSQL access from a PROXY table
- Database = GetStringCatInfo(g, "Database", "*");
+ Database = GetStringCatInfo(g, "Database", Schema ? Schema : PlugDup(g, "*"));
Isview = GetBoolCatInfo("View", false);
// We must get other connection parms from the calling table
@@ -806,7 +806,7 @@ int TDBMYSQL::GetMaxSize(PGLOBAL g)
else if (!Cardinality(NULL))
MaxSize = 10; // To make MySQL happy
else if ((MaxSize = Cardinality(g)) < 0)
- MaxSize = 12; // So we can see an error occured
+ MaxSize = 12; // So we can see an error occurred
} // endif MaxSize
diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp
index fd9a049a05a..c555f2a5abb 100644
--- a/storage/connect/tabodbc.cpp
+++ b/storage/connect/tabodbc.cpp
@@ -5,7 +5,7 @@
/* */
/* COPYRIGHT: */
/* ---------- */
-/* (C) Copyright to the author Olivier BERTRAND 2000-2015 */
+/* (C) Copyright to the author Olivier BERTRAND 2000-2016 */
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
@@ -818,7 +818,7 @@ int TDBODBC::GetMaxSize(PGLOBAL g)
else if (!Cardinality(NULL))
MaxSize = 10; // To make MySQL happy
else if ((MaxSize = Cardinality(g)) < 0)
- MaxSize = 12; // So we can see an error occured
+ MaxSize = 12; // So we can see an error occurred
} // endif MaxSize
@@ -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/tabpivot.cpp b/storage/connect/tabpivot.cpp
index b628e26d3c7..256b454741c 100644
--- a/storage/connect/tabpivot.cpp
+++ b/storage/connect/tabpivot.cpp
@@ -348,7 +348,7 @@ bool PIVOTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
return TRUE;
Tabname = (char*)Tablep->GetName();
- DB = (char*)Tablep->GetQualifier();
+ DB = (char*)Tablep->GetSchema();
Tabsrc = (char*)Tablep->GetSrc();
Host = GetStringCatInfo(g, "Host", "localhost");
@@ -529,7 +529,7 @@ bool TDBPIVOT::GetSourceTable(PGLOBAL g)
// Get the new table description block of this source table
PTABLE tablep = new(g) XTAB("whatever", Tabsrc);
- tablep->SetQualifier(Database);
+ tablep->SetSchema(Database);
if (!(Tdbp = GetSubTable(g, tablep, true)))
return true;
diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp
index 7f979eaf4be..36849146746 100644
--- a/storage/connect/tabtbl.cpp
+++ b/storage/connect/tabtbl.cpp
@@ -5,7 +5,7 @@
/* */
/* COPYRIGHT: */
/* ---------- */
-/* (C) Copyright to PlugDB Software Development 2008-2015 */
+/* (C) Copyright to PlugDB Software Development 2008-2016 */
/* Author: Olivier BERTRAND */
/* */
/* WHAT THIS PROGRAM DOES: */
@@ -130,10 +130,10 @@ bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR, int)
// Allocate the TBLIST block for that table
tbl = new(g) XTAB(pn, def);
- tbl->SetQualifier(pdb);
+ tbl->SetSchema(pdb);
if (trace)
- htrc("TBL: Name=%s db=%s\n", tbl->GetName(), tbl->GetQualifier());
+ htrc("TBL: Name=%s db=%s\n", tbl->GetName(), tbl->GetSchema());
// Link the blocks
if (Tablep)
@@ -607,7 +607,7 @@ void TDBTBM::ResetDB(void)
for (PTABLE tabp = Tablist; tabp; tabp = tabp->GetNext())
((PTDBASE)tabp->GetTo_Tdb())->ResetDB();
- Tdbp = (PTDBASE)Tablist->GetTo_Tdb();
+ Tdbp = (Tablist) ? (PTDBASE)Tablist->GetTo_Tdb() : NULL;
Crp = 0;
} // end of ResetDB
@@ -679,7 +679,7 @@ bool TDBTBM::OpenDB(PGLOBAL g)
/* Table already open, replace it at its beginning. */
/*******************************************************************/
ResetDB();
- return Tdbp->OpenDB(g); // Re-open fist table
+ return (Tdbp) ? Tdbp->OpenDB(g) : false; // Re-open fist table
} // endif use
#if 0
diff --git a/storage/connect/tabtbl.h b/storage/connect/tabtbl.h
index 9d3f297f9e7..3a5ec45d025 100644
--- a/storage/connect/tabtbl.h
+++ b/storage/connect/tabtbl.h
@@ -138,7 +138,8 @@ class DllExport TDBTBM : public TDBTBL {
virtual void ResetDB(void);
// Database routines
- virtual int GetMaxSize(PGLOBAL g) {return 10;} // Temporary
+ virtual int Cardinality(PGLOBAL g) { return 10; }
+ virtual int GetMaxSize(PGLOBAL g) { return 10; } // Temporary
virtual int RowNumber(PGLOBAL g, bool b = FALSE);
virtual bool OpenDB(PGLOBAL g);
virtual int ReadDB(PGLOBAL g);
diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp
index 331a7f45d4d..4069cdbed2a 100644
--- a/storage/connect/tabutil.cpp
+++ b/storage/connect/tabutil.cpp
@@ -1,7 +1,7 @@
/************* Tabutil cpp Declares Source Code File (.CPP) ************/
/* Name: TABUTIL.CPP Version 1.1 */
/* */
-/* (C) Copyright to the author Olivier BERTRAND 2013 - 2015 */
+/* (C) Copyright to the author Olivier BERTRAND 2013 - 2016 */
/* */
/* Utility function used by the PROXY, XCOL, OCCUR, and TBL tables. */
/***********************************************************************/
@@ -118,7 +118,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL,
FLD_REM, FLD_NO, FLD_CHARSET};
unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 32};
- char *fld, *colname, *chset, *fmt, v;
+ char *pn, *tn, *fld, *colname, *chset, *fmt, v;
int i, n, ncol = sizeof(buftyp) / sizeof(int);
int prec, len, type, scale;
int zconv = GetConvSize();
@@ -130,7 +130,16 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
PCOLRES crp;
if (!info) {
- if (!(s = GetTableShare(g, thd, db, name, mysql))) {
+ // Analyze the table name, it may have the format: [dbname.]tabname
+ if (strchr((char*)name, '.')) {
+ tn = (char*)PlugDup(g, name);
+ pn = strchr(tn, '.');
+ *pn++ = 0;
+ db = tn;
+ name = pn;
+ } // endif pn
+
+ if (!(s = GetTableShare(g, thd, db, name, mysql))) {
return NULL;
} else if (s->is_view) {
strcpy(g->Message, "Use MYSQL type to see columns from a view");
@@ -315,7 +324,7 @@ bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR, int)
} // endif pn
Tablep = new(g) XTAB(tab, def);
- Tablep->SetQualifier(db);
+ Tablep->SetSchema(db);
return false;
} // end of DefineAM
@@ -379,12 +388,12 @@ PTDBASE TDBPRX::GetSubTable(PGLOBAL g, PTABLE tabp, bool b)
LPCSTR cdb, curdb = hc->GetDBName(NULL);
THD *thd = (hc->GetTable())->in_use;
- db = (char*)tabp->GetQualifier();
+ db = (char*)(tabp->GetSchema() ? tabp->GetSchema() : curdb);
name = (char*)tabp->GetName();
// Check for eventual loop
for (PTABLE tp = To_Table; tp; tp = tp->Next) {
- cdb = (tp->Qualifier) ? tp->Qualifier : curdb;
+ cdb = (tp->Schema) ? tp->Schema : curdb;
if (!stricmp(name, tp->Name) && !stricmp(db, cdb)) {
sprintf(g->Message, "Table %s.%s pointing on itself", db, name);
@@ -423,7 +432,7 @@ PTDBASE TDBPRX::GetSubTable(PGLOBAL g, PTABLE tabp, bool b)
} // endif Define
if (db)
- ((PTDBMY)tdbp)->SetDatabase(tabp->GetQualifier());
+ ((PTDBMY)tdbp)->SetDatabase(tabp->GetSchema());
if (Mode == MODE_UPDATE || Mode == MODE_DELETE)
tdbp->SetName(Name); // For Make_Command
@@ -757,7 +766,7 @@ void PRXCOL::WriteColumn(PGLOBAL g)
/***********************************************************************/
TDBTBC::TDBTBC(PPRXDEF tdp) : TDBCAT(tdp)
{
- Db = (PSZ)tdp->Tablep->GetQualifier();
+ Db = (PSZ)tdp->Tablep->GetSchema();
Tab = (PSZ)tdp->Tablep->GetName();
} // end of TDBTBC constructor
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/connect/value.cpp b/storage/connect/value.cpp
index f9597cb842b..64d0e13e8c4 100644
--- a/storage/connect/value.cpp
+++ b/storage/connect/value.cpp
@@ -989,7 +989,7 @@ uchar TYPVAL<uchar>::MinMaxVal(bool b)
{return (b) ? UINT_MAX8 : 0;}
/***********************************************************************/
-/* SafeAdd: adds a value and test whether overflow/underflow occured. */
+/* SafeAdd: adds a value and test whether overflow/underflow occurred. */
/***********************************************************************/
template <class TYPE>
TYPE TYPVAL<TYPE>::SafeAdd(TYPE n1, TYPE n2)
@@ -1017,7 +1017,7 @@ inline double TYPVAL<double>::SafeAdd(double n1, double n2)
} // end of SafeAdd
/***********************************************************************/
-/* SafeMult: multiply values and test whether overflow occured. */
+/* SafeMult: multiply values and test whether overflow occurred. */
/***********************************************************************/
template <class TYPE>
TYPE TYPVAL<TYPE>::SafeMult(TYPE n1, TYPE n2)
@@ -1344,10 +1344,13 @@ bool TYPVAL<PSZ>::SetValue_pval(PVAL valp, bool chktype)
/***********************************************************************/
bool TYPVAL<PSZ>::SetValue_char(char *p, int n)
{
- bool rc;
+ bool rc = false;
- if (p && n > 0) {
- rc = n > Len;
+ if (!p || n == 0) {
+ Reset();
+ Null = Nullable;
+ } else if (p != Strp) {
+ rc = n > Len;
if ((n = MY_MIN(n, Len))) {
strncpy(Strp, p, n);
@@ -1366,10 +1369,6 @@ bool TYPVAL<PSZ>::SetValue_char(char *p, int n)
Reset();
Null = false;
- } else {
- rc = false;
- Reset();
- Null = Nullable;
} // endif p
return rc;
@@ -1380,12 +1379,12 @@ bool TYPVAL<PSZ>::SetValue_char(char *p, int n)
/***********************************************************************/
void TYPVAL<PSZ>::SetValue_psz(PSZ s)
{
- if (s) {
- strncpy(Strp, s, Len);
+ if (!s) {
+ Reset();
+ Null = Nullable;
+ } else if (s != Strp) {
+ strncpy(Strp, s, Len);
Null = false;
- } else {
- Reset();
- Null = Nullable;
} // endif s
} // end of SetValue_psz
@@ -1643,7 +1642,7 @@ bool TYPVAL<PSZ>::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op)
assert(np == 1 || np == 2);
if (np == 2)
- strncpy(Strp, p[0], Len);
+ SetValue_psz(p[0]);
if ((i = Len - (signed)strlen(Strp)) > 0)
strncat(Strp, p[np - 1], i);
@@ -1651,11 +1650,11 @@ bool TYPVAL<PSZ>::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op)
break;
case OP_MIN:
assert(np == 2);
- strcpy(Strp, (strcmp(p[0], p[1]) < 0) ? p[0] : p[1]);
+ SetValue_psz((strcmp(p[0], p[1]) < 0) ? p[0] : p[1]);
break;
case OP_MAX:
assert(np == 2);
- strcpy(Strp, (strcmp(p[0], p[1]) > 0) ? p[0] : p[1]);
+ SetValue_psz((strcmp(p[0], p[1]) > 0) ? p[0] : p[1]);
break;
default:
// sprintf(g->Message, MSG(BAD_EXP_OPER), op);
diff --git a/storage/csv/ha_tina.h b/storage/csv/ha_tina.h
index 000b46b2bb2..127c6053a53 100644
--- a/storage/csv/ha_tina.h
+++ b/storage/csv/ha_tina.h
@@ -71,7 +71,7 @@ class ha_tina: public handler
File update_temp_file;
String buffer;
/*
- The chain contains "holes" in the file, occured because of
+ The chain contains "holes" in the file, occurred because of
deletes/updates. It is used in rnd_end() to get rid of them
in the end of the query.
*/
diff --git a/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc
index 0bf4d766d64..478a8f1cfaa 100644
--- a/storage/federated/ha_federated.cc
+++ b/storage/federated/ha_federated.cc
@@ -2016,7 +2016,7 @@ void ha_federated::start_bulk_insert(ha_rows rows, uint flags)
@return Operation status
@retval 0 No error
- @retval != 0 Error occured at remote server. Also sets my_errno.
+ @retval != 0 Error occurred at remote server. Also sets my_errno.
*/
int ha_federated::end_bulk_insert()
diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc
index 5834e70c2e5..890d1bff292 100644
--- a/storage/federatedx/ha_federatedx.cc
+++ b/storage/federatedx/ha_federatedx.cc
@@ -2157,7 +2157,7 @@ void ha_federatedx::start_bulk_insert(ha_rows rows, uint flags)
@return Operation status
@retval 0 No error
- @retval != 0 Error occured at remote server. Also sets my_errno.
+ @retval != 0 Error occurred at remote server. Also sets my_errno.
*/
int ha_federatedx::end_bulk_insert()
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 100f304bf6f..ceffa950739 100644
--- a/storage/innobase/fil/fil0crypt.cc
+++ b/storage/innobase/fil/fil0crypt.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
-Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
+Copyright (C) 2014, 2016, MariaDB Corporation. 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
@@ -662,7 +662,7 @@ fil_space_encrypt(
return src_frame;
}
- ut_ad(crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
+ ut_a(crypt_data != NULL && crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
byte* tmp = fil_encrypt_buf(crypt_data, space, offset, lsn, src_frame, zip_size, dst_frame);
@@ -712,21 +712,37 @@ fil_space_decrypt(
ulint page_type = mach_read_from_2(src_frame+FIL_PAGE_TYPE);
uint key_version = mach_read_from_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED);
-
+ ulint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET);
+ ulint space = mach_read_from_4(src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
+ ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
*err = DB_SUCCESS;
if (key_version == ENCRYPTION_KEY_NOT_ENCRYPTED) {
return false;
}
- ut_ad(crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
+ if (crypt_data == NULL) {
+ if (!(space == 0 && offset == 0) && key_version != 0) {
+ /* FIL_PAGE_FILE_FLUSH_LSN field i.e.
+ FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
+ should be only defined for the
+ first page in a system tablespace
+ data file (ibdata*, not *.ibd), if not
+ clear it. */
+#ifdef UNIV_DEBUG
+ ib_logf(IB_LOG_LEVEL_WARN,
+ "Page on space %lu offset %lu has key_version %u"
+ " when it shoud be undefined.",
+ space, offset, key_version);
+#endif
+ mach_write_to_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0);
+ }
+ return false;
+ }
- /* read space & offset & lsn */
- ulint space = mach_read_from_4(
- src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
- ulint offset = mach_read_from_4(
- src_frame + FIL_PAGE_OFFSET);
- ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
+ ut_a(crypt_data != NULL && crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
+
+ /* read space & lsn */
ulint header_len = FIL_PAGE_DATA;
if (page_compressed) {
@@ -799,6 +815,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 +824,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;
}
/******************************************************************
@@ -2294,6 +2315,10 @@ fil_crypt_set_thread_cnt(
/*=====================*/
uint new_cnt) /*!< in: New key rotation thread count */
{
+ if (!fil_crypt_threads_inited) {
+ fil_crypt_threads_init();
+ }
+
if (new_cnt > srv_n_fil_crypt_threads) {
uint add = new_cnt - srv_n_fil_crypt_threads;
srv_n_fil_crypt_threads = new_cnt;
@@ -2358,15 +2383,18 @@ void
fil_crypt_threads_init()
/*====================*/
{
- fil_crypt_event = os_event_create();
- fil_crypt_threads_event = os_event_create();
- mutex_create(fil_crypt_threads_mutex_key,
- &fil_crypt_threads_mutex, SYNC_NO_ORDER_CHECK);
-
- uint cnt = srv_n_fil_crypt_threads;
- srv_n_fil_crypt_threads = 0;
- fil_crypt_set_thread_cnt(cnt);
- fil_crypt_threads_inited = true;
+ ut_ad(mutex_own(&fil_system->mutex));
+ if (!fil_crypt_threads_inited) {
+ fil_crypt_event = os_event_create();
+ fil_crypt_threads_event = os_event_create();
+ mutex_create(fil_crypt_threads_mutex_key,
+ &fil_crypt_threads_mutex, SYNC_NO_ORDER_CHECK);
+
+ uint cnt = srv_n_fil_crypt_threads;
+ srv_n_fil_crypt_threads = 0;
+ fil_crypt_threads_inited = true;
+ fil_crypt_set_thread_cnt(cnt);
+ }
}
/*********************************************************************
@@ -2389,6 +2417,7 @@ fil_crypt_threads_cleanup()
{
os_event_free(fil_crypt_event);
os_event_free(fil_crypt_threads_event);
+ fil_crypt_threads_inited = false;
}
/*********************************************************************
@@ -2493,6 +2522,7 @@ fil_space_crypt_get_status(
mutex_enter(&crypt_data->mutex);
status->keyserver_requests = crypt_data->keyserver_requests;
status->min_key_version = crypt_data->min_key_version;
+ status->key_id = crypt_data->key_id;
if (crypt_data->rotate_state.active_threads > 0 ||
crypt_data->rotate_state.flushing) {
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index 928c72cf546..d918b21d779 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2015, Oracle and/or its affiliates.
-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
@@ -3207,10 +3207,12 @@ fil_create_link_file(
}
link_filepath = fil_make_isl_name(tablename);
-
+ /* Note that OS_FILE_READ_WRITE_CACHED used here to avoid
+ unnecessary errors on O_DIRECT, link files are not really
+ a data files. */
file = os_file_create_simple_no_error_handling(
innodb_file_data_key, link_filepath,
- OS_FILE_CREATE, OS_FILE_READ_WRITE, &success, 0);
+ OS_FILE_CREATE, OS_FILE_READ_WRITE_CACHED, &success, 0);
if (!success) {
/* The following call will print an error message */
diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc
index cc4a4f9f1a8..ee06f9432b8 100644
--- a/storage/innobase/fts/fts0fts.cc
+++ b/storage/innobase/fts/fts0fts.cc
@@ -6274,7 +6274,7 @@ fts_fake_hex_to_dec(
#ifdef _WIN32
ret = sscanf(tmp_id, "%016llu", &dec_id);
#else
- ret = sscanf(tmp_id, "%016"PRIu64, &dec_id);
+ ret = sscanf(tmp_id, "%016" PRIu64, &dec_id);
#endif /* _WIN32 */
ut_ad(ret == 1);
diff --git a/storage/innobase/fts/fts0opt.cc b/storage/innobase/fts/fts0opt.cc
index e096b8bf6d6..00b3b4682c3 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) {
@@ -598,7 +598,7 @@ fts_zip_read_word(
/* Finished decompressing block. */
if (zip->zp->avail_in == 0) {
- /* Free the block thats been decompressed. */
+ /* Free the block that's been decompressed. */
if (zip->pos > 0) {
ulint prev = zip->pos - 1;
@@ -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..5edb6dc5190 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";
@@ -617,16 +786,6 @@ innobase_map_isolation_level(
/*=========================*/
enum_tx_isolation iso); /*!< in: MySQL isolation level code */
-/******************************************************************//**
-Maps a MySQL trx isolation level code to the InnoDB isolation level code
-@return InnoDB isolation level */
-static inline
-ulint
-innobase_map_isolation_level(
-/*=========================*/
- enum_tx_isolation iso); /*!< in: MySQL isolation level code
- */
-
/*************************************************************//**
Check for a valid value of innobase_compression_algorithm.
@return 0 for valid innodb_compression_algorithm. */
@@ -688,6 +847,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 +927,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 +1431,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 +1700,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 +2259,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 +2279,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 +3212,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 +5055,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 +8293,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 +8815,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 +8881,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 +17895,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 +18329,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 +19874,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 +19882,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 */
@@ -19732,7 +19927,7 @@ maria_declare_plugin(innobase)
innodb_status_variables_export,/* status variables */
innobase_system_variables, /* system variables */
INNODB_VERSION_STR, /* string version */
- MariaDB_PLUGIN_MATURITY_BETA /* maturity */
+ MariaDB_PLUGIN_MATURITY_GAMMA /* maturity */
},
i_s_innodb_trx,
i_s_innodb_locks,
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/handler/i_s.cc b/storage/innobase/handler/i_s.cc
index ef69e7df29d..0bb10f435af 100644
--- a/storage/innobase/handler/i_s.cc
+++ b/storage/innobase/handler/i_s.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2007, 2015, Oracle and/or its affiliates.
-Copyrigth (c) 2014, 2015, MariaDB Corporation
+Copyrigth (c) 2014, 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
@@ -783,7 +783,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_trx =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_locks */
@@ -1043,7 +1043,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_locks =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_lock_waits */
@@ -1226,7 +1226,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_lock_waits =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/*******************************************************************//**
@@ -1562,7 +1562,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_reset =
@@ -1612,7 +1612,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_reset =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic tables
@@ -1912,7 +1912,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_per_index =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_per_index_reset =
@@ -1962,7 +1962,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_per_index_reset =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table information_schema.innodb_cmpmem. */
@@ -2205,7 +2205,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_reset =
@@ -2255,7 +2255,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_reset =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_metrics */
@@ -2779,7 +2779,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_metrics =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_ft_default_stopword */
static ST_FIELD_INFO i_s_stopword_fields_info[] =
@@ -2892,7 +2892,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_default_stopword =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_FT_DELETED
@@ -3060,7 +3060,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_deleted =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/*******************************************************************//**
@@ -3143,7 +3143,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_being_deleted =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED and
@@ -3432,7 +3432,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_index_cache =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/*******************************************************************//**
@@ -3867,7 +3867,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_index_table =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_FT_CONFIG */
@@ -4065,7 +4065,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_config =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INNODB_BUFFER_POOL_STATS. */
@@ -4614,7 +4614,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_stats =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INNODB_BUFFER_POOL_PAGE. */
@@ -5326,7 +5326,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_page =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
static ST_FIELD_INFO i_s_innodb_buf_page_lru_fields_info[] =
@@ -5873,7 +5873,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_page_lru =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/*******************************************************************//**
@@ -6167,7 +6167,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tables =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_TABLESTATS ***********************************************/
@@ -6457,7 +6457,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tablestats =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_INDEXES **************************************************/
@@ -6709,7 +6709,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_indexes =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_COLUMNS **************************************************/
@@ -6946,7 +6946,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_columns =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_FIELDS ***************************************************/
@@ -7156,7 +7156,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_fields =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_FOREIGN ********************************************/
@@ -7381,7 +7381,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_foreign =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_FOREIGN_COLS ********************************************/
@@ -7598,7 +7598,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_foreign_cols =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_TABLESPACES ********************************************/
@@ -7866,7 +7866,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tablespaces =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_DATAFILES ************************************************/
@@ -8055,7 +8055,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_datafiles =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** TABLESPACES_ENCRYPTION ********************************************/
@@ -8134,6 +8134,15 @@ static ST_FIELD_INFO innodb_tablespaces_encryption_fields_info[] =
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
+#define TABLESPACES_ENCRYPTION_CURRENT_KEY_ID 8
+ {STRUCT_FLD(field_name, "CURRENT_KEY_ID"),
+ STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
+ STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
+ STRUCT_FLD(value, 0),
+ STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
+ STRUCT_FLD(old_name, ""),
+ STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
+
END_OF_ST_FIELD_INFO
};
@@ -8172,6 +8181,8 @@ i_s_dict_fill_tablespaces_encryption(
status.min_key_version));
OK(fields[TABLESPACES_ENCRYPTION_CURRENT_KEY_VERSION]->store(
status.current_key_version));
+ OK(fields[TABLESPACES_ENCRYPTION_CURRENT_KEY_ID]->store(
+ status.key_id));
if (status.rotating) {
fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER]->set_notnull();
OK(fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER]->store(
@@ -8338,7 +8349,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_tablespaces_encryption =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA)
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA)
};
/** TABLESPACES_SCRUBBING ********************************************/
@@ -8637,7 +8648,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_tablespaces_scrubbing =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA)
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA)
};
/** INNODB_MUTEXES *********************************************/
@@ -8851,7 +8862,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_mutexes =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_SEMAPHORE_WAITS ************************************************/
@@ -9128,5 +9139,5 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_semaphore_waits =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
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..fdc413e7520 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
@@ -332,6 +333,7 @@ struct fil_space_crypt_status_t {
uint min_key_version; /*!< min key version */
uint current_key_version;/*!< current key version */
uint keyserver_requests;/*!< no of key requests to key server */
+ ulint key_id; /*!< current key_id */
bool rotating; /*!< is key rotation ongoing */
bool flushing; /*!< is flush at end of rotation ongoing */
ulint rotate_next_page_number; /*!< next page if key rotating */
diff --git a/storage/innobase/include/fil0fil.ic b/storage/innobase/include/fil0fil.ic
index a0bfb271d39..5654d8f6178 100644
--- a/storage/innobase/include/fil0fil.ic
+++ b/storage/innobase/include/fil0fil.ic
@@ -146,9 +146,9 @@ fil_page_type_validate(
/* Dump out the page info */
fprintf(stderr, "InnoDB: Space %lu offset %lu name %s page_type %lu page_type_name %s\n"
- "InnoDB: key_version %u page_compressed %d page_compressed_encrypted %d lsn %lu compressed_len %lu\n",
+ "InnoDB: key_version %u page_compressed %d page_compressed_encrypted %d lsn %llu compressed_len %lu\n",
space, offset, rspace->name, page_type, fil_get_page_type_name(page_type),
- key_version, page_compressed, page_compressed_encrypted, lsn, compressed_len);
+ key_version, page_compressed, page_compressed_encrypted, (ulonglong)lsn, compressed_len);
fflush(stderr);
ut_ad(page_type == FIL_PAGE_PAGE_COMPRESSED ||
diff --git a/storage/innobase/include/fts0priv.ic b/storage/innobase/include/fts0priv.ic
index 2d07c60f980..ec61691870b 100644
--- a/storage/innobase/include/fts0priv.ic
+++ b/storage/innobase/include/fts0priv.ic
@@ -53,7 +53,7 @@ fts_write_object_id(
/* Use this to construct old(5.6.14 and 5.7.3) windows
ambiguous aux table names */
DBUG_EXECUTE_IF("innodb_test_wrong_windows_fts_aux_table_name",
- return(sprintf(str, "%016"PRIu64, id)););
+ return(sprintf(str, "%016" PRIu64, id)););
DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name",
return(sprintf(str, UINT64PFx, id)););
@@ -66,7 +66,7 @@ fts_write_object_id(
// FIXME: Use ut_snprintf(), so does following one.
return(sprintf(str, "%016llu", id));
#else /* _WIN32 */
- return(sprintf(str, "%016"PRIu64, id));
+ return(sprintf(str, "%016" PRIu64, id));
#endif /* _WIN32 */
}
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/log0recv.h b/storage/innobase/include/log0recv.h
index e4a06fcc532..292953854f7 100644
--- a/storage/innobase/include/log0recv.h
+++ b/storage/innobase/include/log0recv.h
@@ -498,6 +498,18 @@ use these free frames to read in pages when we start applying the
log records to the database. */
extern ulint recv_n_pool_free_frames;
+/******************************************************//**
+Checks the 4-byte checksum to the trailer checksum field of a log
+block. We also accept a log block in the old format before
+InnoDB-3.23.52 where the checksum field contains the log block number.
+@return TRUE if ok, or if the log block may be in the format of InnoDB
+version predating 3.23.52 */
+ibool
+log_block_checksum_is_ok_or_old_format(
+/*===================================*/
+ const byte* block, /*!< in: pointer to a log block */
+ bool print_err); /*!< in print error ? */
+
#ifndef UNIV_NONINL
#include "log0recv.ic"
#endif
diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h
index c630e91e815..dff5ebd524c 100644
--- a/storage/innobase/include/os0file.h
+++ b/storage/innobase/include/os0file.h
@@ -128,7 +128,10 @@ enum os_file_create_t {
#define OS_FILE_READ_ONLY 333
#define OS_FILE_READ_WRITE 444
#define OS_FILE_READ_ALLOW_DELETE 555 /* for mysqlbackup */
-
+#define OS_FILE_READ_WRITE_CACHED 666 /* OS_FILE_READ_WRITE but never
+ O_DIRECT. Only for
+ os_file_create_simple_no_error_handling
+ currently. */
/* Options for file_create */
#define OS_FILE_AIO 61
#define OS_FILE_NORMAL 62
@@ -435,14 +438,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
@@ -537,7 +545,7 @@ UNIV_INTERN
void
os_file_set_nocache(
/*================*/
- int fd, /*!< in: file descriptor to alter */
+ os_file_t fd, /*!< in: file descriptor to alter */
const char* file_name, /*!< in: file name, used in the
diagnostic message */
const char* operation_name);/*!< in: "open" or "create"; used in the
@@ -1271,14 +1279,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/log/log0crypt.cc b/storage/innobase/log/log0crypt.cc
index e90533c2e76..852148899e9 100644
--- a/storage/innobase/log/log0crypt.cc
+++ b/storage/innobase/log/log0crypt.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
-Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
+Copyright (C) 2014, 2016, MariaDB Corporation. 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
@@ -36,6 +36,8 @@ Modified Jan Lindström jan.lindstrom@mariadb.com
#include "my_crypt.h"
+/* Used for debugging */
+// #define DEBUG_CRYPT 1
#define UNENCRYPTED_KEY_VER 0
/* If true, enable redo log encryption. */
@@ -97,16 +99,24 @@ get_crypt_info(
{
/* so that no one is modifying array while we search */
ut_ad(mutex_own(&(log_sys->mutex)));
+ size_t items = crypt_info.size();
/* a log block only stores 4-bytes of checkpoint no */
checkpoint_no &= 0xFFFFFFFF;
- for (size_t i = 0; i < crypt_info.size(); i++) {
+ for (size_t i = 0; i < items; i++) {
struct crypt_info_t* it = &crypt_info[i];
if (it->checkpoint_no == checkpoint_no) {
return it;
}
}
+
+ /* If checkpoint contains more than one key and we did not
+ find the correct one use the first one. */
+ if (items) {
+ return (&crypt_info[0]);
+ }
+
return NULL;
}
@@ -131,7 +141,8 @@ log_blocks_crypt(
const byte* block, /*!< in: blocks before encrypt/decrypt*/
ulint size, /*!< in: size of block */
byte* dst_block, /*!< out: blocks after encrypt/decrypt */
- int what) /*!< in: encrypt or decrypt*/
+ int what, /*!< in: encrypt or decrypt*/
+ const crypt_info_t* crypt_info) /*!< in: crypt info or NULL */
{
byte *log_block = (byte*)block;
Crypt_result rc = MY_AES_OK;
@@ -146,7 +157,8 @@ log_blocks_crypt(
lsn_t log_block_start_lsn = log_block_get_start_lsn(
lsn, log_block_no);
- const crypt_info_t* info = get_crypt_info(log_block);
+ const crypt_info_t* info = crypt_info == NULL ? get_crypt_info(log_block) :
+ crypt_info;
#ifdef DEBUG_CRYPT
fprintf(stderr,
"%s %lu chkpt: %lu key: %u lsn: %lu\n",
@@ -156,12 +168,21 @@ log_blocks_crypt(
info ? info->key_version : 0,
log_block_start_lsn);
#endif
+ /* If no key is found from checkpoint assume the log_block
+ to be unencrypted. If checkpoint contains the encryption key
+ compare log_block current checksum, if checksum matches,
+ block can't be encrypted. */
if (info == NULL ||
- info->key_version == UNENCRYPTED_KEY_VER) {
+ info->key_version == UNENCRYPTED_KEY_VER ||
+ (log_block_checksum_is_ok_or_old_format(log_block, false) &&
+ what == ENCRYPTION_FLAG_DECRYPT)) {
memcpy(dst_block, log_block, OS_FILE_LOG_BLOCK_SIZE);
goto next;
}
+ ut_ad(what == ENCRYPTION_FLAG_DECRYPT ? !log_block_checksum_is_ok_or_old_format(log_block, false) :
+ log_block_checksum_is_ok_or_old_format(log_block, false));
+
// Assume log block header is not encrypted
memcpy(dst_block, log_block, LOG_BLOCK_HDR_SIZE);
@@ -292,7 +313,7 @@ log_blocks_encrypt(
const ulint size, /*!< in: size of blocks, must be multiple of a log block */
byte* dst_block) /*!< out: blocks after encryption */
{
- return log_blocks_crypt(block, size, dst_block, ENCRYPTION_FLAG_ENCRYPT);
+ return log_blocks_crypt(block, size, dst_block, ENCRYPTION_FLAG_ENCRYPT, NULL);
}
/*********************************************************************//**
@@ -355,14 +376,16 @@ log_encrypt_before_write(
return;
}
- if (info->key_version == UNENCRYPTED_KEY_VER) {
+ /* If the key is not encrypted or user has requested not to
+ encrypt, do not change log block. */
+ if (info->key_version == UNENCRYPTED_KEY_VER || !srv_encrypt_log) {
return;
}
byte* dst_frame = (byte*)malloc(size);
//encrypt log blocks content
- Crypt_result result = log_blocks_crypt(block, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT);
+ Crypt_result result = log_blocks_crypt(block, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT, NULL);
if (result == MY_AES_OK) {
ut_ad(block[0] == dst_frame[0]);
@@ -388,7 +411,7 @@ log_decrypt_after_read(
byte* dst_frame = (byte*)malloc(size);
// decrypt log blocks content
- Crypt_result result = log_blocks_crypt(frame, size, dst_frame, ENCRYPTION_FLAG_DECRYPT);
+ Crypt_result result = log_blocks_crypt(frame, size, dst_frame, ENCRYPTION_FLAG_DECRYPT, NULL);
if (result == MY_AES_OK) {
memcpy(frame, dst_frame, size);
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index fd3646a1691..31104b395c1 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2009, Google Inc.
-Copyright (c) 2013, SkySQL Ab. All Rights Reserved.
+Copyright (C) 2014, 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
@@ -52,6 +52,9 @@ Created 12/9/1995 Heikki Tuuri
#include "trx0roll.h"
#include "srv0mon.h"
+/* Used for debugging */
+// #define DEBUG_CRYPT 1
+
/*
General philosophy of InnoDB redo-logs:
@@ -2358,8 +2361,24 @@ loop:
(ulint) (source_offset % UNIV_PAGE_SIZE),
len, buf, NULL, 0);
+#ifdef DEBUG_CRYPT
+ fprintf(stderr, "BEFORE DECRYPT: block: %lu checkpoint: %lu %.8lx %.8lx offset %lu\n",
+ log_block_get_hdr_no(buf),
+ log_block_get_checkpoint_no(buf),
+ log_block_calc_checksum(buf),
+ log_block_get_checksum(buf), source_offset);
+#endif
+
log_decrypt_after_read(buf, len);
+#ifdef DEBUG_CRYPT
+ fprintf(stderr, "AFTER DECRYPT: block: %lu checkpoint: %lu %.8lx %.8lx\n",
+ log_block_get_hdr_no(buf),
+ log_block_get_checkpoint_no(buf),
+ log_block_calc_checksum(buf),
+ log_block_get_checksum(buf));
+#endif
+
start_lsn += len;
buf += len;
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index c84e8277f07..2304f4885c2 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -2,7 +2,7 @@
Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc.
-Copyright (c) 2013, 2015, MariaDB Corporation. All Rights Reserved.
+Copyright (c) 2013, 2016, MariaDB Corporation. 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
@@ -923,11 +923,11 @@ block. We also accept a log block in the old format before
InnoDB-3.23.52 where the checksum field contains the log block number.
@return TRUE if ok, or if the log block may be in the format of InnoDB
version predating 3.23.52 */
-static
ibool
log_block_checksum_is_ok_or_old_format(
/*===================================*/
- const byte* block) /*!< in: pointer to a log block */
+ const byte* block, /*!< in: pointer to a log block */
+ bool print_err) /*!< in print error ? */
{
#ifdef UNIV_LOG_DEBUG
return(TRUE);
@@ -950,11 +950,13 @@ log_block_checksum_is_ok_or_old_format(
return(TRUE);
}
- fprintf(stderr, "BROKEN: block: %lu checkpoint: %lu %.8lx %.8lx\n",
- log_block_get_hdr_no(block),
- log_block_get_checkpoint_no(block),
- log_block_calc_checksum(block),
- log_block_get_checksum(block));
+ if (print_err) {
+ fprintf(stderr, "BROKEN: block: %lu checkpoint: %lu %.8lx %.8lx\n",
+ log_block_get_hdr_no(block),
+ log_block_get_checkpoint_no(block),
+ log_block_calc_checksum(block),
+ log_block_get_checksum(block));
+ }
return(FALSE);
}
@@ -2664,6 +2666,7 @@ recv_scan_log_recs(
ibool finished;
ulint data_len;
ibool more_data;
+ bool maybe_encrypted=false;
ut_ad(start_lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_ad(len % OS_FILE_LOG_BLOCK_SIZE == 0);
@@ -2678,6 +2681,8 @@ recv_scan_log_recs(
*err = DB_SUCCESS;
do {
+ log_crypt_err_t log_crypt_err;
+
no = log_block_get_hdr_no(log_block);
/*
fprintf(stderr, "Log block header no %lu\n", no);
@@ -2686,12 +2691,11 @@ recv_scan_log_recs(
log_block_convert_lsn_to_no(scanned_lsn));
*/
if (no != log_block_convert_lsn_to_no(scanned_lsn)
- || !log_block_checksum_is_ok_or_old_format(log_block)) {
- log_crypt_err_t log_crypt_err;
+ || !log_block_checksum_is_ok_or_old_format(log_block, true)) {
if (no == log_block_convert_lsn_to_no(scanned_lsn)
&& !log_block_checksum_is_ok_or_old_format(
- log_block)) {
+ log_block, true)) {
fprintf(stderr,
"InnoDB: Log block no %lu at"
" lsn " LSN_PF " has\n"
@@ -2705,12 +2709,14 @@ recv_scan_log_recs(
log_block));
}
+ maybe_encrypted = log_crypt_block_maybe_encrypted(log_block,
+ &log_crypt_err);
+
/* Garbage or an incompletely written log block */
finished = TRUE;
- if (log_crypt_block_maybe_encrypted(log_block,
- &log_crypt_err)) {
+ if (maybe_encrypted) {
/* Log block maybe encrypted finish processing*/
log_crypt_print_error(log_crypt_err);
*err = DB_ERROR;
diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc
index 2b9e877e765..3a0bd1fc328 100644
--- a/storage/innobase/os/os0file.cc
+++ b/storage/innobase/os/os0file.cc
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
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 Percona Inc.. Those modifications are
@@ -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);
@@ -1349,7 +1350,8 @@ os_file_create_simple_func(
access = GENERIC_READ;
- } else if (access_type == OS_FILE_READ_WRITE) {
+ } else if (access_type == OS_FILE_READ_WRITE
+ || access_type == OS_FILE_READ_WRITE_CACHED) {
access = GENERIC_READ | GENERIC_WRITE;
} else {
ib_logf(IB_LOG_LEVEL_ERROR,
@@ -1453,7 +1455,8 @@ os_file_create_simple_func(
#ifdef USE_FILE_LOCK
if (!srv_read_only_mode
&& *success
- && access_type == OS_FILE_READ_WRITE
+ && (access_type == OS_FILE_READ_WRITE
+ || access_type == OS_FILE_READ_WRITE_CACHED)
&& os_file_lock(file, name)) {
*success = FALSE;
@@ -1467,6 +1470,31 @@ os_file_create_simple_func(
return(file);
}
+/** Disable OS I/O caching on the file if the file type and server
+configuration requires it.
+@param file handle to the file
+@param name name of the file, for diagnostics
+@param mode_str operation on the file, for diagnostics
+@param type OS_LOG_FILE or OS_DATA_FILE
+@param access_type if OS_FILE_READ_WRITE_CACHED, then caching will be disabled
+unconditionally, ignored otherwise */
+static
+void
+os_file_set_nocache_if_needed(os_file_t file, const char* name,
+ const char *mode_str, ulint type,
+ ulint access_type)
+{
+ if (srv_read_only_mode || access_type == OS_FILE_READ_WRITE_CACHED) {
+ return;
+ }
+
+ if (type == OS_DATA_FILE
+ && (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT
+ || (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT_NO_FSYNC))) {
+ os_file_set_nocache(file, name, mode_str);
+ }
+}
+
/****************************************************************//**
NOTE! Use the corresponding macro
os_file_create_simple_no_error_handling(), not directly this function!
@@ -1522,7 +1550,8 @@ os_file_create_simple_no_error_handling_func(
access = GENERIC_READ;
} else if (srv_read_only_mode) {
access = GENERIC_READ;
- } else if (access_type == OS_FILE_READ_WRITE) {
+ } else if (access_type == OS_FILE_READ_WRITE
+ || access_type == OS_FILE_READ_WRITE_CACHED) {
access = GENERIC_READ | GENERIC_WRITE;
} else if (access_type == OS_FILE_READ_ALLOW_DELETE) {
@@ -1594,7 +1623,8 @@ os_file_create_simple_no_error_handling_func(
} else {
ut_a(access_type == OS_FILE_READ_WRITE
- || access_type == OS_FILE_READ_ALLOW_DELETE);
+ || access_type == OS_FILE_READ_ALLOW_DELETE
+ || access_type == OS_FILE_READ_WRITE_CACHED);
create_flag = O_RDWR;
}
@@ -1626,18 +1656,16 @@ os_file_create_simple_no_error_handling_func(
/* This function is always called for data files, we should disable
OS caching (O_DIRECT) here as we do in os_file_create_func(), so
we open the same file in the same mode, see man page of open(2). */
- if (!srv_read_only_mode
- && *success
- && (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT
- || srv_unix_file_flush_method == SRV_UNIX_O_DIRECT_NO_FSYNC)) {
-
- os_file_set_nocache(file, name, mode_str);
+ if (*success) {
+ os_file_set_nocache_if_needed(file, name, mode_str,
+ OS_DATA_FILE, access_type);
}
#ifdef USE_FILE_LOCK
if (!srv_read_only_mode
&& *success
- && access_type == OS_FILE_READ_WRITE
+ && (access_type == OS_FILE_READ_WRITE
+ || access_type == OS_FILE_READ_WRITE_CACHED)
&& os_file_lock(file, name)) {
*success = FALSE;
@@ -1676,7 +1704,7 @@ UNIV_INTERN
void
os_file_set_nocache(
/*================*/
- int fd /*!< in: file descriptor to alter */
+ os_file_t fd /*!< in: file descriptor to alter */
__attribute__((unused)),
const char* file_name /*!< in: used in the diagnostic
message */
@@ -2006,13 +2034,8 @@ os_file_create_func(
/* We disable OS caching (O_DIRECT) only on data files */
- if (!srv_read_only_mode
- && *success
- && type != OS_LOG_FILE
- && (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT
- || srv_unix_file_flush_method == SRV_UNIX_O_DIRECT_NO_FSYNC)) {
-
- os_file_set_nocache(file, name, mode_str);
+ if (*success) {
+ os_file_set_nocache_if_needed(file, name, mode_str, type, 0);
}
#ifdef USE_FILE_LOCK
@@ -2925,7 +2948,7 @@ try_again:
"Error in system call pread(). The operating"
" system error number is %lu.",(ulint) errno);
} else {
- /* Partial read occured */
+ /* Partial read occurred */
ib_logf(IB_LOG_LEVEL_ERROR,
"Tried to read " ULINTPF " bytes at offset "
UINT64PF ". Was only able to read %ld.",
@@ -3056,7 +3079,7 @@ try_again:
"Error in system call pread(). The operating"
" system error number is %lu.",(ulint) errno);
} else {
- /* Partial read occured */
+ /* Partial read occurred */
ib_logf(IB_LOG_LEVEL_ERROR,
"Tried to read " ULINTPF " bytes at offset "
UINT64PF ". Was only able to read %ld.",
@@ -3910,7 +3933,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..294facf9723 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,22 +3437,24 @@ 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;
if (merge_file->fd >= 0) {
if (srv_disable_sort_file_cache) {
- os_file_set_nocache(merge_file->fd,
+ os_file_set_nocache((os_file_t)merge_file->fd,
"row0merge.cc", "sort");
}
}
@@ -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 8c54d6eb083..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);
@@ -2984,7 +2984,9 @@ files_checked:
fts_optimize_init();
/* Create thread(s) that handles key rotation */
+ fil_system_enter();
fil_crypt_threads_init();
+ fil_system_exit();
/* Create the log scrub thread */
if (srv_scrub_log)
diff --git a/storage/innobase/sync/sync0sync.cc b/storage/innobase/sync/sync0sync.cc
index 2e1737da3ec..7eb3d0bd6f2 100644
--- a/storage/innobase/sync/sync0sync.cc
+++ b/storage/innobase/sync/sync0sync.cc
@@ -422,7 +422,13 @@ mutex_validate(
const ib_mutex_t* mutex) /*!< in: mutex */
{
ut_a(mutex);
- ut_a(mutex->magic_n == MUTEX_MAGIC_N);
+
+ if (mutex->magic_n != MUTEX_MAGIC_N) {
+ ib_logf(IB_LOG_LEVEL_ERROR,
+ "Mutex %p not initialized file %s line %lu.",
+ mutex, mutex->cfile_name, mutex->cline);
+ }
+ ut_ad(mutex->magic_n == MUTEX_MAGIC_N);
return(TRUE);
}
diff --git a/storage/innobase/ut/crc32_power8/crc32.S b/storage/innobase/ut/crc32_power8/crc32.S
index 52046bb9002..b064ce3dc96 100644
--- a/storage/innobase/ut/crc32_power8/crc32.S
+++ b/storage/innobase/ut/crc32_power8/crc32.S
@@ -67,14 +67,13 @@
#define off96 r30
#define off112 r31
-#define const1 v25
-#define const2 v26
+#define const1 v24
+#define const2 v25
-#define byteswap v27
-#define mask_32bit v28
-#define mask_64bit v29
-#define zeroes v30
-#define ones v31
+#define byteswap v26
+#define mask_32bit v27
+#define mask_64bit v28
+#define zeroes v29
#ifdef BYTESWAP_DATA
#define VPERM(A, B, C, D) vperm A, B, C, D
@@ -101,13 +100,28 @@ FUNC_START(__crc32_vpmsum)
li off112,112
li r0,0
+ /* Enough room for saving 10 non volatile VMX registers */
+ subi r6,r1,56+10*16
+ subi r7,r1,56+2*16
+
+ stvx v20,0,r6
+ stvx v21,off16,r6
+ stvx v22,off32,r6
+ stvx v23,off48,r6
+ stvx v24,off64,r6
+ stvx v25,off80,r6
+ stvx v26,off96,r6
+ stvx v27,off112,r6
+ stvx v28,0,r7
+ stvx v29,off16,r7
+
mr r10,r3
vxor zeroes,zeroes,zeroes
- vspltisw ones,-1
+ vspltisw v0,-1
- vsldoi mask_32bit,zeroes,ones,4
- vsldoi mask_64bit,zeroes,ones,8
+ vsldoi mask_32bit,zeroes,v0,4
+ vsldoi mask_64bit,zeroes,v0,8
/* Get the initial value into v8 */
vxor v8,v8,v8
@@ -570,6 +584,21 @@ FUNC_START(__crc32_vpmsum)
vsldoi v0,v0,zeroes,4 /* shift result into top 64 bits of */
#endif
+.Lout:
+ subi r6,r1,56+10*16
+ subi r7,r1,56+2*16
+
+ lvx v20,0,r6
+ lvx v21,off16,r6
+ lvx v22,off32,r6
+ lvx v23,off48,r6
+ lvx v24,off64,r6
+ lvx v25,off80,r6
+ lvx v26,off96,r6
+ lvx v27,off112,r6
+ lvx v28,0,r7
+ lvx v29,off16,r7
+
/* Get it into r3 */
MFVRD(r3, v0)
@@ -739,6 +768,8 @@ FUNC_START(__crc32_vpmsum)
.Lzero:
mr r3,r10
blr
+ b .Lout
+
FUNC_END(__crc32_vpmsum)
#endif /* __powerpc__ */
diff --git a/storage/maria/ma_bitmap.c b/storage/maria/ma_bitmap.c
index 7c144ac52a4..60d57b95d86 100644
--- a/storage/maria/ma_bitmap.c
+++ b/storage/maria/ma_bitmap.c
@@ -1249,7 +1249,7 @@ static my_bool allocate_head(MARIA_FILE_BITMAP *bitmap, uint size,
DBUG_ASSERT(size <= FULL_PAGE_SIZE(share));
- if (insert_order)
+ if (insert_order && bitmap->page == share->last_insert_bitmap)
{
uint last_insert_page= share->last_insert_page;
uint byte= 6 * (last_insert_page / 16);
@@ -1315,6 +1315,7 @@ found:
{
share->last_insert_page=
((uint) (best_data - bitmap->map)) / 6 * 16 + best_pos;
+ share->last_insert_bitmap= bitmap->page;
}
fill_block(bitmap, block, best_data, best_pos, best_bits, FULL_HEAD_PAGE);
DBUG_RETURN(0);
@@ -1614,6 +1615,16 @@ static my_bool find_head(MARIA_HA *info, uint length, uint position)
*/
block= dynamic_element(&info->bitmap_blocks, position, MARIA_BITMAP_BLOCK *);
+ if (info->s->base.extra_options & MA_EXTRA_OPTIONS_INSERT_ORDER)
+ {
+ if (bitmap->page != info->s->last_insert_bitmap &&
+ _ma_change_bitmap_page(info, bitmap,
+ info->s->last_insert_bitmap))
+ return 1;
+ /* Don't allocate any blocks from earlier pages */
+ info->s->state.first_bitmap_with_space= info->s->last_insert_bitmap;
+ }
+
/*
We need to have DIRENTRY_SIZE here to take into account that we may
need an extra directory entry for the row
@@ -3115,6 +3126,10 @@ static my_bool _ma_bitmap_create_missing(MARIA_HA *info,
bzero(bitmap->map, bitmap->block_size);
bitmap->used_size= 0;
#ifndef DBUG_OFF
+ /*
+ Make a copy of the page to be able to print out bitmap changes during
+ debugging
+ */
memcpy(bitmap->map + bitmap->block_size, bitmap->map, bitmap->block_size);
#endif
diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c
index b517588f959..5035df26b18 100644
--- a/storage/maria/ma_check.c
+++ b/storage/maria/ma_check.c
@@ -6635,17 +6635,6 @@ static void copy_data_file_state(MARIA_STATE_INFO *to,
}
-/* Return 1 if block is full of zero's */
-
-static my_bool zero_filled_block(uchar *tmp, uint length)
-{
- while (length--)
- if (*(tmp++) != 0)
- return 0;
- return 1;
-}
-
-
/*
Read 'safely' next record while scanning table.
@@ -6753,8 +6742,7 @@ read_next_page:
sometimes be found at end of a bitmap when we wrote a big
record last that was moved to the next bitmap.
*/
- if (!zero_filled_block(info->scan.page_buff, share->block_size) ||
- _ma_check_bitmap_data(info, UNALLOCATED_PAGE, 0,
+ if (_ma_check_bitmap_data(info, UNALLOCATED_PAGE, 0,
_ma_bitmap_get_page_bits(info,
&share->bitmap,
page)))
diff --git a/storage/maria/ma_crypt.c b/storage/maria/ma_crypt.c
index 55fa8430d22..cc605d79933 100644
--- a/storage/maria/ma_crypt.c
+++ b/storage/maria/ma_crypt.c
@@ -182,10 +182,10 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff)
return buff + 2 + iv_length;
}
-static int ma_encrypt(MARIA_CRYPT_DATA *, const uchar *, uchar *, uint,
- uint, LSN, uint *);
-static int ma_decrypt(MARIA_CRYPT_DATA *, const uchar *, uchar *, uint,
- uint, LSN, uint);
+static int ma_encrypt(MARIA_SHARE *, MARIA_CRYPT_DATA *, const uchar *,
+ uchar *, uint, uint, LSN, uint *);
+static int ma_decrypt(MARIA_SHARE *, MARIA_CRYPT_DATA *, const uchar *,
+ uchar *, uint, uint, LSN, uint);
static my_bool ma_crypt_pre_read_hook(PAGECACHE_IO_HOOK_ARGS *args)
{
@@ -227,7 +227,7 @@ static my_bool ma_crypt_data_post_read_hook(int res,
/* 1 - copy head */
memcpy(dst, src, head);
/* 2 - decrypt page */
- res= ma_decrypt(share->crypt_data,
+ res= ma_decrypt(share, share->crypt_data,
src + head, dst + head, size - (head + tail), pageno, lsn,
key_version);
/* 3 - copy tail */
@@ -294,9 +294,9 @@ static my_bool ma_crypt_data_pre_write_hook(PAGECACHE_IO_HOOK_ARGS *args)
/* 1 - copy head */
memcpy(dst, src, head);
/* 2 - encrypt page */
- if (ma_encrypt(share->crypt_data,
+ if (ma_encrypt(share, share->crypt_data,
src + head, dst + head, size - (head + tail), pageno, lsn,
- &key_version))
+ &key_version))
return 1;
/* 3 - copy tail */
memcpy(dst + size - tail, src + size - tail, tail);
@@ -361,7 +361,7 @@ static my_bool ma_crypt_index_post_read_hook(int res,
/* 1 - copy head */
memcpy(dst, src, head);
/* 2 - decrypt page */
- res= ma_decrypt(share->crypt_data,
+ res= ma_decrypt(share, share->crypt_data,
src + head, dst + head, size, pageno, lsn, key_version);
/* 3 - copy tail */
memcpy(dst + block_size - tail, src + block_size - tail, tail);
@@ -414,9 +414,12 @@ static my_bool ma_crypt_index_pre_write_hook(PAGECACHE_IO_HOOK_ARGS *args)
/* 1 - copy head */
memcpy(dst, src, head);
/* 2 - encrypt page */
- if (ma_encrypt(share->crypt_data,
+ if (ma_encrypt(share, share->crypt_data,
src + head, dst + head, size, pageno, lsn, &key_version))
+ {
+ my_free(crypt_buf);
return 1;
+ }
/* 3 - copy tail */
memcpy(dst + block_size - tail, src + block_size - tail, tail);
/* 4 - store key version */
@@ -444,19 +447,26 @@ void ma_crypt_set_index_pagecache_callbacks(PAGECACHE_FILE *file,
file->post_write_hook= ma_crypt_post_write_hook;
}
-static int ma_encrypt(MARIA_CRYPT_DATA *crypt_data,
- const uchar *src, uchar *dst, uint size,
- uint pageno, LSN lsn,
- uint *key_version)
+static int ma_encrypt(MARIA_SHARE *share, MARIA_CRYPT_DATA *crypt_data,
+ const uchar *src, uchar *dst, uint size,
+ uint pageno, LSN lsn,
+ uint *key_version)
{
int rc;
- uint32 dstlen;
+ uint32 dstlen= 0; /* Must be set because of error message */
*key_version = encryption_key_get_latest_version(crypt_data->scheme.key_id);
if (*key_version == ENCRYPTION_KEY_VERSION_INVALID)
{
- my_printf_error(HA_ERR_GENERIC, "Unknown key id %u. Can't continue!",
- MYF(ME_FATALERROR|ME_NOREFRESH), crypt_data->scheme.key_id);
+ /*
+ We use this error for both encryption and decryption, as in normal
+ cases it should be impossible to get an error here.
+ */
+ my_errno= HA_ERR_DECRYPTION_FAILED;
+ my_printf_error(HA_ERR_DECRYPTION_FAILED,
+ "Unknown key id %u. Can't continue!",
+ MYF(ME_FATALERROR|ME_NOREFRESH),
+ crypt_data->scheme.key_id);
return 1;
}
@@ -464,40 +474,43 @@ static int ma_encrypt(MARIA_CRYPT_DATA *crypt_data,
&crypt_data->scheme, *key_version,
crypt_data->space, pageno, lsn);
- DBUG_ASSERT(rc == MY_AES_OK);
- DBUG_ASSERT(dstlen == size);
+ /* The following can only fail if the encryption key is wrong */
+ DBUG_ASSERT(!my_assert_on_error || rc == MY_AES_OK);
+ DBUG_ASSERT(!my_assert_on_error || dstlen == size);
if (! (rc == MY_AES_OK && dstlen == size))
{
- my_printf_error(HA_ERR_GENERIC,
- "failed to encrypt! rc: %d, dstlen: %u size: %u\n",
+ my_errno= HA_ERR_DECRYPTION_FAILED;
+ my_printf_error(HA_ERR_DECRYPTION_FAILED,
+ "failed to encrypt '%s' rc: %d dstlen: %u size: %u\n",
MYF(ME_FATALERROR|ME_NOREFRESH),
- rc, dstlen, size);
+ share->open_file_name.str, rc, dstlen, size);
return 1;
}
return 0;
}
-static int ma_decrypt(MARIA_CRYPT_DATA *crypt_data,
+static int ma_decrypt(MARIA_SHARE *share, MARIA_CRYPT_DATA *crypt_data,
const uchar *src, uchar *dst, uint size,
uint pageno, LSN lsn,
uint key_version)
{
int rc;
- uint32 dstlen;
+ uint32 dstlen= 0; /* Must be set because of error message */
rc= encryption_scheme_decrypt(src, size, dst, &dstlen,
&crypt_data->scheme, key_version,
crypt_data->space, pageno, lsn);
- DBUG_ASSERT(rc == MY_AES_OK);
- DBUG_ASSERT(dstlen == size);
+ DBUG_ASSERT(!my_assert_on_error || rc == MY_AES_OK);
+ DBUG_ASSERT(!my_assert_on_error || dstlen == size);
if (! (rc == MY_AES_OK && dstlen == size))
{
- my_printf_error(HA_ERR_GENERIC,
- "failed to encrypt! rc: %d, dstlen: %u size: %u\n",
+ my_errno= HA_ERR_DECRYPTION_FAILED;
+ my_printf_error(HA_ERR_DECRYPTION_FAILED,
+ "failed to decrypt '%s' rc: %d dstlen: %u size: %u\n",
MYF(ME_FATALERROR|ME_NOREFRESH),
- rc, dstlen, size);
+ share->open_file_name.str, rc, dstlen, size);
return 1;
}
return 0;
diff --git a/storage/maria/ma_packrec.c b/storage/maria/ma_packrec.c
index a541a657ed2..6a4e7ea99cf 100644
--- a/storage/maria/ma_packrec.c
+++ b/storage/maria/ma_packrec.c
@@ -1204,7 +1204,7 @@ static void decode_bytes(MARIA_COLUMNDEF *rec,MARIA_BIT_BUFF *bit_buff,
/* This means that the Huffman code must be longer than table_bits. */
pos=decode_tree->table+low_byte;
bits-=table_bits;
- /* NOTE: decode_bytes_test_bit() is a macro wich contains a break !!! */
+ /* NOTE: decode_bytes_test_bit() is a macro which contains a break !!! */
for (;;)
{
low_byte=(uint) (bit_buff->current_byte >> (bits-8));
diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c
index bba99703119..ade91a159ca 100644
--- a/storage/maria/ma_pagecache.c
+++ b/storage/maria/ma_pagecache.c
@@ -1077,7 +1077,7 @@ static inline void dec_counter_for_resize_op(PAGECACHE *pagecache)
{
DBUG_PRINT("signal",
("thread %s %ld", last_thread->next->name,
- last_thread->next->id));
+ (ulong) last_thread->next->id));
pagecache_pthread_cond_signal(&last_thread->next->suspend);
}
}
@@ -1341,7 +1341,8 @@ static void link_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block,
*/
if ((PAGECACHE_HASH_LINK *) thread->keycache_link == hash_link)
{
- DBUG_PRINT("signal", ("thread: %s %ld", thread->name, thread->id));
+ DBUG_PRINT("signal", ("thread: %s %ld", thread->name,
+ (ulong) thread->id));
pagecache_pthread_cond_signal(&thread->suspend);
wqueue_unlink_from_queue(&pagecache->waiting_for_block, thread);
block->requests++;
@@ -1579,7 +1580,7 @@ static inline void wait_for_readers(PAGECACHE *pagecache
DBUG_ENTER("wait_for_readers");
DBUG_PRINT("wait",
("suspend thread: %s %ld block: %u",
- thread->name, thread->id,
+ thread->name, (ulong) thread->id,
PCBLOCK_NUMBER(pagecache, block)));
block->condvar= &thread->suspend;
pagecache_pthread_cond_wait(&thread->suspend, &pagecache->cache_lock);
@@ -1604,7 +1605,7 @@ static void wait_for_flush(PAGECACHE *pagecache
do
{
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name, (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -1671,7 +1672,8 @@ static void unlink_hash(PAGECACHE *pagecache, PAGECACHE_HASH_LINK *hash_link)
if (page->file.file == hash_link->file.file &&
page->pageno == hash_link->pageno)
{
- DBUG_PRINT("signal", ("thread %s %ld", thread->name, thread->id));
+ DBUG_PRINT("signal", ("thread %s %ld", thread->name,
+ (ulong) thread->id));
pagecache_pthread_cond_signal(&thread->suspend);
wqueue_unlink_from_queue(&pagecache->waiting_for_hash_link, thread);
}
@@ -1811,7 +1813,7 @@ restart:
thread->keycache_link= (void *) &page;
wqueue_link_into_queue(&pagecache->waiting_for_hash_link, thread);
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name, (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
thread->keycache_link= NULL;
@@ -1991,7 +1993,8 @@ restart:
do
{
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name,
+ (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -2082,7 +2085,8 @@ restart:
do
{
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name,
+ (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -2355,7 +2359,7 @@ static my_bool pagecache_wait_lock(PAGECACHE *pagecache,
do
{
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name, (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -2755,7 +2759,8 @@ static void read_block(PAGECACHE *pagecache,
do
{
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name,
+ (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -4549,7 +4554,7 @@ static int flush_pagecache_blocks_int(PAGECACHE *pagecache,
{
DBUG_PRINT("wait",
("(1) suspend thread %s %ld",
- thread->name, thread->id));
+ thread->name, (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -4710,7 +4715,7 @@ restart:
{
DBUG_PRINT("wait",
("(2) suspend thread %s %ld",
- thread->name, thread->id));
+ thread->name, (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -4914,7 +4919,8 @@ my_bool pagecache_collect_changed_blocks_with_lsn(PAGECACHE *pagecache,
do
{
DBUG_PRINT("wait",
- ("suspend thread %s %ld", thread->name, thread->id));
+ ("suspend thread %s %ld", thread->name,
+ (ulong) thread->id));
pagecache_pthread_cond_wait(&thread->suspend,
&pagecache->cache_lock);
}
@@ -5057,7 +5063,8 @@ static void pagecache_dump(PAGECACHE *pagecache)
PAGECACHE_PAGE *page;
uint i;
- fprintf(pagecache_dump_file, "thread: %s %ld\n", thread->name, thread->id);
+ fprintf(pagecache_dump_file, "thread: %s %ld\n", thread->name,
+ (ulong) thread->id);
i=0;
thread=last=waiting_for_hash_link.last_thread;
@@ -5069,7 +5076,7 @@ static void pagecache_dump(PAGECACHE *pagecache)
page= (PAGECACHE_PAGE *) thread->keycache_link;
fprintf(pagecache_dump_file,
"thread: %s %ld, (file,pageno)=(%u,%lu)\n",
- thread->name, thread->id,
+ thread->name, (ulong) thread->id,
(uint) page->file.file,(ulong) page->pageno);
if (++i == MAX_QUEUE_LEN)
break;
@@ -5086,7 +5093,7 @@ static void pagecache_dump(PAGECACHE *pagecache)
hash_link= (PAGECACHE_HASH_LINK *) thread->keycache_link;
fprintf(pagecache_dump_file,
"thread: %s %u hash_link:%u (file,pageno)=(%u,%lu)\n",
- thread->name, thread->id,
+ thread->name, (ulong) thread->id,
(uint) PAGECACHE_HASH_LINK_NUMBER(pagecache, hash_link),
(uint) hash_link->file.file,(ulong) hash_link->pageno);
if (++i == MAX_QUEUE_LEN)
@@ -5116,7 +5123,7 @@ static void pagecache_dump(PAGECACHE *pagecache)
{
thread=thread->next;
fprintf(pagecache_dump_file,
- "thread: %s %ld\n", thread->name, thread->id);
+ "thread: %s %ld\n", thread->name, (ulong) thread->id);
if (++i == MAX_QUEUE_LEN)
break;
}
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/maria/maria_def.h b/storage/maria/maria_def.h
index 676927b119a..7337b01a981 100644
--- a/storage/maria/maria_def.h
+++ b/storage/maria/maria_def.h
@@ -523,6 +523,7 @@ typedef struct st_maria_share
Keep of track of last insert page, used to implement insert order
*/
uint last_insert_page;
+ pgcache_page_no_t last_insert_bitmap;
} MARIA_SHARE;
diff --git a/storage/mroonga/mrn_table.cpp b/storage/mroonga/mrn_table.cpp
index af07dc09cf3..144dbe0c530 100644
--- a/storage/mroonga/mrn_table.cpp
+++ b/storage/mroonga/mrn_table.cpp
@@ -278,7 +278,7 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length,
#define MRN_PARAM_STR(title_name, param_name) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info", ("mroonga "title_name" start")); \
+ DBUG_PRINT("info", ("mroonga " title_name " start")); \
if (!share->param_name) \
{ \
if ((share->param_name = mrn_get_string_between_quote( \
@@ -290,7 +290,7 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length,
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info", ("mroonga "title_name"=%s", share->param_name)); \
+ DBUG_PRINT("info", ("mroonga " title_name "=%s", share->param_name)); \
} \
break; \
}
@@ -298,7 +298,7 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length,
#define MRN_PARAM_STR_LIST(title_name, param_name, param_pos) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info", ("mroonga "title_name" start")); \
+ DBUG_PRINT("info", ("mroonga " title_name " start")); \
if (share->param_name && !share->param_name[param_pos]) \
{ \
if ((share->param_name[param_pos] = mrn_get_string_between_quote( \
@@ -311,7 +311,7 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length,
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info", ("mroonga "title_name"[%d]=%s", param_pos, \
+ DBUG_PRINT("info", ("mroonga " title_name "[%d]=%s", param_pos, \
share->param_name[param_pos])); \
} \
break; \
@@ -1015,10 +1015,7 @@ TABLE_SHARE *mrn_get_table_share(TABLE_LIST *table_list, int *error)
share = get_table_share(thd, table_list, key, key_length, 0, error,
hash_value);
#elif defined(MRN_HAVE_TDC_ACQUIRE_SHARE)
- share = tdc_acquire_share(thd, table_list->db, table_list->table_name, key,
- key_length,
- table_list->mdl_request.key.tc_hash_value(),
- GTS_TABLE, NULL);
+ share = tdc_acquire_share(thd, table_list, GTS_TABLE);
#else
share = get_table_share(thd, table_list, key, key_length, 0, error);
#endif
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/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index cbf411544b6..812166ce1cc 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -637,7 +637,7 @@ void _mi_report_crashed(MI_INFO *file, const char *message,
char buf[1024];
mysql_mutex_lock(&file->s->intern_lock);
if ((cur_thd= (THD*) file->in_use.data))
- sql_print_error("Got an error from thread_id=%lu, %s:%d", cur_thd->thread_id,
+ sql_print_error("Got an error from thread_id=%lld, %s:%d", cur_thd->thread_id,
sfile, sline);
else
sql_print_error("Got an error from unknown thread, %s:%d", sfile, sline);
@@ -2409,7 +2409,7 @@ maria_declare_plugin_end;
@return The error code. The engine_data and engine_callback will be set to 0.
@retval TRUE Success
- @retval FALSE An error occured
+ @retval FALSE An error occurred
*/
my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name,
diff --git a/storage/myisam/mi_packrec.c b/storage/myisam/mi_packrec.c
index 3687cfc2179..fc32bb7e518 100644
--- a/storage/myisam/mi_packrec.c
+++ b/storage/myisam/mi_packrec.c
@@ -1158,7 +1158,7 @@ static void decode_bytes(MI_COLUMNDEF *rec,MI_BIT_BUFF *bit_buff,uchar *to,
/* This means that the Huffman code must be longer than table_bits. */
pos=decode_tree->table+low_byte;
bits-=table_bits;
- /* NOTE: decode_bytes_test_bit() is a macro wich contains a break !!! */
+ /* NOTE: decode_bytes_test_bit() is a macro which contains a break !!! */
for (;;)
{
low_byte=(uint) (bit_buff->current_byte >> (bits-8));
diff --git a/storage/myisam/myisamlog.c b/storage/myisam/myisamlog.c
index d549dd76037..7ce03ca9485 100644
--- a/storage/myisam/myisamlog.c
+++ b/storage/myisam/myisamlog.c
@@ -266,7 +266,7 @@ static void get_options(register int *argc, register char ***argv)
puts(" -u \"update\" -v \"verbose\" -w \"write file\"");
puts(" -D \"myisam compiled with DBUG\" -P \"processes\"");
puts("\nOne can give a second and a third '-v' for more verbose.");
- puts("Normaly one does a update (-u).");
+ puts("Normally one does a update (-u).");
puts("If a recover is done all writes and all possibly updates and deletes is done\nand errors are only counted.");
puts("If one gives table names as arguments only these tables will be updated\n");
help=1;
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/graphcore.cc b/storage/oqgraph/graphcore.cc
index 73433fc8219..4346b94805c 100644
--- a/storage/oqgraph/graphcore.cc
+++ b/storage/oqgraph/graphcore.cc
@@ -1036,11 +1036,11 @@ int stack_cursor::fetch_row(const row &row_info, row &result,
optional<EdgeWeight> w;
optional<Vertex> v;
result= row_info;
- if ((result.seq_indicator= seq= last.sequence()))
+ if ((result.seq_indicator= static_cast<bool>(seq= last.sequence())))
result.seq= *seq;
- if ((result.link_indicator= v= last.vertex()))
+ if ((result.link_indicator= static_cast<bool>(v= last.vertex())))
result.link= get(boost::vertex_index, share->g, *v);
- if ((result.weight_indicator= w= last.weight()))
+ if ((result.weight_indicator= static_cast<bool>(w= last.weight())))
result.weight= *w;
return oqgraph::OK;
}
diff --git a/storage/oqgraph/ha_oqgraph.cc b/storage/oqgraph/ha_oqgraph.cc
index e220d64d962..78a0079a5ab 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
@@ -752,6 +753,10 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked)
int ha_oqgraph::close(void)
{
DBUG_PRINT( "oq-debug", ("close()"));
+ if (graph->get_thd() != current_thd) {
+ DBUG_PRINT( "oq-debug", ("index_next_same g->table->in_use: 0x%lx <-- current_thd 0x%lx", (long) graph->get_thd(), (long) current_thd));
+ graph->set_thd(current_thd);
+ }
oqgraph::free(graph); graph= 0;
oqgraph::free(graph_share); graph_share= 0;
@@ -1371,6 +1376,6 @@ maria_declare_plugin(oqgraph)
oqgraph_status, /* status variables */
oqgraph_sysvars, /* system variables */
"3.0",
- MariaDB_PLUGIN_MATURITY_BETA
+ MariaDB_PLUGIN_MATURITY_GAMMA
}
maria_declare_plugin_end;
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/pfs.cc b/storage/perfschema/pfs.cc
index dd61df5f861..dbe3241cfe8 100644
--- a/storage/perfschema/pfs.cc
+++ b/storage/perfschema/pfs.cc
@@ -1444,7 +1444,9 @@ static void register_statement_v1(const char *category,
for (; count>0; count--, info++)
{
- DBUG_ASSERT(info->m_name != NULL);
+ if (info->m_name == NULL)
+ continue;
+
len= strlen(info->m_name);
full_length= prefix_length + len;
if (likely(full_length <= PFS_MAX_INFO_NAME_LENGTH))
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/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index c5c47064403..681a3fb144c 100644
--- a/storage/spider/spd_conn.cc
+++ b/storage/spider/spd_conn.cc
@@ -37,8 +37,6 @@
#include "spd_ping_table.h"
#include "spd_malloc.h"
-extern ulong *spd_db_att_thread_id;
-
extern handlerton *spider_hton_ptr;
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
pthread_mutex_t spider_conn_id_mutex;
@@ -2269,9 +2267,7 @@ void *spider_bg_conn_action(
my_thread_end();
DBUG_RETURN(NULL);
}
- pthread_mutex_lock(&LOCK_thread_count);
- thd->thread_id = (*spd_db_att_thread_id)++;
- pthread_mutex_unlock(&LOCK_thread_count);
+ thd->thread_id = next_thread_id();
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -2782,9 +2778,7 @@ void *spider_bg_sts_action(
#endif
DBUG_RETURN(NULL);
}
- pthread_mutex_lock(&LOCK_thread_count);
- thd->thread_id = (*spd_db_att_thread_id)++;
- pthread_mutex_unlock(&LOCK_thread_count);
+ thd->thread_id = next_thread_id();
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -3164,9 +3158,7 @@ void *spider_bg_crd_action(
#endif
DBUG_RETURN(NULL);
}
- pthread_mutex_lock(&LOCK_thread_count);
- thd->thread_id = (*spd_db_att_thread_id)++;
- pthread_mutex_unlock(&LOCK_thread_count);
+ thd->thread_id = next_thread_id();
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -3653,9 +3645,7 @@ void *spider_bg_mon_action(
my_thread_end();
DBUG_RETURN(NULL);
}
- pthread_mutex_lock(&LOCK_thread_count);
- thd->thread_id = (*spd_db_att_thread_id)++;
- pthread_mutex_unlock(&LOCK_thread_count);
+ thd->thread_id = next_thread_id();
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc
index c01549f8e99..7e7845635af 100644
--- a/storage/spider/spd_copy_tables.cc
+++ b/storage/spider/spd_copy_tables.cc
@@ -81,7 +81,7 @@ int spider_udf_set_copy_tables_param_default(
#define SPIDER_PARAM_STR(title_name, param_name) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (!copy_tables->param_name) \
{ \
if ((copy_tables->param_name = spider_get_string_between_quote( \
@@ -94,14 +94,14 @@ int spider_udf_set_copy_tables_param_default(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%s", copy_tables->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%s", copy_tables->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_HINT_WITH_MAX(title_name, param_name, check_length, max_size, min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
int hint_num = atoi(tmp_ptr + check_length) - 1; \
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
@@ -131,7 +131,7 @@ int spider_udf_set_copy_tables_param_default(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"[%d]=%d", hint_num, \
+ DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
copy_tables->param_name[hint_num])); \
} else { \
error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
@@ -144,7 +144,7 @@ int spider_udf_set_copy_tables_param_default(
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (copy_tables->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -161,14 +161,14 @@ int spider_udf_set_copy_tables_param_default(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%d", copy_tables->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (copy_tables->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -183,14 +183,14 @@ int spider_udf_set_copy_tables_param_default(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%d", copy_tables->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (copy_tables->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -206,7 +206,7 @@ int spider_udf_set_copy_tables_param_default(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%lld", \
+ DBUG_PRINT("info",("spider " title_name "=%lld", \
copy_tables->param_name)); \
} \
break; \
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index 9f46e55ca09..69a05dc94fb 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -737,7 +737,8 @@ int spider_db_errorno(
"to %ld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- current_thd->thread_id, error_num, conn->db_conn->get_error());
+ (ulong) current_thd->thread_id, error_num,
+ conn->db_conn->get_error());
}
if (!conn->mta_conn_mutex_unlock_later)
{
@@ -757,7 +758,8 @@ int spider_db_errorno(
"to %ld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- current_thd->thread_id, error_num, conn->db_conn->get_error());
+ (ulong) current_thd->thread_id, error_num,
+ conn->db_conn->get_error());
}
if (!conn->mta_conn_mutex_unlock_later)
{
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index c4da0194357..a41a943cd04 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -1717,7 +1717,7 @@ int spider_db_mysql::exec_query(
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
security_ctx->user ? security_ctx->user : "system user",
security_ctx->host_or_ip,
- thd->thread_id,
+ (ulong) thd->thread_id,
tmp_query_str.c_ptr_safe());
}
if (log_result_error_with_sql & 1)
@@ -1731,7 +1731,7 @@ int spider_db_mysql::exec_query(
"sql: %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- thd->thread_id, conn->tgt_host, db_conn->thread_id,
+ (ulong) thd->thread_id, conn->tgt_host, (ulong) db_conn->thread_id,
tmp_query_str.c_ptr_safe());
}
}
@@ -1745,7 +1745,7 @@ int spider_db_mysql::exec_query(
"affected_rows: %llu id: %llu status: %u warning_count: %u\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- conn->tgt_host, db_conn->thread_id, thd->thread_id,
+ conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
db_conn->affected_rows, db_conn->insert_id,
db_conn->server_status, db_conn->warning_count);
if (spider_param_log_result_errors() >= 3)
@@ -1760,7 +1760,7 @@ int spider_db_mysql::exec_query(
"affected_rows: %llu id: %llu status: %u warning_count: %u\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- conn->tgt_host, db_conn->thread_id, thd->thread_id,
+ conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
db_conn->affected_rows, db_conn->insert_id,
db_conn->server_status, db_conn->warning_count);
}
@@ -1889,8 +1889,8 @@ void spider_db_mysql::print_warnings(
"from [%s] %ld to %ld: %s %s %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- conn->tgt_host, db_conn->thread_id,
- current_thd->thread_id, row[0], row[1], row[2]);
+ conn->tgt_host, (ulong) db_conn->thread_id,
+ (ulong) current_thd->thread_id, row[0], row[1], row[2]);
row = mysql_fetch_row(res);
}
if (res)
@@ -4041,7 +4041,7 @@ int spider_db_mysql_util::open_item_func(
{
Item_func_conv_charset *item_func_conv_charset =
(Item_func_conv_charset *)item_func;
- CHARSET_INFO *conv_charset = item_func_conv_charset->conv_charset;
+ CHARSET_INFO *conv_charset = item_func_conv_charset->collation.collation;
uint cset_length = strlen(conv_charset->csname);
if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index 7de31e34e94..c0eb7806bb0 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -896,7 +896,7 @@ error:
#define SPIDER_PARAM_STR(title_name, param_name) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (!direct_sql->param_name) \
{ \
if ((direct_sql->param_name = spider_get_string_between_quote( \
@@ -909,14 +909,14 @@ error:
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%s", direct_sql->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_HINT_WITH_MAX(title_name, param_name, check_length, max_size, min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
int hint_num = atoi(tmp_ptr + check_length) - 1; \
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
@@ -946,7 +946,7 @@ error:
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"[%d]=%d", hint_num, \
+ DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
direct_sql->param_name[hint_num])); \
} else { \
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
@@ -959,7 +959,7 @@ error:
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (direct_sql->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -976,7 +976,7 @@ error:
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%d", \
+ DBUG_PRINT("info",("spider " title_name "=%d", \
(int) direct_sql->param_name)); \
} \
break; \
@@ -984,7 +984,7 @@ error:
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (direct_sql->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -999,14 +999,14 @@ error:
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%d", direct_sql->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (direct_sql->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1022,7 +1022,7 @@ error:
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%lld", \
+ DBUG_PRINT("info",("spider " title_name "=%lld", \
direct_sql->param_name)); \
} \
break; \
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index a9aea90dcdd..d981dc6002b 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -41,7 +41,6 @@
#include "spd_direct_sql.h"
#include "spd_malloc.h"
-ulong *spd_db_att_thread_id;
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED
@@ -1500,7 +1499,7 @@ static int spider_set_ll_value(
#define SPIDER_PARAM_STR(title_name, param_name) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (!share->param_name) \
{ \
if ((share->param_name = spider_get_string_between_quote( \
@@ -1512,7 +1511,7 @@ static int spider_set_ll_value(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%s", share->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%s", share->param_name)); \
} \
break; \
}
@@ -1521,7 +1520,7 @@ static int spider_set_ll_value(
#define SPIDER_PARAM_STR_LIST(title_name, param_name) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (!share->param_name) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1547,7 +1546,7 @@ static int spider_set_ll_value(
#define SPIDER_PARAM_HINT(title_name, param_name, check_length, max_size, append_method) \
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
int hint_num = atoi(tmp_ptr + check_length); \
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
@@ -1566,7 +1565,7 @@ static int spider_set_ll_value(
if ((error_num = \
append_method(&share->param_name[hint_num], hint_str))) \
goto error; \
- DBUG_PRINT("info",("spider "title_name"[%d]=%s", hint_num, \
+ DBUG_PRINT("info",("spider " title_name "[%d]=%s", hint_num, \
share->param_name[hint_num].ptr())); \
} else { \
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
@@ -1579,7 +1578,7 @@ static int spider_set_ll_value(
#define SPIDER_PARAM_NUMHINT(title_name, param_name, check_length, max_size, append_method) \
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
int hint_num = atoi(tmp_ptr + check_length); \
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
@@ -1598,7 +1597,7 @@ static int spider_set_ll_value(
if ((error_num = \
append_method(&share->param_name[hint_num], hint_str))) \
goto error; \
- DBUG_PRINT("info",("spider "title_name"[%d]=%lld", hint_num, \
+ DBUG_PRINT("info",("spider " title_name "[%d]=%lld", hint_num, \
share->param_name[hint_num])); \
} else { \
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
@@ -1613,7 +1612,7 @@ static int spider_set_ll_value(
min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (!share->param_name) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1640,7 +1639,7 @@ static int spider_set_ll_value(
min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (!share->param_name) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1665,7 +1664,7 @@ static int spider_set_ll_value(
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (share->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1682,14 +1681,14 @@ static int spider_set_ll_value(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%d", share->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%d", share->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (share->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1704,14 +1703,14 @@ static int spider_set_ll_value(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%d", share->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%d", share->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_DOUBLE(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (share->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1726,14 +1725,14 @@ static int spider_set_ll_value(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%f", share->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%f", share->param_name)); \
} \
break; \
}
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
{ \
- DBUG_PRINT("info",("spider "title_name" start")); \
+ DBUG_PRINT("info",("spider " title_name " start")); \
if (share->param_name == -1) \
{ \
if ((tmp_ptr2 = spider_get_string_between_quote( \
@@ -1748,7 +1747,7 @@ static int spider_set_ll_value(
MYF(0), tmp_ptr); \
goto error; \
} \
- DBUG_PRINT("info",("spider "title_name"=%lld", share->param_name)); \
+ DBUG_PRINT("info",("spider " title_name "=%lld", share->param_name)); \
} \
break; \
}
@@ -6327,8 +6326,6 @@ int spider_db_init(
#ifdef _WIN32
HMODULE current_module = GetModuleHandle(NULL);
- spd_db_att_thread_id = (ulong *)
- GetProcAddress(current_module, "?thread_id@@3KA");
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED
@@ -6362,7 +6359,6 @@ int spider_db_init(
spd_abort_loop = (bool volatile *)
GetProcAddress(current_module, "?abort_loop@@3_NC");
#else
- spd_db_att_thread_id = &thread_id;
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index d7127fa0084..b376265c1e7 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -2683,7 +2683,8 @@ int spider_initinal_xa_recover(
FALSE, open_tables_backup, TRUE, &error_num))
)
goto error_open_table;
- init_read_record(read_record, thd, table_xa, NULL, TRUE, FALSE, FALSE);
+ init_read_record(read_record, thd, table_xa, NULL, NULL, TRUE, FALSE,
+ FALSE);
}
SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
while ((!(read_record->read_record(read_record))) && cnt < (int) len)
diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt
index 2b605d14677..a64974d7330 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)
@@ -34,7 +31,7 @@ MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-vla")
MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-vla" DEBUG)
############################################
-SET(TOKUDB_DEB_FILES "usr/lib/mysql/plugin/ha_tokudb.so\netc/mysql/conf.d/tokudb.cnf\nusr/bin/tokuftdump\nusr/share/doc/mariadb-server-10.2/README-TOKUDB\nusr/share/doc/mariadb-server-10.2/README.md" PARENT_SCOPE)
+SET(TOKUDB_DEB_FILES "usr/lib/mysql/plugin/ha_tokudb.so\netc/mysql/conf.d/tokudb.cnf\nusr/bin/tokuftdump" PARENT_SCOPE)
MARK_AS_ADVANCED(BUILDNAME)
MARK_AS_ADVANCED(BUILD_TESTING)
MARK_AS_ADVANCED(CMAKE_TOKUDB_REVISION)
diff --git a/storage/tokudb/PerconaFT/buildheader/CMakeLists.txt b/storage/tokudb/PerconaFT/buildheader/CMakeLists.txt
index 5da3c98ff48..6d5cbb94358 100644
--- a/storage/tokudb/PerconaFT/buildheader/CMakeLists.txt
+++ b/storage/tokudb/PerconaFT/buildheader/CMakeLists.txt
@@ -1,6 +1,6 @@
set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "")
-file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/runcat.sh" "#!/bin/bash
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/runcat.sh" "#!/bin/sh
out=$1; shift
exec \"$@\" >$out")
@@ -8,7 +8,7 @@ add_executable(make_tdb make_tdb.cc)
set_property(TARGET make_tdb APPEND PROPERTY COMPILE_DEFINITIONS _GNU_SOURCE)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/db.h"
- COMMAND bash runcat.sh "${CMAKE_CURRENT_BINARY_DIR}/db.h" $<TARGET_FILE:make_tdb>
+ COMMAND sh runcat.sh "${CMAKE_CURRENT_BINARY_DIR}/db.h" $<TARGET_FILE:make_tdb>
DEPENDS make_tdb)
add_custom_target(install_tdb_h DEPENDS
"${CMAKE_CURRENT_BINARY_DIR}/db.h")
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/tokudb/mysql-test/tokudb/r/cluster_filter_unpack_varchar_hidden.result b/storage/tokudb/mysql-test/tokudb/r/cluster_filter_unpack_varchar_hidden.result
index 640c7badc71..6269b8f2d71 100644
--- a/storage/tokudb/mysql-test/tokudb/r/cluster_filter_unpack_varchar_hidden.result
+++ b/storage/tokudb/mysql-test/tokudb/r/cluster_filter_unpack_varchar_hidden.result
@@ -182,14 +182,14 @@ a b c d e f
3 30 200 2000 20000 200000
explain select * from t1 where b > "0";
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 index b b NULL NULL NULL; Using where; Using index
+1 SIMPLE t1 <type> b b NULL NULL NULL; Using where; Using index
select * from t1 where b > "0";
a b c d e f
2 20 100 1000 10000 100000
3 30 200 2000 20000 200000
explain select * from t1 where d > "0";
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 index d d NULL NULL NULL; Using where; Using index
+1 SIMPLE t1 <type> d d NULL NULL NULL; Using where; Using index
select * from t1 where d > "0";
a b c d e f
2 20 100 1000 10000 100000
diff --git a/storage/tokudb/mysql-test/tokudb/t/change_column_bin.py b/storage/tokudb/mysql-test/tokudb/t/change_column_bin.py
index 0ddee301d1b..b94a80ec7be 100644
--- a/storage/tokudb/mysql-test/tokudb/t/change_column_bin.py
+++ b/storage/tokudb/mysql-test/tokudb/t/change_column_bin.py
@@ -24,6 +24,7 @@ def gen_test(n):
def main():
print "# this test is generated by change_bin.py"
print "# test binary expansion is hot"
+ print "--source include/big_test.inc"
print "--disable_warnings"
print "DROP TABLE IF EXISTS t,ti;"
print "--enable_warnings"
diff --git a/storage/tokudb/mysql-test/tokudb/t/change_column_bin.test b/storage/tokudb/mysql-test/tokudb/t/change_column_bin.test
index 0365c155302..6053a263cf0 100644
--- a/storage/tokudb/mysql-test/tokudb/t/change_column_bin.test
+++ b/storage/tokudb/mysql-test/tokudb/t/change_column_bin.test
@@ -1,6 +1,7 @@
source include/have_tokudb.inc;
# this test is generated by change_bin.py
# test binary expansion is hot
+--source include/big_test.inc
--disable_warnings
DROP TABLE IF EXISTS t,ti;
--enable_warnings
diff --git a/storage/tokudb/mysql-test/tokudb/t/change_column_char.py b/storage/tokudb/mysql-test/tokudb/t/change_column_char.py
index 99d99d1c017..7481d9092f2 100644
--- a/storage/tokudb/mysql-test/tokudb/t/change_column_char.py
+++ b/storage/tokudb/mysql-test/tokudb/t/change_column_char.py
@@ -24,6 +24,7 @@ def gen_test(n):
def main():
print "# this test is generated by change_char.py"
print "# test char expansion"
+ print "--source include/big_test.inc"
print "--disable_warnings"
print "DROP TABLE IF EXISTS t,ti;"
print "--enable_warnings"
diff --git a/storage/tokudb/mysql-test/tokudb/t/change_column_char.test b/storage/tokudb/mysql-test/tokudb/t/change_column_char.test
index 8a0b0a9abd8..977420ad07e 100644
--- a/storage/tokudb/mysql-test/tokudb/t/change_column_char.test
+++ b/storage/tokudb/mysql-test/tokudb/t/change_column_char.test
@@ -1,6 +1,7 @@
source include/have_tokudb.inc;
# this test is generated by change_char.py
# test char expansion
+--source include/big_test.inc
--disable_warnings
DROP TABLE IF EXISTS t,ti;
--enable_warnings
diff --git a/storage/tokudb/mysql-test/tokudb/t/cluster_filter_unpack_varchar_hidden.test b/storage/tokudb/mysql-test/tokudb/t/cluster_filter_unpack_varchar_hidden.test
index d1be871c7d2..e9bb18a586e 100644
--- a/storage/tokudb/mysql-test/tokudb/t/cluster_filter_unpack_varchar_hidden.test
+++ b/storage/tokudb/mysql-test/tokudb/t/cluster_filter_unpack_varchar_hidden.test
@@ -82,11 +82,11 @@ alter table t1 add key d(d,a) clustering=yes, add key b(b) clustering=yes;
explain select * from t1;
select * from t1;
---replace_column 7 NULL 9 NULL;
+--replace_column 4 <type> 7 NULL 9 NULL;
explain select * from t1 where b > "0";
select * from t1 where b > "0";
---replace_column 7 NULL 9 NULL;
+--replace_column 4 <type> 7 NULL 9 NULL;
explain select * from t1 where d > "0";
select * from t1 where d > "0";
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 100f304bf6f..ceffa950739 100644
--- a/storage/xtradb/fil/fil0crypt.cc
+++ b/storage/xtradb/fil/fil0crypt.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
-Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
+Copyright (C) 2014, 2016, MariaDB Corporation. 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
@@ -662,7 +662,7 @@ fil_space_encrypt(
return src_frame;
}
- ut_ad(crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
+ ut_a(crypt_data != NULL && crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
byte* tmp = fil_encrypt_buf(crypt_data, space, offset, lsn, src_frame, zip_size, dst_frame);
@@ -712,21 +712,37 @@ fil_space_decrypt(
ulint page_type = mach_read_from_2(src_frame+FIL_PAGE_TYPE);
uint key_version = mach_read_from_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED);
-
+ ulint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET);
+ ulint space = mach_read_from_4(src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
+ ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
*err = DB_SUCCESS;
if (key_version == ENCRYPTION_KEY_NOT_ENCRYPTED) {
return false;
}
- ut_ad(crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
+ if (crypt_data == NULL) {
+ if (!(space == 0 && offset == 0) && key_version != 0) {
+ /* FIL_PAGE_FILE_FLUSH_LSN field i.e.
+ FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
+ should be only defined for the
+ first page in a system tablespace
+ data file (ibdata*, not *.ibd), if not
+ clear it. */
+#ifdef UNIV_DEBUG
+ ib_logf(IB_LOG_LEVEL_WARN,
+ "Page on space %lu offset %lu has key_version %u"
+ " when it shoud be undefined.",
+ space, offset, key_version);
+#endif
+ mach_write_to_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0);
+ }
+ return false;
+ }
- /* read space & offset & lsn */
- ulint space = mach_read_from_4(
- src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
- ulint offset = mach_read_from_4(
- src_frame + FIL_PAGE_OFFSET);
- ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
+ ut_a(crypt_data != NULL && crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
+
+ /* read space & lsn */
ulint header_len = FIL_PAGE_DATA;
if (page_compressed) {
@@ -799,6 +815,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 +824,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;
}
/******************************************************************
@@ -2294,6 +2315,10 @@ fil_crypt_set_thread_cnt(
/*=====================*/
uint new_cnt) /*!< in: New key rotation thread count */
{
+ if (!fil_crypt_threads_inited) {
+ fil_crypt_threads_init();
+ }
+
if (new_cnt > srv_n_fil_crypt_threads) {
uint add = new_cnt - srv_n_fil_crypt_threads;
srv_n_fil_crypt_threads = new_cnt;
@@ -2358,15 +2383,18 @@ void
fil_crypt_threads_init()
/*====================*/
{
- fil_crypt_event = os_event_create();
- fil_crypt_threads_event = os_event_create();
- mutex_create(fil_crypt_threads_mutex_key,
- &fil_crypt_threads_mutex, SYNC_NO_ORDER_CHECK);
-
- uint cnt = srv_n_fil_crypt_threads;
- srv_n_fil_crypt_threads = 0;
- fil_crypt_set_thread_cnt(cnt);
- fil_crypt_threads_inited = true;
+ ut_ad(mutex_own(&fil_system->mutex));
+ if (!fil_crypt_threads_inited) {
+ fil_crypt_event = os_event_create();
+ fil_crypt_threads_event = os_event_create();
+ mutex_create(fil_crypt_threads_mutex_key,
+ &fil_crypt_threads_mutex, SYNC_NO_ORDER_CHECK);
+
+ uint cnt = srv_n_fil_crypt_threads;
+ srv_n_fil_crypt_threads = 0;
+ fil_crypt_threads_inited = true;
+ fil_crypt_set_thread_cnt(cnt);
+ }
}
/*********************************************************************
@@ -2389,6 +2417,7 @@ fil_crypt_threads_cleanup()
{
os_event_free(fil_crypt_event);
os_event_free(fil_crypt_threads_event);
+ fil_crypt_threads_inited = false;
}
/*********************************************************************
@@ -2493,6 +2522,7 @@ fil_space_crypt_get_status(
mutex_enter(&crypt_data->mutex);
status->keyserver_requests = crypt_data->keyserver_requests;
status->min_key_version = crypt_data->min_key_version;
+ status->key_id = crypt_data->key_id;
if (crypt_data->rotate_state.active_threads > 0 ||
crypt_data->rotate_state.flushing) {
diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc
index 65827717230..b60a0e9ddaf 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.
@@ -3198,9 +3240,12 @@ fil_create_link_file(
link_filepath = fil_make_isl_name(tablename);
+ /* Note that OS_FILE_READ_WRITE_CACHED used here to avoid
+ unnecessary errors on O_DIRECT, link files are not really
+ a data files. */
file = os_file_create_simple_no_error_handling(
innodb_file_data_key, link_filepath,
- OS_FILE_CREATE, OS_FILE_READ_WRITE, &success, 0);
+ OS_FILE_CREATE, OS_FILE_READ_WRITE_CACHED, &success, 0);
if (!success) {
/* The following call will print an error message */
@@ -6918,31 +6963,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/fts/fts0fts.cc b/storage/xtradb/fts/fts0fts.cc
index 7a381f4ca05..712dfa264d4 100644
--- a/storage/xtradb/fts/fts0fts.cc
+++ b/storage/xtradb/fts/fts0fts.cc
@@ -6274,7 +6274,7 @@ fts_fake_hex_to_dec(
#ifdef _WIN32
ret = sscanf(tmp_id, "%016llu", &dec_id);
#else
- ret = sscanf(tmp_id, "%016"PRIu64, &dec_id);
+ ret = sscanf(tmp_id, "%016" PRIu64, &dec_id);
#endif /* _WIN32 */
ut_ad(ret == 1);
diff --git a/storage/xtradb/fts/fts0opt.cc b/storage/xtradb/fts/fts0opt.cc
index e096b8bf6d6..0703b050848 100644
--- a/storage/xtradb/fts/fts0opt.cc
+++ b/storage/xtradb/fts/fts0opt.cc
@@ -598,7 +598,7 @@ fts_zip_read_word(
/* Finished decompressing block. */
if (zip->zp->avail_in == 0) {
- /* Free the block thats been decompressed. */
+ /* Free the block that's been decompressed. */
if (zip->pos > 0) {
ulint prev = zip->pos - 1;
diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc
index c50d3fd934b..b6d259c8bda 100644
--- a/storage/xtradb/handler/ha_innodb.cc
+++ b/storage/xtradb/handler/ha_innodb.cc
@@ -1,11 +1,10 @@
/*****************************************************************************
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
-Copyright (c) 2013, 2015, MariaDB Corporation.
+Copyright (c) 2013, 2016, MariaDB Corporation.
Copyright (c) 2008, 2009 Google Inc.
Copyright (c) 2009, Percona Inc.
Copyright (c) 2012, Facebook Inc.
-Copyright (c) 2013, 2015, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -944,12 +943,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 +1483,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 +5378,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 +8314,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 %lu.",
+ 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 +8648,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 +8667,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 %lu.",
+ 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 +9087,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 %lu.",
+ 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 +9194,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 +9208,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 %lu.",
+ 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 +9280,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 +12736,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 %lu.",
+ 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 +12757,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 %lu.",
+ 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 +14153,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 %lu.",
+ 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 +14169,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 %lu.",
+ 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 +15384,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 %lu.",
+ 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 +18490,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 +19247,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);
@@ -21070,7 +21123,7 @@ maria_declare_plugin(xtradb)
innodb_status_variables_export,/* status variables */
innobase_system_variables, /* system variables */
INNODB_VERSION_STR, /* string version */
- MariaDB_PLUGIN_MATURITY_BETA /* maturity */
+ MariaDB_PLUGIN_MATURITY_GAMMA /* maturity */
},
i_s_xtradb_read_view,
i_s_xtradb_internal_hash_tables,
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/handler/i_s.cc b/storage/xtradb/handler/i_s.cc
index e124cb98f99..a131a50458a 100644
--- a/storage/xtradb/handler/i_s.cc
+++ b/storage/xtradb/handler/i_s.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
-Copyrigth (c) 2014, 2015, MariaDB Corporation
+Copyrigth (c) 2014, 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
@@ -792,7 +792,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_trx =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_locks */
@@ -1050,7 +1050,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_locks =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_lock_waits */
@@ -1231,7 +1231,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_lock_waits =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/*******************************************************************//**
@@ -1565,7 +1565,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_reset =
@@ -1613,7 +1613,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_reset =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/* Fields of the dynamic tables
@@ -1912,7 +1912,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmp_per_index =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmp_per_index_reset =
@@ -1961,7 +1961,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmp_per_index_reset =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table information_schema.innodb_cmpmem. */
@@ -2203,7 +2203,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_reset =
@@ -2251,7 +2251,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_reset =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_metrics */
@@ -2774,7 +2774,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_metrics =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_ft_default_stopword */
static ST_FIELD_INFO i_s_stopword_fields_info[] =
@@ -2886,7 +2886,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_ft_default_stopword =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_FT_DELETED
@@ -3053,7 +3053,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_ft_deleted =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/*******************************************************************//**
@@ -3135,7 +3135,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_ft_being_deleted =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED and
@@ -3423,7 +3423,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_ft_index_cache =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/*******************************************************************//**
@@ -3857,7 +3857,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_ft_index_table =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_FT_CONFIG */
@@ -4054,7 +4054,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_ft_config =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/* Fields of the dynamic table INNODB_BUFFER_POOL_STATS. */
@@ -4601,7 +4601,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_stats =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/* Fields of the dynamic table INNODB_BUFFER_POOL_PAGE. */
@@ -5310,7 +5310,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_page =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
static ST_FIELD_INFO i_s_innodb_buf_page_lru_fields_info[] =
@@ -5855,7 +5855,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_page_lru =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/*******************************************************************//**
@@ -6147,7 +6147,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tables =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_TABLESTATS ***********************************************/
@@ -6435,7 +6435,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tablestats =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_INDEXES **************************************************/
@@ -6685,7 +6685,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_indexes =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_COLUMNS **************************************************/
@@ -6920,7 +6920,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_columns =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_FIELDS ***************************************************/
@@ -7128,7 +7128,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_fields =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_FOREIGN ********************************************/
@@ -7351,7 +7351,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_foreign =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_FOREIGN_COLS ********************************************/
@@ -7566,7 +7566,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_foreign_cols =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** SYS_TABLESPACES ********************************************/
@@ -7833,7 +7833,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_tablespaces =
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_DATAFILES ************************************************/
@@ -8020,7 +8020,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_datafiles =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
static ST_FIELD_INFO i_s_innodb_changed_pages_info[] =
@@ -8389,7 +8389,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_changed_pages =
STRUCT_FLD(version, 0x0100 /* 1.0 */),
STRUCT_FLD(status_vars, NULL),
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** TABLESPACES_ENCRYPTION ********************************************/
@@ -8468,6 +8468,15 @@ static ST_FIELD_INFO innodb_tablespaces_encryption_fields_info[] =
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
+#define TABLESPACES_ENCRYPTION_CURRENT_KEY_ID 8
+ {STRUCT_FLD(field_name, "CURRENT_KEY_ID"),
+ STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
+ STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
+ STRUCT_FLD(value, 0),
+ STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
+ STRUCT_FLD(old_name, ""),
+ STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
+
END_OF_ST_FIELD_INFO
};
@@ -8506,6 +8515,8 @@ i_s_dict_fill_tablespaces_encryption(
status.min_key_version));
OK(fields[TABLESPACES_ENCRYPTION_CURRENT_KEY_VERSION]->store(
status.current_key_version));
+ OK(fields[TABLESPACES_ENCRYPTION_CURRENT_KEY_ID]->store(
+ status.key_id));
if (status.rotating) {
fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER]->set_notnull();
OK(fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER]->store(
@@ -8670,7 +8681,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_tablespaces_encryption =
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
- INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_BETA
+ INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_GAMMA
};
/** TABLESPACES_SCRUBBING ********************************************/
@@ -8969,7 +8980,7 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_tablespaces_scrubbing =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA)
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA)
};
/** INNODB_MUTEXES *********************************************/
@@ -9183,7 +9194,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_mutexes =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
/** SYS_SEMAPHORE_WAITS ************************************************/
@@ -9460,7 +9471,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_semaphore_waits =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
static ST_FIELD_INFO innodb_changed_page_bitmaps_fields_info[] =
@@ -9584,6 +9595,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_changed_page_bitmaps =
/* Maria extension */
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
diff --git a/storage/xtradb/handler/xtradb_i_s.cc b/storage/xtradb/handler/xtradb_i_s.cc
index 207682e3154..a0ff959013a 100644
--- a/storage/xtradb/handler/xtradb_i_s.cc
+++ b/storage/xtradb/handler/xtradb_i_s.cc
@@ -176,7 +176,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_xtradb_read_view =
STRUCT_FLD(status_vars, NULL),
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
static ST_FIELD_INFO xtradb_internal_hash_tables_fields_info[] =
@@ -381,7 +381,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_xtradb_internal_hash_tables =
STRUCT_FLD(status_vars, NULL),
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
@@ -514,5 +514,5 @@ UNIV_INTERN struct st_mysql_plugin i_s_xtradb_rseg =
STRUCT_FLD(status_vars, NULL),
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
- STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA),
+ STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA),
};
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..5deed1f001c 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
@@ -332,6 +333,7 @@ struct fil_space_crypt_status_t {
uint min_key_version; /*!< min key version */
uint current_key_version;/*!< current key version */
uint keyserver_requests;/*!< no of key requests to key server */
+ ulint key_id; /*!< current key_id */
bool rotating; /*!< is key rotation ongoing */
bool flushing; /*!< is flush at end of rotation ongoing */
ulint rotate_next_page_number; /*!< next page if key rotating */
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/fil0fil.ic b/storage/xtradb/include/fil0fil.ic
index ec3b7e85e91..7ccc69b9561 100644
--- a/storage/xtradb/include/fil0fil.ic
+++ b/storage/xtradb/include/fil0fil.ic
@@ -147,9 +147,9 @@ fil_page_type_validate(
/* Dump out the page info */
fprintf(stderr, "InnoDB: Space %lu offset %lu name %s page_type %lu page_type_name %s\n"
- "InnoDB: key_version %u page_compressed %d page_compressed_encrypted %d lsn %lu compressed_len %lu\n",
+ "InnoDB: key_version %u page_compressed %d page_compressed_encrypted %d lsn %llu compressed_len %lu\n",
space, offset, rspace->name, page_type, fil_get_page_type_name(page_type),
- key_version, page_compressed, page_compressed_encrypted, lsn, compressed_len);
+ key_version, page_compressed, page_compressed_encrypted, (ulonglong)lsn, compressed_len);
fflush(stderr);
ut_ad(page_type == FIL_PAGE_PAGE_COMPRESSED ||
diff --git a/storage/xtradb/include/fts0priv.ic b/storage/xtradb/include/fts0priv.ic
index 2d07c60f980..ec61691870b 100644
--- a/storage/xtradb/include/fts0priv.ic
+++ b/storage/xtradb/include/fts0priv.ic
@@ -53,7 +53,7 @@ fts_write_object_id(
/* Use this to construct old(5.6.14 and 5.7.3) windows
ambiguous aux table names */
DBUG_EXECUTE_IF("innodb_test_wrong_windows_fts_aux_table_name",
- return(sprintf(str, "%016"PRIu64, id)););
+ return(sprintf(str, "%016" PRIu64, id)););
DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name",
return(sprintf(str, UINT64PFx, id)););
@@ -66,7 +66,7 @@ fts_write_object_id(
// FIXME: Use ut_snprintf(), so does following one.
return(sprintf(str, "%016llu", id));
#else /* _WIN32 */
- return(sprintf(str, "%016"PRIu64, id));
+ return(sprintf(str, "%016" PRIu64, id));
#endif /* _WIN32 */
}
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/log0recv.h b/storage/xtradb/include/log0recv.h
index b23a140aac2..8fc5daaef1d 100644
--- a/storage/xtradb/include/log0recv.h
+++ b/storage/xtradb/include/log0recv.h
@@ -43,7 +43,8 @@ UNIV_INTERN
ibool
log_block_checksum_is_ok_or_old_format(
/*===================================*/
- const byte* block); /*!< in: pointer to a log block */
+ const byte* block, /*!< in: pointer to a log block */
+ bool print_err); /*!< in print error ? */
/*******************************************************//**
Calculates the new value for lsn when more data is added to the log. */
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/log0crypt.cc b/storage/xtradb/log/log0crypt.cc
index e90533c2e76..852148899e9 100644
--- a/storage/xtradb/log/log0crypt.cc
+++ b/storage/xtradb/log/log0crypt.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
-Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
+Copyright (C) 2014, 2016, MariaDB Corporation. 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
@@ -36,6 +36,8 @@ Modified Jan Lindström jan.lindstrom@mariadb.com
#include "my_crypt.h"
+/* Used for debugging */
+// #define DEBUG_CRYPT 1
#define UNENCRYPTED_KEY_VER 0
/* If true, enable redo log encryption. */
@@ -97,16 +99,24 @@ get_crypt_info(
{
/* so that no one is modifying array while we search */
ut_ad(mutex_own(&(log_sys->mutex)));
+ size_t items = crypt_info.size();
/* a log block only stores 4-bytes of checkpoint no */
checkpoint_no &= 0xFFFFFFFF;
- for (size_t i = 0; i < crypt_info.size(); i++) {
+ for (size_t i = 0; i < items; i++) {
struct crypt_info_t* it = &crypt_info[i];
if (it->checkpoint_no == checkpoint_no) {
return it;
}
}
+
+ /* If checkpoint contains more than one key and we did not
+ find the correct one use the first one. */
+ if (items) {
+ return (&crypt_info[0]);
+ }
+
return NULL;
}
@@ -131,7 +141,8 @@ log_blocks_crypt(
const byte* block, /*!< in: blocks before encrypt/decrypt*/
ulint size, /*!< in: size of block */
byte* dst_block, /*!< out: blocks after encrypt/decrypt */
- int what) /*!< in: encrypt or decrypt*/
+ int what, /*!< in: encrypt or decrypt*/
+ const crypt_info_t* crypt_info) /*!< in: crypt info or NULL */
{
byte *log_block = (byte*)block;
Crypt_result rc = MY_AES_OK;
@@ -146,7 +157,8 @@ log_blocks_crypt(
lsn_t log_block_start_lsn = log_block_get_start_lsn(
lsn, log_block_no);
- const crypt_info_t* info = get_crypt_info(log_block);
+ const crypt_info_t* info = crypt_info == NULL ? get_crypt_info(log_block) :
+ crypt_info;
#ifdef DEBUG_CRYPT
fprintf(stderr,
"%s %lu chkpt: %lu key: %u lsn: %lu\n",
@@ -156,12 +168,21 @@ log_blocks_crypt(
info ? info->key_version : 0,
log_block_start_lsn);
#endif
+ /* If no key is found from checkpoint assume the log_block
+ to be unencrypted. If checkpoint contains the encryption key
+ compare log_block current checksum, if checksum matches,
+ block can't be encrypted. */
if (info == NULL ||
- info->key_version == UNENCRYPTED_KEY_VER) {
+ info->key_version == UNENCRYPTED_KEY_VER ||
+ (log_block_checksum_is_ok_or_old_format(log_block, false) &&
+ what == ENCRYPTION_FLAG_DECRYPT)) {
memcpy(dst_block, log_block, OS_FILE_LOG_BLOCK_SIZE);
goto next;
}
+ ut_ad(what == ENCRYPTION_FLAG_DECRYPT ? !log_block_checksum_is_ok_or_old_format(log_block, false) :
+ log_block_checksum_is_ok_or_old_format(log_block, false));
+
// Assume log block header is not encrypted
memcpy(dst_block, log_block, LOG_BLOCK_HDR_SIZE);
@@ -292,7 +313,7 @@ log_blocks_encrypt(
const ulint size, /*!< in: size of blocks, must be multiple of a log block */
byte* dst_block) /*!< out: blocks after encryption */
{
- return log_blocks_crypt(block, size, dst_block, ENCRYPTION_FLAG_ENCRYPT);
+ return log_blocks_crypt(block, size, dst_block, ENCRYPTION_FLAG_ENCRYPT, NULL);
}
/*********************************************************************//**
@@ -355,14 +376,16 @@ log_encrypt_before_write(
return;
}
- if (info->key_version == UNENCRYPTED_KEY_VER) {
+ /* If the key is not encrypted or user has requested not to
+ encrypt, do not change log block. */
+ if (info->key_version == UNENCRYPTED_KEY_VER || !srv_encrypt_log) {
return;
}
byte* dst_frame = (byte*)malloc(size);
//encrypt log blocks content
- Crypt_result result = log_blocks_crypt(block, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT);
+ Crypt_result result = log_blocks_crypt(block, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT, NULL);
if (result == MY_AES_OK) {
ut_ad(block[0] == dst_frame[0]);
@@ -388,7 +411,7 @@ log_decrypt_after_read(
byte* dst_frame = (byte*)malloc(size);
// decrypt log blocks content
- Crypt_result result = log_blocks_crypt(frame, size, dst_frame, ENCRYPTION_FLAG_DECRYPT);
+ Crypt_result result = log_blocks_crypt(frame, size, dst_frame, ENCRYPTION_FLAG_DECRYPT, NULL);
if (result == MY_AES_OK) {
memcpy(frame, dst_frame, size);
diff --git a/storage/xtradb/log/log0log.cc b/storage/xtradb/log/log0log.cc
index 853afe70100..36531f3c6f4 100644
--- a/storage/xtradb/log/log0log.cc
+++ b/storage/xtradb/log/log0log.cc
@@ -2,6 +2,7 @@
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2009, Google Inc.
+Copyright (C) 2014, 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
@@ -33,10 +34,13 @@ Created 12/9/1995 Heikki Tuuri
#include "config.h"
#ifdef HAVE_ALLOCA_H
#include "alloca.h"
-#elif defined(HAVE_MALLOC_H)
+#elif defined(HAVE_MALLOC_H)
#include "malloc.h"
#endif
+/* Used for debugging */
+// #define DEBUG_CRYPT 1
+
#include "log0log.h"
#ifdef UNIV_NONINL
@@ -1394,7 +1398,6 @@ log_group_file_header_flush(
Stores a 4-byte checksum to the trailer checksum field of a log block
before writing it to a log file. This checksum is used in recovery to
check the consistency of a log block. */
-static
void
log_block_store_checksum(
/*=====================*/
@@ -1512,6 +1515,14 @@ loop:
log_encrypt_before_write(log_sys->next_checkpoint_no,
buf, write_len);
+#ifdef DEBUG_CRYPT
+ fprintf(stderr, "WRITE: block: %lu checkpoint: %lu %.8lx %.8lx\n",
+ log_block_get_hdr_no(buf),
+ log_block_get_checkpoint_no(buf),
+ log_block_calc_checksum(buf),
+ log_block_get_checksum(buf));
+#endif
+
fil_io(OS_FILE_WRITE | OS_FILE_LOG, true, group->space_id, 0,
(ulint) (next_offset / UNIV_PAGE_SIZE),
(ulint) (next_offset % UNIV_PAGE_SIZE), write_len, buf,
@@ -2320,7 +2331,10 @@ log_checkpoint(
* the checkpoint info has been written and THEN blocks will be encrypted
* with new key
*/
- log_crypt_set_ver_and_key(log_sys->next_checkpoint_no + 1);
+ if (srv_encrypt_log) {
+ log_crypt_set_ver_and_key(log_sys->next_checkpoint_no + 1);
+ }
+
log_groups_write_checkpoint_info();
MONITOR_INC(MONITOR_NUM_CHECKPOINT);
@@ -2585,8 +2599,24 @@ loop:
mutex_enter(&log_sys->mutex);
}
+#ifdef DEBUG_CRYPT
+ fprintf(stderr, "BEFORE DECRYPT: block: %lu checkpoint: %lu %.8lx %.8lx offset %lu\n",
+ log_block_get_hdr_no(buf),
+ log_block_get_checkpoint_no(buf),
+ log_block_calc_checksum(buf),
+ log_block_get_checksum(buf), source_offset);
+#endif
+
log_decrypt_after_read(buf, len);
+#ifdef DEBUG_CRYPT
+ fprintf(stderr, "AFTER DECRYPT: block: %lu checkpoint: %lu %.8lx %.8lx\n",
+ log_block_get_hdr_no(buf),
+ log_block_get_checkpoint_no(buf),
+ log_block_calc_checksum(buf),
+ log_block_get_checksum(buf));
+#endif
+
if (release_mutex) {
mutex_exit(&log_sys->mutex);
}
diff --git a/storage/xtradb/log/log0online.cc b/storage/xtradb/log/log0online.cc
index 92f03f0e6a9..51a9fa8f6c5 100644
--- a/storage/xtradb/log/log0online.cc
+++ b/storage/xtradb/log/log0online.cc
@@ -905,7 +905,7 @@ log_online_is_valid_log_seg(
const byte* log_block) /*!< in: read log data */
{
ibool checksum_is_ok
- = log_block_checksum_is_ok_or_old_format(log_block);
+ = log_block_checksum_is_ok_or_old_format(log_block, true);
if (!checksum_is_ok) {
diff --git a/storage/xtradb/log/log0recv.cc b/storage/xtradb/log/log0recv.cc
index b0e69107723..f98adbbca08 100644
--- a/storage/xtradb/log/log0recv.cc
+++ b/storage/xtradb/log/log0recv.cc
@@ -2,7 +2,7 @@
Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc.
-Copyright (c) 2013, 2015, MariaDB Corporation. All Rights Reserved.
+Copyright (c) 2013, 2016, MariaDB Corporation. 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
@@ -43,7 +43,7 @@ Created 9/20/1997 Heikki Tuuri
#include "config.h"
#ifdef HAVE_ALLOCA_H
#include "alloca.h"
-#elif defined(HAVE_MALLOC_H)
+#elif defined(HAVE_MALLOC_H)
#include "malloc.h"
#endif
@@ -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"
@@ -928,7 +932,8 @@ UNIV_INTERN
ibool
log_block_checksum_is_ok_or_old_format(
/*===================================*/
- const byte* block) /*!< in: pointer to a log block */
+ const byte* block, /*!< in: pointer to a log block */
+ bool print_err) /*!< in print if error found */
{
#ifdef UNIV_LOG_DEBUG
return(TRUE);
@@ -1011,11 +1016,13 @@ log_block_checksum_is_ok_or_old_format(
return(TRUE);
}
- fprintf(stderr, "BROKEN: block: %lu checkpoint: %lu %.8lx %.8lx\n",
- log_block_get_hdr_no(block),
- log_block_get_checkpoint_no(block),
- log_block_calc_checksum(block),
- log_block_get_checksum(block));
+ if (print_err) {
+ fprintf(stderr, "BROKEN: block: %lu checkpoint: %lu %.8lx %.8lx\n",
+ log_block_get_hdr_no(block),
+ log_block_get_checkpoint_no(block),
+ log_block_calc_checksum(block),
+ log_block_get_checksum(block));
+ }
return(FALSE);
}
@@ -2730,6 +2737,7 @@ recv_scan_log_recs(
ibool finished;
ulint data_len;
ibool more_data;
+ bool maybe_encrypted=false;
ut_ad(start_lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_ad(len % OS_FILE_LOG_BLOCK_SIZE == 0);
@@ -2744,6 +2752,8 @@ recv_scan_log_recs(
*err = DB_SUCCESS;
do {
+ log_crypt_err_t log_crypt_err;
+
no = log_block_get_hdr_no(log_block);
/*
fprintf(stderr, "Log block header no %lu\n", no);
@@ -2751,13 +2761,13 @@ recv_scan_log_recs(
fprintf(stderr, "Scanned lsn no %lu\n",
log_block_convert_lsn_to_no(scanned_lsn));
*/
+
if (no != log_block_convert_lsn_to_no(scanned_lsn)
- || !log_block_checksum_is_ok_or_old_format(log_block)) {
- log_crypt_err_t log_crypt_err;
+ || !log_block_checksum_is_ok_or_old_format(log_block, true)) {
if (no == log_block_convert_lsn_to_no(scanned_lsn)
&& !log_block_checksum_is_ok_or_old_format(
- log_block)) {
+ log_block, true)) {
fprintf(stderr,
"InnoDB: Log block no %lu at"
" lsn " LSN_PF " has\n"
@@ -2771,12 +2781,14 @@ recv_scan_log_recs(
log_block));
}
+ maybe_encrypted = log_crypt_block_maybe_encrypted(log_block,
+ &log_crypt_err);
+
/* Garbage or an incompletely written log block */
finished = TRUE;
- if (log_crypt_block_maybe_encrypted(log_block,
- &log_crypt_err)) {
+ if (maybe_encrypted) {
/* Log block maybe encrypted finish processing*/
log_crypt_print_error(log_crypt_err);
*err = DB_ERROR;
@@ -2786,12 +2798,13 @@ recv_scan_log_recs(
/* Stop if we encounter a garbage log block */
if (!srv_force_recovery) {
fputs("InnoDB: Set innodb_force_recovery"
- " to ignore this error.\n", stderr);
+ " to ignore this error.\n", stderr);
*err = DB_ERROR;
return (TRUE);
}
break;
+
}
if (log_block_get_flush_bit(log_block)) {
diff --git a/storage/xtradb/os/os0file.cc b/storage/xtradb/os/os0file.cc
index 7f13c1656ee..b2b3e256211 100644
--- a/storage/xtradb/os/os0file.cc
+++ b/storage/xtradb/os/os0file.cc
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
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 Percona Inc.. Those modifications are
@@ -1422,7 +1422,8 @@ os_file_create_simple_func(
access = GENERIC_READ;
- } else if (access_type == OS_FILE_READ_WRITE) {
+ } else if (access_type == OS_FILE_READ_WRITE
+ || access_type == OS_FILE_READ_WRITE_CACHED) {
access = GENERIC_READ | GENERIC_WRITE;
} else {
ib_logf(IB_LOG_LEVEL_ERROR,
@@ -1526,7 +1527,8 @@ os_file_create_simple_func(
#ifdef USE_FILE_LOCK
if (!srv_read_only_mode
&& *success
- && access_type == OS_FILE_READ_WRITE
+ && (access_type == OS_FILE_READ_WRITE
+ || access_type == OS_FILE_READ_WRITE_CACHED)
&& os_file_lock(file, name)) {
*success = FALSE;
@@ -1554,15 +1556,16 @@ os_file_set_nocache_if_needed(os_file_t file, const char* name,
const char *mode_str, ulint type,
ulint access_type)
{
- if (srv_read_only_mode || access_type == OS_FILE_READ_WRITE_CACHED)
+ if (srv_read_only_mode || access_type == OS_FILE_READ_WRITE_CACHED) {
return;
+ }
if (srv_unix_file_flush_method == SRV_UNIX_ALL_O_DIRECT
- || (type != OS_LOG_FILE
+ || (type == OS_LOG_FILE
&& (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT
- || (srv_unix_file_flush_method
- == SRV_UNIX_O_DIRECT_NO_FSYNC))))
+ || (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT_NO_FSYNC)))) {
os_file_set_nocache(file, name, mode_str);
+ }
}
/****************************************************************//**
@@ -2154,8 +2157,9 @@ os_file_create_func(
} while (retry);
- if (*success) {
+ /* We disable OS caching (O_DIRECT) only on data files */
+ if (*success) {
os_file_set_nocache_if_needed(file, name, mode_str, type, 0);
}
@@ -3144,7 +3148,7 @@ try_again:
"Error in system call pread(). The operating"
" system error number is %lu.",(ulint) errno);
} else {
- /* Partial read occured */
+ /* Partial read occurred */
ib_logf(IB_LOG_LEVEL_ERROR,
"Tried to read " ULINTPF " bytes at offset "
UINT64PF ". Was only able to read %ld.",
@@ -3248,7 +3252,7 @@ try_again:
"Error in system call pread(). The operating"
" system error number is %lu.",(ulint) errno);
} else {
- /* Partial read occured */
+ /* Partial read occurred */
ib_logf(IB_LOG_LEVEL_ERROR,
"Tried to read " ULINTPF " bytes at offset "
UINT64PF ". Was only able to read %ld.",
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/row/row0sel.cc b/storage/xtradb/row/row0sel.cc
index 35719391fae..2bebfb7a0f1 100644
--- a/storage/xtradb/row/row0sel.cc
+++ b/storage/xtradb/row/row0sel.cc
@@ -3751,12 +3751,6 @@ row_search_for_mysql(
ut_error;
}
- /* init null bytes with default values as they might be
- left uninitialized in some cases and these uninited bytes
- might be copied into mysql record buffer that leads to
- valgrind warnings */
- memcpy(buf, prebuilt->default_rec, prebuilt->null_bitmap_len);
-
#if 0
/* August 19, 2005 by Heikki: temporarily disable this error
print until the cursor lock count is done correctly.
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 6e45725098c..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) {
@@ -3076,7 +3085,9 @@ files_checked:
fts_optimize_init();
/* Create thread(s) that handles key rotation */
+ fil_system_enter();
fil_crypt_threads_init();
+ fil_system_exit();
/* Create the log scrub thread */
if (srv_scrub_log)
diff --git a/storage/xtradb/sync/sync0sync.cc b/storage/xtradb/sync/sync0sync.cc
index 14b332a2185..702dd240f16 100644
--- a/storage/xtradb/sync/sync0sync.cc
+++ b/storage/xtradb/sync/sync0sync.cc
@@ -482,7 +482,13 @@ mutex_validate(
const ib_mutex_t* mutex) /*!< in: mutex */
{
ut_a(mutex);
- ut_a(mutex->magic_n == MUTEX_MAGIC_N);
+
+ if (mutex->magic_n != MUTEX_MAGIC_N) {
+ ib_logf(IB_LOG_LEVEL_ERROR,
+ "Mutex %p not initialized file %s line %lu.",
+ mutex, mutex->cfile_name, mutex->cline);
+ }
+ ut_ad(mutex->magic_n == MUTEX_MAGIC_N);
return(TRUE);
}
@@ -1651,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));
}
/*******************************************************************//**
diff --git a/storage/xtradb/ut/crc32_power8/crc32.S b/storage/xtradb/ut/crc32_power8/crc32.S
index 52046bb9002..b064ce3dc96 100644
--- a/storage/xtradb/ut/crc32_power8/crc32.S
+++ b/storage/xtradb/ut/crc32_power8/crc32.S
@@ -67,14 +67,13 @@
#define off96 r30
#define off112 r31
-#define const1 v25
-#define const2 v26
+#define const1 v24
+#define const2 v25
-#define byteswap v27
-#define mask_32bit v28
-#define mask_64bit v29
-#define zeroes v30
-#define ones v31
+#define byteswap v26
+#define mask_32bit v27
+#define mask_64bit v28
+#define zeroes v29
#ifdef BYTESWAP_DATA
#define VPERM(A, B, C, D) vperm A, B, C, D
@@ -101,13 +100,28 @@ FUNC_START(__crc32_vpmsum)
li off112,112
li r0,0
+ /* Enough room for saving 10 non volatile VMX registers */
+ subi r6,r1,56+10*16
+ subi r7,r1,56+2*16
+
+ stvx v20,0,r6
+ stvx v21,off16,r6
+ stvx v22,off32,r6
+ stvx v23,off48,r6
+ stvx v24,off64,r6
+ stvx v25,off80,r6
+ stvx v26,off96,r6
+ stvx v27,off112,r6
+ stvx v28,0,r7
+ stvx v29,off16,r7
+
mr r10,r3
vxor zeroes,zeroes,zeroes
- vspltisw ones,-1
+ vspltisw v0,-1
- vsldoi mask_32bit,zeroes,ones,4
- vsldoi mask_64bit,zeroes,ones,8
+ vsldoi mask_32bit,zeroes,v0,4
+ vsldoi mask_64bit,zeroes,v0,8
/* Get the initial value into v8 */
vxor v8,v8,v8
@@ -570,6 +584,21 @@ FUNC_START(__crc32_vpmsum)
vsldoi v0,v0,zeroes,4 /* shift result into top 64 bits of */
#endif
+.Lout:
+ subi r6,r1,56+10*16
+ subi r7,r1,56+2*16
+
+ lvx v20,0,r6
+ lvx v21,off16,r6
+ lvx v22,off32,r6
+ lvx v23,off48,r6
+ lvx v24,off64,r6
+ lvx v25,off80,r6
+ lvx v26,off96,r6
+ lvx v27,off112,r6
+ lvx v28,0,r7
+ lvx v29,off16,r7
+
/* Get it into r3 */
MFVRD(r3, v0)
@@ -739,6 +768,8 @@ FUNC_START(__crc32_vpmsum)
.Lzero:
mr r3,r10
blr
+ b .Lout
+
FUNC_END(__crc32_vpmsum)
#endif /* __powerpc__ */