diff --git a/mysql-test/suite/connect/r/tbl.result b/mysql-test/suite/connect/r/tbl.result index e59335a1da8..52b749acec4 100644 --- a/mysql-test/suite/connect/r/tbl.result +++ b/mysql-test/suite/connect/r/tbl.result @@ -3,7 +3,7 @@ # CREATE TABLE t1 ( a INT NOT NULL, -message CHAR(10) NOT NULL) ENGINE=connect; +message CHAR(10)) ENGINE=connect; Warnings: Warning 1105 No table_type. Was set to DOS Warning 1105 No file name. Table will use t1.dos @@ -15,18 +15,18 @@ a message 3 t1 CREATE TABLE t2 ( a INT NOT NULL, -message CHAR(10) NOT NULL) ENGINE=connect TABLE_TYPE=BIN; +message CHAR(10)) ENGINE=connect TABLE_TYPE=BIN; Warnings: Warning 1105 No file name. Table will use t2.bin -INSERT INTO t2 VALUES (1,'Testing'),(2,'bin table'),(3,'t2'); +INSERT INTO t2 VALUES (1,'Testing'),(2,NULL),(3,'t2'); SELECT * FROM t2; a message 1 Testing -2 bin table +2 NULL 3 t2 CREATE TABLE t3 ( a INT NOT NULL, -message CHAR(10) NOT NULL) ENGINE=connect TABLE_TYPE=CSV; +message CHAR(10)) ENGINE=connect TABLE_TYPE=CSV; Warnings: Warning 1105 No file name. Table will use t3.csv INSERT INTO t3 VALUES (1,'Testing'),(2,'csv table'),(3,'t3'); @@ -35,38 +35,50 @@ a message 1 Testing 2 csv table 3 t3 +CREATE TABLE t4 ( +ta INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +message CHAR(20)) ENGINE=MyISAM; +INSERT INTO t4 (message) VALUES ('Testing'),('myisam table'),('t4'); +SELECT * FROM t4; +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) NOT NULL) -engine=CONNECT table_type=TBL table_list='t1,t2,t3'; +message CHAR(20)) +engine=CONNECT table_type=TBL table_list='t1,t2,t3,t4'; select * from total; tabname ta message t1 1 Testing t1 2 dos table t1 3 t1 t2 1 Testing -t2 2 bin table +t2 2 NULL t2 3 t2 t3 1 Testing t3 2 csv table t3 3 t3 +t4 1 Testing +t4 2 myisam table +t4 3 t4 select * from total where tabname = 't2'; tabname ta message t2 1 Testing -t2 2 bin table +t2 2 NULL t2 3 t2 select * from total where tabname = 't2' and ta = 3; tabname ta message t2 3 t2 -select * from total where tabname in ('t1','t3'); +select * from total where tabname in ('t1','t4'); tabname ta message t1 1 Testing t1 2 dos table t1 3 t1 -t3 1 Testing -t3 2 csv table -t3 3 t3 +t4 1 Testing +t4 2 myisam table +t4 3 t4 select * from total where ta = 3 and tabname in ('t1','t2'); tabname ta message t1 3 t1 @@ -79,28 +91,36 @@ t1 3 t1 t3 1 Testing t3 2 csv table t3 3 t3 +t4 1 Testing +t4 2 myisam table +t4 3 t4 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'); tabname ta message t1 1 Testing t1 2 dos table t1 3 t1 +t4 1 Testing +t4 2 myisam table +t4 3 t4 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','t3'); +select * from total where ta = 3 or tabname in ('t2','t4'); tabname ta message t1 3 t1 t2 1 Testing -t2 2 bin table +t2 2 NULL t2 3 t2 -t3 1 Testing -t3 2 csv table t3 3 t3 +t4 1 Testing +t4 2 myisam table +t4 3 t4 select * from total where not tabname = 't2'; tabname ta message t1 1 Testing @@ -109,15 +129,19 @@ t1 3 t1 t3 1 Testing t3 2 csv table t3 3 t3 +t4 1 Testing +t4 2 myisam table +t4 3 t4 select * from total where tabname = 't2' or tabname = 't1'; tabname ta message t1 1 Testing t1 2 dos table t1 3 t1 t2 1 Testing -t2 2 bin table +t2 2 NULL t2 3 t2 DROP TABLE total; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; +DROP TABLE t4; diff --git a/mysql-test/suite/connect/t/tbl.test b/mysql-test/suite/connect/t/tbl.test index 4a9e5ad707f..e802e049c48 100644 --- a/mysql-test/suite/connect/t/tbl.test +++ b/mysql-test/suite/connect/t/tbl.test @@ -1,46 +1,53 @@ -let $MYSQLD_DATADIR= `select @@datadir`; - ---echo # ---echo # Checking TBL tables ---echo # -CREATE TABLE t1 ( -a INT NOT NULL, -message CHAR(10) NOT NULL) ENGINE=connect; -INSERT INTO t1 VALUES (1,'Testing'),(2,'dos table'),(3,'t1'); -SELECT * FROM t1; - -CREATE TABLE t2 ( -a INT NOT NULL, -message CHAR(10) NOT NULL) ENGINE=connect TABLE_TYPE=BIN; -INSERT INTO t2 VALUES (1,'Testing'),(2,'bin table'),(3,'t2'); -SELECT * FROM t2; - -CREATE TABLE t3 ( -a INT NOT NULL, -message CHAR(10) NOT NULL) ENGINE=connect TABLE_TYPE=CSV; -INSERT INTO t3 VALUES (1,'Testing'),(2,'csv table'),(3,'t3'); -SELECT * FROM t3; - -CREATE TABLE total ( -tabname CHAR(8) NOT NULL SPECIAL='TABID', -ta TINYINT NOT NULL FLAG=1, -message CHAR(20) NOT NULL) -engine=CONNECT table_type=TBL table_list='t1,t2,t3'; - -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','t3'); -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','t3'); -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; +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # +--echo # Checking TBL tables +--echo # +CREATE TABLE t1 ( +a INT NOT NULL, +message CHAR(10)) ENGINE=connect; +INSERT INTO t1 VALUES (1,'Testing'),(2,'dos table'),(3,'t1'); +SELECT * FROM t1; + +CREATE TABLE t2 ( +a INT NOT NULL, +message CHAR(10)) ENGINE=connect TABLE_TYPE=BIN; +INSERT INTO t2 VALUES (1,'Testing'),(2,NULL),(3,'t2'); +SELECT * FROM t2; + +CREATE TABLE t3 ( +a INT NOT NULL, +message CHAR(10)) ENGINE=connect TABLE_TYPE=CSV; +INSERT INTO t3 VALUES (1,'Testing'),(2,'csv table'),(3,'t3'); +SELECT * FROM t3; + +CREATE TABLE t4 ( +ta INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +message CHAR(20)) ENGINE=MyISAM; +INSERT INTO t4 (message) VALUES ('Testing'),('myisam table'),('t4'); +SELECT * FROM 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'; + +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; diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h index 9d806b4b4bb..4f0584ef7bc 100644 --- a/storage/connect/catalog.h +++ b/storage/connect/catalog.h @@ -90,13 +90,16 @@ class DllExport CATALOG { virtual bool ClearName(PGLOBAL g, PSZ name) {return true;} virtual PRELDEF MakeOneTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) {return NULL;} virtual PRELDEF GetTableDescEx(PGLOBAL g, PTABLE tablep) {return NULL;} - virtual PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am, + virtual PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR type, PRELDEF *prp = NULL) {return NULL;} virtual PRELDEF GetFirstTable(PGLOBAL g) {return NULL;} virtual PRELDEF GetNextTable(PGLOBAL g) {return NULL;} - virtual bool TestCond(PGLOBAL g, const char *name, const char *type) {return true;} + virtual bool TestCond(PGLOBAL g, const char *name, const char *type) + {return true;} virtual bool DropTable(PGLOBAL g, PSZ name, bool erase) {return true;} - virtual PTDB GetTable(PGLOBAL g, PTABLE tablep, MODE mode = MODE_READ) {return NULL;} + virtual PTDB GetTable(PGLOBAL g, PTABLE tablep, + MODE mode = MODE_READ, LPCSTR type = NULL) + {return NULL;} virtual void TableNames(PGLOBAL g, char *buffer, int maxbuf, int info[]) {} virtual void ColumnNames(PGLOBAL g, char *tabname, char *buffer, int maxbuf, int info[]) {} diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 49483cfc11b..5ce13e446f0 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -832,7 +832,7 @@ char *ha_connect::GetStringOption(char *opname, char *sdef) else if (!stricmp(opname, "Data_charset")) opval= (char*)options->data_charset; - if (!opval && options->oplist) + if (!opval && options && options->oplist) opval= GetListOption(opname, options->oplist); if (!opval) { @@ -931,7 +931,7 @@ int ha_connect::GetIntegerOption(char *opname) else if (!stricmp(opname, "Compressed")) opval= (options->compressed); - if (opval == NO_IVAL && options->oplist) + if (opval == NO_IVAL && options && options->oplist) if ((pv= GetListOption(opname, options->oplist))) opval= atoi(pv); diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index eb7098e8189..4db70efe27f 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -581,19 +581,17 @@ bool MYCAT::GetIndexInfo(PGLOBAL g, PTABDEF defp) /* found, make and add the descriptor and return a pointer to it. */ /***********************************************************************/ PRELDEF MYCAT::GetTableDesc(PGLOBAL g, LPCSTR name, - LPCSTR am, PRELDEF *prp) + LPCSTR type, PRELDEF *prp) { - LPCSTR type; - if (xtrace) - printf("GetTableDesc: name=%s am=%s\n", name, SVP(am)); + printf("GetTableDesc: name=%s am=%s\n", name, SVP(type)); // Firstly check whether this table descriptor is in memory if (To_Desc) return To_Desc; - // Here get the type of this table - if (!(type= Hc->GetStringOption("Type"))) + // If not specified get the type of this table + if (!type && !(type= Hc->GetStringOption("Type"))) type= "DOS"; return MakeTableDesc(g, name, type); @@ -658,7 +656,7 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) /***********************************************************************/ /* Initialize a Table Description Block construction. */ /***********************************************************************/ -PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode) +PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode, LPCSTR type) { PRELDEF tdp; PTDB tdbp= NULL; @@ -668,7 +666,7 @@ PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode) printf("GetTableDB: name=%s\n", name); // Look for the description of the requested table - tdp= GetTableDesc(g, name, NULL); + tdp= GetTableDesc(g, name, type); if (tdp) { if (xtrace) diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index d30f591f264..c878d5be1a8 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -65,8 +65,9 @@ class MYCAT : public CATALOG { bool GetIndexInfo(PGLOBAL g, PTABDEF defp); bool StoreIndex(PGLOBAL g, PTABDEF defp) {return false;} // Temporary PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, - LPCSTR am, PRELDEF *prp = NULL); - PTDB GetTable(PGLOBAL g, PTABLE tablep, MODE mode = MODE_READ); + LPCSTR type, PRELDEF *prp = NULL); + PTDB GetTable(PGLOBAL g, PTABLE tablep, + MODE mode = MODE_READ, LPCSTR type = NULL); void ClearDB(PGLOBAL g); protected: diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 367caf010fb..56d21550df6 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -72,6 +72,7 @@ class TDBMYSQL : public TDBASE { virtual int GetProgMax(PGLOBAL g); virtual void ResetDB(void) {N = 0;} virtual int RowNumber(PGLOBAL g, bool b = FALSE); + void SetDatabase(LPCSTR db) {Database = (char*)db;} // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 928b72a0f9e..b82c2a02875 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -71,6 +71,9 @@ #include "tabcol.h" #include "tabdos.h" // TDBDOS and DOSCOL class dcls #include "tabtbl.h" // TDBTBL and TBLCOL classes dcls +#if defined(MYSQL_SUPPORT) +#include "tabmysql.h" +#endif // MYSQL_SUPPORT #include "ha_connect.h" #include "mycat.h" // For GetHandler @@ -222,8 +225,8 @@ PTDB TDBTBL::GetSubTable(PGLOBAL g, PTBL tblp, PTABLE tabp) TABLE_LIST table_list; TABLE_SHARE *s; PCATLG cat = To_Def->GetCat(); - PHC hc = ((MYCAT*)cat)->GetHandler(); - THD *thd = (hc->GetTable())->in_use; + PHC hc = ((MYCAT*)cat)->GetHandler(); + THD *thd = (hc->GetTable())->in_use; if (!thd) return NULL; // Should not happen anymore @@ -251,9 +254,29 @@ PTDB TDBTBL::GetSubTable(PGLOBAL g, PTBL tblp, PTABLE tabp) flags = 24; if (!open_table_def(thd, s, flags)) { - hc->tshp = s; - tdbp = cat->GetTable(g, tabp); - hc->tshp = NULL; + if (stricmp((*s->db_plugin)->name.str, "connect")) { +#if defined(MYSQL_SUPPORT) + // Access sub-table via MySQL API + if (!(tdbp= cat->GetTable(g, tabp, MODE_READ, "MYSQL"))) { + sprintf(g->Message, "Cannot access %s.%s", db, tblp->Name); + return NULL; + } // endif Define + + if (tabp->GetQualifier()) + ((PTDBMY)tdbp)->SetDatabase(tabp->GetQualifier()); + +#else // !MYSQL_SUPPORT + sprintf(g->Message, "%s.%s is not a CONNECT table", + db, tblp->Name); + return NULL; +#endif // MYSQL_SUPPORT + } else { + // Sub-table is a CONNECT table + hc->tshp = s; + tdbp = cat->GetTable(g, tabp); + hc->tshp = NULL; + } // endif plugin + } else sprintf(g->Message, "Error %d opening share\n", s->error); @@ -742,8 +765,12 @@ bool TBLCOL::Init(PGLOBAL g) } else if (!tdbp->Accept) { sprintf(g->Message, MSG(NO_MATCHING_COL), Name, tdbp->Tdbp->GetName()); return TRUE; - } else + } else { + if (Nullable) + Value->SetNull(true); + Value->Reset(); + } // endif's return FALSE; } // end of Init @@ -761,8 +788,8 @@ void TBLCOL::ReadColumn(PGLOBAL g) Value->SetValue_pval(To_Val); // Set null when applicable - if (Colp->IsNullable()) - Value->SetNull(Value->IsZero()); + if (Nullable) + Value->SetNull(Value->IsNull()); } // endif Colp