[tarantool-patches] Re: [PATCH v2] sql: remove useless pragmas
n.pettik
korablev at tarantool.org
Fri Feb 8 22:12:20 MSK 2019
> On 8 Feb 2019, at 13:19, Stanislav Zudin <szudin at tarantool.org> wrote:
>
> The pragmas "query_only" and "read_uncommitted" didn't affect anything
> and were removed.
> Fixed an error in pragma index_list which caused a segmantation fault.
> pragmas index_list and index_info return an error when receive an
> invalid table or index names.
> pragma sql_default_engine accepts only strings.
> Thus pragma sql_default_engine('memtx') is a well-formed command,
> while pragma sql_default_engine(memtx) or
> pragma sql_default_engine("memtx") are considered as an ill-formed and
> raise an error.
>
> Closes #3733
Please, fix commit subject: now it is not only about removal of useless pragmas.
> ---
> diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
> index eef1ed931..158e6269b 100644
> --- a/src/box/sql/pragma.c
> +++ b/src/box/sql/pragma.c
> @@ -342,15 +342,37 @@ sql_pragma_index_info(struct Parse *parse,
> MAYBE_UNUSED const PragmaName *pragma,
> const char *tbl_name, const char *idx_name)
> {
> - if (idx_name == NULL || tbl_name == NULL)
> + if (idx_name == NULL) {
> + diag_set(ClientError, ER_ILLEGAL_PARAMS,
> + "index name was not specified");
> + parse->rc = SQL_TARANTOOL_ERROR;
> + parse->nErr++;
> + return;
> + }
I’m sorry, but it seems that I interpreted comment from
P.Gulutzan in a wrong way. We shouldn’t throw any errors,
according to his clarification. Please, check out his comment
and make sure this time I am right. If really so, please discard
changes to sql_pragma_index_info().
> + if(tbl_name == NULL) {
> + diag_set(ClientError, ER_ILLEGAL_PARAMS,
> + "table name was not specified");
> + parse->rc = SQL_TARANTOOL_ERROR;
> + parse->nErr++;
> return;
> + }
> +
> struct space *space = space_by_name(tbl_name);
> - if (space == NULL)
> + if (space == NULL) {
> + diag_set(ClientError, ER_NO_SUCH_SPACE,
> + tbl_name);
> + parse->rc = SQL_TARANTOOL_ERROR;
> + parse->nErr++;
> return;
> + }
> +
> uint32_t iid = box_index_id_by_name(space->def->id, idx_name,
> strlen(idx_name));
> - if (iid == BOX_ID_NIL)
> + if (iid == BOX_ID_NIL) {
> + sqlite3ErrorMsg(parse, "no such index: %s", idx_name);
Note that in this case you don’t need set sqlite error:
box_index_id_by_name will set diag message. So, you should
only set appropriate error code in parse struct.
> return;
> + }
> +
> struct index *idx = space_index(space, iid);
> assert(idx != NULL);
> parse->nMem = 6;
> @@ -389,18 +411,39 @@ sql_pragma_index_list(struct Parse *parse, const char *tbl_name)
> if (tbl_name == NULL)
> return;
> struct space *space = space_by_name(tbl_name);
> - if (space == NULL)
> + if (space == NULL) {
> + diag_set(ClientError, ER_NO_SUCH_SPACE,
> + tbl_name);
> + parse->rc = SQL_TARANTOOL_ERROR;
> + parse->nErr++;
Seems that this change should be discarded as well.
> return;
> +/*
> + * @brief Check whether the specified token is a string or ID.
> + * @param pToken - token to be examined
> + * @return true - if the token value is enclosed into quotes (')
> + * @return false in other cases
> + * The empty value is considered to be a string.
> + */
> +static bool token_is_string(const Token* pToken)
> +{
> + if (!pToken || pToken->n == 0)
> + return true;
> + return (pToken->n >= 2) &&
> + (pToken->z[0] == '\'') &&
> + (pToken->z[pToken->n - 1] == '\'');
> +}
I fixed codestyle violations:
diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index 158e6269b..3938ae429 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -428,20 +428,20 @@ sql_pragma_index_list(struct Parse *parse, const char *tbl_name)
}
}
-/*
+/**
* @brief Check whether the specified token is a string or ID.
- * @param pToken - token to be examined
+ * @param token - token to be examined
* @return true - if the token value is enclosed into quotes (')
* @return false in other cases
* The empty value is considered to be a string.
*/
-static bool token_is_string(const Token* pToken)
+static bool
+token_is_string(const struct Token *token)
{
- if (!pToken || pToken->n == 0)
+ if (token == NULL || token->n == 0)
return true;
- return (pToken->n >= 2) &&
- (pToken->z[0] == '\'') &&
- (pToken->z[pToken->n - 1] == '\'');
+ return token->n >= 2 && token->z[0] == '\'' &&
+ token->z[token->n - 1] == '\'';
}
/*
> +
> /*
> * Process a pragma statement.
> *
> @@ -601,6 +644,14 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
> }
>
> case PragTyp_DEFAULT_ENGINE: {
> + if (!token_is_string(pValue))
I’d better use sql_token() function.
> + {
Nit: put bracer at the previous line:
if (…) {
> + diag_set(ClientError, ER_ILLEGAL_PARAMS,
> + "string value is expected”);
> + pParse->rc = SQL_TARANTOOL_ERROR;
> + pParse->nErr++;
> + goto pragma_out;
> + }
> if (sql_default_engine_set(zRight) != 0) {
> pParse->rc = SQL_TARANTOOL_ERROR;
> pParse->nErr++;
> diff --git a/test/sql-tap/gh-3733-pragma.test.lua b/test/sql-tap/gh-3733-pragma.test.lua
> new file mode 100755
> index 000000000..5b0dcd26a
> --- /dev/null
> +---
> +--- cleanup
> +—
In sql-tap/ tests we don’t need cleanup:
it is done automatically after execution.
> +test:do_execsql_test(
> + "pragma-8.1",
> + [[
> + DROP TABLE IF EXISTS gh3733;
> + ]], {
> +
> +})
> +
> +test:finish_test()
More information about the Tarantool-patches
mailing list