From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: Nikita Pettik <korablev@tarantool.org>, tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH v2 16/16] netbox: introduce prepared statements Date: Sat, 7 Dec 2019 00:18:04 +0100 [thread overview] Message-ID: <1de08217-e926-5cc8-1480-52036188a01c@tarantool.org> (raw) In-Reply-To: <6df993c3a6068f2d2ed7d7b289644e9a1dd2cfce.1574277369.git.korablev@tarantool.org> Thanks for the patch! See 5 comments below. On 20/11/2019 22:28, Nikita Pettik wrote: > This patch introduces support of prepared statements in IProto > protocol. To achieve this new IProto command is added - IPROTO_PREPARE. > It is sent with IPROTO_SQL_TEXT key and it means to prepare SQL statement > (for details see previous commit). Also to reply on PREPARE request a few > response keys are added: IPROTO_BIND_METADATA (contains parameters > metadata) and IPROTO_BIND_COUNT (count of parameters to be bound). 1. Please, remind me, why do we need these two new keys? > > Closes #2592 > > @TarantoolBot document > Title: Prepared statements in SQL > > Now it is possible to 'prepare' (i.e. compile into byte-code and save to > the cache) statement and execute it several times. Mechanism is similar > to ones in other DBs. Prepared statement is identified by string > containing original SQL request. Prepared statement cache is global and > follows LRU eviction policy: when there's no place for another one > statement, the statement that is least recently used (prepared) is > removed. Cache size is adjusted by box.cfg{sql_cache_size} variable > (can be set dynamically; in case size is reduced some statements may be > erased from cache). Note that any DDL operation leads to expiration of all > prepared statements: they are recompiled on demand. To erase whole cache > one can set its size to 0. Prepared statements are available in local mode > (i.e. via box.prepare() function) and are supported in IProto protocol. > Typical workflow with prepared statements is following: > > s = box.prepare("SELECT * FROM t WHERE id = ?;") > s:execute({1}) or box.execute(s.sql_str, {1}) > s:execute({2}) or box.execute(s.sql_str, {2}) > > In terms of remote connection: > > cn = netbox:connect(addr) > s = cn:prepare("SELECT * FROM t WHERE id = ?;") > cn:execute(s.sql_str, {1}) 2. Each time when binary protocol is changed the doc request should describe these changes in detail: where the new keys are added, what are their names, what are their values and types, are they optional, what to assume when they are omitted? This is needed so as our users could update their connectors. 3. That would be cool to give user an advice here, that the cache eviction is not signaled anyhow. So if they want the prepared statements really stay prepared, then should recall prepare(), when a sequence of execute() calls is expected soon. 4. Please, document new 'prepared statement' object - what attributes does it have, with what types. > diff --git a/src/box/execute.c b/src/box/execute.c > index 2b5a9ba90..13e5a6ba1 100644 > --- a/src/box/execute.c > +++ b/src/box/execute.c > @@ -326,6 +326,67 @@ sql_get_metadata(struct sql_stmt *stmt, struct obuf *out, int column_count) > +static int > +sql_get_prepare_common_keys(struct sql_stmt *stmt, struct obuf *out, int keys, > + const char *sql_str) > +{ > + int size = mp_sizeof_map(keys) + > + mp_sizeof_uint(IPROTO_SQL_TEXT) + > + mp_sizeof_str(strlen(sql_str)) + > + mp_sizeof_uint(IPROTO_BIND_COUNT) + > + mp_sizeof_uint(sql_bind_parameter_count(stmt)); > + char *pos = (char *) obuf_alloc(out, size); > + if (pos == NULL) { > + diag_set(OutOfMemory, size, "obuf_alloc", "pos"); > + return -1; > + } > + pos = mp_encode_map(pos, keys); > + pos = mp_encode_uint(pos, IPROTO_SQL_TEXT); > + pos = mp_encode_str(pos, sql_str, strlen(sql_str)); > + pos = mp_encode_uint(pos, IPROTO_BIND_COUNT); > + pos = mp_encode_uint(pos, sql_bind_parameter_count(stmt)); > + if (sql_get_params_metadata(stmt, out) != 0) > + return -1; > + return 0; 5. Just make 'return sql_get_params_metadata(...)'. 6. Have you done any benchmarks? Just out of curiosity. How much a prepared execution is faster then an execute from the scratch? Just a microbenchmark with lua-land time measurement would be fine.
next prev parent reply other threads:[~2019-12-06 23:18 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-11-20 21:27 [Tarantool-patches] [PATCH v2 00/16] sql: " Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 01/16] sql: remove sql_prepare_v2() Nikita Pettik 2019-12-04 11:36 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 02/16] sql: refactor sql_prepare() and sqlPrepare() Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 11:36 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 03/16] sql: move sql_prepare() declaration to box/execute.h Nikita Pettik 2019-12-04 11:37 ` Konstantin Osipov 2019-12-05 13:32 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 04/16] sql: rename sqlPrepare() to sql_compile() Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-13 13:49 ` Nikita Pettik 2019-12-04 11:39 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 05/16] sql: move sql_finalize() to execute.h Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 11:39 ` Konstantin Osipov 2019-12-13 13:49 ` Nikita Pettik 2019-12-04 11:40 ` Konstantin Osipov 2019-12-05 13:37 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 06/16] port: increase padding of struct port Nikita Pettik 2019-12-04 11:42 ` Konstantin Osipov 2019-12-13 13:54 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 07/16] port: add dump format and request type to port_sql Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-13 13:55 ` Nikita Pettik 2019-12-04 11:52 ` Konstantin Osipov 2019-12-13 13:53 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 08/16] sql: resurrect sql_bind_parameter_count() function Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 11:54 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 09/16] sql: resurrect sql_bind_parameter_name() Nikita Pettik 2019-12-04 11:55 ` Konstantin Osipov 2019-12-04 11:55 ` Konstantin Osipov 2019-12-13 13:55 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 10/16] sql: add sql_stmt_schema_version() Nikita Pettik 2019-12-04 11:57 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 11/16] sql: introduce sql_stmt_sizeof() function Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-13 13:56 ` Nikita Pettik 2019-12-04 11:59 ` Konstantin Osipov 2019-12-13 13:56 ` Nikita Pettik 2019-12-13 14:15 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 12/16] box: increment schema_version on ddl operations Nikita Pettik 2019-12-04 12:03 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 13/16] sql: introduce sql_stmt_query_str() method Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 12:04 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 14/16] sql: introduce cache for prepared statemets Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 12:11 ` Konstantin Osipov 2019-12-17 14:43 ` Kirill Yukhin 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 15/16] box: introduce prepared statements Nikita Pettik 2019-12-04 12:13 ` Konstantin Osipov 2019-12-06 23:18 ` Vladislav Shpilevoy 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 16/16] netbox: " Nikita Pettik 2019-12-06 23:18 ` Vladislav Shpilevoy [this message] 2019-12-03 22:51 ` [Tarantool-patches] [PATCH v2 00/16] sql: " Vladislav Shpilevoy 2019-12-17 15:58 ` Georgy Kirichenko
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=1de08217-e926-5cc8-1480-52036188a01c@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v2 16/16] netbox: introduce prepared statements' \ /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