From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 51D5D26208 for ; Sat, 2 Mar 2019 08:08:06 -0500 (EST) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SrLnjDVIoD1p for ; Sat, 2 Mar 2019 08:08:06 -0500 (EST) Received: from smtpng1.m.smailru.net (smtpng1.m.smailru.net [94.100.181.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id A9FDA2779E for ; Sat, 2 Mar 2019 08:08:05 -0500 (EST) From: imeevma@tarantool.org Subject: [tarantool-patches] [PATCH v3 9/9] sql: remove sqlErrorMsg() Date: Sat, 2 Mar 2019 16:08:03 +0300 Message-Id: In-Reply-To: References: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: korablev@tarantool.org Cc: tarantool-patches@freelists.org This patch replaces sqlErrorMsg() by tt_sprintf() + diag_set(). Part of #3965 --- src/box/sql/build.c | 100 ++++++++++++++++---------- src/box/sql/delete.c | 7 +- src/box/sql/expr.c | 85 +++++++++++++--------- src/box/sql/insert.c | 44 ++++++++---- src/box/sql/parse.y | 12 ++-- src/box/sql/resolve.c | 137 +++++++++++++++++++++++------------- src/box/sql/select.c | 151 +++++++++++++++++++++++++--------------- src/box/sql/sqlInt.h | 1 - src/box/sql/trigger.c | 7 +- src/box/sql/update.c | 19 +++-- src/box/sql/util.c | 31 --------- src/box/sql/vdbemem.c | 4 +- src/box/sql/where.c | 4 +- src/box/sql/whereexpr.c | 8 ++- test/sql-tap/e_select1.test.lua | 20 +++--- test/sql-tap/null.test.lua | 4 +- test/sql-tap/select1.test.lua | 6 +- test/sql-tap/select3.test.lua | 4 +- test/sql-tap/select4.test.lua | 6 +- test/sql-tap/tkt2822.test.lua | 30 ++++---- test/sql-tap/with1.test.lua | 2 +- 21 files changed, 406 insertions(+), 276 deletions(-) diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 64d2690..5d2a7dc 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -271,11 +271,16 @@ int sqlCheckIdentifierName(Parse *pParse, char *zName) { ssize_t len = strlen(zName); - - if (len > BOX_NAME_MAX || identifier_check(zName, len) != 0) { - sqlErrorMsg(pParse, - "identifier name is invalid: %s", - zName); + if (len > BOX_NAME_MAX) { + const char *err_msg = + tt_sprintf("identifier name is invalid: %s", + tt_cstr(zName, BOX_INVALID_NAME_MAX)); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; + return SQL_ERROR; + } + if (identifier_check(zName, len) != 0) { + pParse->is_aborted = true; return SQL_ERROR; } return SQL_OK; @@ -527,9 +532,12 @@ sqlAddDefaultValue(Parse * pParse, ExprSpan * pSpan) struct space_def *def = pParse->new_space->def; if (!sqlExprIsConstantOrFunction (pSpan->pExpr, db->init.busy)) { - sqlErrorMsg(pParse, - "default value of column [%s] is not constant", - def->fields[def->field_count - 1].name); + const char *err_msg = + tt_sprintf("default value of column [%s] is "\ + "not constant", + def->fields[def->field_count - 1].name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; } else { assert(def != NULL); struct field_def *field = @@ -594,9 +602,11 @@ sqlAddPrimaryKey(Parse * pParse, /* Parsing context */ if (space == NULL) goto primary_key_exit; if (sql_space_primary_key(space) != NULL) { - sqlErrorMsg(pParse, - "table \"%s\" has more than one primary key", - space->def->name); + const char *err_msg = tt_sprintf("table \"%s\" has more than "\ + "one primary key", + space->def->name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto primary_key_exit; } if (pList == NULL) { @@ -642,8 +652,12 @@ sqlAddPrimaryKey(Parse * pParse, /* Parsing context */ if (db->mallocFailed) goto primary_key_exit; } else if (autoInc) { - sqlErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " - "INTEGER PRIMARY KEY or INT PRIMARY KEY"); + const char *err_msg = tt_sprintf("AUTOINCREMENT is only "\ + "allowed on an INTEGER "\ + "PRIMARY KEY or INT PRIMARY "\ + "KEY"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto primary_key_exit; } else { sql_create_index(pParse, 0, 0, pList, 0, sortOrder, false, @@ -1149,9 +1163,11 @@ sqlEndTable(Parse * pParse, /* Parse context */ if (!new_space->def->opts.is_view) { if (sql_space_primary_key(new_space) == NULL) { - sqlErrorMsg(pParse, - "PRIMARY KEY missing on table %s", - new_space->def->name); + const char *err_msg = tt_sprintf("PRIMARY KEY missing "\ + "on table %s", + new_space->def->name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto cleanup; } } @@ -1269,8 +1285,10 @@ sql_create_view(struct Parse *parse_context, struct Token *begin, { struct sql *db = parse_context->db; if (parse_context->nVar > 0) { - sqlErrorMsg(parse_context, - "parameters are not allowed in views"); + const char *err_msg = tt_sprintf("parameters are not allowed "\ + "in views"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse_context->is_aborted = true; goto create_view_fail; } sqlStartTable(parse_context, name, if_exists); @@ -1284,10 +1302,13 @@ sql_create_view(struct Parse *parse_context, struct Token *begin, goto create_view_fail; if (aliases != NULL) { if ((int)select_res_space->def->field_count != aliases->nExpr) { - sqlErrorMsg(parse_context, "expected %d columns "\ - "for '%s' but got %d", aliases->nExpr, - space->def->name, - select_res_space->def->field_count); + const char *err_msg = + tt_sprintf("expected %d columns for '%s' but "\ + "got %d", aliases->nExpr, + space->def->name, + select_res_space->def->field_count); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse_context->is_aborted = true; goto create_view_fail; } sqlColumnsFromExprList(parse_context, aliases, space->def); @@ -1609,13 +1630,17 @@ sql_drop_table(struct Parse *parse_context, struct SrcList *table_name_list, * and DROP VIEW is not used on a table. */ if (is_view && !space->def->opts.is_view) { - sqlErrorMsg(parse_context, "use DROP TABLE to delete table %s", - space_name); + const char *err_msg = tt_sprintf("use DROP TABLE to delete "\ + "table %s", space_name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse_context->is_aborted = true; goto exit_drop_table; } if (!is_view && space->def->opts.is_view) { - sqlErrorMsg(parse_context, "use DROP VIEW to delete view %s", - space_name); + const char *err_msg = tt_sprintf("use DROP VIEW to delete "\ + "view %s", space_name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse_context->is_aborted = true; goto exit_drop_table; } /* @@ -1760,8 +1785,10 @@ sql_create_foreign_key(struct Parse *parse_context, struct SrcList *child, } } else { if (parent_space->def->opts.is_view) { - sqlErrorMsg(parse_context, - "referenced table can't be view"); + const char *err_msg = tt_sprintf("referenced table "\ + "can't be view"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse_context->is_aborted = true; goto exit_create_fk; } } @@ -2149,7 +2176,9 @@ sql_create_index(struct Parse *parse, struct Token *token, struct space_def *def = space->def; if (def->opts.is_view) { - sqlErrorMsg(parse, "views can not be indexed"); + const char *err_msg = tt_sprintf("views can not be indexed"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse->is_aborted = true; goto exit_create_index; } /* @@ -2947,11 +2976,8 @@ sqlSavepoint(Parse * pParse, int op, Token * pName) return; } if (op == SAVEPOINT_BEGIN && - sqlCheckIdentifierName(pParse, zName) - != SQL_OK) { - sqlErrorMsg(pParse, "bad savepoint name"); + sqlCheckIdentifierName(pParse, zName) != SQL_OK) return; - } sqlVdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC); } } @@ -3038,9 +3064,11 @@ sqlWithAdd(Parse * pParse, /* Parsing context */ int i; for (i = 0; i < pWith->nCte; i++) { if (strcmp(zName, pWith->a[i].zName) == 0) { - sqlErrorMsg(pParse, - "duplicate WITH table name: %s", - zName); + const char *err_msg = + tt_sprintf("duplicate WITH table "\ + "name: %s", zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; } } } diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c index 87d4ed4..d99a8ea 100644 --- a/src/box/sql/delete.c +++ b/src/box/sql/delete.c @@ -157,8 +157,11 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list, goto delete_from_cleanup; if (trigger_list == NULL) { - sqlErrorMsg(parse, "cannot modify %s because it is a" - " view", space->def->name); + const char *err_msg = tt_sprintf("cannot modify %s "\ + "because it is a view", + space->def->name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse->is_aborted = true; goto delete_from_cleanup; } } diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index ffcb455..14b2985 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -645,7 +645,9 @@ codeVectorCompare(Parse * pParse, /* Code generator context */ int addrDone = sqlVdbeMakeLabel(v); if (nLeft != sqlExprVectorSize(pRight)) { - sqlErrorMsg(pParse, "row value misused"); + const char *err_msg = tt_sprintf("row value misused"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return; } assert(pExpr->op == TK_EQ || pExpr->op == TK_NE @@ -1757,8 +1759,10 @@ sqlExprListAppendVector(Parse * pParse, /* Parsing context */ */ if (pExpr->op != TK_SELECT && pColumns->nId != (n = sqlExprVectorSize(pExpr))) { - sqlErrorMsg(pParse, "%d columns assigned %d values", - pColumns->nId, n); + const char *err_msg = tt_sprintf("%d columns assigned %d "\ + "values", pColumns->nId, n); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto vector_append_error; } @@ -1878,7 +1882,10 @@ sqlExprListCheckLength(Parse * pParse, testcase(pEList && pEList->nExpr == mx); testcase(pEList && pEList->nExpr == mx + 1); if (pEList && pEList->nExpr > mx) { - sqlErrorMsg(pParse, "too many columns in %s", zObject); + const char *err_msg = tt_sprintf("too many columns in %s", + zObject); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; } } @@ -2638,19 +2645,6 @@ expr_in_type(Parse *pParse, Expr *pExpr) } /* - * Load the Parse object passed as the first argument with an error - * message of the form: - * - * "sub-select returns N columns - expected M" - */ -void -sqlSubselectError(Parse * pParse, int nActual, int nExpect) -{ - const char *zFmt = "sub-select returns %d columns - expected %d"; - sqlErrorMsg(pParse, zFmt, nActual, nExpect); -} - -/* * Expression pExpr is a vector that has been used in a context where * it is not permitted. If pExpr is a sub-select vector, this routine * loads the Parse object with a message of the form: @@ -2664,12 +2658,16 @@ sqlSubselectError(Parse * pParse, int nActual, int nExpect) void sqlVectorErrorMsg(Parse * pParse, Expr * pExpr) { + const char *err_msg; if (pExpr->flags & EP_xIsSelect) { - sqlSubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, - 1); + err_msg = tt_sprintf("sub-select returns %d columns - "\ + "expected %d", + pExpr->x.pSelect->pEList->nExpr, 1); } else { - sqlErrorMsg(pParse, "row value misused"); + err_msg = tt_sprintf("row value misused"); } + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; } /* @@ -2955,9 +2953,13 @@ sqlExprCheckIN(Parse * pParse, Expr * pIn) int nVector = sqlExprVectorSize(pIn->pLeft); if ((pIn->flags & EP_xIsSelect)) { if (nVector != pIn->x.pSelect->pEList->nExpr) { - sqlSubselectError(pParse, - pIn->x.pSelect->pEList->nExpr, - nVector); + const char *err_msg = + tt_sprintf("sub-select returns %d columns - "\ + "expected %d", + pIn->x.pSelect->pEList->nExpr, + nVector); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } } else if (nVector != 1) { @@ -3961,9 +3963,12 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) AggInfo *pInfo = pExpr->pAggInfo; if (pInfo == 0) { assert(!ExprHasProperty(pExpr, EP_IntValue)); - sqlErrorMsg(pParse, - "misuse of aggregate: %s()", - pExpr->u.zToken); + const char *err_msg = + tt_sprintf("misuse of aggregate: %s()", + pExpr->u.zToken); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; } else { pExpr->type = pInfo->aFunc->pFunc->ret_type; return pInfo->aFunc[pExpr->iAgg].iMem; @@ -4130,7 +4135,13 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) testcase(op == TK_SELECT); if (op == TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr) != 1) { - sqlSubselectError(pParse, nCol, 1); + const char *err_msg = + tt_sprintf("sub-select returns %d "\ + "columns - expected %d", + nCol, 1); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; } else { return sqlCodeSubselect(pParse, pExpr, 0); } @@ -4149,9 +4160,12 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) sqlExprVectorSize(pExpr-> pLeft)) ) { - sqlErrorMsg(pParse, - "%d columns assigned %d values", - pExpr->iTable, n); + const char *err_msg = + tt_sprintf("%d columns assigned %d "\ + "values", pExpr->iTable, n); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; } return pExpr->pLeft->iTable + pExpr->iColumn; } @@ -4250,7 +4264,9 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) } case TK_VECTOR:{ - sqlErrorMsg(pParse, "row value misused"); + const char *err_msg = tt_sprintf("row value misused"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; break; } @@ -4350,8 +4366,11 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) } case TK_RAISE: if (pParse->triggered_space == NULL) { - sqlErrorMsg(pParse, "RAISE() may only be used " - "within a trigger-program"); + const char *err_msg = tt_sprintf("RAISE() may only be "\ + "used within a "\ + "trigger-program"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 0; } if (pExpr->on_conflict_action == ON_CONFLICT_ACTION_ABORT) diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c index 6f7f020..67aa675 100644 --- a/src/box/sql/insert.c +++ b/src/box/sql/insert.c @@ -322,8 +322,10 @@ sqlInsert(Parse * pParse, /* Parser context */ /* Cannot insert into a read-only table. */ if (is_view && tmask == 0) { - sqlErrorMsg(pParse, "cannot modify %s because it is a view", - space_def->name); + const char *err_msg = tt_sprintf("cannot modify %s because it "\ + "is a view", space_def->name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto insert_cleanup; } @@ -388,16 +390,23 @@ sqlInsert(Parse * pParse, /* Parser context */ } } if (j >= (int) space_def->field_count) { - sqlErrorMsg(pParse, - "table %S has no column named %s", - pTabList, 0, pColumn->a[i].zName); + const char *space_name = + pTabList->a[0].space->def->name; + const char *err_msg = + tt_sprintf("table %s has no column "\ + "named %s", space_name, + pColumn->a[i].zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto insert_cleanup; } if (bit_test(used_columns, j)) { - const char *err; - err = "table id list: duplicate column name %s"; - sqlErrorMsg(pParse, - err, pColumn->a[i].zName); + const char *err_msg = + tt_sprintf("table id list: duplicate "\ + "column name %s", + pColumn->a[i].zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto insert_cleanup; } bit_set(used_columns, j); @@ -508,14 +517,21 @@ sqlInsert(Parse * pParse, /* Parser context */ if (pColumn == NULL && nColumn != 0 && nColumn != (int)space_def->field_count) { - sqlErrorMsg(pParse, - "table %S has %d columns but %d values were supplied", - pTabList, 0, space_def->field_count, nColumn); + const char *space_name = pTabList->a[0].space->def->name; + const char *err_msg = + tt_sprintf("table %s has %d columns but %d values "\ + "were supplied", space_name, + space_def->field_count, nColumn); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto insert_cleanup; } if (pColumn != 0 && nColumn != pColumn->nId) { - sqlErrorMsg(pParse, "%d values for %d columns", nColumn, - pColumn->nId); + const char *err_msg = + tt_sprintf("%d values for %d columns", nColumn, + pColumn->nId); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto insert_cleanup; } diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y index b69f059..3653824 100644 --- a/src/box/sql/parse.y +++ b/src/box/sql/parse.y @@ -897,7 +897,9 @@ expr(A) ::= VARIABLE(X). { Token t = X; if (pParse->parse_only) { spanSet(&A, &t, &t); - sqlErrorMsg(pParse, "bindings are not allowed in DDL"); + const char *err_msg = tt_sprintf("bindings are not allowed in DDL"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; A.pExpr = NULL; } else if (!(X.z[0]=='#' && sqlIsdigit(X.z[1]))) { u32 n = X.n; @@ -1377,9 +1379,11 @@ trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. { trnm(A) ::= nm(A). trnm(A) ::= nm DOT nm(X). { A = X; - sqlErrorMsg(pParse, - "qualified table names are not allowed on INSERT, UPDATE, and DELETE " - "statements within triggers"); + const char *err_msg = tt_sprintf("qualified table names are not allowed on "\ + "INSERT, UPDATE, and DELETE statements "\ + "within triggers"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; } // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE diff --git a/src/box/sql/resolve.c b/src/box/sql/resolve.c index 02eca37..63a1b96 100644 --- a/src/box/sql/resolve.c +++ b/src/box/sql/resolve.c @@ -392,14 +392,25 @@ lookupName(Parse * pParse, /* The parsing context */ pOrig = pEList->a[j].pExpr; if ((pNC->ncFlags & NC_AllowAgg) == 0 && ExprHasProperty(pOrig, EP_Agg)) { - sqlErrorMsg(pParse, - "misuse of aliased aggregate %s", - zAs); + const char *err_msg = + tt_sprintf("misuse of "\ + "aliased "\ + "aggregate "\ + "%s", zAs); + diag_set(ClientError, + ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; return WRC_Abort; } if (sqlExprVectorSize(pOrig) != 1) { - sqlErrorMsg(pParse, - "row value misused"); + const char *err_msg = + tt_sprintf("row value "\ + "misused"); + diag_set(ClientError, + ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; return WRC_Abort; } resolveAlias(pParse, pEList, j, pExpr, @@ -426,12 +437,15 @@ lookupName(Parse * pParse, /* The parsing context */ * more matches. Either way, we have an error. */ if (cnt > 1) { + const char *err_msg; if (zTab) { - sqlErrorMsg(pParse, "ambiguous column name: %s.%s", - zTab, zCol); + err_msg = tt_sprintf("ambiguous column name: %s.%s", + zTab, zCol); } else { - sqlErrorMsg(pParse, "ambiguous column name: %s", zCol); + err_msg = tt_sprintf("ambiguous column name: %s", zCol); } + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; pTopNC->nErr++; } if (cnt == 0) { @@ -633,9 +647,13 @@ resolveExprStep(Walker * pWalker, Expr * pExpr) exprProbability(pList->a[1]. pExpr); if (pExpr->iTable < 0) { - sqlErrorMsg(pParse, - "second argument to likelihood() must be a " - "constant between 0.0 and 1.0"); + const char *err_msg = + tt_sprintf("second argument to likelihood() must be a "\ + "constant between 0.0 and 1.0"); + diag_set(ClientError, + ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; pNC->nErr++; } } else { @@ -678,9 +696,12 @@ resolveExprStep(Walker * pWalker, Expr * pExpr) } } if (is_agg && (pNC->ncFlags & NC_AllowAgg) == 0) { - sqlErrorMsg(pParse, - "misuse of aggregate function %.*s()", - nId, zId); + const char *err_msg = + tt_sprintf("misuse of aggregate "\ + "function %.*s()", nId, zId); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; pNC->nErr++; is_agg = 0; } else if (no_such_func && pParse->db->init.busy == 0 @@ -692,9 +713,13 @@ resolveExprStep(Walker * pWalker, Expr * pExpr) pParse->is_aborted = true; pNC->nErr++; } else if (wrong_num_args) { - sqlErrorMsg(pParse, - "wrong number of arguments to function %.*s()", - nId, zId); + const char *err_msg = + tt_sprintf("wrong number of arguments "\ + "to function %.*s()", nId, + zId); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; pNC->nErr++; } if (is_agg) @@ -802,7 +827,11 @@ resolveExprStep(Walker * pWalker, Expr * pExpr) testcase(pExpr->op == TK_GT); testcase(pExpr->op == TK_GE); testcase(pExpr->op == TK_BETWEEN); - sqlErrorMsg(pParse, "row value misused"); + const char *err_msg = tt_sprintf("row value "\ + "misused"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; } break; } @@ -904,21 +933,6 @@ resolveOrderByTermToExprList(Parse * pParse, /* Parsing context for error messag } /* - * Generate an ORDER BY or GROUP BY term out-of-range error. - */ -static void -resolveOutOfRangeError(Parse * pParse, /* The error context into which to write the error */ - const char *zType, /* "ORDER" or "GROUP" */ - int i, /* The index (1-based) of the term out of range */ - int mx /* Largest permissible value of i */ - ) -{ - sqlErrorMsg(pParse, - "%r %s BY term out of range - should be " - "between 1 and %d", i, zType, mx); -} - -/* * Analyze the ORDER BY clause in a compound SELECT statement. Modify * each term of the ORDER BY clause is a constant integer between 1 * and N where N is the number of columns in the compound SELECT. @@ -950,7 +964,10 @@ resolveCompoundOrderBy(Parse * pParse, /* Parsing context. Leave error messages db = pParse->db; #if SQL_MAX_COLUMN if (pOrderBy->nExpr > db->aLimit[SQL_LIMIT_COLUMN]) { - sqlErrorMsg(pParse, "too many terms in ORDER BY clause"); + const char *err_msg = tt_sprintf("too many terms in ORDER BY "\ + "clause"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } #endif @@ -976,9 +993,13 @@ resolveCompoundOrderBy(Parse * pParse, /* Parsing context. Leave error messages pE = sqlExprSkipCollate(pItem->pExpr); if (sqlExprIsInteger(pE, &iCol)) { if (iCol <= 0 || iCol > pEList->nExpr) { - resolveOutOfRangeError(pParse, "ORDER", - i + 1, - pEList->nExpr); + const char *err_msg = + tt_sprintf("ORDER BY term out "\ + "of range - should "\ + "be between 1 and "\ + "%d", pEList->nExpr); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } } else { @@ -1024,9 +1045,11 @@ resolveCompoundOrderBy(Parse * pParse, /* Parsing context. Leave error messages } for (i = 0; i < pOrderBy->nExpr; i++) { if (pOrderBy->a[i].done == 0) { - sqlErrorMsg(pParse, - "%r ORDER BY term does not match any " - "column in the result set", i + 1); + const char *err_msg = + tt_sprintf("ORDER BY term does not match any "\ + "column in the result set"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } } @@ -1059,8 +1082,10 @@ sqlResolveOrderGroupBy(Parse * pParse, /* Parsing context. Leave error messages return 0; #if SQL_MAX_COLUMN if (pOrderBy->nExpr > db->aLimit[SQL_LIMIT_COLUMN]) { - sqlErrorMsg(pParse, "too many terms in %s BY clause", - zType); + const char *err_msg = tt_sprintf("too many terms in %s BY "\ + "clause", zType); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } #endif @@ -1069,8 +1094,12 @@ sqlResolveOrderGroupBy(Parse * pParse, /* Parsing context. Leave error messages for (i = 0, pItem = pOrderBy->a; i < pOrderBy->nExpr; i++, pItem++) { if (pItem->u.x.iOrderByCol) { if (pItem->u.x.iOrderByCol > pEList->nExpr) { - resolveOutOfRangeError(pParse, zType, i + 1, - pEList->nExpr); + const char *err_msg = + tt_sprintf("%s BY term out of range - "\ + "should be between 1 and %d", + zType, pEList->nExpr); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol - 1, @@ -1136,8 +1165,12 @@ resolveOrderGroupBy(NameContext * pNC, /* The name context of the SELECT stateme * order-by term to a copy of the result-set expression */ if (iCol < 1 || iCol > 0xffff) { - resolveOutOfRangeError(pParse, zType, i + 1, - nResult); + const char *err_msg = + tt_sprintf("%s BY term out of range - "\ + "should be between 1 and %d", + zType, nResult); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } pItem->u.x.iOrderByCol = (u16) iCol; @@ -1417,9 +1450,15 @@ resolveSelectStep(Walker * pWalker, Select * p) for (i = 0, pItem = pGroupBy->a; i < pGroupBy->nExpr; i++, pItem++) { if (ExprHasProperty(pItem->pExpr, EP_Agg)) { - sqlErrorMsg(pParse, - "aggregate functions are not allowed in " - "the GROUP BY clause"); + const char *err_msg = + tt_sprintf("aggregate "\ + "functions are not "\ + "allowed in the "\ + "GROUP BY clause"); + diag_set(ClientError, + ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; return WRC_Abort; } } diff --git a/src/box/sql/select.c b/src/box/sql/select.c index 261a8bd..f15e453 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -397,13 +397,18 @@ sqlJoinType(Parse * pParse, Token * pA, Token * pB, Token * pC) } if ((jointype & (JT_INNER | JT_OUTER)) == (JT_INNER | JT_OUTER) || (jointype & JT_ERROR) != 0) { - const char *zSp = " "; - assert(pB != 0); + const char *err_msg; if (pC == 0) { - zSp++; + err_msg = tt_sprintf("unknown or unsupported join "\ + "type: %.*s %.*s", pA->n, pA->z, + pB->n, pB->z); + } else { + err_msg = tt_sprintf("unknown or unsupported join "\ + "type: %.*s %.*s %.*s", pA->n, + pA->z, pB->n, pB->z, pC->n, pC->z); } - sqlErrorMsg(pParse, "unknown or unsupported join type: " - "%T %T%s%T", pA, pB, zSp, pC); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; jointype = JT_INNER; } else if ((jointype & JT_OUTER) != 0 && (jointype & (JT_LEFT | JT_RIGHT)) != JT_LEFT) { @@ -590,9 +595,13 @@ sqlProcessJoin(Parse * pParse, Select * p) */ if (pRight->fg.jointype & JT_NATURAL) { if (pRight->pOn || pRight->pUsing) { - sqlErrorMsg(pParse, - "a NATURAL join may not have " - "an ON or USING clause", 0); + const char *err_msg = + tt_sprintf("a NATURAL join may not "\ + "have an ON or USING "\ + "clause"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; return 1; } for (j = 0; j < (int)right_space->def->field_count; j++) { @@ -613,8 +622,11 @@ sqlProcessJoin(Parse * pParse, Select * p) /* Disallow both ON and USING clauses in the same join */ if (pRight->pOn && pRight->pUsing) { - sqlErrorMsg(pParse, "cannot have both ON and USING " - "clauses in the same join"); + const char *err_msg = + tt_sprintf("cannot have both ON and USING " + "clauses in the same join"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return 1; } @@ -650,10 +662,16 @@ sqlProcessJoin(Parse * pParse, Select * p) || !tableAndColumnIndex(pSrc, i + 1, zName, &iLeft, &iLeftCol) ) { - sqlErrorMsg(pParse, - "cannot join using column %s - column " - "not present in both tables", - zName); + const char *err_msg = + tt_sprintf("cannot join using "\ + "column %s - "\ + "column not "\ + "present in both "\ + "tables", zName); + diag_set(ClientError, + ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; return 1; } addWhereTerm(pParse, pSrc, iLeft, iLeftCol, @@ -2601,16 +2619,20 @@ multiSelect(Parse * pParse, /* Parsing context */ pPrior = p->pPrior; dest = *pDest; if (pPrior->pOrderBy) { - sqlErrorMsg(pParse, - "ORDER BY clause should come after %s not before", - selectOpName(p->op)); + const char *err_msg = + tt_sprintf("ORDER BY clause should come after %s not "\ + "before", selectOpName(p->op)); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; rc = 1; goto multi_select_end; } if (pPrior->pLimit) { - sqlErrorMsg(pParse, - "LIMIT clause should come after %s not before", - selectOpName(p->op)); + const char *err_msg = + tt_sprintf("LIMIT clause should come after %s not "\ + "before", selectOpName(p->op)); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; rc = 1; goto multi_select_end; } @@ -2991,14 +3013,17 @@ multiSelect(Parse * pParse, /* Parsing context */ void sqlSelectWrongNumTermsError(struct Parse *parse, struct Select * p) { + const char *err_msg; if (p->selFlags & SF_Values) { - sqlErrorMsg(parse, "all VALUES must have the same number "\ - "of terms"); + err_msg = tt_sprintf("all VALUES must have the same number of "\ + "terms"); } else { - sqlErrorMsg(parse, "SELECTs to the left and right of %s " - "do not have the same number of result columns", - selectOpName(p->op)); + err_msg = tt_sprintf("SELECTs to the left and right of %s do "\ + "not have the same number of result "\ + "columns", selectOpName(p->op)); } + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + parse->is_aborted = true; } /** @@ -4521,21 +4546,6 @@ convertCompoundSelectToSubquery(Walker * pWalker, Select * p) return WRC_Continue; } -/* - * Check to see if the FROM clause term pFrom has table-valued function - * arguments. If it does, leave an error message in pParse and return - * non-zero, since pFrom is not allowed to be a table-valued function. - */ -static int -cannotBeFunction(Parse * pParse, struct SrcList_item *pFrom) -{ - if (pFrom->fg.isTabFunc) { - sqlErrorMsg(pParse, "'%s' is not a function", pFrom->zName); - return 1; - } - return 0; -} - #ifndef SQL_OMIT_CTE /* * Argument pWith (which may be NULL) points to a linked list of nested @@ -4630,11 +4640,20 @@ withExpand(Walker * pWalker, struct SrcList_item *pFrom) * In this case, proceed. */ if (pCte->zCteErr) { - sqlErrorMsg(pParse, pCte->zCteErr, pCte->zName); + const char *err_msg = + tt_sprintf(pCte->zCteErr, pCte->zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return SQL_ERROR; } - if (cannotBeFunction(pParse, pFrom)) + if (pFrom->fg.isTabFunc) { + const char *err_msg = + tt_sprintf("'%s' is not a function", + pFrom->zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return SQL_ERROR; + } assert(pFrom->space == NULL); pFrom->space = sql_ephemeral_space_new(pParse, pCte->zName); @@ -4666,9 +4685,11 @@ withExpand(Walker * pWalker, struct SrcList_item *pFrom) } } if (ref_counter > 1) { - sqlErrorMsg(pParse, - "multiple references to recursive table: %s", - pCte->zName); + const char *err_msg = + tt_sprintf("multiple references to recursive "\ + "table: %s", pCte->zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return SQL_ERROR; } assert(ref_counter == 0 || @@ -4684,10 +4705,14 @@ withExpand(Walker * pWalker, struct SrcList_item *pFrom) pEList = pLeft->pEList; if (pCte->pCols) { if (pEList && pEList->nExpr != pCte->pCols->nExpr) { - sqlErrorMsg(pParse, - "table %s has %d values for %d columns", - pCte->zName, pEList->nExpr, - pCte->pCols->nExpr); + const char *err_msg = + tt_sprintf("table %s has %d values "\ + "for %d columns", + pCte->zName, pEList->nExpr, + pCte->pCols->nExpr); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; pParse->pWith = pSavedWith; return SQL_ERROR; } @@ -4843,8 +4868,15 @@ selectExpander(Walker * pWalker, Select * p) struct space *space = sql_lookup_space(pParse, pFrom); if (space == NULL) return WRC_Abort; - if (cannotBeFunction(pParse, pFrom)) + if (pFrom->fg.isTabFunc) { + const char *err_msg = + tt_sprintf("'%s' is not a function", + pFrom->zName); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; return WRC_Abort; + } if (space->def->opts.is_view) { struct Select *select = sql_view_compile(db, space->def->opts.sql); @@ -5254,9 +5286,11 @@ resetAccumulator(Parse * pParse, AggInfo * pAggInfo) Expr *pE = pFunc->pExpr; assert(!ExprHasProperty(pE, EP_xIsSelect)); if (pE->x.pList == 0 || pE->x.pList->nExpr != 1) { - sqlErrorMsg(pParse, - "DISTINCT aggregates must have exactly one " - "argument"); + const char *err_msg = + tt_sprintf("DISTINCT aggregates must "\ + "have exactly one argument"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; pFunc->iDistinct = -1; } else { struct sql_key_info *key_info = @@ -5526,10 +5560,13 @@ sqlSelect(Parse * pParse, /* The parser context */ * columns in the SELECT on the RHS */ if ((int)space->def->field_count != pSub->pEList->nExpr) { - sqlErrorMsg(pParse, - "expected %d columns for '%s' but got %d", - space->def->field_count, space->def->name, - pSub->pEList->nExpr); + const char *err_msg = + tt_sprintf("expected %d columns for '%s' but "\ + "got %d", space->def->field_count, + space->def->name, + pSub->pEList->nExpr); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto select_end; } diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index 85718e1..5a74c65 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -3182,7 +3182,6 @@ void sqlTreeViewWith(TreeView *, const With *); #endif void sqlSetString(char **, sql *, const char *); -void sqlErrorMsg(Parse *, const char *, ...); void sqlDequote(char *); void sqlNormalizeName(char *z); void sqlTokenInit(Token *, char *); diff --git a/src/box/sql/trigger.c b/src/box/sql/trigger.c index 2f1268a..297ba01 100644 --- a/src/box/sql/trigger.c +++ b/src/box/sql/trigger.c @@ -621,8 +621,11 @@ codeTriggerProgram(Parse * pParse, /* The parser context */ sqlSubProgramsRemaining--; if (sqlSubProgramsRemaining == 0) { - sqlErrorMsg(pParse, - "Maximum number of chained trigger activations exceeded."); + const char *err_msg = tt_sprintf("Maximum number of chained "\ + "trigger activations "\ + "exceeded."); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; } for (pStep = pStepList; pStep; pStep = pStep->pNext) { diff --git a/src/box/sql/update.c b/src/box/sql/update.c index 05ceeb4..88ebc90 100644 --- a/src/box/sql/update.c +++ b/src/box/sql/update.c @@ -139,8 +139,10 @@ sqlUpdate(Parse * pParse, /* The parser context */ goto update_cleanup; } if (is_view && tmask == 0) { - sqlErrorMsg(pParse, "cannot modify %s because it is a view", - space->def->name); + const char *err_msg = tt_sprintf("cannot modify %s because it "\ + "is a view", space->def->name); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; goto update_cleanup; } @@ -178,10 +180,15 @@ sqlUpdate(Parse * pParse, /* The parser context */ sql_space_column_is_in_pk(space, j)) is_pk_modified = true; if (aXRef[j] != -1) { - sqlErrorMsg(pParse, - "set id list: duplicate" - " column name %s", - pChanges->a[i].zName); + const char *err_msg = + tt_sprintf("set id list: "\ + "duplicate column "\ + "name %s", + pChanges->a[i].zName); + diag_set(ClientError, + ER_SQL_PARSER_GENERIC, + err_msg); + pParse->is_aborted = true; goto update_cleanup; } aXRef[j] = i; diff --git a/src/box/sql/util.c b/src/box/sql/util.c index 07527ff..cac404f 100644 --- a/src/box/sql/util.c +++ b/src/box/sql/util.c @@ -211,37 +211,6 @@ sqlErrorWithMsg(sql * db, int err_code, const char *zFormat, ...) } /* - * Add an error message to diag. - * The following formatting characters are allowed: - * - * %s Insert a string - * %z A string that should be freed after use - * %d Insert an integer - * %T Insert a token - * %S Insert the first element of a SrcList - * - * This function should be used to report any error that occurs while - * compiling an SQL statement (i.e. within sql_prepare()). The - * last thing the sql_prepare() function does is copy the error - * stored by this function into the database handle using sqlError(). - * Functions sqlError() or sqlErrorWithMsg() should be used - * during statement execution (sql_step() etc.). - */ -void -sqlErrorMsg(Parse * pParse, const char *zFormat, ...) -{ - char *zMsg; - va_list ap; - sql *db = pParse->db; - va_start(ap, zFormat); - zMsg = sqlVMPrintf(db, zFormat, ap); - va_end(ap); - diag_set(ClientError, ER_SQL_PARSER_GENERIC, zMsg); - sqlDbFree(db, zMsg); - pParse->is_aborted = true; -} - -/* * Convert an SQL-style quoted string into a normal string by removing * the quote characters. The conversion is done in-place. If the * input does not begin with a quote character, then this routine diff --git a/src/box/sql/vdbemem.c b/src/box/sql/vdbemem.c index 9957f3a..d4fbf17 100644 --- a/src/box/sql/vdbemem.c +++ b/src/box/sql/vdbemem.c @@ -1222,7 +1222,9 @@ valueFromFunction(sql * db, /* The database connection */ pFunc->xSFunc(&ctx, nVal, apVal); if (ctx.isError) { rc = ctx.isError; - sqlErrorMsg(pCtx->pParse, "%s", sql_value_text(pVal)); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, + sql_value_text(pVal)); + pCtx->pParse->is_aborted = true; } else { sql_value_apply_type(pVal, type); assert(rc == SQL_OK); diff --git a/src/box/sql/where.c b/src/box/sql/where.c index 33885d0..e2c91e0 100644 --- a/src/box/sql/where.c +++ b/src/box/sql/where.c @@ -3914,7 +3914,9 @@ wherePathSolver(WhereInfo * pWInfo, LogEst nRowEst) } if (nFrom == 0) { - sqlErrorMsg(pParse, "no query solution"); + const char *err_msg = tt_sprintf("no query solution"); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; sqlDbFree(db, pSpace); return SQL_ERROR; } diff --git a/src/box/sql/whereexpr.c b/src/box/sql/whereexpr.c index 6df28ad..535914f 100644 --- a/src/box/sql/whereexpr.c +++ b/src/box/sql/whereexpr.c @@ -1497,9 +1497,11 @@ sqlWhereTabFuncArgs(Parse * pParse, /* Parsing context */ while (k < (int)space_def->field_count) k++; if (k >= (int)space_def->field_count) { - sqlErrorMsg(pParse, - "too many arguments on %s() - max %d", - space_def->name, j); + const char *err_msg = + tt_sprintf("too many arguments on %s() - max "\ + "%d", space_def->name, j); + diag_set(ClientError, ER_SQL_PARSER_GENERIC, err_msg); + pParse->is_aborted = true; return; } pColRef = sqlExprAlloc(pParse->db, TK_COLUMN, 0, 0); diff --git a/test/sql-tap/e_select1.test.lua b/test/sql-tap/e_select1.test.lua index e190ad7..16a31a8 100755 --- a/test/sql-tap/e_select1.test.lua +++ b/test/sql-tap/e_select1.test.lua @@ -1855,13 +1855,13 @@ test:do_catchsql_test( "e_select-8.7.1.1", "SELECT x FROM d1 UNION ALL SELECT a FROM d2 ORDER BY x*z", { - 1, "1st ORDER BY term does not match any column in the result set"}) + 1, "ORDER BY term does not match any column in the result set"}) test:do_catchsql_test( "e_select-8.7.1.2", "SELECT x,z FROM d1 UNION ALL SELECT a,b FROM d2 ORDER BY x, x/z", { - 1, "2nd ORDER BY term does not match any column in the result set"}) + 1, "ORDER BY term does not match any column in the result set"}) test:do_select_tests( "e_select-8.7.2", @@ -2077,20 +2077,20 @@ test:do_select_tests( -- EVIDENCE-OF: R-39265-04070 If no matching expression can be found in -- the result columns of any constituent SELECT, it is an error. -- -for _, val in ipairs({{1, "SELECT a FROM d5 UNION SELECT c FROM d6 ORDER BY a+1", "1st"}, - {2, "SELECT a FROM d5 UNION SELECT c FROM d6 ORDER BY a, a+1", "2nd"}, - {3, "SELECT * FROM d5 INTERSECT SELECT * FROM d6 ORDER BY \"hello\"", "1st"}, - {4, "SELECT * FROM d5 INTERSECT SELECT * FROM d6 ORDER BY blah", "1st"}, - {5, "SELECT * FROM d5 INTERSECT SELECT * FROM d6 ORDER BY c,d,c+d", "3rd"}, - {6, "SELECT * FROM d5 EXCEPT SELECT * FROM d7 ORDER BY 1,2,b,a/b", "4th"}}) do +for _, val in ipairs({{1, "SELECT a FROM d5 UNION SELECT c FROM d6 ORDER BY a+1"}, + {2, "SELECT a FROM d5 UNION SELECT c FROM d6 ORDER BY a, a+1"}, + {3, "SELECT * FROM d5 INTERSECT SELECT * FROM d6 ORDER BY \"hello\""}, + {4, "SELECT * FROM d5 INTERSECT SELECT * FROM d6 ORDER BY blah"}, + {5, "SELECT * FROM d5 INTERSECT SELECT * FROM d6 ORDER BY c,d,c+d"}, + {6, "SELECT * FROM d5 EXCEPT SELECT * FROM d7 ORDER BY 1,2,b,a/b"}}) do local tn = val[1] local select = val[2] - local err_param = val[3] test:do_catchsql_test( "e_select-8.14."..tn, select, { - 1, string.format("%s ORDER BY term does not match any column in the result set", err_param)}) + 1, "ORDER BY term does not match any column in the result set" + }) end -- EVIDENCE-OF: R-03407-11483 Each term of the ORDER BY clause is -- processed separately and may be matched against result columns from diff --git a/test/sql-tap/null.test.lua b/test/sql-tap/null.test.lua index 50a2cfb..cf6bcc9 100755 --- a/test/sql-tap/null.test.lua +++ b/test/sql-tap/null.test.lua @@ -295,7 +295,7 @@ test:do_catchsql_test( select b from t1 union select c from t1 order by t1.a; ]], { -- - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) @@ -305,7 +305,7 @@ test:do_catchsql_test( select b from t1 union select c from t1 order by t1.a; ]], { -- - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) diff --git a/test/sql-tap/select1.test.lua b/test/sql-tap/select1.test.lua index d73429a..470a8f7 100755 --- a/test/sql-tap/select1.test.lua +++ b/test/sql-tap/select1.test.lua @@ -840,7 +840,7 @@ test:do_catchsql_test( SELECT * FROM t5 ORDER BY 3; ]], { -- - 1, "1st ORDER BY term out of range - should be between 1 and 2" + 1, "ORDER BY term out of range - should be between 1 and 2" -- }) @@ -850,7 +850,7 @@ test:do_catchsql_test( SELECT * FROM t5 ORDER BY -1; ]], { -- - 1, "1st ORDER BY term out of range - should be between 1 and 2" + 1, "ORDER BY term out of range - should be between 1 and 2" -- }) @@ -1334,7 +1334,7 @@ test:do_catchsql2_test( ORDER BY f2+101; ]], { -- - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) diff --git a/test/sql-tap/select3.test.lua b/test/sql-tap/select3.test.lua index 9fb825f..d2807bf 100755 --- a/test/sql-tap/select3.test.lua +++ b/test/sql-tap/select3.test.lua @@ -157,7 +157,7 @@ test:do_catchsql_test("select3-2.10", [[ SELECT log, count(*) FROM t1 GROUP BY 0 ORDER BY log; ]], { -- - 1, "1st GROUP BY term out of range - should be between 1 and 2" + 1, "GROUP BY term out of range - should be between 1 and 2" -- }) @@ -165,7 +165,7 @@ test:do_catchsql_test("select3-2.11", [[ SELECT log, count(*) FROM t1 GROUP BY 3 ORDER BY log; ]], { -- - 1, "1st GROUP BY term out of range - should be between 1 and 2" + 1, "GROUP BY term out of range - should be between 1 and 2" -- }) diff --git a/test/sql-tap/select4.test.lua b/test/sql-tap/select4.test.lua index bd2ada9..e451038 100755 --- a/test/sql-tap/select4.test.lua +++ b/test/sql-tap/select4.test.lua @@ -450,7 +450,7 @@ test:do_catchsql_test( ORDER BY "xyzzy"; ]], { -- - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) @@ -463,7 +463,7 @@ test:do_catchsql_test( ORDER BY "xyzzy"; ]], { -- - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) @@ -515,7 +515,7 @@ test:do_catchsql_test( ORDER BY 2; ]], { -- - 1, "1st ORDER BY term out of range - should be between 1 and 1" + 1, "ORDER BY term out of range - should be between 1 and 1" -- }) diff --git a/test/sql-tap/tkt2822.test.lua b/test/sql-tap/tkt2822.test.lua index 4212cbd..d125008 100755 --- a/test/sql-tap/tkt2822.test.lua +++ b/test/sql-tap/tkt2822.test.lua @@ -200,7 +200,7 @@ test:do_catchsql_test( SELECT a, b, c FROM t1 UNION ALL SELECT a, b, c FROM t2 ORDER BY x ]], { -- - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) @@ -298,7 +298,7 @@ test:do_test( ]] end, { -- - 1, "1st ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -308,7 +308,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 0; ]], { -- - 1, "2nd ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -318,7 +318,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 26; ]], { -- - 1, "2nd ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -328,7 +328,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 65536; ]], { -- - 1, "2nd ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -338,7 +338,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 0; ]], { -- - 1, "3rd ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -348,7 +348,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 3, 0; ]], { -- - 1, "4th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -358,7 +358,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 0; ]], { -- - 1, "9th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -368,7 +368,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 0; ]], { -- - 1, "10th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -378,7 +378,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0; ]], { -- - 1, "11th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -388,7 +388,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 0; ]], { -- - 1, "12th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -398,7 +398,7 @@ test:do_catchsql_test( SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 0; ]], { -- - 1, "13th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -409,7 +409,7 @@ test:do_catchsql_test( 11,12,13,14,15,16,17,18,19, 0 ]], { -- - 1, "20th ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -420,7 +420,7 @@ test:do_catchsql_test( 11,12,13,14,15,16,17,18,19, 20, 0 ]], { -- - 1, "21st ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) @@ -431,7 +431,7 @@ test:do_catchsql_test( 11,12,13,14,15,16,17,18,19, 20, 21, 0 ]], { -- - 1, "22nd ORDER BY term out of range - should be between 1 and 25" + 1, "ORDER BY term out of range - should be between 1 and 25" -- }) diff --git a/test/sql-tap/with1.test.lua b/test/sql-tap/with1.test.lua index 16c9b12..deb4cbb 100755 --- a/test/sql-tap/with1.test.lua +++ b/test/sql-tap/with1.test.lua @@ -782,7 +782,7 @@ test:do_catchsql_test("10.7.1", [[ SELECT * FROM t ]], { -- <10.7.1> - 1, "1st ORDER BY term does not match any column in the result set" + 1, "ORDER BY term does not match any column in the result set" -- }) -- 2.7.4