[tarantool-patches] Re: [PATCH v2 1/3] sql: introduce pragma sql_default_engine

  • From: Kirill Shcherbatov <kshcherbatov@xxxxxxxxxxxxx>
  • To: tarantool-patches@xxxxxxxxxxxxx
  • Date: Mon, 2 Jul 2018 11:46:05 +0300

Hi!  Thank you for review.

These inputs leads to segfault:
Thank you for this scenarios.

Also, it reproduces with:
pragma sql_default_engine 1
pragma sql_default_engine ‘memtx’ 
I've included this in tests.

Moreover, simple ‘pragma’ command displays list of available pragmas and
their statuses. Lets add ’sql_default_engine’ to that list.
Ok, good idea.

========================================

diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index 7a25db6..31581b1 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -219,13 +219,30 @@ pragmaLocate(const char *zName)
        }                                                                      \
 } 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)
 {
        int i;
        for (i = 0; i < ArraySize(aPragmaName); ++i) {
-               if (aPragmaName[i].ePragTyp == PragTyp_FLAG)
-                       PRINT_PRAGMA(aPragmaName[i].zName, aPragmaName[i].iArg);
+               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;
+                       }
+               }
        }
 
        printf("Other available pragmas: \n");
@@ -244,6 +261,11 @@ printActivePragmas(struct session *user_session)
 static int
 sql_default_engine_set(const char *engine_name)
 {
+       if (engine_name == NULL) {
+               diag_set(ClientError, ER_ILLEGAL_PARAMS,
+                        "'sql_default_engine' was not specified");
+               return -1;
+       }
        enum sql_storage_engine engine =
                STR2ENUM(sql_storage_engine, engine_name);
        if (engine == sql_storage_engine_MAX) {

diff --git a/test/sql-tap/gh-2367-pragma.test.lua 
b/test/sql-tap/gh-2367-pragma.test.lua
index 6d2e73d..c0792c9 100755
--- a/test/sql-tap/gh-2367-pragma.test.lua
+++ b/test/sql-tap/gh-2367-pragma.test.lua
@@ -1,7 +1,7 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
 
-test:plan(4)
+test:plan(7)
 
 test:do_catchsql_test(
        "pragma-1.3",
@@ -38,4 +38,28 @@ test:do_catchsql_test(
        0
 })
 
+test:do_catchsql_test(
+       "pragma-2.4",
+       [[
+               pragma sql_default_engine;
+       ]], {
+       1, 'Illegal parameters, \'sql_default_engine\' was not specified'
+})
+
+test:do_catchsql_test(
+       "pragma-2.5",
+       [[
+               pragma sql_default_engine 'memtx';
+       ]], {
+       1, 'near \"\'memtx\'\": syntax error'
+})
+
+test:do_catchsql_test(
+       "pragma-2.5",
+       [[
+               pragma sql_default_engine 1;
+       ]], {
+       1, 'near \"1\": syntax error'
+})
+
 test:finish_test()


Other related posts: