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 8452C2E6C2 for ; Mon, 10 Jun 2019 09:56:33 -0400 (EDT) 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 mN0wgxNZQ9rN for ; Mon, 10 Jun 2019 09:56:33 -0400 (EDT) Received: from smtp1.mail.ru (smtp1.mail.ru [94.100.179.111]) (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 1B47E2E6AA for ; Mon, 10 Jun 2019 09:56:33 -0400 (EDT) From: imeevma@tarantool.org Subject: [tarantool-patches] [PATCH v1 04/28] sql: remove sqlError() and remove sqlErrorWithMsg() Date: Mon, 10 Jun 2019 16:56:31 +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: v.shpilevoy@tarantool.org Cc: tarantool-patches@freelists.org These functions are part of the SQL error system, which is replaced by the Tarantool error system. They are not needed now, so they will be deleted. --- src/box/lua/lua_sql.c | 2 +- src/box/sql/legacy.c | 2 -- src/box/sql/main.c | 83 +++++++------------------------------------ src/box/sql/malloc.c | 1 - src/box/sql/prepare.c | 6 ++-- src/box/sql/sqlInt.h | 6 ---- src/box/sql/util.c | 69 ----------------------------------- src/box/sql/vdbeInt.h | 1 - src/box/sql/vdbeapi.c | 7 +--- src/box/sql/vdbeaux.c | 31 +++++----------- test/sql/func-recreate.result | 3 +- 11 files changed, 27 insertions(+), 184 deletions(-) diff --git a/src/box/lua/lua_sql.c b/src/box/lua/lua_sql.c index 529ee59..4d90a53 100644 --- a/src/box/lua/lua_sql.c +++ b/src/box/lua/lua_sql.c @@ -199,6 +199,6 @@ lbox_sql_create_function(struct lua_State *L) func_info, lua_sql_call, NULL, NULL, lua_sql_destroy); if (rc != 0) - return luaL_error(L, sqlErrStr(rc)); + return luaT_error(L); return 0; } diff --git a/src/box/sql/legacy.c b/src/box/sql/legacy.c index a57677e..d519991 100644 --- a/src/box/sql/legacy.c +++ b/src/box/sql/legacy.c @@ -69,7 +69,6 @@ sql_exec(sql * db, /* The database on which the SQL executes */ if (zSql == 0) zSql = ""; - sqlError(db, SQL_OK); while (rc == SQL_OK && zSql[0]) { int nCol; char **azVals = 0; @@ -141,7 +140,6 @@ sql_exec(sql * db, /* The database on which the SQL executes */ rc = SQL_ABORT; sqlVdbeFinalize((Vdbe *) pStmt); pStmt = 0; - sqlError(db, SQL_ABORT); goto exec_out; } } diff --git a/src/box/sql/main.c b/src/box/sql/main.c index 155cbcc..f35c84f 100644 --- a/src/box/sql/main.c +++ b/src/box/sql/main.c @@ -284,61 +284,6 @@ functionDestroy(sql * db, FuncDef * p) } /* - * Return TRUE if database connection db has unfinalized prepared - * statement. - */ -static int -connectionIsBusy(sql * db) -{ - if (db->pVdbe) - return 1; - return 0; -} - -/* - * Close an existing sql database - */ -static int -sqlClose(sql * db, int forceZombie) -{ - assert(db); - if (!sqlSafetyCheckSickOrOk(db)) { - return SQL_MISUSE; - } - if (db->mTrace & SQL_TRACE_CLOSE) { - db->xTrace(SQL_TRACE_CLOSE, db->pTraceArg, db, 0); - } - - /* Legacy behavior (sql_close() behavior) is to return - * SQL_BUSY if the connection can not be closed immediately. - */ - if (!forceZombie && connectionIsBusy(db)) { - sqlErrorWithMsg(db, SQL_BUSY, - "unable to close due to unfinalized " - "statements"); - return SQL_BUSY; - } - - /* Convert the connection into a zombie and then close it. - */ - db->magic = SQL_MAGIC_ZOMBIE; - - return SQL_OK; -} - -/* - * Two variations on the public interface for closing a database - * connection. The sql_close() version returns SQL_BUSY and - * leaves the connection option if there are unfinalized prepared - * statements. - */ -int -sql_close(sql * db) -{ - return sqlClose(db, 0); -} - -/* * Rollback all database files. If tripCode is not SQL_OK, then * any write cursors are invalidated ("tripped" - as in "tripping a circuit * breaker") and made to return tripCode if there are any further @@ -417,7 +362,9 @@ sqlCreateFunc(sql * db, (!xSFunc && (!xFinal && xStep)) || (nArg < -1 || nArg > SQL_MAX_FUNCTION_ARG) || (255 < (sqlStrlen30(zFunctionName)))) { - return SQL_MISUSE; + diag_set(ClientError, ER_CREATE_FUNCTION, zFunctionName, + "wrong function definition"); + return SQL_TARANTOOL_ERROR; } assert(SQL_FUNC_CONSTANT == SQL_DETERMINISTIC); @@ -432,10 +379,10 @@ sqlCreateFunc(sql * db, p = sqlFindFunction(db, zFunctionName, nArg, 0); if (p && p->nArg == nArg) { if (db->nVdbeActive) { - sqlErrorWithMsg(db, SQL_BUSY, - "unable to delete/modify user-function due to active statements"); - assert(!db->mallocFailed); - return SQL_BUSY; + diag_set(ClientError, ER_CREATE_FUNCTION, zFunctionName, + "unable to create function due to active "\ + "statements"); + return SQL_TARANTOOL_ERROR; } else { sqlExpirePreparedStatements(db); } @@ -443,9 +390,8 @@ sqlCreateFunc(sql * db, p = sqlFindFunction(db, zFunctionName, nArg, 1); assert(p || db->mallocFailed); - if (!p) { - return SQL_NOMEM; - } + if (p == NULL) + return SQL_TARANTOOL_ERROR; /* If an older version of the function with a configured destructor is * being replaced invoke the destructor function here. @@ -716,22 +662,17 @@ sql_init_db(sql **out_db) * database schema yet. This is delayed until the first time the database * is accessed. */ - sqlError(db, SQL_OK); sqlRegisterPerConnectionBuiltinFunctions(db); - if (rc) - sqlError(db, rc); - /* Enable the lookaside-malloc subsystem */ setupLookaside(db, 0, sqlGlobalConfig.szLookaside, sqlGlobalConfig.nLookaside); opendb_out: assert(db != 0 || rc == SQL_NOMEM); - if (rc == SQL_NOMEM) { - sql_close(db); - db = 0; - } else if (rc != SQL_OK) + if (rc == SQL_NOMEM) + db = NULL; + else if (rc != SQL_OK) db->magic = SQL_MAGIC_SICK; *out_db = db; diff --git a/src/box/sql/malloc.c b/src/box/sql/malloc.c index 72a1fb9..925ffb2 100644 --- a/src/box/sql/malloc.c +++ b/src/box/sql/malloc.c @@ -926,7 +926,6 @@ static SQL_NOINLINE int apiOomError(sql * db) { sqlOomClear(db); - sqlError(db, SQL_NOMEM); return SQL_NOMEM; } diff --git a/src/box/sql/prepare.c b/src/box/sql/prepare.c index e2f8c0b..e692be0 100644 --- a/src/box/sql/prepare.c +++ b/src/box/sql/prepare.c @@ -81,9 +81,9 @@ sqlPrepare(sql * db, /* Database handle. */ testcase(nBytes == mxLen); testcase(nBytes == mxLen + 1); if (nBytes > mxLen) { - sqlErrorWithMsg(db, SQL_TOOBIG, - "statement too long"); - rc = sqlApiExit(db, SQL_TOOBIG); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, + "SQL command length", nBytes, mxLen); + rc = SQL_TARANTOOL_ERROR; goto end_prepare; } zSqlCopy = sqlDbStrNDup(db, zSql, nBytes); diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index bda3df1..2b7aa8b 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -931,8 +931,6 @@ sql_stmt_busy(sql_stmt *); int sql_init_db(sql **db); -int -sql_close(sql *); /** * Get number of the named parameter in the prepared sql @@ -1437,7 +1435,6 @@ struct sql { struct coll *pDfltColl; /* The default collating sequence (BINARY) */ i64 szMmap; /* Default mmap_size setting */ int errMask; /* & result codes with this before returning */ - int iSysErrno; /* Errno value from last system error */ u16 dbOptFlags; /* Flags to enable/disable optimizations */ u8 enc; /* Text encoding */ u8 temp_store; /* 1: file 2: memory 0: default */ @@ -4460,9 +4457,6 @@ sql_atoi64(const char *z, int64_t *val, int length); int sql_dec_or_hex_to_i64(const char *z, int64_t *val); -void sqlErrorWithMsg(sql *, int, const char *, ...); -void sqlError(sql *, int); -void sqlSystemError(sql *, int); void *sqlHexToBlob(sql *, const char *z, int n); u8 sqlHexToInt(int h); diff --git a/src/box/sql/util.c b/src/box/sql/util.c index 819f7fa..d5f6447 100644 --- a/src/box/sql/util.c +++ b/src/box/sql/util.c @@ -131,75 +131,6 @@ sqlStrlen30(const char *z) } /* - * Helper function for sqlError() - called rarely. Broken out into - * a separate routine to avoid unnecessary register saves on entry to - * sqlError(). - */ -static SQL_NOINLINE void -sqlErrorFinish(sql * db, int err_code) -{ - sqlSystemError(db, err_code); -} - -/* - * Set the current error code to err_code and clear any prior error message. - * Also set iSysErrno (by calling sqlSystem) if the err_code indicates - * that would be appropriate. - */ -void -sqlError(sql * db, int err_code) -{ - assert(db != 0); - if (err_code) - sqlErrorFinish(db, err_code); -} - -/* - * Load the sql.iSysErrno field if that is an appropriate thing - * to do based on the sql error code in rc. - */ -void -sqlSystemError(sql * db, int rc) -{ - if (rc == SQL_IOERR_NOMEM) - return; - rc &= 0xff; - if (rc == SQL_CANTOPEN || rc == SQL_IOERR) { - db->iSysErrno = sqlOsGetLastError(db->pVfs); - } -} - -/* - * Set the most recent error code and error string for the sql - * handle "db". The error code is set to "err_code". - * - * If it is not NULL, string zFormat specifies the format of the - * error string in the style of the printf functions: The following - * format 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 - * - * zFormat and any string tokens that follow it are assumed to be - * encoded in UTF-8. - * - * To clear the most recent error for sql handle "db", sqlError - * should be called with err_code set to SQL_OK and zFormat set - * to NULL. - */ -void -sqlErrorWithMsg(sql * db, int err_code, const char *zFormat, ...) -{ - assert(db != 0); - sqlSystemError(db, err_code); - if (zFormat == 0) - sqlError(db, err_code); -} - -/* * 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/vdbeInt.h b/src/box/sql/vdbeInt.h index 8b212e3..8da0c29 100644 --- a/src/box/sql/vdbeInt.h +++ b/src/box/sql/vdbeInt.h @@ -507,7 +507,6 @@ int sqlVdbeMemClearAndResize(Mem * pMem, int n); int sqlVdbeCloseStatement(Vdbe *, int); void sqlVdbeFrameDelete(VdbeFrame *); int sqlVdbeFrameRestore(VdbeFrame *); -int sqlVdbeTransferError(Vdbe * p); int sqlVdbeSorterInit(struct sql *db, struct VdbeCursor *cursor); void sqlVdbeSorterReset(sql *, VdbeSorter *); diff --git a/src/box/sql/vdbeapi.c b/src/box/sql/vdbeapi.c index db1726a..c151a52 100644 --- a/src/box/sql/vdbeapi.c +++ b/src/box/sql/vdbeapi.c @@ -524,7 +524,7 @@ sqlStep(Vdbe * p) * error has occurred, then return the error code in p->rc to the * caller. Set the error code in the database handle to the same value. */ - rc = sqlVdbeTransferError(p); + rc = p->rc; } return (rc & db->errMask); } @@ -756,7 +756,6 @@ columnMem(sql_stmt * pStmt, int i) if (pVm->pResultSet != 0 && i < pVm->nResColumn && i >= 0) { pOut = &pVm->pResultSet[i]; } else { - sqlError(pVm->db, SQL_RANGE); pOut = (Mem *) columnNullValue(); } return pOut; @@ -1027,20 +1026,17 @@ vdbeUnbind(Vdbe * p, int i) return SQL_MISUSE; } if (p->magic != VDBE_MAGIC_RUN || p->pc >= 0) { - sqlError(p->db, SQL_MISUSE); sql_log(SQL_MISUSE, "bind on a busy prepared statement: [%s]", p->zSql); return SQL_MISUSE; } if (i < 1 || i > p->nVar) { - sqlError(p->db, SQL_RANGE); return SQL_RANGE; } i--; pVar = &p->aVar[i]; sqlVdbeMemRelease(pVar); pVar->flags = MEM_Null; - sqlError(p->db, SQL_OK); /* If the bit corresponding to this variable in Vdbe.expmask is set, then * binding a new value to this variable invalidates the current query plan. @@ -1126,7 +1122,6 @@ bindText(sql_stmt * pStmt, /* The statement to bind against */ rc = sqlVdbeMemSetStr(pVar, zData, nData, 1, xDel); if (rc == SQL_OK) rc = sql_bind_type(p, i, "TEXT"); - sqlError(p->db, rc); rc = sqlApiExit(p->db, rc); } } else if (xDel != SQL_STATIC && xDel != SQL_TRANSIENT) { diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c index ae1f38f..697dffd 100644 --- a/src/box/sql/vdbeaux.c +++ b/src/box/sql/vdbeaux.c @@ -2364,23 +2364,6 @@ sqlVdbeResetStepResult(Vdbe * p) } /* - * Copy the error code and error message belonging to the VDBE passed - * as the first argument to its database handle (so that they will be - * returned by calls to sql_errcode() and sql_errmsg()). - * - * This function does not clear the VDBE error code or message, just - * copies them to the database handle. - */ -int -sqlVdbeTransferError(Vdbe * p) -{ - sql *db = p->db; - int rc = p->rc; - sqlError(db, rc); - return rc; -} - -/* * Clean up a VDBE after execution but do not delete the VDBE just yet. * Return the result code. * @@ -2409,15 +2392,17 @@ sqlVdbeReset(Vdbe * p) * instructions yet, leave the main database error information unchanged. */ if (p->pc >= 0) { - sqlVdbeTransferError(p); if (p->runOnlyOnce) p->expired = 1; - } else if (p->rc && p->expired) { - /* The expired flag was set on the VDBE before the first call - * to sql_step(). For consistency (since sql_step() was - * called), set the database error in this case as well. + } else { + /* + * An error should be thrown here if the expired + * flag is set on the VDBE flag with the first + * call to sql_step(). However, the expired flag + * is currently disabled, so this error has been + * replaced with assert. */ - sqlErrorWithMsg(db, p->rc, NULL); + assert(p->rc == 0 || p->expired == 0); } /* Reclaim all memory used by the VDBE diff --git a/test/sql/func-recreate.result b/test/sql/func-recreate.result index d713292..73fb03c 100644 --- a/test/sql/func-recreate.result +++ b/test/sql/func-recreate.result @@ -26,7 +26,8 @@ fiber.sleep(0.1) ... box.internal.sql_create_function('WAITFOR', 'INT', function (n) require('fiber').sleep(n) return n end) --- -- error: database is locked +- error: 'Failed to create function ''WAITFOR'': unable to create function due to + active statements' ... ch:get() --- -- 2.7.4