[tarantool-patches] Re: [PATCH 8/8] sql: introduce dry-run execution
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Thu Aug 29 23:46:21 MSK 2019
Thanks for the patch!
See 2 comments below.
On 27/08/2019 15:34, Nikita Pettik wrote:
> To get result of dry-run execution locally, one can use
> box.dry_run("sql_string") method, which returns query's
> meta-information. Note this method does not support binding values
> substitution.
>
> To get result of dry-run execution using net.box facilities, one can
> pass map containing dry_run options to :execute() method (leaving array
> of bindings empty):
>
> cn:execute("SELECT 1;", {}, {{dry_run = true}})
>
> Or simply set options considering their order:
>
> cn:execute("SELECT 1;", {}, {true})
>
> Note that there's no binding substitution even if array of values to be
> bound is not empty. Also, dry-run execution for DML and DDL request
> doesn't make any sense - zero row_count is always returned.
>
> Under the hood we add 'meta_only' flag to struct port_sql, which
> regulates whether response contains only metadata or metadata and
> tuples forming the result set of query.
>
> Closes #3292
1. JFR, we will need a docbot request. About box, netbox, and the binary
protocol.
> diff --git a/src/box/iproto.cc b/src/box/iproto.cc
> index a92e66ace..22019efaa 100644
> --- a/src/box/iproto.cc
> +++ b/src/box/iproto.cc
> @@ -1671,14 +1671,16 @@ tx_process_sql(struct cmsg *m)
> if (sql_prepare(sql, len, &stmt, NULL) != 0)
> goto error;
> assert(stmt != NULL);
> - port_sql_create(&port, stmt);
> - if (sql_bind(stmt, bind, bind_count) != 0) {
> - port_destroy(&port);
> - goto error;
> - }
> - if (sql_execute(stmt, &port, &fiber()->gc) != 0) {
> - port_destroy(&port);
> - goto error;
> + port_sql_create(&port, stmt, opts.dry_run);
> + if (!opts.dry_run) {
> + if (sql_bind(stmt, bind, bind_count) != 0) {
> + port_destroy(&port);
> + goto error;
> + }
> + if (sql_execute(stmt, &port, &fiber()->gc) != 0) {
> + port_destroy(&port);
> + goto error;
> + }
> }
2. This should be done inside sql_prepare_and_execute(), which
will take sql_opts parameter. It will allow you to 1) keep
sql_port encapsulated, 2) don't duplicate this code for Lua and
iproto versions.
More information about the Tarantool-patches
mailing list