From 33b8e8310f67c161c3c1a08955adb9afa242f25b Mon Sep 17 00:00:00 2001 From: Chris Sosnin <k.sosnin@tarantool.org> Date: Mon, 27 Jan 2020 11:33:23 +0300 Subject: [PATCH] sql: fix segfault in pragma table_info We should first check that primary key is not NULL. Closes #4745 (cherry picked from commit e9aa378480336c907304d383ffa5e4dff510171a) --- src/box/sql/pragma.c | 6 ++--- test/sql/gh-4745-table-info-assertion.result | 23 +++++++++++++++++++ .../sql/gh-4745-table-info-assertion.test.lua | 12 ++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 test/sql/gh-4745-table-info-assertion.result create mode 100644 test/sql/gh-4745-table-info-assertion.test.lua diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index 2ca7609029..a1f5f38b10 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -238,10 +238,10 @@ sql_pragma_table_info(struct Parse *parse, const char *tbl_name) struct Vdbe *v = sqlGetVdbe(parse); struct field_def *field = space->def->fields; for (uint32_t i = 0, k; i < space->def->field_count; ++i, ++field) { - if (!sql_space_column_is_in_pk(space, i)) { - k = 0; - } else if (pk == NULL) { + if (pk == NULL) { k = 1; + } else if (!sql_space_column_is_in_pk(space, i)) { + k = 0; } else { struct key_def *kdef = pk->def->key_def; k = key_def_find_by_fieldno(kdef, i) - kdef->parts + 1; diff --git a/test/sql/gh-4745-table-info-assertion.result b/test/sql/gh-4745-table-info-assertion.result new file mode 100644 index 0000000000..1c5197fd12 --- /dev/null +++ b/test/sql/gh-4745-table-info-assertion.result @@ -0,0 +1,23 @@ +-- test-run result file version 2 +test_run = require('test_run').new() + | --- + | ... +engine = test_run:get_cfg('engine') + | --- + | ... +-- +-- Make sure that 'pragma table_info()' correctly handles tables +-- without primary key. +-- +T = box.schema.create_space('T', { \ + engine = engine, \ + format = {{'i', 'integer'}} \ +}) + | --- + | ... +_ = box.execute('pragma table_info(T)') + | --- + | ... +T:drop() + | --- + | ... diff --git a/test/sql/gh-4745-table-info-assertion.test.lua b/test/sql/gh-4745-table-info-assertion.test.lua new file mode 100644 index 0000000000..0e8ef38490 --- /dev/null +++ b/test/sql/gh-4745-table-info-assertion.test.lua @@ -0,0 +1,12 @@ +test_run = require('test_run').new() +engine = test_run:get_cfg('engine') +-- +-- Make sure that 'pragma table_info()' correctly handles tables +-- without primary key. +-- +T = box.schema.create_space('T', { \ + engine = engine, \ + format = {{'i', 'integer'}} \ +}) +_ = box.execute('pragma table_info(T)') +T:drop() -- GitLab