summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Bertrand <bertrandop@gmail.com>2014-02-16 18:05:43 +0100
committerOlivier Bertrand <bertrandop@gmail.com>2014-02-16 18:05:43 +0100
commitad9d7e8561296a5579c241fd96fa5f1cd8a501d5 (patch)
treed64000a299db4513411fec9b381713286d1857c3
parente1096934d7c9222691789d57c5c3754bcd3560dc (diff)
downloadmariadb-git-ad9d7e8561296a5579c241fd96fa5f1cd8a501d5.tar.gz
# This is a minor change commitment
- Fix accidental crash when closing domdoc xml table modified: storage/connect/domdoc.cpp - Update table and index flags. Correct version number in maria_declare_plugin. modified: storage/connect/ha_connect.cc storage/connect/ha_connect.h storage/connect/mycat.cc storage/connect/mycat.h - Fix syntax error when getting columns of a non-select srcdef (discovery) modified: storage/connect/myconn.cpp - Update some tests and result according to new flag setting modified: storage/connect/mysql-test/connect/r/alter.result storage/connect/mysql-test/connect/r/dbf.result storage/connect/mysql-test/connect/t/dbf.test - Change some tracing tests to avoid too much test printed modified: storage/connect/plgdbutl.cpp storage/connect/tabutil.cpp storage/connect/value.cpp
-rw-r--r--storage/connect/domdoc.cpp4
-rw-r--r--storage/connect/ha_connect.cc91
-rw-r--r--storage/connect/ha_connect.h26
-rw-r--r--storage/connect/mycat.cc23
-rw-r--r--storage/connect/mycat.h1
-rw-r--r--storage/connect/myconn.cpp7
-rw-r--r--storage/connect/mysql-test/connect/r/alter.result12
-rw-r--r--storage/connect/mysql-test/connect/r/dbf.result8
-rw-r--r--storage/connect/mysql-test/connect/t/dbf.test1022
-rw-r--r--storage/connect/plgdbutl.cpp4
-rw-r--r--storage/connect/tabutil.cpp2
-rw-r--r--storage/connect/value.cpp4
12 files changed, 668 insertions, 536 deletions
diff --git a/storage/connect/domdoc.cpp b/storage/connect/domdoc.cpp
index 0272a1d709a..251b4f17982 100644
--- a/storage/connect/domdoc.cpp
+++ b/storage/connect/domdoc.cpp
@@ -59,7 +59,9 @@ void CloseXMLFile(PGLOBAL g, PFBLOCK fp, bool all)
xp->Count--;
} else if (xp && xp->Count > 0) {
try {
- xp->Docp->Release();
+ if (xp->Docp)
+ xp->Docp->Release();
+
} catch(_com_error e) {
sprintf(g->Message, "%s %s", MSG(COM_ERROR), e.Description());
} catch(...) {}
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 9ac95d6360b..7fd652e5bc2 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -593,13 +593,13 @@ TABTYPE ha_connect::GetRealType(PTOS pos)
*/
ulonglong ha_connect::table_flags() const
{
- ulonglong flags= HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ |
+ ulonglong flags= HA_CAN_VIRTUAL_COLUMNS | HA_REC_NOT_IN_SEQ |
HA_NO_AUTO_INCREMENT | HA_NO_PREFIX_CHAR_KEYS |
- HA_HAS_RECORDS | HA_CAN_VIRTUAL_COLUMNS |
HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE |
// HA_NULL_IN_KEY | not implemented yet
- HA_DUPLICATE_KEY_NOT_IN_ORDER |
- HA_MUST_USE_TABLE_CONDITION_PUSHDOWN;
+// HA_FAST_KEY_READ | causes error when sorting (???)
+ HA_NO_TRANSACTIONS | HA_DUPLICATE_KEY_NOT_IN_ORDER |
+ HA_NO_BLOBS | HA_MUST_USE_TABLE_CONDITION_PUSHDOWN;
ha_connect *hp= (ha_connect*)this;
PTOS pos= hp->GetTableOptionStruct(table);
@@ -609,6 +609,9 @@ ulonglong ha_connect::table_flags() const
if (IsFileType(type))
flags|= HA_FILE_BASED;
+ if (IsExactType(type))
+ flags|= (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT);
+
// No data change on ALTER for outward tables
if (!IsFileType(type) || hp->FileExists(pos->filename))
flags|= HA_NO_COPY_ON_ALTER;
@@ -2298,6 +2301,9 @@ int ha_connect::index_end()
{
DBUG_ENTER("index_end");
active_index= MAX_KEY;
+#if defined(MRRBKA_SUPPORT)
+ ds_mrr.dsmrr_close();
+#endif // MRRBKA_SUPPORT
DBUG_RETURN(rnd_end());
} // end of index_end
@@ -2564,6 +2570,9 @@ int ha_connect::rnd_end()
// if (tdbp && xp->last_query_id == valid_query_id)
// rc= CloseTable(xp->g);
+#if defined(MRRBKA_SUPPORT)
+ ds_mrr.dsmrr_close();
+#endif // MRRBKA_SUPPORT
DBUG_RETURN(rc);
} // end of rnd_end
@@ -5391,6 +5400,76 @@ bool ha_connect::check_if_incompatible_data(HA_CREATE_INFO *info,
} // end of check_if_incompatible_data
+#if defined(MRRBKA_SUPPORT)
+#error This is not implemented yet
+/****************************************************************************
+ * CONNECT MRR implementation: use DS-MRR
+ This is just copied from myisam
+ ***************************************************************************/
+
+int ha_connect::multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
+ uint n_ranges, uint mode,
+ HANDLER_BUFFER *buf)
+{
+ return ds_mrr.dsmrr_init(this, seq, seq_init_param, n_ranges, mode, buf);
+} // end of multi_range_read_init
+
+int ha_connect::multi_range_read_next(range_id_t *range_info)
+{
+ return ds_mrr.dsmrr_next(range_info);
+} // end of multi_range_read_next
+
+ha_rows ha_connect::multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq,
+ void *seq_init_param,
+ uint n_ranges, uint *bufsz,
+ uint *flags, Cost_estimate *cost)
+{
+ /*
+ This call is here because there is no location where this->table would
+ already be known.
+ TODO: consider moving it into some per-query initialization call.
+ */
+ ds_mrr.init(this, table);
+
+ // MMR is implemented for "local" file based tables only
+ if (!IsFileType(GetRealType(GetTableOptionStruct(table))))
+ *flags |= HA_MRR_USE_DEFAULT_IMPL;
+
+ return ds_mrr.dsmrr_info_const(keyno, seq, seq_init_param, n_ranges, bufsz,
+ flags, cost);
+} // end of multi_range_read_info_const
+
+ha_rows ha_connect::multi_range_read_info(uint keyno, uint n_ranges, uint keys,
+ uint key_parts, uint *bufsz,
+ uint *flags, Cost_estimate *cost)
+{
+ ds_mrr.init(this, table);
+ return ds_mrr.dsmrr_info(keyno, n_ranges, keys, key_parts, bufsz, flags, cost);
+} // end of multi_range_read_info
+
+
+int ha_connect::multi_range_read_explain_info(uint mrr_mode, char *str,
+ size_t size)
+{
+ return ds_mrr.dsmrr_explain_info(mrr_mode, str, size);
+} // end of multi_range_read_explain_info
+
+/* CONNECT MRR implementation ends */
+
+#if 0
+// Does this make sens for CONNECT?
+Item *ha_connect::idx_cond_push(uint keyno_arg, Item* idx_cond_arg)
+{
+ pushed_idx_cond_keyno= keyno_arg;
+ pushed_idx_cond= idx_cond_arg;
+ in_range_check_pushed_down= TRUE;
+ if (active_index == pushed_idx_cond_keyno)
+ mi_set_index_cond_func(file, handler_index_cond_check, this);
+ return NULL;
+}
+#endif // 0
+#endif // MRRBKA_SUPPORT
+
struct st_mysql_storage_engine connect_storage_engine=
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
@@ -5404,10 +5483,10 @@ maria_declare_plugin(connect)
PLUGIN_LICENSE_GPL,
connect_init_func, /* Plugin Init */
connect_done_func, /* Plugin Deinit */
- 0x0001, /* version number (0.1) */
+ 0x0102, /* version number (1.02) */
NULL, /* status variables */
NULL, /* system variables */
- "0.1", /* string version */
+ "1.02", /* string version */
MariaDB_PLUGIN_MATURITY_BETA /* maturity */
}
maria_declare_plugin_end;
diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h
index aae20db2f9d..7983ec72bdc 100644
--- a/storage/connect/ha_connect.h
+++ b/storage/connect/ha_connect.h
@@ -243,7 +243,7 @@ public:
*/
ulong index_flags(uint inx, uint part, bool all_parts) const
{
- return HA_READ_NEXT | HA_READ_RANGE;
+ return HA_READ_NEXT | HA_READ_RANGE | HA_READ_ORDER;
}
/** @brief
@@ -494,4 +494,28 @@ public:
char *index_file_name;
uint int_table_flags; // Inherited from MyISAM
bool enable_activate_all_index; // Inherited from MyISAM
+
+#if defined(MRRBKA_SUPPORT)
+ /**
+ * Multi Range Read interface
+ */
+ int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
+ uint n_ranges, uint mode, HANDLER_BUFFER *buf);
+ int multi_range_read_next(range_id_t *range_info);
+ ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq,
+ void *seq_init_param,
+ uint n_ranges, uint *bufsz,
+ uint *flags, Cost_estimate *cost);
+ ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys,
+ uint key_parts, uint *bufsz,
+ uint *flags, Cost_estimate *cost);
+ int multi_range_read_explain_info(uint mrr_mode, char *str, size_t size);
+
+ int reset(void) {ds_mrr.dsmrr_close(); return 0;}
+
+ /* Index condition pushdown implementation */
+// Item *idx_cond_push(uint keyno, Item* idx_cond);
+private:
+ DsMrr_impl ds_mrr;
+#endif // MRRBKA_SUPPORT
}; // end of ha_connect class definition
diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc
index 5b5bf4d3000..15df8cf8ba2 100644
--- a/storage/connect/mycat.cc
+++ b/storage/connect/mycat.cc
@@ -168,6 +168,29 @@ bool IsFileType(TABTYPE type)
} // end of IsFileType
/***********************************************************************/
+/* Return true for table types returning exact row count. */
+/***********************************************************************/
+bool IsExactType(TABTYPE type)
+ {
+ bool exact;
+
+ switch (type) {
+ case TAB_FIX:
+ case TAB_BIN:
+ case TAB_DBF:
+// case TAB_XML: depends on Multiple || Xpand || Coltype
+ case TAB_VEC:
+ exact= true;
+ break;
+ default:
+ exact= false;
+ break;
+ } // endswitch type
+
+ return exact;
+ } // end of IsExactType
+
+/***********************************************************************/
/* Return true for table types accepting null fields. */
/***********************************************************************/
bool IsTypeNullable(TABTYPE type)
diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h
index 05fa96e6295..4c1d548d6a5 100644
--- a/storage/connect/mycat.h
+++ b/storage/connect/mycat.h
@@ -36,6 +36,7 @@ typedef class ha_connect *PHC;
TABTYPE GetTypeID(const char *type);
bool IsFileType(TABTYPE type);
+bool IsExactType(TABTYPE type);
bool IsTypeNullable(TABTYPE type);
bool IsTypeFixed(TABTYPE type);
bool IsTypeIndexable(TABTYPE type);
diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp
index 769aa5a581c..1776a8f9168 100644
--- a/storage/connect/myconn.cpp
+++ b/storage/connect/myconn.cpp
@@ -283,8 +283,11 @@ PQRYRES SrcColumns(PGLOBAL g, const char *host, const char *db,
if (!port)
port = mysqld_port;
- query = (char *)PlugSubAlloc(g, NULL, strlen(srcdef) + 9);
- strcat(strcpy(query, srcdef), " LIMIT 0");
+ if (!strnicmp(srcdef, "select ", 7)) {
+ query = (char *)PlugSubAlloc(g, NULL, strlen(srcdef) + 9);
+ strcat(strcpy(query, srcdef), " LIMIT 0");
+ } else
+ query = (char *)srcdef;
// Open a MySQL connection for this table
if (myc.Open(g, host, db, user, pwd, port))
diff --git a/storage/connect/mysql-test/connect/r/alter.result b/storage/connect/mysql-test/connect/r/alter.result
index 54d4a8c818e..14d4fc92c1d 100644
--- a/storage/connect/mysql-test/connect/r/alter.result
+++ b/storage/connect/mysql-test/connect/r/alter.result
@@ -21,8 +21,8 @@ DROP INDEX xd ON t1;
ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d);
SHOW INDEX FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
-t1 1 xc 1 c NULL NULL NULL NULL XPLUG
-t1 1 xd 1 d NULL NULL NULL NULL XPLUG
+t1 1 xc 1 c A NULL NULL NULL XPLUG
+t1 1 xd 1 d A NULL NULL NULL XPLUG
ALTER TABLE t1 DROP INDEX xc, DROP INDEX xd;
SHOW INDEX FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
@@ -182,8 +182,8 @@ t1 CREATE TABLE `t1` (
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=DBF
SHOW INDEX FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
-t1 1 xc 1 c NULL NULL NULL NULL XPLUG
-t1 1 xd 1 d NULL NULL NULL NULL XPLUG
+t1 1 xc 1 c A NULL NULL NULL XPLUG
+t1 1 xd 1 d A NULL NULL NULL XPLUG
SELECT * FROM t1;
c d
1 One
@@ -214,8 +214,8 @@ line
ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d);
SHOW INDEX FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
-t1 1 xc 1 c NULL NULL NULL NULL XPLUG
-t1 1 xd 1 d NULL NULL NULL NULL XPLUG
+t1 1 xc 1 c A NULL NULL NULL XPLUG
+t1 1 xd 1 d A NULL NULL NULL XPLUG
SELECT d FROM t1 WHERE c = 2;
d
Two
diff --git a/storage/connect/mysql-test/connect/r/dbf.result b/storage/connect/mysql-test/connect/r/dbf.result
index bc09f85a631..30fac687119 100644
--- a/storage/connect/mysql-test/connect/r/dbf.result
+++ b/storage/connect/mysql-test/connect/r/dbf.result
@@ -390,22 +390,22 @@ CREATE TABLE t1
(
a BLOB
) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-ERROR HY000: Unsupported type for column a
+ERROR 42000: Storage engine CONNECT doesn't support BLOB/TEXT columns
CREATE TABLE t1
(
a TINYBLOB
) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-ERROR HY000: Unsupported type for column a
+ERROR 42000: Storage engine CONNECT doesn't support BLOB/TEXT columns
CREATE TABLE t1
(
a MEDIUMBLOB
) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-ERROR HY000: Unsupported type for column a
+ERROR 42000: Storage engine CONNECT doesn't support BLOB/TEXT columns
CREATE TABLE t1
(
a LONGBLOB
) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-ERROR HY000: Unsupported type for column a
+ERROR 42000: Storage engine CONNECT doesn't support BLOB/TEXT columns
#
# Testing DATE
#
diff --git a/storage/connect/mysql-test/connect/t/dbf.test b/storage/connect/mysql-test/connect/t/dbf.test
index 7b364e9b921..467c608fe38 100644
--- a/storage/connect/mysql-test/connect/t/dbf.test
+++ b/storage/connect/mysql-test/connect/t/dbf.test
@@ -1,511 +1,511 @@
-let $MYSQLD_DATADIR= `select @@datadir`;
-
---echo #
---echo # Testing errors
---echo #
-CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-SHOW CREATE TABLE t1;
---replace_regex /on .*test.t1.dbf/on DATADIR\/test\/t1.dbf/
-SELECT * FROM t1;
-DROP TABLE t1;
-
---replace_regex /Cannot open .*test.t1.dbf/Cannot open DATADIR\/test\/t1.dbf/
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---replace_regex /Cannot open .*test.t1.dbf/Cannot open DATADIR\/test\/t1.dbf/
-SHOW WARNINGS;
-
-
-DELIMITER //;
-CREATE PROCEDURE test.dbf_field(in fieldno INT, in content BLOB) DETERMINISTIC
-BEGIN
- SELECT '---';
- SELECT fieldno AS `FieldN`;
- SELECT TRIM(TRAILING 0x00 FROM LEFT(content, 10)) AS `Name`;
- SELECT SUBSTRING(content, 12, 1) AS `Type`;
- SELECT CONV(HEX(REVERSE(SUBSTRING(content,13,4))),16,10) AS `Offset`;
- SELECT CONV(HEX(REVERSE(SUBSTRING(content,17,1))),16,10) AS `Length`;
- SELECT CONV(HEX(REVERSE(SUBSTRING(content,18,1))),16,10) AS `Dec`;
- SELECT HEX(REVERSE(SUBSTRING(content,19,1))) AS `Flags`;
--- SELECT CONV(HEX(REVERSE(SUBSTRING(content,20,4))),16,10) AS `Next`;
--- SELECT CONV(HEX(REVERSE(SUBSTRING(content,24,4))),16,10) AS `Step`;
-END//
-
-CREATE PROCEDURE test.dbf_header(in fname VARCHAR(1024)) DETERMINISTIC
-BEGIN
- DECLARE content BLOB;
- DECLARE offset INT;
- DECLARE fieldno INT;
- SELECT '--------';
- SELECT LOAD_FILE(fname) INTO content;
- SELECT LENGTH(content) AS FileSize;
- SELECT HEX(LEFT(content, 1)) AS DBF_Version;
- SELECT CONV(HEX(REVERSE(SUBSTRING(content,5,4))),16,10) AS NRecords;
- SELECT CONV(HEX(REVERSE(SUBSTRING(content,9,2))),16,10) AS FirstRecPos;
- SELECT CONV(HEX(REVERSE(SUBSTRING(content,11,2))),16,10) AS RecLength;
- SELECT HEX(REVERSE(SUBSTRING(content,29,2))) AS TableFlags;
- SELECT HEX(REVERSE(SUBSTRING(content,30,1))) AS CodePageMark;
- SET offset=33;
- SET fieldno=0;
- WHILE SUBSTR(content, offset, 1) <> 0x0D AND offset + 32 < LENGTH(content) DO
- CALL dbf_field(fieldno, SUBSTRING(content, offset, 32));
- SET offset=offset + 32;
- SET fieldno=fieldno + 1;
- END WHILE;
- SELECT '--------';
-END//
-DELIMITER ;//
-
-
---echo #
---echo # Testing READONLY tables
---echo #
-CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-SHOW CREATE TABLE t1;
-INSERT INTO t1 VALUES (10),(20);
-SELECT * FROM t1;
-ALTER TABLE t1 READONLY=Yes;
-SHOW CREATE TABLE t1;
---error ER_OPEN_AS_READONLY
-INSERT INTO t1 VALUES (30);
---error ER_OPEN_AS_READONLY
-UPDATE t1 SET a=30 WHERE a=10;
---error ER_OPEN_AS_READONLY
-DELETE FROM t1 WHERE a=10;
---error ER_OPEN_AS_READONLY
-TRUNCATE TABLE t1;
-ALTER TABLE t1 READONLY=NO;
-SHOW CREATE TABLE t1;
-INSERT INTO t1 VALUES (30);
-SELECT * FROM t1;
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # This SQL script crashed (dbf01.sql)
---echo #
-CREATE TABLE t1
-(
- a int(11) NOT NULL,
- b char(10) NOT NULL,
- c varchar(10) NOT NULL
-) ENGINE=CONNECT table_type=DBF file_name='t1.dbf';
-INSERT INTO t1 VALUES (1,'1','1');
-INSERT INTO t1 VALUES (2,'2','2');
-SELECT * FROM t1;
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing that table options in lower case and mixed case are understood:
---echo #
-CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT table_type=dbf file_name='t1.dbf';
-SHOW CREATE TABLE t1;
-INSERT INTO t1 VALUES (10);
-SELECT * FROM t1;
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-CREATE TABLE t1 (a CHAR(10) NOT NULL) ENGINE=CONNECT Table_Type=dbf File_Name='t1.dbf';
-SHOW CREATE TABLE t1;
-INSERT INTO t1 VALUES ('test');
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
-#
-# TODO: this creates DBF record with length=32, which looks wrong
-#
---echo #
---echo # Testing multiple columns
---echo #
-CREATE TABLE t1
-(
- a INT NOT NULL,
- b CHAR(10) NOT NULL,
- c VARCHAR(10) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (1,'1','1');
-INSERT INTO t1 VALUES (2,'2','2');
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing long column name
---echo #
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a012345678901234567890123456789 INT NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-
---echo #
---echo # Testing 2 columns with long names (12)
---echo #
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a0123456789a INT NOT NULL,
- b0123456789b INT NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t02x11.dbf';
-
---echo #
---echo # Testing 2 columns with long names (11)
---echo #
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a012345678a INT NOT NULL,
- b012345678b INT NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t02x12.dbf';
-
---echo #
---echo # Testing 2 columns name length 10 (maximum possible length)
---echo #
-CREATE TABLE t1
-(
- a01234567a INT NOT NULL,
- b01234567b INT NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t02x13.dbf';
-SHOW CREATE TABLE t1;
-INSERT INTO t1 VALUES (1,2);
-SELECT * FROM t1;
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t02x13.dbf
-
-
---echo #
---echo # Testing BIGINT
---echo #
-CREATE TABLE t1
-(
- a bigint NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (0x7FFFFFFFFFFFFFFF);
-INSERT INTO t1 VALUES (-0x8000000000000000);
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing TINYINT
---echo #
-CREATE TABLE t1
-(
- a TINYINT NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (123);
-SELECT * FROM t1;
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing SMALLINT
---echo #
-CREATE TABLE t1
-(
- a SMALLINT NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (0x7FFF);
-INSERT INTO t1 VALUES (-0x8000);
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing VARCHAR
---echo #
-CREATE TABLE t1
-(
- a VARCHAR(255) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (REPEAT('a',255));
-SELECT LENGTH(a) FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing too long CHAR
---echo # All columns longer than 255 bytes should be rejected
---echo #
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a CHAR(86) CHARACTER SET utf8 NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---error ER_UNKNOWN_ERROR
-
-
---echo #
---echo # Testing too long VARCHAR
---echo # All columns longer than 255 bytes should be rejected
---echo #
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a VARCHAR(256) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a VARCHAR(86) CHARACTER SET utf8 NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a VARCHAR(64000) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-
-
---echo #
---echo # Testing BLOB
---echo #
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a BLOB
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a TINYBLOB
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a MEDIUMBLOB
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
---error ER_UNKNOWN_ERROR
-CREATE TABLE t1
-(
- a LONGBLOB
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-
-
-# TODO: utf8 does not work
-#--echo #
-#--echo # Testing varchar with utf8
-#--echo #
-#SET NAMES utf8;
-#CREATE TABLE t1
-#(
-# a VARCHAR(10) CHARACTER SET utf8
-#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-#INSERT INTO t1 VALUES (REPEAT(_ucs2 0x00DF,10));
-#SELECT * FROM t1;
-#DROP TABLE IF EXISTS t1;
-#--remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing DATE
---echo #
-CREATE TABLE t1
-(
- a DATE NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES ('2001-01-01');
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
-
---echo #
---echo # Testing FLOAT
---echo #
-CREATE TABLE t1
-(
- a FLOAT(12,4) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (123);
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-#
-# TODO: this return error:
-# Got error 122 'Value 123.0000000000 too long for column a of length 12'
-# from CONNECT
-#
-#CREATE TABLE t1
-#(
-# a FLOAT NOT NULL
-#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-#--error ER_GET_ERRMSG - why this error?
-#INSERT INTO t1 VALUES (123);
-#SELECT * FROM t1;
-#DROP TABLE IF EXISTS t1;
-#--remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
-#
-# TODO: this creates a column of type 'D' (date), which is wrong
-#
-#--echo #
-#--echo # Testing DATETIME
-#--echo #
-#CREATE TABLE t1
-#(
-# a DATETIME NOT NULL
-#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-#INSERT INTO t1 VALUES ('2013-02-01');
-#SELECT * FROM t1;
-#DROP TABLE t1;
-#--remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
-#
-# TODO: this creates a column of type 'D' (date), which is wrong
-#
-#--echo #
-#--echo # Testing TIMESTAMP
-#--echo #
-#CREATE TABLE t1
-#(
-# a TIMESTAMP
-#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-#INSERT INTO t1 VALUES ('2013-02-01');
-#SELECT * FROM t1;
-#DROP TABLE t1;
-#--remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
---echo #
---echo # Testing double
---echo #
-CREATE TABLE t1
-(
- a DOUBLE(20,5) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES (123);
-INSERT INTO t1 VALUES (123456789.12345);
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE IF EXISTS t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-
-# TODO:
-# Testing with no FILE_NAME specified
-# Currently it returns:
-# ERROR 1296 (HY000): Got error 174 'Open(a+) error 21
-# on /opt/mariadb-5.5/data/: Is a directory' from CONNECT
-#CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=DBF;
-
---echo #
---echo # Testing ALTER
---echo #
-# Temporarily change the file name because ALTER that are not executed not in place
-# delete the data file when it has the same path/name than the default file name.
-CREATE TABLE t1
-(
- a VARCHAR(10) NOT NULL
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1c.dbf';
-INSERT INTO t1 VALUES ('10');
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1c.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1c.dbf');
---horizontal_results
-ALTER TABLE t1 MODIFY a VARCHAR(10) NOT NULL;
-SHOW CREATE TABLE t1;
-SELECT * FROM t1;
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1c.dbf');
---horizontal_results
-ALTER TABLE t1 MODIFY a INT(10) NOT NULL;
-SHOW CREATE TABLE t1;
-SELECT * FROM t1;
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1c.dbf');
---horizontal_results
-
-# TODO: this does not work on Windows
-#ALTER TABLE t1 MODIFY a INT(8) NOT NULL;
-#SHOW CREATE TABLE t1;
-#--error ER_GET_ERRMSG
-#SELECT * FROM t1;
-#--vertical_results
-#--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-#eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
-#--horizontal_results
-DROP TABLE IF EXISTS t1;
---remove_file $MYSQLD_DATADIR/test/t1c.dbf
-
-
---echo #
---echo # Testing NULL
---echo #
-# TODO: NULLs should probably change to DEFAULT and produce a warning
-CREATE TABLE t1
-(
- c1 VARCHAR(10) NOT NULL,
- c2 VARCHAR(10) NOT NULL DEFAULT 'def',
- i1 INT NOT NULL,
- i2 INT NOT NULL DEFAULT 123
-) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
-INSERT INTO t1 VALUES ('10','10',10,10);
-#INSERT INTO t1 VALUES (NULL,NULL,NULL,NULL);
-INSERT INTO t1(c1,i1) VALUES ('20',20);
-INSERT INTO t1 VALUES ('30',DEFAULT,30,DEFAULT);
-SELECT * FROM t1;
---chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
---vertical_results
---replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
-eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
---horizontal_results
-DROP TABLE IF EXISTS t1;
---remove_file $MYSQLD_DATADIR/test/t1.dbf
-
-DROP PROCEDURE test.dbf_field;
-DROP PROCEDURE test.dbf_header;
+let $MYSQLD_DATADIR= `select @@datadir`;
+
+--echo #
+--echo # Testing errors
+--echo #
+CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+SHOW CREATE TABLE t1;
+--replace_regex /on .*test.t1.dbf/on DATADIR\/test\/t1.dbf/
+SELECT * FROM t1;
+DROP TABLE t1;
+
+--replace_regex /Cannot open .*test.t1.dbf/Cannot open DATADIR\/test\/t1.dbf/
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--replace_regex /Cannot open .*test.t1.dbf/Cannot open DATADIR\/test\/t1.dbf/
+SHOW WARNINGS;
+
+
+DELIMITER //;
+CREATE PROCEDURE test.dbf_field(in fieldno INT, in content BLOB) DETERMINISTIC
+BEGIN
+ SELECT '---';
+ SELECT fieldno AS `FieldN`;
+ SELECT TRIM(TRAILING 0x00 FROM LEFT(content, 10)) AS `Name`;
+ SELECT SUBSTRING(content, 12, 1) AS `Type`;
+ SELECT CONV(HEX(REVERSE(SUBSTRING(content,13,4))),16,10) AS `Offset`;
+ SELECT CONV(HEX(REVERSE(SUBSTRING(content,17,1))),16,10) AS `Length`;
+ SELECT CONV(HEX(REVERSE(SUBSTRING(content,18,1))),16,10) AS `Dec`;
+ SELECT HEX(REVERSE(SUBSTRING(content,19,1))) AS `Flags`;
+-- SELECT CONV(HEX(REVERSE(SUBSTRING(content,20,4))),16,10) AS `Next`;
+-- SELECT CONV(HEX(REVERSE(SUBSTRING(content,24,4))),16,10) AS `Step`;
+END//
+
+CREATE PROCEDURE test.dbf_header(in fname VARCHAR(1024)) DETERMINISTIC
+BEGIN
+ DECLARE content BLOB;
+ DECLARE offset INT;
+ DECLARE fieldno INT;
+ SELECT '--------';
+ SELECT LOAD_FILE(fname) INTO content;
+ SELECT LENGTH(content) AS FileSize;
+ SELECT HEX(LEFT(content, 1)) AS DBF_Version;
+ SELECT CONV(HEX(REVERSE(SUBSTRING(content,5,4))),16,10) AS NRecords;
+ SELECT CONV(HEX(REVERSE(SUBSTRING(content,9,2))),16,10) AS FirstRecPos;
+ SELECT CONV(HEX(REVERSE(SUBSTRING(content,11,2))),16,10) AS RecLength;
+ SELECT HEX(REVERSE(SUBSTRING(content,29,2))) AS TableFlags;
+ SELECT HEX(REVERSE(SUBSTRING(content,30,1))) AS CodePageMark;
+ SET offset=33;
+ SET fieldno=0;
+ WHILE SUBSTR(content, offset, 1) <> 0x0D AND offset + 32 < LENGTH(content) DO
+ CALL dbf_field(fieldno, SUBSTRING(content, offset, 32));
+ SET offset=offset + 32;
+ SET fieldno=fieldno + 1;
+ END WHILE;
+ SELECT '--------';
+END//
+DELIMITER ;//
+
+
+--echo #
+--echo # Testing READONLY tables
+--echo #
+CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+SHOW CREATE TABLE t1;
+INSERT INTO t1 VALUES (10),(20);
+SELECT * FROM t1;
+ALTER TABLE t1 READONLY=Yes;
+SHOW CREATE TABLE t1;
+--error ER_OPEN_AS_READONLY
+INSERT INTO t1 VALUES (30);
+--error ER_OPEN_AS_READONLY
+UPDATE t1 SET a=30 WHERE a=10;
+--error ER_OPEN_AS_READONLY
+DELETE FROM t1 WHERE a=10;
+--error ER_OPEN_AS_READONLY
+TRUNCATE TABLE t1;
+ALTER TABLE t1 READONLY=NO;
+SHOW CREATE TABLE t1;
+INSERT INTO t1 VALUES (30);
+SELECT * FROM t1;
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # This SQL script crashed (dbf01.sql)
+--echo #
+CREATE TABLE t1
+(
+ a int(11) NOT NULL,
+ b char(10) NOT NULL,
+ c varchar(10) NOT NULL
+) ENGINE=CONNECT table_type=DBF file_name='t1.dbf';
+INSERT INTO t1 VALUES (1,'1','1');
+INSERT INTO t1 VALUES (2,'2','2');
+SELECT * FROM t1;
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing that table options in lower case and mixed case are understood:
+--echo #
+CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT table_type=dbf file_name='t1.dbf';
+SHOW CREATE TABLE t1;
+INSERT INTO t1 VALUES (10);
+SELECT * FROM t1;
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+CREATE TABLE t1 (a CHAR(10) NOT NULL) ENGINE=CONNECT Table_Type=dbf File_Name='t1.dbf';
+SHOW CREATE TABLE t1;
+INSERT INTO t1 VALUES ('test');
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+#
+# TODO: this creates DBF record with length=32, which looks wrong
+#
+--echo #
+--echo # Testing multiple columns
+--echo #
+CREATE TABLE t1
+(
+ a INT NOT NULL,
+ b CHAR(10) NOT NULL,
+ c VARCHAR(10) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (1,'1','1');
+INSERT INTO t1 VALUES (2,'2','2');
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing long column name
+--echo #
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a012345678901234567890123456789 INT NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+
+--echo #
+--echo # Testing 2 columns with long names (12)
+--echo #
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a0123456789a INT NOT NULL,
+ b0123456789b INT NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t02x11.dbf';
+
+--echo #
+--echo # Testing 2 columns with long names (11)
+--echo #
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a012345678a INT NOT NULL,
+ b012345678b INT NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t02x12.dbf';
+
+--echo #
+--echo # Testing 2 columns name length 10 (maximum possible length)
+--echo #
+CREATE TABLE t1
+(
+ a01234567a INT NOT NULL,
+ b01234567b INT NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t02x13.dbf';
+SHOW CREATE TABLE t1;
+INSERT INTO t1 VALUES (1,2);
+SELECT * FROM t1;
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t02x13.dbf
+
+
+--echo #
+--echo # Testing BIGINT
+--echo #
+CREATE TABLE t1
+(
+ a bigint NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (0x7FFFFFFFFFFFFFFF);
+INSERT INTO t1 VALUES (-0x8000000000000000);
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing TINYINT
+--echo #
+CREATE TABLE t1
+(
+ a TINYINT NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (123);
+SELECT * FROM t1;
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing SMALLINT
+--echo #
+CREATE TABLE t1
+(
+ a SMALLINT NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (0x7FFF);
+INSERT INTO t1 VALUES (-0x8000);
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing VARCHAR
+--echo #
+CREATE TABLE t1
+(
+ a VARCHAR(255) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (REPEAT('a',255));
+SELECT LENGTH(a) FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing too long CHAR
+--echo # All columns longer than 255 bytes should be rejected
+--echo #
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a CHAR(86) CHARACTER SET utf8 NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--error ER_UNKNOWN_ERROR
+
+
+--echo #
+--echo # Testing too long VARCHAR
+--echo # All columns longer than 255 bytes should be rejected
+--echo #
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a VARCHAR(256) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a VARCHAR(86) CHARACTER SET utf8 NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1
+(
+ a VARCHAR(64000) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+
+
+--echo #
+--echo # Testing BLOB
+--echo #
+--error ER_TABLE_CANT_HANDLE_BLOB
+CREATE TABLE t1
+(
+ a BLOB
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--error ER_TABLE_CANT_HANDLE_BLOB
+CREATE TABLE t1
+(
+ a TINYBLOB
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--error ER_TABLE_CANT_HANDLE_BLOB
+CREATE TABLE t1
+(
+ a MEDIUMBLOB
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+--error ER_TABLE_CANT_HANDLE_BLOB
+CREATE TABLE t1
+(
+ a LONGBLOB
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+
+
+# TODO: utf8 does not work
+#--echo #
+#--echo # Testing varchar with utf8
+#--echo #
+#SET NAMES utf8;
+#CREATE TABLE t1
+#(
+# a VARCHAR(10) CHARACTER SET utf8
+#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+#INSERT INTO t1 VALUES (REPEAT(_ucs2 0x00DF,10));
+#SELECT * FROM t1;
+#DROP TABLE IF EXISTS t1;
+#--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing DATE
+--echo #
+CREATE TABLE t1
+(
+ a DATE NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES ('2001-01-01');
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+
+--echo #
+--echo # Testing FLOAT
+--echo #
+CREATE TABLE t1
+(
+ a FLOAT(12,4) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (123);
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+#
+# TODO: this return error:
+# Got error 122 'Value 123.0000000000 too long for column a of length 12'
+# from CONNECT
+#
+#CREATE TABLE t1
+#(
+# a FLOAT NOT NULL
+#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+#--error ER_GET_ERRMSG - why this error?
+#INSERT INTO t1 VALUES (123);
+#SELECT * FROM t1;
+#DROP TABLE IF EXISTS t1;
+#--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+#
+# TODO: this creates a column of type 'D' (date), which is wrong
+#
+#--echo #
+#--echo # Testing DATETIME
+#--echo #
+#CREATE TABLE t1
+#(
+# a DATETIME NOT NULL
+#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+#INSERT INTO t1 VALUES ('2013-02-01');
+#SELECT * FROM t1;
+#DROP TABLE t1;
+#--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+#
+# TODO: this creates a column of type 'D' (date), which is wrong
+#
+#--echo #
+#--echo # Testing TIMESTAMP
+#--echo #
+#CREATE TABLE t1
+#(
+# a TIMESTAMP
+#) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+#INSERT INTO t1 VALUES ('2013-02-01');
+#SELECT * FROM t1;
+#DROP TABLE t1;
+#--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+--echo #
+--echo # Testing double
+--echo #
+CREATE TABLE t1
+(
+ a DOUBLE(20,5) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES (123);
+INSERT INTO t1 VALUES (123456789.12345);
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE IF EXISTS t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+
+# TODO:
+# Testing with no FILE_NAME specified
+# Currently it returns:
+# ERROR 1296 (HY000): Got error 174 'Open(a+) error 21
+# on /opt/mariadb-5.5/data/: Is a directory' from CONNECT
+#CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=DBF;
+
+--echo #
+--echo # Testing ALTER
+--echo #
+# Temporarily change the file name because ALTER that are not executed not in place
+# delete the data file when it has the same path/name than the default file name.
+CREATE TABLE t1
+(
+ a VARCHAR(10) NOT NULL
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1c.dbf';
+INSERT INTO t1 VALUES ('10');
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1c.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1c.dbf');
+--horizontal_results
+ALTER TABLE t1 MODIFY a VARCHAR(10) NOT NULL;
+SHOW CREATE TABLE t1;
+SELECT * FROM t1;
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1c.dbf');
+--horizontal_results
+ALTER TABLE t1 MODIFY a INT(10) NOT NULL;
+SHOW CREATE TABLE t1;
+SELECT * FROM t1;
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1c.dbf');
+--horizontal_results
+
+# TODO: this does not work on Windows
+#ALTER TABLE t1 MODIFY a INT(8) NOT NULL;
+#SHOW CREATE TABLE t1;
+#--error ER_GET_ERRMSG
+#SELECT * FROM t1;
+#--vertical_results
+#--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+#eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+#--horizontal_results
+DROP TABLE IF EXISTS t1;
+--remove_file $MYSQLD_DATADIR/test/t1c.dbf
+
+
+--echo #
+--echo # Testing NULL
+--echo #
+# TODO: NULLs should probably change to DEFAULT and produce a warning
+CREATE TABLE t1
+(
+ c1 VARCHAR(10) NOT NULL,
+ c2 VARCHAR(10) NOT NULL DEFAULT 'def',
+ i1 INT NOT NULL,
+ i2 INT NOT NULL DEFAULT 123
+) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf';
+INSERT INTO t1 VALUES ('10','10',10,10);
+#INSERT INTO t1 VALUES (NULL,NULL,NULL,NULL);
+INSERT INTO t1(c1,i1) VALUES ('20',20);
+INSERT INTO t1 VALUES ('30',DEFAULT,30,DEFAULT);
+SELECT * FROM t1;
+--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf
+--vertical_results
+--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
+eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf');
+--horizontal_results
+DROP TABLE IF EXISTS t1;
+--remove_file $MYSQLD_DATADIR/test/t1.dbf
+
+DROP PROCEDURE test.dbf_field;
+DROP PROCEDURE test.dbf_header;
diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp
index c3c74463271..c51100e0141 100644
--- a/storage/connect/plgdbutl.cpp
+++ b/storage/connect/plgdbutl.cpp
@@ -853,7 +853,7 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6])
else // assume standard MySQL date format
fmt = "%4d-%2d-%2d %2d:%2d:%2d";
- if (trace)
+ if (trace > 1)
htrc("ExtractDate: dts=%s fmt=%s defy=%d\n", dts, fmt, defy);
// Set default values for time only use
@@ -935,7 +935,7 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6])
} // endfor i
- if (trace)
+ if (trace > 1)
htrc("numval=%d val=(%d,%d,%d,%d,%d,%d)\n",
numval, val[0], val[1], val[2], val[3], val[4], val[5]);
diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp
index 5e10c0a6846..6d83852ccb8 100644
--- a/storage/connect/tabutil.cpp
+++ b/storage/connect/tabutil.cpp
@@ -625,7 +625,7 @@ void PRXCOL::Reset(void)
/***********************************************************************/
void PRXCOL::ReadColumn(PGLOBAL g)
{
- if (trace)
+ if (trace > 1)
htrc("PRX ReadColumn: name=%s\n", Name);
if (Colp) {
diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp
index 8a839f3b50b..c818070b970 100644
--- a/storage/connect/value.cpp
+++ b/storage/connect/value.cpp
@@ -2091,13 +2091,13 @@ bool DTVAL::FormatValue(PVAL vp, char *fmt)
char *buf = (char*)vp->GetTo_Val(); // Should be big enough
struct tm tm, *ptm = GetGmTime(&tm);
- if (trace)
+ if (trace > 1)
htrc("FormatValue: ptm=%p len=%d\n", ptm, vp->GetValLen());
if (ptm) {
size_t n = strftime(buf, vp->GetValLen(), fmt, ptm);
- if (trace)
+ if (trace > 1)
htrc("strftime: n=%d buf=%s\n", n, (n) ? buf : "???");
return (n == 0);