diff options
Diffstat (limited to 'storage/connect')
21 files changed, 337 insertions, 65 deletions
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 03364ccd01e..d96d7455d8b 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,9 +169,9 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.04.0005 January 24, 2016"; + 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= '/'; @@ -5159,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; @@ -5226,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 @@ -5295,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: @@ -5977,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++) { @@ -6765,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/mysql-test/connect/r/grant.result b/storage/connect/mysql-test/connect/r/grant.result index 4e64b983ea7..118d75408be 100644 --- a/storage/connect/mysql-test/connect/r/grant.result +++ b/storage/connect/mysql-test/connect/r/grant.result @@ -4,6 +4,8 @@ set sql_mode=""; # GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -14,6 +16,7 @@ ftype CHAR(4) NOT NULL, size DOUBLE(12,0) NOT NULL flag=5 ) ENGINE=CONNECT TABLE_TYPE=DIR FILE_NAME='*.*'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -26,6 +29,7 @@ size DOUBLE(12,0) NOT NULL flag=5 SELECT fname, ftype, size FROM t1 WHERE size>0; fname ftype size t1 .frm 1081 +connection user; SELECT user(); user() user@localhost @@ -44,10 +48,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -59,6 +65,8 @@ UPDATE v1 SET path=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +disconnect user; +connection default; SELECT user(); user() root@localhost @@ -74,6 +82,8 @@ DROP USER user@localhost; CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -102,11 +112,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=BIN FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=BIN FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost @@ -129,10 +141,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -144,6 +158,7 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -153,12 +168,15 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=BIN; Warnings: Warning 1105 No file name. Table will use t1.bin INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost ALTER TABLE t1 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; +disconnect user; DROP USER user@localhost; # # End of grant.inc @@ -169,6 +187,8 @@ DROP USER user@localhost; CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -197,11 +217,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost @@ -224,10 +246,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -239,6 +263,7 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -248,12 +273,15 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV; Warnings: Warning 1105 No file name. Table will use t1.csv INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost ALTER TABLE t1 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; +disconnect user; DROP USER user@localhost; # # End of grant.inc @@ -264,6 +292,8 @@ DROP USER user@localhost; CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -292,11 +322,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost @@ -319,10 +351,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -334,6 +368,7 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -343,12 +378,15 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF; Warnings: Warning 1105 No file name. Table will use t1.dbf INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost ALTER TABLE t1 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; +disconnect user; DROP USER user@localhost; # # End of grant.inc @@ -359,6 +397,8 @@ DROP USER user@localhost; CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -387,11 +427,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost @@ -414,10 +456,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -429,6 +473,7 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -438,12 +483,15 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX; Warnings: Warning 1105 No file name. Table will use t1.fix INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost ALTER TABLE t1 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; +disconnect user; DROP USER user@localhost; # # End of grant.inc @@ -454,6 +502,8 @@ DROP USER user@localhost; CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -482,11 +532,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=VEC MAX_ROWS=100 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=VEC MAX_ROWS=100 FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost @@ -509,10 +561,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -524,6 +578,7 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -533,12 +588,15 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=VEC MAX_ROWS=100; Warnings: Warning 1105 No file name. Table will use t1.vec INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost ALTER TABLE t1 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; +disconnect user; DROP USER user@localhost; # # End of grant.inc diff --git a/storage/connect/mysql-test/connect/r/grant2.result b/storage/connect/mysql-test/connect/r/grant2.result index 0259dd74cdc..73e41f49256 100644 --- a/storage/connect/mysql-test/connect/r/grant2.result +++ b/storage/connect/mysql-test/connect/r/grant2.result @@ -5,6 +5,7 @@ CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; # Testing SQLCOM_SELECT +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -21,6 +22,7 @@ a 10 SELECT * FROM v1_baddefiner; ERROR 28000: Access denied for user 'root'@'localhost' (using password: NO) +connect user,localhost,user,,; SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) SELECT * FROM v1_invoker; @@ -28,9 +30,11 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) SELECT * FROM v1_definer; a 10 +connection default; DROP VIEW v1_invoker, v1_definer, v1_baddefiner; DROP TABLE t1; # Testing SQLCOM_UPDATE +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -38,14 +42,17 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1; UPDATE t1 SET a=11; UPDATE v1_invoker SET a=12; UPDATE v1_definer SET a=13; +connection user; UPDATE t1 SET a=21; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) UPDATE v1_invoker SET a=22; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) UPDATE v1_definer SET a=23; +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_INSERT +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -53,14 +60,17 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1; INSERT INTO t1 VALUES (11); INSERT INTO v1_invoker VALUES (12); INSERT INTO v1_definer VALUES (13); +connection user; INSERT INTO t1 VALUES (21); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) INSERT INTO v1_invoker VALUES (22); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) INSERT INTO v1_definer VALUES (23); +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_REPLACE +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -71,15 +81,18 @@ REPLACE INTO v1_invoker VALUES (12); ERROR 42000: CONNECT Unsupported command REPLACE INTO v1_definer VALUES (13); ERROR 42000: CONNECT Unsupported command +connection user; REPLACE INTO t1 VALUES (21); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) REPLACE INTO v1_invoker VALUES (22); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) REPLACE INTO v1_definer VALUES (23); ERROR 42000: CONNECT Unsupported command +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_DELETE +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10),(11),(12),(13),(21),(22),(23); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -87,14 +100,17 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1; DELETE FROM t1 WHERE a=11; DELETE FROM v1_invoker WHERE a=12; DELETE FROM v1_definer WHERE a=13; +connection user; DELETE FROM t1 WHERE a=21; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1_invoker WHERE a=22; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1_definer WHERE a=23; +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_LOAD +connection default; CREATE TABLE t1 (a VARCHAR(128)) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -102,29 +118,38 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1; LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE t1; LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_invoker; LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_definer; +connection user; LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_invoker; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_definer; +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_TRUNCATE +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); TRUNCATE TABLE t1; INSERT INTO t1 VALUES (11); +connection user; TRUNCATE TABLE t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_DROP_TABLE +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); +connection user; DROP TABLE t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_DROP_VIEW # DROP VIEW does not need FILE_ACL. +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10),(11),(12),(13),(21),(22),(23); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -132,13 +157,18 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1; DROP VIEW v1_invoker, v1_definer; CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1; +connection user; DROP VIEW v1_invoker; DROP VIEW v1_definer; +connection default; DROP TABLE t1; # Testing SQLCOM_CREATE_TABLE +connection user; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; # Testing SQLCOM_LOCK_TABLES +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -155,6 +185,7 @@ LOCK TABLE v1_definer READ; UNLOCK TABLES; LOCK TABLE v1_definer WRITE; UNLOCK TABLES; +connection user; LOCK TABLE t1 READ; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) LOCK TABLE t1 WRITE; @@ -167,9 +198,11 @@ LOCK TABLE v1_definer READ; UNLOCK TABLES; LOCK TABLE v1_definer WRITE; UNLOCK TABLES; +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_UPDATE_MULTI +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; CREATE TABLE t2 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t2.fix'; CREATE TABLE t3 (a INT); @@ -229,6 +262,7 @@ UPDATE v2_definer a1,v1_invoker a2 SET a1.a=50 WHERE a1.a=a2.a; UPDATE v2_definer a1,v1_definer a2 SET a1.a=50 WHERE a1.a=a2.a; UPDATE v2_definer a1,v2_invoker a2 SET a1.a=50 WHERE a1.a=a2.a; UPDATE v2_definer a1,v2_definer a2 SET a1.a=50 WHERE a1.a=a2.a; +connection user; UPDATE t1 a1,t1 a2 SET a1.a=50 WHERE a1.a=a2.a; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) UPDATE t1 a1,t2 a2 SET a1.a=50 WHERE a1.a=a2.a; @@ -318,9 +352,11 @@ UPDATE v2_definer a1,v1_definer a2 SET a1.a=50 WHERE a1.a=a2.a; UPDATE v2_definer a1,v2_invoker a2 SET a1.a=50 WHERE a1.a=a2.a; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) UPDATE v2_definer a1,v2_definer a2 SET a1.a=50 WHERE a1.a=a2.a; +connection default; DROP VIEW v1_invoker, v1_definer, v2_invoker, v2_definer; DROP TABLE t1, t2, t3; # Testing SQLCOM_DELETE_MULTI +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; CREATE TABLE t2 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t2.fix'; CREATE TABLE t3 (a INT); @@ -380,6 +416,7 @@ DELETE a1 FROM v2_definer a1,v1_invoker a2 WHERE a1.a=a2.a; DELETE a1 FROM v2_definer a1,v1_definer a2 WHERE a1.a=a2.a; DELETE a1 FROM v2_definer a1,v2_invoker a2 WHERE a1.a=a2.a; DELETE a1 FROM v2_definer a1,v2_definer a2 WHERE a1.a=a2.a; +connection user; DELETE a1 FROM t1 a1,t1 a2 WHERE a1.a=a2.a; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE a1 FROM t1 a1,t2 a2 WHERE a1.a=a2.a; @@ -469,9 +506,11 @@ DELETE a1 FROM v2_definer a1,v1_definer a2 WHERE a1.a=a2.a; DELETE a1 FROM v2_definer a1,v2_invoker a2 WHERE a1.a=a2.a; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE a1 FROM v2_definer a1,v2_definer a2 WHERE a1.a=a2.a; +connection default; DROP VIEW v1_invoker, v1_definer, v2_invoker, v2_definer; DROP TABLE t1, t2, t3; # Testing SQLCOM_CREATE_VIEW +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -480,15 +519,18 @@ CREATE VIEW v2 AS SELECT * FROM v1_invoker; DROP VIEW v2; CREATE VIEW v2 AS SELECT * FROM v1_definer; DROP VIEW v2; +connection user; CREATE VIEW v2 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v2 AS SELECT * FROM v1_invoker; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v2 AS SELECT * FROM v1_definer; DROP VIEW v2; +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_INSERT_SELECT +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -502,6 +544,7 @@ INSERT INTO v1_invoker SELECT * FROM v1_definer WHERE a=20; INSERT INTO v1_definer SELECT * FROM t1 WHERE a=20; INSERT INTO v1_definer SELECT * FROM v1_invoker WHERE a=20; INSERT INTO v1_definer SELECT * FROM v1_definer WHERE a=20; +connection user; INSERT INTO t1 SELECT * FROM t1 WHERE a=20; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) INSERT INTO t1 SELECT * FROM v1_invoker WHERE a=20; @@ -519,9 +562,11 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) INSERT INTO v1_definer SELECT * FROM v1_invoker WHERE a=20; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) INSERT INTO v1_definer SELECT * FROM v1_definer WHERE a=20; +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_REPLACE_SELECT +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1; @@ -544,6 +589,7 @@ REPLACE INTO v1_definer SELECT * FROM v1_invoker WHERE a=20; ERROR 42000: CONNECT Unsupported command REPLACE INTO v1_definer SELECT * FROM v1_definer WHERE a=20; ERROR 42000: CONNECT Unsupported command +connection user; REPLACE INTO t1 SELECT * FROM t1 WHERE a=20; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) REPLACE INTO t1 SELECT * FROM v1_invoker WHERE a=20; @@ -562,9 +608,11 @@ REPLACE INTO v1_definer SELECT * FROM v1_invoker WHERE a=20; ERROR 42000: CONNECT Unsupported command REPLACE INTO v1_definer SELECT * FROM v1_definer WHERE a=20; ERROR 42000: CONNECT Unsupported command +connection default; DROP VIEW v1_invoker, v1_definer; DROP TABLE t1; # Testing SQLCOM_RENAME_TABLE +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); RENAME TABLE t1 TO t2; @@ -574,10 +622,13 @@ t2 CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=fix `FILE_NAME`='t1.fix' RENAME TABLE t2 TO t1; +connection user; RENAME TABLE t1 TO t2; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (for ALTER..RENAME) +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); ALTER TABLE t1 RENAME TO t2; @@ -587,20 +638,26 @@ t2 CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=fix `FILE_NAME`='t1.fix' ALTER TABLE t2 RENAME TO t1; +connection user; ALTER TABLE t1 RENAME TO t2; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (changing ENGINE to non-CONNECT) +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); ALTER TABLE t1 ENGINE=MyISAM; DROP TABLE t1; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); +connection user; ALTER TABLE t1 ENGINE=MyISAM; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (changing ENGINE to CONNECT) +connection default; CREATE TABLE t1 (a INT) ENGINE=MyISAM; INSERT INTO t1 VALUES (10); SELECT * FROM t1; @@ -610,63 +667,83 @@ ALTER TABLE t1 ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; DROP TABLE t1; CREATE TABLE t1 (a INT) ENGINE=MyISAM; INSERT INTO t1 VALUES (10); +connection user; ALTER TABLE t1 ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_OPTIMIZE +connection default; CREATE TABLE t1 (a INT NOT NULL, KEY(a)) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK +connection user; OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize Error Access denied for user 'user'@'localhost' (using password: NO) test.t1 optimize Error Got error 122 'This operation requires the FILE privilege' from CONNECT test.t1 optimize error Corrupt +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (adding columns) +connection default; CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10); ALTER TABLE t1 ADD b INT; Warnings: Warning 1105 This is an outward table, table data were not modified. +connection user; ALTER TABLE t1 ADD c INT; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (removing columns) +connection default; CREATE TABLE t1 (a INT,b INT,c INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10,10,10); ALTER TABLE t1 DROP b; Warnings: Warning 1105 This is an outward table, table data were not modified. +connection user; ALTER TABLE t1 DROP c; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (adding keys) +connection default; CREATE TABLE t1 (a INT NOT NULL,b INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10,10); ALTER TABLE t1 ADD KEY(a); +connection user; ALTER TABLE t1 ADD KEY(b); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_ALTER_TABLE (removing keys) +connection default; CREATE TABLE t1 (a INT NOT NULL,b INT NOT NULL, KEY a(a), KEY b(b)) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10,10); ALTER TABLE t1 DROP KEY a; +connection user; ALTER TABLE t1 DROP KEY b; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing SQLCOM_CREATE_INDEX and SQLCOM_DROP_INDEX +connection default; CREATE TABLE t1 (a INT NOT NULL,b INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix'; INSERT INTO t1 VALUES (10,10); CREATE INDEX a ON t1 (a); DROP INDEX a ON t1; CREATE INDEX a ON t1 (a); +connection user; CREATE INDEX b ON t1 (b); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DROP INDEX a ON t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; # Testing stored procedures CREATE PROCEDURE p_definer() SQL SECURITY DEFINER @@ -681,9 +758,11 @@ CALL p_invoker(); DROP TABLE t1; CALL p_baddefiner(); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection user; CALL p_invoker(); ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CALL p_definer(); +connection default; DROP TABLE t1; DROP PROCEDURE p_definer; DROP PROCEDURE p_invoker; 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/ini_grant.result b/storage/connect/mysql-test/connect/r/ini_grant.result index 68330278183..8cbf88123fb 100644 --- a/storage/connect/mysql-test/connect/r/ini_grant.result +++ b/storage/connect/mysql-test/connect/r/ini_grant.result @@ -5,6 +5,8 @@ set sql_mode=""; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; set sql_mode=default; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -33,11 +35,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (sec CHAR(10) NOT NULL FLAG=1, val CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=INI FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (sec CHAR(10) NOT NULL FLAG=1, val CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=INI FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES ('sec1','val1'); +connection user; SELECT user(); user() user@localhost @@ -58,10 +62,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -73,6 +79,8 @@ UPDATE v1 SET val='val11'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +disconnect user; +connection default; DROP VIEW v1; DROP TABLE t1; DROP USER user@localhost; diff --git a/storage/connect/mysql-test/connect/r/mysql_discovery.result b/storage/connect/mysql-test/connect/r/mysql_discovery.result index 4580c68558f..220df6f7b92 100644 --- a/storage/connect/mysql-test/connect/r/mysql_discovery.result +++ b/storage/connect/mysql-test/connect/r/mysql_discovery.result @@ -1,5 +1,10 @@ +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +connection master; CREATE DATABASE connect; +connection slave; CREATE DATABASE connect; +connection slave; CREATE TABLE t1 ( `id` int(20) primary key, `group` int NOT NULL default 1, @@ -7,6 +12,7 @@ CREATE TABLE t1 ( `a\\` int unsigned, `name` varchar(32) default 'name') DEFAULT CHARSET=latin1; +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1'; SHOW CREATE TABLE t1; @@ -25,12 +31,15 @@ id group a\\b a\\ name 1 1 2 NULL foo 2 1 2 NULL fee DROP TABLE t1; +connection slave; SELECT * FROM t1; id group a\\b a\\ name 1 1 2 NULL foo 2 1 2 NULL fee DROP TABLE t1; +connection master; DROP TABLE IF EXISTS connect.t1; DROP DATABASE IF EXISTS connect; +connection slave; DROP TABLE IF EXISTS connect.t1; DROP DATABASE IF EXISTS connect; diff --git a/storage/connect/mysql-test/connect/r/mysql_exec.result b/storage/connect/mysql-test/connect/r/mysql_exec.result index 778577a1d8a..b6606ab5978 100644 --- a/storage/connect/mysql-test/connect/r/mysql_exec.result +++ b/storage/connect/mysql-test/connect/r/mysql_exec.result @@ -1,8 +1,13 @@ +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +connection master; CREATE DATABASE connect; +connection slave; CREATE DATABASE connect; # # Checking Sending Commands # +connection master; CREATE TABLE t1 ( command VARCHAR(128) NOT NULL, warnings INT(4) NOT NULL FLAG=3, @@ -48,6 +53,7 @@ command warnings number message update t1 set msg = "Five" where id = 5 0 1 Affected rows DROP PROCEDURE p1; DROP TABLE t1; +connection slave; SELECT * FROM t1; id msg 1 One @@ -56,7 +62,9 @@ id msg 4 Four 5 Five DROP TABLE t1; +connection master; DROP TABLE IF EXISTS connect.t1; DROP DATABASE IF EXISTS connect; +connection slave; DROP TABLE IF EXISTS connect.t1; DROP DATABASE IF EXISTS connect; diff --git a/storage/connect/mysql-test/connect/r/mysql_grant.result b/storage/connect/mysql-test/connect/r/mysql_grant.result index 5f630834392..11a3dbba36c 100644 --- a/storage/connect/mysql-test/connect/r/mysql_grant.result +++ b/storage/connect/mysql-test/connect/r/mysql_grant.result @@ -5,11 +5,14 @@ set sql_mode=""; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; set sql_mode=default; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=MySQL OPTION_LIST='host=localhost,user=root1,port=PORT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -21,6 +24,7 @@ a 10 20 30 +connection user; SELECT user(); user() user@localhost @@ -39,10 +43,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -54,6 +60,8 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +disconnect user; +connection default; SELECT user(); user() root@localhost diff --git a/storage/connect/mysql-test/connect/r/mysql_new.result b/storage/connect/mysql-test/connect/r/mysql_new.result index 309d69abe7e..05071ef7be6 100644 --- a/storage/connect/mysql-test/connect/r/mysql_new.result +++ b/storage/connect/mysql-test/connect/r/mysql_new.result @@ -1,5 +1,10 @@ +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +connection master; CREATE DATABASE connect; +connection slave; CREATE DATABASE connect; +connection slave; CREATE TABLE t1 (a int, b char(10)); INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); SELECT * FROM t1; @@ -12,6 +17,7 @@ NULL NULL # # Testing errors # +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://unknown@127.0.0.1:SLAVE_PORT/test/t1'; ERROR HY000: (1045) Access denied for user 'unknown'@'localhost' (using password: NO) @@ -39,10 +45,14 @@ ERROR HY000: Got error 174 '(1054) Unknown column 'x' in 'field list' [SELECT `x DROP TABLE t1; CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1'; +connection slave; ALTER TABLE t1 RENAME t1backup; +connection master; SELECT * FROM t1; ERROR HY000: Got error 174 '(1146) Table 'test.t1' doesn't exist [SELECT `a`, `b` FROM `t1`]' from CONNECT +connection slave; ALTER TABLE t1backup RENAME t1; +connection master; DROP TABLE t1; # # Testing SELECT, etc. @@ -111,6 +121,7 @@ NULL NULL 2 0 3 0 DROP TABLE t1; +connection slave; DROP TABLE t1; # # Testing numeric data types @@ -129,6 +140,7 @@ t1 CREATE TABLE `t1` ( `h` decimal(20,5) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265); +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL OPTION_LIST='host=127.0.0.1,user=root,port=SLAVE_PORT'; SHOW CREATE TABLE t1; @@ -147,6 +159,7 @@ SELECT * FROM t1; a b c d e f g h 100 3333 41235 1234567890 235000000000 3.14159 3.14159265 3141.59265 DROP TABLE t1; +connection slave; DROP TABLE t1; # # Testing character data types @@ -162,6 +175,7 @@ INSERT INTO t1 VALUES('Welcome','Hello, World'); SELECT * FROM t1; a b Welcome Hello, World +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT'; SHOW CREATE TABLE t1; @@ -174,6 +188,7 @@ SELECT * FROM t1; a b Welcome Hello, World DROP TABLE t1; +connection slave; DROP TABLE t1; # # Testing temporal data types @@ -196,6 +211,7 @@ Warning 1265 Data truncated for column 'e' at row 1 SELECT * FROM t1; a b c d e 2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003 +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT'; SHOW CREATE TABLE t1; @@ -211,8 +227,11 @@ SELECT * FROM t1; a b c d e 2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003 DROP TABLE t1; +connection slave; DROP TABLE t1; +connection master; DROP TABLE IF EXISTS connect.t1; DROP DATABASE IF EXISTS connect; +connection slave; DROP TABLE IF EXISTS connect.t1; DROP DATABASE IF EXISTS connect; 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/r/xml_grant.result b/storage/connect/mysql-test/connect/r/xml_grant.result index 9eb818bf32f..817d3f5bf57 100644 --- a/storage/connect/mysql-test/connect/r/xml_grant.result +++ b/storage/connect/mysql-test/connect/r/xml_grant.result @@ -6,6 +6,8 @@ Warning 1105 No file name. Table will use t1.xml CREATE USER user@localhost; GRANT ALL PRIVILEGES ON *.* TO user@localhost; REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; SELECT user(); user() user@localhost @@ -34,11 +36,13 @@ DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost @@ -61,10 +65,12 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) CREATE VIEW v1 AS SELECT * FROM t1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) # Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; SELECT user(); user() root@localhost CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; SELECT user(); user() user@localhost @@ -76,6 +82,7 @@ UPDATE v1 SET a=123; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) DELETE FROM v1; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; SELECT user(); user() root@localhost @@ -85,12 +92,15 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmls Warnings: Warning 1105 No file name. Table will use t1.xml INSERT INTO t1 VALUES (10); +connection user; SELECT user(); user() user@localhost ALTER TABLE t1 FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; DROP TABLE t1; +disconnect user; DROP USER user@localhost; # # End of grant.inc 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/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 cb21a8bda15..55ccbdbada1 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -1758,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)) @@ -1766,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; 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/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/tabmysql.cpp b/storage/connect/tabmysql.cpp index 5a8bb17bd50..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", Schema ? Schema : (char*)"*"); + 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 501a814721d..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 diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 6b72c715517..36849146746 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -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/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); |