From b3377ccfebe6e26efc2d4cd49b5589f9fcaa7ea1 Mon Sep 17 00:00:00 2001 From: Mergen Imeev <imeevma@tarantool.org> Date: Tue, 10 Oct 2023 16:59:11 +0300 Subject: [PATCH] sql: check space for SHOW CREATE TABLE Before this patch, the existence of an space for a "SHOW CREATE TABLE table_name" statement was checked at runtime. This is quite inconvenient for #4467, so this will now be checked when creating the VDBE. Needed for #4467 NO_DOC=no user-visible changes NO_TEST=no user-visible changes NO_CHANGELOG=no user-visible changes --- src/box/sql/build.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 275a43e293..56e6432d17 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -3534,37 +3534,26 @@ sql_setting_set(struct Parse *parse_context, struct Token *name, void sql_emit_show_create_table_one(struct Parse *parse, struct Token *name) { + const struct space *space = sql_space_by_token(name); + if (space == NULL) { + const char *name_str = sql_tt_name_from_token(name); + diag_set(ClientError, ER_NO_SUCH_SPACE, name_str); + parse->is_aborted = true; + return; + } + struct Vdbe *v = sqlGetVdbe(parse); - char *space_name = sql_name_from_token(name); sqlVdbeSetNumCols(v, 2); vdbe_metadata_set_col_name(v, 0, "STATEMENTS"); vdbe_metadata_set_col_type(v, 0, "array"); vdbe_metadata_set_col_name(v, 1, "ERRORS"); vdbe_metadata_set_col_type(v, 1, "array"); - - int cursor = parse->nTab++; - int space_reg = ++parse->nMem; - int name_reg = ++parse->nMem; - sqlVdbeAddOp2(v, OP_OpenSpace, space_reg, BOX_VSPACE_ID); - sqlVdbeAddOp3(v, OP_IteratorOpen, cursor, 2, space_reg); - sqlVdbeChangeP5(v, OPFLAG_SEEKEQ); - sqlVdbeAddOp4(v, OP_String8, 0, name_reg, 0, space_name, P4_DYNAMIC); - int addr1 = sqlVdbeAddOp4Int(v, OP_SeekGE, cursor, 0, name_reg, 1); - int addr2 = sqlVdbeAddOp4Int(v, OP_IdxGT, cursor, 0, name_reg, 1); int space_id_reg = ++parse->nMem; - sqlVdbeAddOp3(v, OP_Column, cursor, BOX_SPACE_FIELD_ID, space_id_reg); + sqlVdbeAddOp2(v, OP_Integer, space->def->id, space_id_reg); int result_reg = ++parse->nMem; ++parse->nMem; sqlVdbeAddOp2(v, OP_ShowCreateTable, space_id_reg, result_reg); sqlVdbeAddOp2(v, OP_ResultRow, result_reg, 2); - int addr3 = sqlVdbeAddOp0(v, OP_Goto); - sqlVdbeJumpHere(v, addr1); - sqlVdbeJumpHere(v, addr2); - - char *err = sqlMPrintf(tnt_errcode_desc(ER_NO_SUCH_SPACE), space_name); - sqlVdbeAddOp4(v, OP_SetDiag, ER_NO_SUCH_SPACE, 0, 0, err, P4_DYNAMIC); - sqlVdbeAddOp2(v, OP_Halt, -1, ON_CONFLICT_ACTION_ABORT); - sqlVdbeJumpHere(v, addr3); } /** Emit VDBE instructions for "SHOW CREATE TABLE;" statement. */ -- GitLab