From: Kirill Shcherbatov <kshcherbatov@tarantool.org> To: tarantool-patches@freelists.org Cc: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Subject: [tarantool-patches] Re: [PATCH v1 1/2] sql: introduce pragma sql_default_engine Date: Tue, 26 Jun 2018 20:09:36 +0300 [thread overview] Message-ID: <cca6a46e-098c-761e-0c70-bdd0a24d6888@tarantool.org> (raw) In-Reply-To: <9085644e-030f-b1bc-6928-4819bc5ffed7@tarantool.org> > 1. It was a rhetorical question. Please, remove it in the way > described in comment 6. ok. > 2. I do not see the new patch version. Please, put it after fixes. appended. My fault. I was confused by \set language. > > Please, do not skip the rest of the comment. I will paste it > here for you: > >> Maybe we should ask in a big red chat about this default engine >> for each language unless we will have to set default engine like >> this when use iproto: >> >> c = netbox.connect(uri) >> c:execute('PRAGMA default_engine = "memtx"') >> c:eval('box.space.default_engine = "memtx"') >> ... -- etc for each language. >> >> And it breaks our "celebratory interoperability" so much >> glorified on T+ conf. >> >> Maybe it is a good question for Gulutzan. > > Please, do what I said here. I've discussed this with Kirill. He confirmed to use this setting only in SQL. > 4. Here strcpy is enough. You do not need any formatting here, > and you know, that engine name fits in space_def.engine_name. Ok. > 5. Please, do not use neither _t nor _type for enums. sql_storage_engine > > 6. Why do you need strcasecmp here? I do not think, > that we should allow 'MeMtX' or 'Memtx' or something. Only > 'memtx' (and 'vinyl'). And in such a case you can declare > sql_storage_engine_strs and use STR2ENUM like it is done > for other enums visible to user. Ok. ================================================== Part of #2199. @TarantoolBot document Title: new pragma sql_default_engine Now it is allowed to create vinyl spaces using special pragma setting default engine for SQL requests. This config is stored in user_session() and affect *only* tables been created with SQL. Example: \set language sql pragma sql_default_engine='vinyl'; CREATE TABLE t3(a primary key,b,c); --- src/box/schema_def.h | 7 +++++++ src/box/session.cc | 1 + src/box/session.h | 2 ++ src/box/sql/build.c | 11 ++++++++++- src/box/sql/pragma.c | 28 ++++++++++++++++++++++++++++ src/box/sql/pragma.h | 6 ++++++ src/box/sql/sqliteInt.h | 2 ++ test/sql-tap/gh-2367-pragma.test.lua | 29 ++++++++++++++++++++++++++++- 8 files changed, 84 insertions(+), 2 deletions(-) diff --git a/src/box/schema_def.h b/src/box/schema_def.h index b9a5fa5..e6a7206 100644 --- a/src/box/schema_def.h +++ b/src/box/schema_def.h @@ -243,6 +243,13 @@ enum schema_object_type { schema_object_type_MAX = 8 }; +/** SQL Storage engine. */ +enum sql_storage_engine { + SQL_STORAGE_ENGINE_MEMTX = 0, + SQL_STORAGE_ENGINE_VINYL = 1, + sql_storage_engine_MAX = 2 +}; + enum schema_object_type schema_object_type(const char *name); diff --git a/src/box/session.cc b/src/box/session.cc index e487280..64714cd 100644 --- a/src/box/session.cc +++ b/src/box/session.cc @@ -107,6 +107,7 @@ session_create(enum session_type type) memset(&session->meta, 0, sizeof(session->meta)); session->type = type; session->sql_flags = default_flags; + session->sql_default_engine = SQL_STORAGE_ENGINE_MEMTX; /* For on_connect triggers. */ credentials_init(&session->credentials, guest_user->auth_token, diff --git a/src/box/session.h b/src/box/session.h index 515c30a..df1dcbc 100644 --- a/src/box/session.h +++ b/src/box/session.h @@ -92,6 +92,8 @@ union session_meta { struct session { /** Session id. */ uint64_t id; + /** SQL Tarantool Default storage engine. */ + uint8_t sql_default_engine; /** SQL Connection flag for current user session */ uint32_t sql_flags; enum session_type type; diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 093fea5..5496d29 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -492,6 +492,11 @@ sqlite3PrimaryKeyIndex(Table * pTab) return p; } +const char *sql_storage_engine_strs[] = { + [SQL_STORAGE_ENGINE_MEMTX] = "memtx", + [SQL_STORAGE_ENGINE_VINYL] = "vinyl", +}; + /** * Create and initialize a new SQL Table object. * All memory except table object itself is allocated on region. @@ -510,6 +515,9 @@ sql_table_new(Parse *parser, char *name) if (table == NULL) return NULL; + strcpy(table->def->engine_name, + sql_storage_engine_strs[current_session()->sql_default_engine]); + table->iPKey = -1; table->iAutoIncPKey = -1; table->pSchema = db->pSchema; @@ -1602,7 +1610,8 @@ createSpace(Parse * pParse, int iSpaceId, char *zStmt) sqlite3VdbeAddOp4(v, OP_String8, 0, iFirstCol + 2 /* name */ , 0, sqlite3DbStrDup(pParse->db, p->def->name), P4_DYNAMIC); sqlite3VdbeAddOp4(v, OP_String8, 0, iFirstCol + 3 /* engine */ , 0, - "memtx", P4_STATIC); + sqlite3DbStrDup(pParse->db, p->def->engine_name), + P4_DYNAMIC); sqlite3VdbeAddOp2(v, OP_Integer, p->def->field_count, iFirstCol + 4 /* field_count */ ); sqlite3VdbeAddOp4(v, OP_Blob, zOptsSz, iFirstCol + 5, MSGPACK_SUBTYPE, diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index be6a01c..7a25db6 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -235,6 +235,26 @@ printActivePragmas(struct session *user_session) } } +/** + * Set tarantool backend default engine for SQL interface. + * @param engine_name to set default. + * @retval -1 on error. + * @retval 0 on success. + */ +static int +sql_default_engine_set(const char *engine_name) +{ + enum sql_storage_engine engine = + STR2ENUM(sql_storage_engine, engine_name); + if (engine == sql_storage_engine_MAX) { + diag_set(ClientError, ER_NO_SUCH_ENGINE, engine_name); + return -1; + } + current_session()->sql_default_engine = engine; + return 0; +} + + /* * Process a pragma statement. * @@ -868,6 +888,14 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */ } break; } + case PragTyp_DEFAULT_ENGINE: { + if (sql_default_engine_set(zRight) != 0) { + pParse->rc = SQL_TARANTOOL_ERROR; + pParse->nErr++; + goto pragma_out; + } + break; + } /* * PRAGMA busy_timeout * PRAGMA busy_timeout = N * * diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h index 06b7eea..795c98c 100644 --- a/src/box/sql/pragma.h +++ b/src/box/sql/pragma.h @@ -17,6 +17,7 @@ #define PragTyp_STATS 15 #define PragTyp_TABLE_INFO 17 #define PragTyp_PARSER_TRACE 24 +#define PragTyp_DEFAULT_ENGINE 25 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -247,6 +248,11 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ SQLITE_ShortColNames}, #endif + { /* zName: */ "sql_default_engine", + /* ePragTyp: */ PragTyp_DEFAULT_ENGINE, + /* ePragFlg: */ PragFlg_Result0 | PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0}, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) { /* zName: */ "sql_trace", diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h index d6ae5c2..918fe90 100644 --- a/src/box/sql/sqliteInt.h +++ b/src/box/sql/sqliteInt.h @@ -4804,4 +4804,6 @@ vdbe_emit_halt_if_exists(struct Parse *parser, int space_id, int index_id, const char *name_src, int tarantool_error_code, const char *error_src, bool no_error); +extern const char *sql_storage_engine_strs[]; + #endif /* SQLITEINT_H */ diff --git a/test/sql-tap/gh-2367-pragma.test.lua b/test/sql-tap/gh-2367-pragma.test.lua index a41a026..6d2e73d 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(1) +test:plan(4) test:do_catchsql_test( "pragma-1.3", @@ -11,4 +11,31 @@ test:do_catchsql_test( 1, "no such pragma: KEK" }) +--- +--- gh-2199: SQL default engine pragma +--- +test:do_catchsql_test( + "pragma-2.1", + [[ + pragma sql_default_engine='creepy'; + ]], { + 1, "Space engine 'creepy' does not exist" +}) + +test:do_catchsql_test( + "pragma-2.2", + [[ + pragma sql_default_engine='vinyl'; + ]], { + 0 +}) + +test:do_catchsql_test( + "pragma-2.3", + [[ + pragma sql_default_engine='memtx'; + ]], { + 0 +}) + test:finish_test() -- 2.7.4
next prev parent reply other threads:[~2018-06-26 17:09 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-06-20 17:06 [tarantool-patches] [PATCH v1 0/2] sql: default engine pragma Kirill Shcherbatov 2018-06-20 17:06 ` [tarantool-patches] [PATCH v1 1/2] sql: introduce pragma sql_default_engine Kirill Shcherbatov 2018-06-22 20:04 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-26 12:22 ` Kirill Shcherbatov 2018-06-26 13:34 ` Vladislav Shpilevoy 2018-06-26 17:09 ` Kirill Shcherbatov [this message] 2018-06-27 12:32 ` Vladislav Shpilevoy 2018-06-27 15:59 ` Kirill Shcherbatov 2018-06-20 17:06 ` [tarantool-patches] [PATCH v1 2/2] sql: enable multi-engine tests for SQL Kirill Shcherbatov 2018-06-22 20:04 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-26 12:22 ` Kirill Shcherbatov 2018-06-26 13:34 ` Vladislav Shpilevoy 2018-06-26 17:09 ` Kirill Shcherbatov 2018-06-26 12:23 ` [tarantool-patches] [PATCH v1 2/3] sql: fix SQL Count for vinyl engine Kirill Shcherbatov 2018-06-28 15:35 ` [tarantool-patches] Re: [PATCH v1 0/2] sql: default engine pragma Vladislav Shpilevoy 2018-06-28 16:00 ` n.pettik
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=cca6a46e-098c-761e-0c70-bdd0a24d6888@tarantool.org \ --to=kshcherbatov@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=v.shpilevoy@tarantool.org \ --subject='[tarantool-patches] Re: [PATCH v1 1/2] sql: introduce pragma sql_default_engine' \ /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