diff options
author | Olivier Bertrand <bertrandop@gmail.com> | 2013-04-10 23:38:27 +0200 |
---|---|---|
committer | Olivier Bertrand <bertrandop@gmail.com> | 2013-04-10 23:38:27 +0200 |
commit | 1357bffbf39cdeb1746ce276ad3a556ec0356c35 (patch) | |
tree | 02f6679fa1ba009e9911f76c49124ffd3faf6a91 | |
parent | 9b790248c5c1f4d8ef006ef2b7383aa41986c1a6 (diff) | |
download | mariadb-git-1357bffbf39cdeb1746ce276ad3a556ec0356c35.tar.gz |
- Add support of NULLs for file table columns.
Update CONNECT version number and date.
modified:
mysql-test/suite/connect/r/null.result
mysql-test/suite/connect/r/xml.result
mysql-test/suite/connect/t/null.test
storage/connect/ha_connect.cc
storage/connect/mycat.cc
storage/connect/tabdos.cpp
storage/connect/tabfix.cpp
storage/connect/tabfmt.cpp
storage/connect/tabtbl.cpp
storage/connect/tabvct.cpp
-rw-r--r-- | mysql-test/suite/connect/r/null.result | 118 | ||||
-rw-r--r-- | mysql-test/suite/connect/r/xml.result | 2 | ||||
-rw-r--r-- | mysql-test/suite/connect/t/null.test | 147 | ||||
-rw-r--r-- | storage/connect/ha_connect.cc | 13 | ||||
-rw-r--r-- | storage/connect/mycat.cc | 13 | ||||
-rw-r--r-- | storage/connect/tabdos.cpp | 6 | ||||
-rw-r--r-- | storage/connect/tabfix.cpp | 4 | ||||
-rw-r--r-- | storage/connect/tabfmt.cpp | 5 | ||||
-rw-r--r-- | storage/connect/tabtbl.cpp | 6 | ||||
-rw-r--r-- | storage/connect/tabvct.cpp | 5 |
10 files changed, 232 insertions, 87 deletions
diff --git a/mysql-test/suite/connect/r/null.result b/mysql-test/suite/connect/r/null.result index 9df2554e002..0e4f1f864b9 100644 --- a/mysql-test/suite/connect/r/null.result +++ b/mysql-test/suite/connect/r/null.result @@ -3,41 +3,117 @@ # CREATE TABLE t1 ( -id INT -) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='t1.txt'; -ERROR HY000: Table type FIX does not support nullable columns +id INT NOT NULL, +nb INT, +msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=FIX; +Warnings: +Warning 1105 No file name. Table will use t1.fix +INSERT INTO t1 values(NULL,1,'Hello'); +ERROR 23000: Column 'id' cannot be null +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +id nb msg +10 4 NULL +20 2 Hello +0 NULL Zero +SELECT* FROM t1 WHERE id IS NULL; +id nb msg +SELECT * FROM t1 WHERE nb IS NULL; +id nb msg +0 NULL Zero +SELECT * FROM t1 WHERE msg IS NOT NULL; +id nb msg +20 2 Hello +0 NULL Zero +DROP TABLE t1; # # Testing CSV null columns # CREATE TABLE t1 ( -id INT -) ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='t1.csv'; -ERROR HY000: Table type CSV does not support nullable columns -# -# Testing VEC null columns -# -CREATE TABLE t1 -( -id INT -) ENGINE=CONNECT TABLE_TYPE=VEC FILE_NAME='t1.vec'; -ERROR HY000: Table type VEC does not support nullable columns +id INT NOT NULL, +nb INT, +msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1; +Warnings: +Warning 1105 No file name. Table will use t1.csv +INSERT INTO t1 values(NULL,1,'Hello'); +ERROR 23000: Column 'id' cannot be null +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +id nb msg +10 4 NULL +20 2 Hello +0 NULL Zero +SELECT* FROM t1 WHERE id IS NULL; +id nb msg +SELECT * FROM t1 WHERE nb IS NULL; +id nb msg +0 NULL Zero +SELECT * FROM t1 WHERE msg IS NOT NULL; +id nb msg +20 2 Hello +0 NULL Zero +DROP TABLE t1; # -# Testing DOS null columns +# Testing BIN null columns # CREATE TABLE t1 ( -id INT -) ENGINE=CONNECT FILE_NAME='t1.txt'; -ERROR HY000: Table type DOS does not support nullable columns +id INT NOT NULL, +nb INT, +msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=BIN; +Warnings: +Warning 1105 No file name. Table will use t1.bin +INSERT INTO t1 values(NULL,1,'Hello'); +ERROR 23000: Column 'id' cannot be null +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +id nb msg +10 4 NULL +20 2 Hello +0 NULL Zero +SELECT* FROM t1 WHERE id IS NULL; +id nb msg +SELECT * FROM t1 WHERE nb IS NULL; +id nb msg +0 NULL Zero +SELECT * FROM t1 WHERE msg IS NOT NULL; +id nb msg +20 2 Hello +0 NULL Zero +DROP TABLE t1; # # Testing DBF null columns # CREATE TABLE t1 ( -id INT -) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf'; -ERROR HY000: Table type DBF does not support nullable columns +id INT NOT NULL, +nb INT, +msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=DBF; +Warnings: +Warning 1105 No file name. Table will use t1.dbf +INSERT INTO t1 values(NULL,1,'Hello'); +ERROR 23000: Column 'id' cannot be null +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +id nb msg +10 4 NULL +20 2 Hello +0 NULL Zero +SELECT* FROM t1 WHERE id IS NULL; +id nb msg +SELECT * FROM t1 WHERE nb IS NULL; +id nb msg +0 NULL Zero +SELECT * FROM t1 WHERE msg IS NOT NULL; +id nb msg +20 2 Hello +0 NULL Zero +DROP TABLE t1; # # Testing INI null columns # diff --git a/mysql-test/suite/connect/r/xml.result b/mysql-test/suite/connect/r/xml.result index 69ece85c5fa..e7dcf8f4c73 100644 --- a/mysql-test/suite/connect/r/xml.result +++ b/mysql-test/suite/connect/r/xml.result @@ -507,7 +507,7 @@ DROP TABLE t1; SET @a=LOAD_FILE('test/t1.xml'); SELECT CAST(@a AS CHAR CHARACTER SET latin1); CAST(@a AS CHAR CHARACTER SET latin1) <?xml version="1.0" encoding="iso-8859-1"?> -<!-- Created by CONNECT Version 1.01.0003 March 02, 2013 --> +<!-- Created by CONNECT Version 1.01.0004 April 10, 2013 --> <t1> <line> <node>ÀÁÂÃ</node> diff --git a/mysql-test/suite/connect/t/null.test b/mysql-test/suite/connect/t/null.test index 8657a866fe7..3d1e33eb77c 100644 --- a/mysql-test/suite/connect/t/null.test +++ b/mysql-test/suite/connect/t/null.test @@ -1,60 +1,87 @@ -let $MYSQLD_DATADIR= `select @@datadir`; - ---echo # ---echo # Testing FIX null columns ---echo # ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 -( - id INT -) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='t1.txt'; - ---echo # ---echo # Testing CSV null columns ---echo # ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 -( - id INT -) ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='t1.csv'; - ---echo # ---echo # Testing VEC null columns ---echo # ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 -( - id INT -) ENGINE=CONNECT TABLE_TYPE=VEC FILE_NAME='t1.vec'; - ---echo # ---echo # Testing DOS null columns ---echo # ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 -( - id INT -) ENGINE=CONNECT FILE_NAME='t1.txt'; - ---echo # ---echo # Testing DBF null columns ---echo # ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 -( - id INT -) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf'; - ---echo # ---echo # Testing INI null columns ---echo # -CREATE TABLE t1 -( - `sec` char(8) NOT NULL flag=1, - `key` char(12) -) ENGINE=CONNECT TABLE_TYPE=INI; -INSERT INTO t1(sec) values('S1'); -SELECT * FROM t1; -INSERT INTO t1 values('S1','Newval'); -SELECT * FROM t1; -DROP TABLE t1; +let $MYSQLD_DATADIR= `select @@datadir`;
+
+--echo #
+--echo # Testing FIX null columns
+--echo #
+CREATE TABLE t1
+(
+ id INT NOT NULL,
+ nb INT,
+ msg VARCHAR(12)
+) ENGINE=CONNECT TABLE_TYPE=FIX;
+--error ER_BAD_NULL_ERROR
+INSERT INTO t1 values(NULL,1,'Hello');
+INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero');
+SELECT * FROM t1;
+SELECT* FROM t1 WHERE id IS NULL;
+SELECT * FROM t1 WHERE nb IS NULL;
+SELECT * FROM t1 WHERE msg IS NOT NULL;
+DROP TABLE t1;
+
+--echo #
+--echo # Testing CSV null columns
+--echo #
+CREATE TABLE t1
+(
+ id INT NOT NULL,
+ nb INT,
+ msg VARCHAR(12)
+) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1;
+--error ER_BAD_NULL_ERROR
+INSERT INTO t1 values(NULL,1,'Hello');
+INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero');
+SELECT * FROM t1;
+SELECT* FROM t1 WHERE id IS NULL;
+SELECT * FROM t1 WHERE nb IS NULL;
+SELECT * FROM t1 WHERE msg IS NOT NULL;
+DROP TABLE t1;
+
+--echo #
+--echo # Testing BIN null columns
+--echo #
+CREATE TABLE t1
+(
+ id INT NOT NULL,
+ nb INT,
+ msg VARCHAR(12)
+) ENGINE=CONNECT TABLE_TYPE=BIN;
+--error ER_BAD_NULL_ERROR
+INSERT INTO t1 values(NULL,1,'Hello');
+INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero');
+SELECT * FROM t1;
+SELECT* FROM t1 WHERE id IS NULL;
+SELECT * FROM t1 WHERE nb IS NULL;
+SELECT * FROM t1 WHERE msg IS NOT NULL;
+DROP TABLE t1;
+
+--echo #
+--echo # Testing DBF null columns
+--echo #
+CREATE TABLE t1
+(
+ id INT NOT NULL,
+ nb INT,
+ msg VARCHAR(12)
+) ENGINE=CONNECT TABLE_TYPE=DBF;
+--error ER_BAD_NULL_ERROR
+INSERT INTO t1 values(NULL,1,'Hello');
+INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero');
+SELECT * FROM t1;
+SELECT* FROM t1 WHERE id IS NULL;
+SELECT * FROM t1 WHERE nb IS NULL;
+SELECT * FROM t1 WHERE msg IS NOT NULL;
+DROP TABLE t1;
+
+--echo #
+--echo # Testing INI null columns
+--echo #
+CREATE TABLE t1
+(
+ `sec` char(8) NOT NULL flag=1,
+ `key` char(12)
+) ENGINE=CONNECT TABLE_TYPE=INI;
+INSERT INTO t1(sec) values('S1');
+SELECT * FROM t1;
+INSERT INTO t1 values('S1','Newval');
+SELECT * FROM t1;
+DROP TABLE t1;
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index ec2863e1498..49483cfc11b 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -156,7 +156,7 @@ extern "C" char nmfile[]; extern "C" char pdebug[]; extern "C" { - char version[]= "Version 1.01.0003 March 02, 2013"; + char version[]= "Version 1.01.0004 April 10, 2013"; #if defined(XMSG) char msglang[]; // Default message language @@ -2146,10 +2146,15 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT* check_opt) if (!((PTDBASE)tdbp)->GetDef()->Indexable()) { sprintf(g->Message, "Table %s is not indexable", tdbp->GetName()); rc= HA_ERR_INTERNAL_ERROR; - } else - if (((PTDBASE)tdbp)->ResetTableOpt(g, true)) + } else if ((rc= ((PTDBASE)tdbp)->ResetTableOpt(g, true))) { + if (rc == RC_INFO) { + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, g->Message); + rc= 0; + } else rc = HA_ERR_INTERNAL_ERROR; + } // endif's + } else rc= HA_ERR_INTERNAL_ERROR; @@ -4310,7 +4315,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, if (cat) { cat->SetDataPath(g, table_arg->in_use->db); - if ((rc= optimize(NULL, NULL))) { + if ((rc= optimize(table->in_use, NULL))) { printf("Create rc=%d %s\n", rc, g->Message); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_INTERNAL_ERROR; diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 68a09e834d2..eb7098e8189 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -161,6 +161,7 @@ bool IsTypeNullable(TABTYPE type) { bool nullable; +#if 0 switch (type) { case TAB_ODBC: case TAB_MYSQL: @@ -173,6 +174,18 @@ bool IsTypeNullable(TABTYPE type) nullable= false; break; } // endswitch type +#endif // 0 + + switch (type) { + case TAB_MAC: + case TAB_DIR: + nullable= false; + break; + default: + nullable= true; + break; + } // endswitch type + return nullable; } // end of IsTypeNullable diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index c872a4d9e5f..288396276bc 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -571,7 +571,7 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) goto err; } else - break; // Physical table does not exist yet or anymore + return RC_INFO; // Error or Physical table does not exist if (Use == USE_OPEN) CloseDB(g); @@ -1112,6 +1112,10 @@ void DOSCOL::ReadColumn(PGLOBAL g) longjmp(g->jumper[g->jump_level], 34); } // endswitch Ftype + // Set null when applicable + if (Nullable) + Value->SetNull(Value->IsZero()); + } // end of ReadColumn /***********************************************************************/ diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index 1f2fb58d153..801de79aad9 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -382,6 +382,10 @@ void BINCOL::ReadColumn(PGLOBAL g) longjmp(g->jumper[g->jump_level], 11); } // endswitch Fmt + // Set null when applicable + if (Nullable) + Value->SetNull(Value->IsZero()); + } // end of ReadColumn /***********************************************************************/ diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index 3533dc366c0..95e99b01b82 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -1341,6 +1341,11 @@ void CSVCOL::ReadColumn(PGLOBAL g) PSZ fp = tdbp->Field[Fldnum]; Value->SetValue_psz(fp); + + // Set null when applicable + if (Nullable) + Value->SetNull(Value->IsZero()); + } // endif Mode } // end of ReadColumn diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index b79858203da..928b72a0f9e 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -759,6 +759,11 @@ void TBLCOL::ReadColumn(PGLOBAL g) if (Colp) { Colp->ReadColumn(g); Value->SetValue_pval(To_Val); + + // Set null when applicable + if (Colp->IsNullable()) + Value->SetNull(Value->IsZero()); + } // endif Colp } // end of ReadColumn @@ -774,6 +779,7 @@ void TBTBLK::ReadColumn(PGLOBAL g) htrc("TBT ReadColumn: name=%s\n", Name); Value->SetValue_psz((char*)((PTDBTBL)To_Tdb)->Tdbp->GetName()); + } // end of ReadColumn /* ------------------------------------------------------------------- */ diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 234b9707706..7a16d2baf0c 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -534,6 +534,11 @@ void VCTCOL::ReadColumn(PGLOBAL g) //ColBlk = txfp->CurBlk; done in ReadBlock ColPos = txfp->CurNum; Value->SetValue_pvblk(Blk, ColPos); + + // Set null when applicable + if (Nullable) + Value->SetNull(Value->IsZero()); + } // end of ReadColumn /***********************************************************************/ |