From: imeevma@tarantool.org To: v.shpilevoy@tarantool.org Cc: tarantool-patches@freelists.org Subject: [tarantool-patches] [PATCH v6 5/7] sql: get results of PRAGMA statement as result set Date: Thu, 21 Feb 2019 16:00:52 +0300 [thread overview] Message-ID: <3767fc33a72bf5a79e3e4b07aa6e290c36c2b2cf.1550753723.git.imeevma@gmail.com> (raw) In-Reply-To: <cover.1550753723.git.imeevma@gmail.com> Currently box.sql.execute ('PRAGMA') returns nothing, but prints list of pragmas and their statuses to stdout. Such strategy is considered to be wrong since output of this command would be unavailable for users who redirect stdout, use net box connection etc. This patch makes the command to return result as the rest of SQL commands. The result contains only FLAG-type pragmas and their statuses. --- src/box/sql/pragma.c | 56 ++++++++++++++------------------------------- test/sql/sql-debug.result | 22 ++++++++++++++++++ test/sql/sql-debug.test.lua | 5 ++++ 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index c2431bf..e166197 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -168,48 +168,26 @@ pragmaLocate(const char *zName) return lwr > upr ? 0 : &aPragmaName[mid]; } -#ifdef PRINT_PRAGMA -#undef PRINT_PRAGMA -#endif -#define PRINT_PRAGMA(pragma_name, pragma_flag) do { \ - int nCoolSpaces = 30 - strlen(pragma_name); \ - if (user_session->sql_flags & (pragma_flag)) { \ - printf("%s %*c -- [true] \n", pragma_name, nCoolSpaces, ' '); \ - } else { \ - printf("%s %*c -- [false] \n", pragma_name, nCoolSpaces, ' ');\ - } \ -} while (0) - -#define PRINT_STR_PRAGMA(pragma_name, str_value) do { \ - int nCoolSpaces = 30 - strlen(pragma_name); \ - printf("%s %*c -- '%s' \n", pragma_name, nCoolSpaces, ' ', str_value);\ -} while (0) - static void -printActivePragmas(struct session *user_session) +vdbe_emit_pragma_status(struct Parse *parse) { - int i; - for (i = 0; i < ArraySize(aPragmaName); ++i) { - switch (aPragmaName[i].ePragTyp) { - case PragTyp_FLAG: - PRINT_PRAGMA(aPragmaName[i].zName, aPragmaName[i].iArg); - break; - case PragTyp_DEFAULT_ENGINE: { - const char *engine_name = - sql_storage_engine_strs[ - current_session()-> - sql_default_engine]; - PRINT_STR_PRAGMA(aPragmaName[i].zName, - engine_name); - break; - } - } - } + struct Vdbe *v = sqlGetVdbe(parse); + struct session *user_session = current_session(); + + sqlVdbeSetNumCols(v, 2); + sqlVdbeSetColName(v, 0, COLNAME_NAME, "pragma_name", SQL_STATIC); + sqlVdbeSetColName(v, 0, COLNAME_DECLTYPE, "TEXT", SQL_STATIC); + sqlVdbeSetColName(v, 1, COLNAME_NAME, "pragma_value", SQL_STATIC); + sqlVdbeSetColName(v, 1, COLNAME_DECLTYPE, "INTEGER", SQL_STATIC); - printf("Other available pragmas: \n"); - for (i = 0; i < ArraySize(aPragmaName); ++i) { + parse->nMem = 2; + for (int i = 0; i < ArraySize(aPragmaName); ++i) { if (aPragmaName[i].ePragTyp != PragTyp_FLAG) - printf("-- %s \n", aPragmaName[i].zName); + continue; + sqlVdbeAddOp4(v, OP_String8, 0, 1, 0, aPragmaName[i].zName, 0); + int val = (user_session->sql_flags & aPragmaName[i].iArg) != 0; + sqlVdbeAddOp2(v, OP_Integer, val, 2); + sqlVdbeAddOp2(v, OP_ResultRow, 1, 2); } } @@ -454,7 +432,7 @@ sqlPragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */ zLeft = sqlNameFromToken(db, pId); if (!zLeft) { - printActivePragmas(user_session); + vdbe_emit_pragma_status(pParse); return; } diff --git a/test/sql/sql-debug.result b/test/sql/sql-debug.result index 9388578..a857392 100644 --- a/test/sql/sql-debug.result +++ b/test/sql/sql-debug.result @@ -21,3 +21,25 @@ box.sql.execute('PRAGMA parser_trace') box.sql.execute('PRAGMA parser_trace = '.. result[1][1]) --- ... +-- +-- Make PRAGMA command return the result as a result set. +-- +box.sql.execute('PRAGMA') +--- +- - ['case_sensitive_like', 0] + - ['count_changes', 0] + - ['defer_foreign_keys', 0] + - ['full_column_names', 0] + - ['parser_trace', 0] + - ['recursive_triggers', 1] + - ['reverse_unordered_selects', 0] + - ['select_trace', 0] + - ['short_column_names', 1] + - ['sql_trace', 0] + - ['vdbe_addoptrace', 0] + - ['vdbe_debug', 0] + - ['vdbe_eqp', 0] + - ['vdbe_listing', 0] + - ['vdbe_trace', 0] + - ['where_trace', 0] +... diff --git a/test/sql/sql-debug.test.lua b/test/sql/sql-debug.test.lua index 721ef19..e429c38 100644 --- a/test/sql/sql-debug.test.lua +++ b/test/sql/sql-debug.test.lua @@ -10,3 +10,8 @@ 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]) + +-- +-- Make PRAGMA command return the result as a result set. +-- +box.sql.execute('PRAGMA') -- 2.7.4
next prev parent reply other threads:[~2019-02-21 13:00 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-02-21 13:00 [tarantool-patches] [PATCH v6 0/7] sql: set column types for EXPLAIN and PRAGMA imeevma 2019-02-21 13:00 ` [tarantool-patches] [PATCH v6 1/7] sql: remove unused macros from pragma.c and pragma.h imeevma 2019-02-21 13:00 ` [tarantool-patches] [PATCH v6 2/7] sql: fix "PRAGMA parser_trace" result imeevma 2019-02-21 13:00 ` [tarantool-patches] [PATCH v6 3/7] sql: Show currently set sql_default_engine imeevma 2019-02-21 15:52 ` [tarantool-patches] " Konstantin Osipov 2019-02-21 13:00 ` [tarantool-patches] [PATCH v6 4/7] sql: fix "PRAGMA case_sensitive_like" result imeevma 2019-02-21 13:00 ` imeevma [this message] 2019-02-21 13:00 ` [tarantool-patches] [PATCH v6 6/7] sql: set column types for EXPLAIN and PRAGMA imeevma 2019-02-21 13:00 ` [tarantool-patches] [PATCH v6 7/7] sql: remove test gh-3733-pragma.test.lua imeevma 2019-02-25 11:59 ` [tarantool-patches] Re: [PATCH v6 0/7] sql: set column types for EXPLAIN and PRAGMA Vladislav Shpilevoy 2019-02-25 21:05 ` Imeev Mergen 2019-02-26 9:33 ` Vladislav Shpilevoy 2019-02-27 11:09 ` Kirill Yukhin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=3767fc33a72bf5a79e3e4b07aa6e290c36c2b2cf.1550753723.git.imeevma@gmail.com \ --to=imeevma@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [tarantool-patches] [PATCH v6 5/7] sql: get results of PRAGMA statement as result set' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox