From b67cf0781e6b6553d62d6936c49e4df98cb14271 Mon Sep 17 00:00:00 2001 From: Mergen Imeev <imeevma@gmail.com> Date: Wed, 12 Dec 2018 22:16:33 +0300 Subject: [PATCH] sql: fix "PRAGMA parser_trace" result Currently PRAGMA parser_trace returns an empty table. This seems wrong, since other similar pragmas return their status. Fixed in the current patch. --- src/box/sql/pragma.c | 59 ++++++++++++++----------------------- src/box/sql/pragma.h | 7 ++--- src/box/sql/sqlInt.h | 2 ++ test/sql/engine.cfg | 3 ++ test/sql/sql-debug.result | 23 +++++++++++++++ test/sql/sql-debug.test.lua | 12 ++++++++ test/sql/suite.ini | 2 +- 7 files changed, 66 insertions(+), 42 deletions(-) create mode 100644 test/sql/sql-debug.result create mode 100644 test/sql/sql-debug.test.lua diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index ea312f9eba..ab6c7752bf 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -482,33 +482,30 @@ sqlPragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */ switch (pPragma->ePragTyp) { case PragTyp_FLAG:{ - if (zRight == 0) { - setPragmaResultColumnNames(v, pPragma); - returnSingleInt(v, - (user_session-> - sql_flags & pPragma->iArg) != - 0); - } else { - int mask = pPragma->iArg; /* Mask of bits to set - * or clear. - */ - - if (sqlGetBoolean(zRight, 0)) { - user_session->sql_flags |= mask; - } else { - user_session->sql_flags &= ~mask; - } - - /* Many of the flag-pragmas modify the code - * generated by the SQL * compiler (eg. - * count_changes). So add an opcode to expire - * all * compiled SQL statements after - * modifying a pragma value. - */ - sqlVdbeAddOp0(v, OP_Expire); + if (zRight == NULL) { + setPragmaResultColumnNames(v, pPragma); + returnSingleInt(v, (user_session->sql_flags & + pPragma->iArg) != 0); + } else { + /* Mask of bits to set or clear. */ + int mask = pPragma->iArg; + bool is_pragma_set = sqlGetBoolean(zRight, 0); + + if (is_pragma_set) + user_session->sql_flags |= mask; + else + user_session->sql_flags &= ~mask; +#if defined(SQL_DEBUG) + if (mask == PARSER_TRACE_FLAG) { + if (is_pragma_set) + sqlParserTrace(stdout, "parser: "); + else + sqlParserTrace(0, 0); } - break; +#endif } + break; + } case PragTyp_TABLE_INFO: sql_pragma_table_info(pParse, zRight); @@ -587,18 +584,6 @@ sqlPragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */ } break; } -#ifndef NDEBUG - case PragTyp_PARSER_TRACE:{ - if (zRight) { - if (sqlGetBoolean(zRight, 0)) { - sqlParserTrace(stdout, "parser: "); - } else { - sqlParserTrace(0, 0); - } - } - break; - } -#endif /* * Reinstall the LIKE and functions. The variant diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h index 088b64d224..9c8e79c93a 100644 --- a/src/box/sql/pragma.h +++ b/src/box/sql/pragma.h @@ -13,7 +13,6 @@ #define PragTyp_INDEX_LIST 11 #define PragTyp_STATS 15 #define PragTyp_TABLE_INFO 17 -#define PragTyp_PARSER_TRACE 24 #define PragTyp_DEFAULT_ENGINE 25 #define PragTyp_COMPOUND_SELECT_LIMIT 26 @@ -127,10 +126,10 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0}, #if defined(SQL_DEBUG) { /* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlg: */ 0, + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0 | PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ 0}, + /* iArg: */ PARSER_TRACE_FLAG}, #endif { /* zName: */ "recursive_triggers", /* ePragTyp: */ PragTyp_FLAG, diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index ea16089777..8c76b1caf7 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -1522,6 +1522,8 @@ struct sql { * Possible values for the sql.flags. */ #define SQL_VdbeTrace 0x00000001 /* True to trace VDBE execution */ +/* Debug print info about SQL query as it parsed */ +#define PARSER_TRACE_FLAG 0x00000002 #define SQL_FullColNames 0x00000004 /* Show full column names on SELECT */ #define SQL_ShortColNames 0x00000040 /* Show short columns names */ #define SQL_CountRows 0x00000080 /* Count rows changed by INSERT, */ diff --git a/test/sql/engine.cfg b/test/sql/engine.cfg index d5666a0813..5ac445108b 100644 --- a/test/sql/engine.cfg +++ b/test/sql/engine.cfg @@ -2,6 +2,9 @@ "vinyl-opts.test.lua" : { "vinyl": {"engine": "vinyl"} }, + "sql-debug.test.lua": { + "memtx": {"engine": "memtx"} + }, "*": { "memtx": {"engine": "memtx"}, "vinyl": {"engine": "vinyl"} diff --git a/test/sql/sql-debug.result b/test/sql/sql-debug.result new file mode 100644 index 0000000000..9388578b43 --- /dev/null +++ b/test/sql/sql-debug.result @@ -0,0 +1,23 @@ +remote = require('net.box') +--- +... +test_run = require('test_run').new() +--- +... +-- +-- gh-3832: Some statements do not return column type +-- Check that "PRAGMA parser_trace" returns 0 or 1 if called +-- without parameter. +result = box.sql.execute('PRAGMA parser_trace') +--- +... +box.sql.execute('PRAGMA parser_trace = 1') +--- +... +box.sql.execute('PRAGMA parser_trace') +--- +- - [1] +... +box.sql.execute('PRAGMA parser_trace = '.. result[1][1]) +--- +... diff --git a/test/sql/sql-debug.test.lua b/test/sql/sql-debug.test.lua new file mode 100644 index 0000000000..721ef19410 --- /dev/null +++ b/test/sql/sql-debug.test.lua @@ -0,0 +1,12 @@ +remote = require('net.box') +test_run = require('test_run').new() + +-- +-- gh-3832: Some statements do not return column type + +-- Check that "PRAGMA parser_trace" returns 0 or 1 if called +-- without parameter. +result = box.sql.execute('PRAGMA parser_trace') +box.sql.execute('PRAGMA parser_trace = 1') +box.sql.execute('PRAGMA parser_trace') +box.sql.execute('PRAGMA parser_trace = '.. result[1][1]) diff --git a/test/sql/suite.ini b/test/sql/suite.ini index 4504731273..ce6ccb79ae 100644 --- a/test/sql/suite.ini +++ b/test/sql/suite.ini @@ -6,4 +6,4 @@ use_unix_sockets = True config = engine.cfg is_parallel = True lua_libs = lua/sql_tokenizer.lua -release_disabled = errinj.test.lua view_delayed_wal.test.lua +release_disabled = errinj.test.lua view_delayed_wal.test.lua sql-debug.test.lua -- GitLab