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 1DB26213A3 for ; Tue, 29 Jan 2019 09:29:46 -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 u8Y35eCfw--P for ; Tue, 29 Jan 2019 09:29:46 -0500 (EST) Received: from smtp40.i.mail.ru (smtp40.i.mail.ru [94.100.177.100]) (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 C83DB21E7A for ; Tue, 29 Jan 2019 09:29:45 -0500 (EST) From: imeevma@tarantool.org Subject: [tarantool-patches] [PATCH v5 5/6] sql: get results of PRAGMA statement in YAML format Date: Tue, 29 Jan 2019 17:29:43 +0300 Message-Id: <1a7fd53719a4790845c68f815a4f1a9f4f84b97a.1548771900.git.imeevma@gmail.com> 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, v.shpilevoy@tarantool.org Cc: korablev@tarantool.org 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 in YAML format. --- src/box/sql/pragma.c | 58 +++++++++++++++------------------------------ test/sql/sql-debug.result | 24 +++++++++++++++++++ test/sql/sql-debug.test.lua | 5 ++++ 3 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index a610345..de81c28 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -168,48 +168,28 @@ 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 = sqlite3GetVdbe(parse); + struct session *user_session = current_session(); + + sqlite3VdbeSetNumCols(v, 2); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "pragma_name", SQLITE_STATIC); + sqlite3VdbeSetColName(v, 0, COLNAME_DECLTYPE, "TEXT", SQLITE_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "pragma_value", + SQLITE_STATIC); + sqlite3VdbeSetColName(v, 1, COLNAME_DECLTYPE, "INTEGER", SQLITE_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; + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, aPragmaName[i].zName, + 0); + int val = (user_session->sql_flags & aPragmaName[i].iArg) != 0; + sqlite3VdbeAddOp2(v, OP_Integer, val, 2); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); } } @@ -438,7 +418,7 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */ zLeft = sqlite3NameFromToken(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 0c9ac97..6f1d889 100644 --- a/test/sql/sql-debug.result +++ b/test/sql/sql-debug.result @@ -27,3 +27,27 @@ box.sql.execute('PRAGMA parser_trace') box.sql.execute('PRAGMA parser_trace = '.. result[1][1]) --- ... +-- +-- Make PRAGMA command return the result in YAML format. +-- +box.sql.execute('PRAGMA') +--- +- - ['case_sensitive_like', 0] + - ['count_changes', 0] + - ['defer_foreign_keys', 0] + - ['full_column_names', 0] + - ['parser_trace', 0] + - ['query_only', 0] + - ['read_uncommitted', 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 f946306..0cbc747 100644 --- a/test/sql/sql-debug.test.lua +++ b/test/sql/sql-debug.test.lua @@ -12,3 +12,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 in YAML format. +-- +box.sql.execute('PRAGMA') -- 2.7.4