From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id DD7F929622 for ; Thu, 7 Mar 2019 08:14:10 -0500 (EST) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5b5HXFvjZMMe for ; Thu, 7 Mar 2019 08:14:10 -0500 (EST) Received: from smtpng1.m.smailru.net (smtpng1.m.smailru.net [94.100.181.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 6468822B6C for ; Thu, 7 Mar 2019 08:14:10 -0500 (EST) From: Nikita Pettik Subject: [tarantool-patches] [PATCH 1/4] sql: remove support of DATE/TIME from parser Date: Thu, 7 Mar 2019 16:14:01 +0300 Message-Id: In-Reply-To: References: In-Reply-To: References: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: v.shpilevoy@tarantool.org, Nikita Pettik Currently, there is no native (in Tarantool terms) types to represent time-like types. So, until we add implementation of those types, it makes no sense to allow to specify those types in table definition. Note that previously they were mapped to NUMBER type. For the same reason all built-in functions connected with DATE/TIME are disabled as well. Part of #4019 --- extra/mkkeywordhash.c | 10 +++++----- src/box/sql/date.c | 9 ++++++--- src/box/sql/parse.y | 27 ++++++++++++++++++--------- test/sql-tap/date.test.lua | 9 ++++++--- test/sql-tap/suite.ini | 4 ++++ test/sql-tap/table.test.lua | 6 +++++- test/sql-tap/tkt-7bbfb7d442.test.lua | 4 ++-- test/sql-tap/tkt-bd484a090c.test.lua | 9 +++++++-- test/sql-tap/tkt2192.test.lua | 8 ++++++-- test/sql-tap/tkt3791.test.lua | 10 ++++++---- test/sql/triggers.result | 4 ++-- test/sql/triggers.test.lua | 4 ++-- 12 files changed, 69 insertions(+), 35 deletions(-) diff --git a/extra/mkkeywordhash.c b/extra/mkkeywordhash.c index edc2ee3b7..491b81ddd 100644 --- a/extra/mkkeywordhash.c +++ b/extra/mkkeywordhash.c @@ -126,9 +126,6 @@ static Keyword aKeywordTable[] = { { "CONSTRAINT", "TK_CONSTRAINT", ALWAYS, true }, { "CREATE", "TK_CREATE", ALWAYS, true }, { "CROSS", "TK_JOIN_KW", ALWAYS, true }, - { "CURRENT_DATE", "TK_CTIME_KW", ALWAYS, true }, - { "CURRENT_TIME", "TK_CTIME_KW", ALWAYS, true }, - { "CURRENT_TIMESTAMP", "TK_CTIME_KW", ALWAYS, true }, { "DEFAULT", "TK_DEFAULT", ALWAYS, true }, { "DEFERRED", "TK_DEFERRED", ALWAYS, false }, { "DEFERRABLE", "TK_DEFERRABLE", FKEY, false }, @@ -225,8 +222,11 @@ static Keyword aKeywordTable[] = { { "CURRENT", "TK_STANDARD", RESERVED, true }, { "CURRENT_USER", "TK_STANDARD", RESERVED, true }, { "CURSOR", "TK_STANDARD", RESERVED, true }, - { "DATE", "TK_DATE", RESERVED, true }, - { "DATETIME", "TK_DATETIME", RESERVED, true }, + { "CURRENT_DATE", "TK_STANDARD", RESERVED, true }, + { "CURRENT_TIME", "TK_STANDARD", RESERVED, true }, + { "CURRENT_TIMESTAMP", "TK_STANDARD", RESERVED, true }, + { "DATE", "TK_STANDARD", RESERVED, true }, + { "DATETIME", "TK_STANDARD", RESERVED, true }, { "DECIMAL", "TK_DECIMAL", RESERVED, true }, { "DECLARE", "TK_STANDARD", RESERVED, true }, { "DENSE_RANK", "TK_STANDARD", RESERVED, true }, diff --git a/src/box/sql/date.c b/src/box/sql/date.c index f3b5b484c..5f5272ea3 100644 --- a/src/box/sql/date.c +++ b/src/box/sql/date.c @@ -69,7 +69,11 @@ #include #include -#ifndef SQL_OMIT_DATETIME_FUNCS +/* + * Till time-like types are implemented as native Tarantool + * types, built-in functions below make no sense. + */ +#if 0 /* * A structure for holding a single date and time. @@ -1305,7 +1309,7 @@ void sqlRegisterDateTimeFunctions(void) { static FuncDef aDateTimeFuncs[] = { -#ifndef SQL_OMIT_DATETIME_FUNCS +#if 0 DFUNCTION(julianday, -1, 0, 0, juliandayFunc, FIELD_TYPE_NUMBER), DFUNCTION(date, -1, 0, 0, dateFunc, FIELD_TYPE_STRING), DFUNCTION(time, -1, 0, 0, timeFunc, FIELD_TYPE_STRING), @@ -1315,7 +1319,6 @@ sqlRegisterDateTimeFunctions(void) DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc, FIELD_TYPE_STRING), DFUNCTION(current_date, 0, 0, 0, cdateFunc, FIELD_TYPE_STRING), -#else STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y index e2504c4f1..fb3639f3f 100644 --- a/src/box/sql/parse.y +++ b/src/box/sql/parse.y @@ -931,8 +931,10 @@ expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { } } -type_func(A) ::= DATE(A) . -type_func(A) ::= DATETIME(A) . +/* + * type_func(A) ::= DATE(A) . + * type_func(A) ::= DATETIME(A) . + */ type_func(A) ::= CHAR(A) . expr(A) ::= type_func(X) LP distinct(D) exprlist(Y) RP(E). { if( Y && Y->nExpr>pParse->db->aLimit[SQL_LIMIT_FUNCTION_ARG] ){ @@ -949,10 +951,12 @@ expr(A) ::= id(X) LP STAR RP(E). { A.pExpr = sqlExprFunction(pParse, 0, &X); spanSet(&A,&X,&E); } -term(A) ::= CTIME_KW(OP). { - A.pExpr = sqlExprFunction(pParse, 0, &OP); - spanSet(&A, &OP, &OP); -} +/* + * term(A) ::= CTIME_KW(OP). { + * A.pExpr = sqlExprFunction(pParse, 0, &OP); + * spanSet(&A, &OP, &OP); + * } + */ %include { /* This routine constructs a binary expression node out of two ExprSpan @@ -1474,9 +1478,14 @@ wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. { %type typedef {struct type_def} typedef(A) ::= TEXT . { A.type = FIELD_TYPE_STRING; } typedef(A) ::= BLOB_KW . { A.type = FIELD_TYPE_SCALAR; } -typedef(A) ::= DATE . { A.type = FIELD_TYPE_NUMBER; } -typedef(A) ::= TIME . { A.type = FIELD_TYPE_NUMBER; } -typedef(A) ::= DATETIME . { A.type = FIELD_TYPE_NUMBER; } +/** + * Time-like types are temporary disabled, until they are + * implemented as a native Tarantool types (gh-3694). + * + typedef(A) ::= DATE . { A.type = FIELD_TYPE_NUMBER; } + typedef(A) ::= TIME . { A.type = FIELD_TYPE_NUMBER; } + typedef(A) ::= DATETIME . { A.type = FIELD_TYPE_NUMBER; } +*/ %type char_len {int} typedef(A) ::= CHAR . { diff --git a/test/sql-tap/date.test.lua b/test/sql-tap/date.test.lua index f66a4f02c..87fc80db0 100755 --- a/test/sql-tap/date.test.lua +++ b/test/sql-tap/date.test.lua @@ -1,6 +1,7 @@ #!/usr/bin/env tarantool test = require("sqltester") -test:plan(1279) +-- test:plan(1279) +test:plan(0) --!./tcltestrunner.lua -- 2003 October 31 @@ -26,7 +27,9 @@ test:plan(1279) -- at compile-time -- - +-- Disabled until #3694 is resolved. +-- +if false then local function datetest(tnum, expr, result) test:do_test( "date-"..tnum, @@ -478,7 +481,7 @@ test:do_test( 1 -- }) - +end -- if false test:finish_test() diff --git a/test/sql-tap/suite.ini b/test/sql-tap/suite.ini index faa56a999..bb492895e 100644 --- a/test/sql-tap/suite.ini +++ b/test/sql-tap/suite.ini @@ -5,6 +5,10 @@ disabled = selectA.test.lua ; like2.test.lua ; types2.test.lua ; e_expr.test.lua ; + date.test.lua ; + tkt-bd484a090c.test.lua ; + tkt3791.test.lua ; + lua_libs = lua/sqltester.lua ../sql/lua/sql_tokenizer.lua ../box/lua/identifier.lua is_parallel = True release_disabled = debug_mode_only.test.lua diff --git a/test/sql-tap/table.test.lua b/test/sql-tap/table.test.lua index 2bcc5aa48..b1ea27878 100755 --- a/test/sql-tap/table.test.lua +++ b/test/sql-tap/table.test.lua @@ -1,6 +1,6 @@ #!/usr/bin/env tarantool test = require("sqltester") -test:plan(78) +test:plan(77) --!./tcltestrunner.lua -- 2001 September 15 @@ -945,6 +945,9 @@ test:do_execsql_test( -- Test the ability to have default values of CURRENT_TIME, CURRENT_DATE -- and CURRENT_TIMESTAMP. -- +-- Disabled until #3694 is resolved. +-- +if false then test:do_execsql_test( "table-13.1", [[ @@ -960,6 +963,7 @@ test:do_execsql_test( -- }) +end ---------------------------------------------------------------------- -- Test cases table-14.* diff --git a/test/sql-tap/tkt-7bbfb7d442.test.lua b/test/sql-tap/tkt-7bbfb7d442.test.lua index 15478a77d..9469025cd 100755 --- a/test/sql-tap/tkt-7bbfb7d442.test.lua +++ b/test/sql-tap/tkt-7bbfb7d442.test.lua @@ -91,7 +91,7 @@ if (1 > 0) InventoryControlId INTEGER, SKU INTEGER NOT NULL PRIMARY KEY, Variant INTEGER NOT NULL DEFAULT 0, - ControlDate DATE NOT NULL, + ControlDate TEXT NOT NULL, ControlState INTEGER NOT NULL DEFAULT -1, DeliveredQty TEXT ); @@ -161,7 +161,7 @@ if (1 > 0) INSERT INTO InventoryControl(SKU, Variant, ControlDate) SELECT - II.SKU AS SKU, II.Variant AS Variant, julianday('2011-08-30') AS ControlDate + II.SKU AS SKU, II.Variant AS Variant, '2011-08-30' AS ControlDate FROM InventoryItem II; ]]) diff --git a/test/sql-tap/tkt-bd484a090c.test.lua b/test/sql-tap/tkt-bd484a090c.test.lua index 974e22169..0347fd426 100755 --- a/test/sql-tap/tkt-bd484a090c.test.lua +++ b/test/sql-tap/tkt-bd484a090c.test.lua @@ -1,6 +1,7 @@ #!/usr/bin/env tarantool test = require("sqltester") -test:plan(2) +--test:plan(2) +test:plan(0) --!./tcltestrunner.lua -- 2011 June 21 @@ -18,6 +19,10 @@ test:plan(2) -- ["set","testdir",[["file","dirname",["argv0"]]]] -- ["source",[["testdir"],"\/tester.tcl"]] testprefix = "tkt-bd484a090c" + +-- Disabled until #3694 is resolved. +-- +if false then test:do_test( 1.1, function() @@ -29,7 +34,7 @@ test:do_test( function() return test:catchsql(" SELECT datetime('now', 'utc') ")[1] end, 0) - +end -- if false -- TBI to be implemented feature --sql_test_control("sql_TESTCTRL_LOCALTIME_FAULT", 1) --test:do_catchsql_test( diff --git a/test/sql-tap/tkt2192.test.lua b/test/sql-tap/tkt2192.test.lua index b118d6310..17b5d46d1 100755 --- a/test/sql-tap/tkt2192.test.lua +++ b/test/sql-tap/tkt2192.test.lua @@ -1,6 +1,7 @@ #!/usr/bin/env tarantool test = require("sqltester") -test:plan(6) +-- test:plan(6) +test:plan(4) --!./tcltestrunner.lua -- 2007 January 26 @@ -23,7 +24,9 @@ test:plan(6) -- ["set","testdir",[["file","dirname",["argv0"]]]] -- ["source",[["testdir"],"\/tester.tcl"]] - +-- Disabled until #3694 is resolved. +-- +if false then test:do_execsql_test( "tkt2192-1.1", [[ @@ -105,6 +108,7 @@ test:do_test( -- }) +end -- if false test:do_execsql_test( "tkt2192-2.1", diff --git a/test/sql-tap/tkt3791.test.lua b/test/sql-tap/tkt3791.test.lua index 388670a4b..d39b6a2d5 100755 --- a/test/sql-tap/tkt3791.test.lua +++ b/test/sql-tap/tkt3791.test.lua @@ -1,6 +1,7 @@ #!/usr/bin/env tarantool test = require("sqltester") -test:plan(1) +--test:plan(1) +test:plan(0) --!./tcltestrunner.lua -- 2009 April 2 @@ -21,9 +22,9 @@ test:plan(1) -- ["set","testdir",[["file","dirname",["argv0"]]]] -- ["source",[["testdir"],"\/tester.tcl"]] -- MUST_WORK_TEST -if (0 > 0) - then -end +-- Disabled until #3694 is resolved. +-- +if (0 > 0) then test:do_test( "tkt3791-1.1", function() @@ -37,6 +38,7 @@ test:do_test( 1, 19 -- }) +end test:finish_test() diff --git a/test/sql/triggers.result b/test/sql/triggers.result index bbfff3302..2f5b14803 100644 --- a/test/sql/triggers.result +++ b/test/sql/triggers.result @@ -256,7 +256,7 @@ box.sql.execute("PRAGMA sql_default_engine ('vinyl');") box.sql.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);") --- ... -box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = DATETIME('now'); END;") +box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = 'now'; END;") --- ... box.sql.execute("PRAGMA sql_default_engine('memtx');") @@ -292,7 +292,7 @@ box.sql.execute("PRAGMA sql_default_engine ('memtx');") box.sql.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);") --- ... -box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = DATETIME('now'); END;") +box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = 'now'; END;") --- ... box.sql.execute("PRAGMA sql_default_engine('vinyl');") diff --git a/test/sql/triggers.test.lua b/test/sql/triggers.test.lua index eb3f41ef5..b22b4f9ff 100644 --- a/test/sql/triggers.test.lua +++ b/test/sql/triggers.test.lua @@ -102,7 +102,7 @@ box.sql.execute("DROP TABLE T1;") -- Case 1: Src 'vinyl' table; Dst 'memtx' table box.sql.execute("PRAGMA sql_default_engine ('vinyl');") box.sql.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);") -box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = DATETIME('now'); END;") +box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = 'now'; END;") box.sql.execute("PRAGMA sql_default_engine('memtx');") box.sql.execute("CREATE TABLE n (s0 INT PRIMARY KEY, s1 TEXT UNIQUE, s2 REAL);") box.sql.execute("INSERT INTO m VALUES (0, '0');") @@ -118,7 +118,7 @@ box.sql.execute("DROP TABLE n;") -- Case 2: Src 'memtx' table; Dst 'vinyl' table box.sql.execute("PRAGMA sql_default_engine ('memtx');") box.sql.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);") -box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = DATETIME('now'); END;") +box.sql.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = 'now'; END;") box.sql.execute("PRAGMA sql_default_engine('vinyl');") box.sql.execute("CREATE TABLE n (s0 INT PRIMARY KEY, s1 TEXT UNIQUE, s2 REAL);") box.sql.execute("INSERT INTO m VALUES (0, '0');") -- 2.15.1