summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Bertrand <bertrandop@gmail.com>2013-04-10 23:38:27 +0200
committerOlivier Bertrand <bertrandop@gmail.com>2013-04-10 23:38:27 +0200
commit1357bffbf39cdeb1746ce276ad3a556ec0356c35 (patch)
tree02f6679fa1ba009e9911f76c49124ffd3faf6a91
parent9b790248c5c1f4d8ef006ef2b7383aa41986c1a6 (diff)
downloadmariadb-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.result118
-rw-r--r--mysql-test/suite/connect/r/xml.result2
-rw-r--r--mysql-test/suite/connect/t/null.test147
-rw-r--r--storage/connect/ha_connect.cc13
-rw-r--r--storage/connect/mycat.cc13
-rw-r--r--storage/connect/tabdos.cpp6
-rw-r--r--storage/connect/tabfix.cpp4
-rw-r--r--storage/connect/tabfmt.cpp5
-rw-r--r--storage/connect/tabtbl.cpp6
-rw-r--r--storage/connect/tabvct.cpp5
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
/***********************************************************************/