diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index a731e81e1d0273aaa4cff4dabcb7df96054839e5..436931f15c7a0352a87b32d13041fc4742e12352 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 9388578b43b4e49c75d9d9e63182187b9dc12734..a857392fd5b0c502812d9dfad6dc11b5e8d263cf 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 721ef194103533bbe4b050429962ed482a72d39e..e429c38b34bd5d2ffb7ed8675b3caffcc3275b6d 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')