From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id E5047452566 for ; Thu, 7 Nov 2019 04:05:00 +0300 (MSK) From: Nikita Pettik Date: Thu, 7 Nov 2019 04:04:40 +0300 Message-Id: <20191107010455.64457-1-korablev@tarantool.org> Subject: [Tarantool-patches] [PATCH 00/15] sql: prepared statements List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org Cc: v.shpilevoy@tarantool.org Branch: https://github.com/tarantool/tarantool/tree/np/gh-2592-prepared-statements Issues: https://github.com/tarantool/tarantool/issues/2592 For details see particular patches and RFC. One difference from RFC is that there's no LRU replacement policy in current implementation. User has to remove statements manually. Optional check of values to be bound I'm going to implement as a follow-up to these patches. To the one who will review: I've failed to come up with remote (netbox) :execute() and :unpepare() methods for prepared statement objects. So there are only cn:execute(query_id) and cn:unprepare(query_id) methods. Hence we get a small inconsistency between remote and local behaviour: Local mode s = box.prepare("SELECT 1;") tarantool> s --- - execute: 'function: 0x011240df28' query_id: 1 params: [] unprepare: 'function: 0x011240df60' metadata: - name: '1' type: integer param_count: 0 ... s:execute() -> unfolds into box.execute(s.query_id) Remote mode cn = netbox.connect(box.cfg.listen) s = cn:prepare("SELECT 1;") tarantool> s --- query_id: 1 params: [] metadata: - name: '1' type: integer param_count: 0 ... cn:execute(s.query_id) It seems that introducing :prepare() and :execute() methods might require a lot of Lua netbox module refactoring (to make up execute/unprepare requests we need established channel; as a workaround we can attempt at hiding it in prepared statement object via patching serializable methods). Nikita Pettik (15): sql: remove sql_prepare_v2() sql: refactor sql_prepare() and sqlPrepare() sql: move sql_prepare() declaration to box/execute.h sql: rename sqlPrepare() to sql_compile() sql: move sql_finalize() to execute.h port: increase padding of struct port port: add dump format and request type to port_sql sql: resurrect sql_bind_parameter_count() function sql: resurrect sql_bind_parameter_name() sql: add sql_schema_version() sql: introduce sql_stmt_sizeof() function box: increment schema_version on ddl operations sql: introduce cache for prepared statemets box: introduce prepared statements netbox: introduce prepared statements src/box/CMakeLists.txt | 1 + src/box/alter.cc | 3 + src/box/box.cc | 19 ++ src/box/box.h | 1 + src/box/ck_constraint.c | 1 + src/box/errcode.h | 2 + src/box/execute.c | 193 ++++++++++- src/box/execute.h | 66 ++++ src/box/iproto.cc | 68 +++- src/box/iproto_constants.c | 7 +- src/box/iproto_constants.h | 5 + src/box/lua/cfg.cc | 12 + src/box/lua/execute.c | 231 +++++++++++++- src/box/lua/execute.h | 2 +- src/box/lua/init.c | 2 +- src/box/lua/load_cfg.lua | 3 + src/box/lua/net_box.c | 104 +++++- src/box/lua/net_box.lua | 28 ++ src/box/lua/session.c | 10 + src/box/prep_stmt.c | 108 +++++++ src/box/prep_stmt.h | 88 ++++++ src/box/session.cc | 14 + src/box/session.h | 2 + src/box/sql/analyze.c | 16 +- src/box/sql/legacy.c | 3 +- src/box/sql/prepare.c | 56 +--- src/box/sql/sqlInt.h | 44 ++- src/box/sql/vdbe.h | 2 +- src/box/sql/vdbeInt.h | 1 - src/box/sql/vdbeapi.c | 83 +++-- src/box/sql/vdbeaux.c | 5 +- src/box/xrow.c | 19 +- src/box/xrow.h | 4 +- src/lib/core/port.h | 2 +- test/app-tap/init_script.result | 37 +-- test/box/admin.result | 2 + test/box/cfg.result | 7 + test/box/cfg.test.lua | 1 + test/box/misc.result | 5 + test/sql/engine.cfg | 4 + test/sql/iproto.result | 2 +- test/sql/prepared.result | 685 ++++++++++++++++++++++++++++++++++++++++ test/sql/prepared.test.lua | 266 ++++++++++++++++ 43 files changed, 2043 insertions(+), 171 deletions(-) create mode 100644 src/box/prep_stmt.c create mode 100644 src/box/prep_stmt.h create mode 100644 test/sql/prepared.result create mode 100644 test/sql/prepared.test.lua -- 2.15.1