[Tarantool-patches] [PATCH v1 18/21] sql: remove unused code
imeevma at tarantool.org
imeevma at tarantool.org
Thu Nov 11 13:49:21 MSK 2021
Some of the code is no longer used after changes in the SQL built-in
functions. This patch removes part of the unused code.
Needed for #4145
---
src/box/CMakeLists.txt | 1 -
src/box/bind.c | 5 +-
src/box/sql/mem.c | 11 --
src/box/sql/mem.h | 78 --------------
src/box/sql/sqlInt.h | 73 +------------
src/box/sql/trigger.c | 7 +-
src/box/sql/utf.c | 95 ----------------
src/box/sql/vdbe.h | 5 +-
src/box/sql/vdbeInt.h | 1 -
src/box/sql/vdbeapi.c | 238 +++--------------------------------------
src/box/sql/vdbeaux.c | 26 ++---
11 files changed, 33 insertions(+), 507 deletions(-)
delete mode 100644 src/box/sql/utf.c
diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt
index 957290bdd..17f1e60ba 100644
--- a/src/box/CMakeLists.txt
+++ b/src/box/CMakeLists.txt
@@ -55,7 +55,6 @@ set(sql_sources
sql/tokenize.c
sql/treeview.c
sql/trigger.c
- sql/utf.c
sql/update.c
sql/util.c
sql/vdbe.c
diff --git a/src/box/bind.c b/src/box/bind.c
index 58fff0b98..e75e36283 100644
--- a/src/box/bind.c
+++ b/src/box/bind.c
@@ -185,12 +185,11 @@ sql_bind_column(struct sql_stmt *stmt, const struct sql_bind *p,
* there is no need to copy the packet and we can
* use SQL_STATIC.
*/
- return sql_bind_text64(stmt, pos, p->s, p->bytes, SQL_STATIC);
+ return sql_bind_str_static(stmt, pos, p->s, p->bytes);
case MP_NIL:
return sql_bind_null(stmt, pos);
case MP_BIN:
- return sql_bind_blob64(stmt, pos, (const void *) p->s, p->bytes,
- SQL_STATIC);
+ return sql_bind_bin_static(stmt, pos, p->s, p->bytes);
case MP_EXT:
assert(p->ext_type == MP_UUID || p->ext_type == MP_DECIMAL);
if (p->ext_type == MP_UUID)
diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c
index dc629aee3..70ca9e1b2 100644
--- a/src/box/sql/mem.c
+++ b/src/box/sql/mem.c
@@ -2638,17 +2638,6 @@ mem_mp_type(const struct Mem *mem)
return MP_NIL;
}
-/* EVIDENCE-OF: R-12793-43283 Every value in sql has one of five
- * fundamental datatypes: 64-bit signed integer 64-bit IEEE floating
- * point number string BLOB NULL
- */
-enum mp_type
-sql_value_type(sql_value *pVal)
-{
- struct Mem *mem = (struct Mem *) pVal;
- return mem_mp_type(mem);
-}
-
#ifdef SQL_DEBUG
/*
* Check invariants on a Mem object.
diff --git a/src/box/sql/mem.h b/src/box/sql/mem.h
index 242f910db..9533833f2 100644
--- a/src/box/sql/mem.h
+++ b/src/box/sql/mem.h
@@ -359,54 +359,6 @@ mem_set_str0_dynamic(struct Mem *mem, char *value);
void
mem_set_str0_allocated(struct Mem *mem, char *value);
-static inline void
-mem_set_strl_ephemeral(struct Mem *mem, char *value, int len_hint)
-{
- if (len_hint < 0)
- mem_set_str0_ephemeral(mem, value);
- else
- mem_set_str_ephemeral(mem, value, len_hint);
-}
-
-static inline void
-mem_set_strl_static(struct Mem *mem, char *value, int len_hint)
-{
- if (len_hint < 0)
- mem_set_str0_static(mem, value);
- else
- mem_set_str_static(mem, value, len_hint);
-}
-
-static inline void
-mem_set_strl_dynamic(struct Mem *mem, char *value, int len_hint)
-{
- if (len_hint < 0)
- mem_set_str0_dynamic(mem, value);
- else
- mem_set_str_dynamic(mem, value, len_hint);
-}
-
-static inline void
-mem_set_strl_allocated(struct Mem *mem, char *value, int len_hint)
-{
- if (len_hint < 0)
- mem_set_str0_allocated(mem, value);
- else
- mem_set_str_allocated(mem, value, len_hint);
-}
-
-static inline void
-mem_set_strl(struct Mem *mem, char *value, int len_hint,
- void (*custom_free)(void *))
-{
- if (custom_free == SQL_STATIC)
- return mem_set_strl_static(mem, value, len_hint);
- if (custom_free == SQL_DYNAMIC)
- return mem_set_strl_allocated(mem, value, len_hint);
- if (custom_free != SQL_TRANSIENT)
- return mem_set_strl_dynamic(mem, value, len_hint);
-}
-
/** Copy string to a newly allocated memory. The MEM type becomes STRING. */
int
mem_copy_str(struct Mem *mem, const char *value, uint32_t len);
@@ -418,14 +370,6 @@ mem_copy_str(struct Mem *mem, const char *value, uint32_t len);
int
mem_copy_str0(struct Mem *mem, const char *value);
-static inline int
-mem_copy_strl(struct Mem *mem, const char *value, int len_hint)
-{
- if (len_hint < 0)
- return mem_copy_str0(mem, value);
- return mem_copy_str(mem, value, len_hint);
-}
-
/**
* Clear MEM and set it to VARBINARY. The binary value belongs to another
* object.
@@ -454,18 +398,6 @@ mem_set_bin_dynamic(struct Mem *mem, char *value, uint32_t size);
void
mem_set_bin_allocated(struct Mem *mem, char *value, uint32_t size);
-static inline void
-mem_set_binl(struct Mem *mem, char *value, uint32_t size,
- void (*custom_free)(void *))
-{
- if (custom_free == SQL_STATIC)
- return mem_set_bin_static(mem, value, size);
- if (custom_free == SQL_DYNAMIC)
- return mem_set_bin_allocated(mem, value, size);
- if (custom_free != SQL_TRANSIENT)
- return mem_set_bin_dynamic(mem, value, size);
-}
-
/**
* Copy binary value to a newly allocated memory. The MEM type becomes
* VARBINARY.
@@ -891,13 +823,6 @@ mem_len_unsafe(const struct Mem *mem)
return len;
}
-/**
- * Return address of memory allocated for accumulation structure of the
- * aggregate function.
- */
-int
-mem_get_agg(const struct Mem *mem, void **accum);
-
/**
* Simple type to str convertor. It is used to simplify
* error reporting.
@@ -913,9 +838,6 @@ mem_type_to_str(const struct Mem *p);
enum mp_type
mem_mp_type(const struct Mem *mem);
-enum mp_type
-sql_value_type(struct Mem *);
-
#ifdef SQL_DEBUG
int sqlVdbeCheckMemInvariants(struct Mem *);
void sqlVdbeMemPrettyPrint(Mem * pMem, char *zBuf);
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index c8f711ed2..22a4aa5cd 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -355,45 +355,6 @@ sql_stricmp(const char *, const char *);
int
sql_strnicmp(const char *, const char *, int);
-sql *
-sql_context_db_handle(sql_context *);
-
-
-void
-sql_result_blob(sql_context *, const void *,
- int, void (*)(void *));
-
-void
-sql_result_blob64(sql_context *, const void *,
- sql_uint64, void (*)(void *));
-
-void
-sql_result_double(sql_context *, double);
-
-void
-sql_result_uint(sql_context *ctx, uint64_t u_val);
-
-void
-sql_result_int(sql_context *ctx, int64_t val);
-
-void
-sql_result_bool(struct sql_context *ctx, bool value);
-
-void
-sql_result_null(sql_context *);
-
-void
-sql_result_text(sql_context *, const char *,
- int, void (*)(void *));
-
-void
-sql_result_text64(sql_context *, const char *,
- sql_uint64, void (*)(void *));
-
-void
-sql_result_value(sql_context *,
- sql_value *);
-
char *
sql_mprintf(const char *, ...);
char *
@@ -567,14 +528,6 @@ sql_vfs_register(sql_vfs *, int makeDflt);
void
sql_unbind(struct sql_stmt *stmt);
-int
-sql_bind_blob(sql_stmt *, int, const void *,
- int n, void (*)(void *));
-
-int
-sql_bind_blob64(sql_stmt *, int, const void *,
- sql_uint64, void (*)(void *));
-
int
sql_bind_double(sql_stmt *, int, double);
@@ -602,8 +555,10 @@ int
sql_bind_null(sql_stmt *, int);
int
-sql_bind_text64(sql_stmt *, int, const char *,
- sql_uint64, void (*)(void *));
+sql_bind_str_static(sql_stmt *stmt, int i, const char *str, uint32_t len);
+
+int
+sql_bind_bin_static(sql_stmt *stmt, int i, const char *str, uint32_t size);
int
sql_bind_uuid(struct sql_stmt *stmt, int i, const struct tt_uuid *uuid);
@@ -3697,26 +3652,6 @@ void sqlDetach(Parse *, Expr *);
int sqlAtoF(const char *z, double *, int);
int sqlGetInt32(const char *, int *);
-/**
- * Return number of symbols in the given string.
- *
- * Number of symbols != byte size of string because some symbols
- * are encoded with more than one byte. Also note that all
- * symbols from 'str' to 'str + byte_len' would be counted,
- * even if there is a '\0' somewhere between them.
- *
- * This function is implemented to be fast and indifferent to
- * correctness of string being processed. If input string has
- * even one invalid utf-8 sequence, then the resulting length
- * could be arbitary in these boundaries (0 < len < byte_len).
- * @param str String to be counted.
- * @param byte_len Byte length of given string.
- * @return number of symbols in the given string.
- */
-int
-sql_utf8_char_count(const unsigned char *str, int byte_len);
-
-u32 sqlUtf8Read(const u8 **);
LogEst sqlLogEst(u64);
LogEst sqlLogEstAdd(LogEst, LogEst);
u64 sqlLogEstToInt(LogEst);
diff --git a/src/box/sql/trigger.c b/src/box/sql/trigger.c
index 7c983fea5..fbd159126 100644
--- a/src/box/sql/trigger.c
+++ b/src/box/sql/trigger.c
@@ -805,11 +805,8 @@ sql_row_trigger_program(struct Parse *parser, struct sql_trigger *trigger,
if (!parser->is_aborted)
parser->is_aborted = pSubParse->is_aborted;
- if (db->mallocFailed == 0) {
- pProgram->aOp =
- sqlVdbeTakeOpArray(v, &pProgram->nOp,
- &pTop->nMaxArg);
- }
+ if (db->mallocFailed == 0)
+ pProgram->aOp = sqlVdbeTakeOpArray(v, &pProgram->nOp);
pProgram->nMem = pSubParse->nMem;
pProgram->nCsr = pSubParse->nTab;
pProgram->token = (void *)trigger;
diff --git a/src/box/sql/utf.c b/src/box/sql/utf.c
deleted file mode 100644
index 2d9a12806..000000000
--- a/src/box/sql/utf.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2010-2017, Tarantool AUTHORS, please see AUTHORS file.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * 1. Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
- * following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * This file contains routines used to translate between UTF-8.
- *
- * Notes on UTF-8:
- *
- * Byte-0 Byte-1 Byte-2 Byte-3 Value
- * 0xxxxxxx 00000000 00000000 0xxxxxxx
- * 110yyyyy 10xxxxxx 00000000 00000yyy yyxxxxxx
- * 1110zzzz 10yyyyyy 10xxxxxx 00000000 zzzzyyyy yyxxxxxx
- * 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx 000uuuuu zzzzyyyy yyxxxxxx
- *
- *
- */
-#include "sqlInt.h"
-
-/*
- * This lookup table is used to help decode the first byte of
- * a multi-byte UTF8 character.
- */
-static const unsigned char sqlUtf8Trans1[] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00,
-};
-
-u32
-sqlUtf8Read(const unsigned char **pz /* Pointer to string from which to read char */
- )
-{
- unsigned int c;
-
- /* Same as READ_UTF8() above but without the zTerm parameter.
- * For this routine, we assume the UTF8 string is always zero-terminated.
- */
- c = *((*pz)++);
- if (c >= 0xc0) {
- c = sqlUtf8Trans1[c - 0xc0];
- while ((*(*pz) & 0xc0) == 0x80) {
- c = (c << 6) + (0x3f & *((*pz)++));
- }
- if (c < 0x80
- || (c & 0xFFFFF800) == 0xD800
- || (c & 0xFFFFFFFE) == 0xFFFE) {
- c = 0xFFFD;
- }
- }
- return c;
-}
-
-int
-sql_utf8_char_count(const unsigned char *str, int byte_len)
-{
- int symbol_count = 0;
- for (int i = 0; i < byte_len;) {
- SQL_UTF8_FWD_1(str, i, byte_len);
- symbol_count++;
- }
- return symbol_count;
-}
diff --git a/src/box/sql/vdbe.h b/src/box/sql/vdbe.h
index 121b86029..106555bb1 100644
--- a/src/box/sql/vdbe.h
+++ b/src/box/sql/vdbe.h
@@ -264,7 +264,10 @@ void sqlVdbeCountChanges(Vdbe *);
sql *sqlVdbeDb(Vdbe *);
void sqlVdbeSetSql(Vdbe *, const char *z, int n);
void sqlVdbeSwap(Vdbe *, Vdbe *);
-VdbeOp *sqlVdbeTakeOpArray(Vdbe *, int *, int *);
+
+struct VdbeOp *
+sqlVdbeTakeOpArray(struct Vdbe *p, int *pnOp);
+
sql_value *sqlVdbeGetBoundValue(Vdbe *, int);
char *sqlVdbeExpandSql(Vdbe *, const char *);
diff --git a/src/box/sql/vdbeInt.h b/src/box/sql/vdbeInt.h
index 8dbba4908..c45cc9301 100644
--- a/src/box/sql/vdbeInt.h
+++ b/src/box/sql/vdbeInt.h
@@ -262,7 +262,6 @@ struct Vdbe {
Op *aOp; /* Space to hold the virtual machine's program */
Mem *aMem; /* The memory locations */
- Mem **apArg; /* Arguments to currently executing user function */
/** SQL metadata for DML/DQL queries. */
struct sql_column_metadata *metadata;
Mem *pResultSet; /* Pointer to an array of results */
diff --git a/src/box/sql/vdbeapi.c b/src/box/sql/vdbeapi.c
index 486f797fb..3894bb943 100644
--- a/src/box/sql/vdbeapi.c
+++ b/src/box/sql/vdbeapi.c
@@ -107,135 +107,6 @@ sql_metadata_is_full()
return current_session()->sql_flags & SQL_FullMetadata;
}
-/**************************** sql_result_ ******************************
- * The following routines are used by user-defined functions to specify
- * the function result.
- *
- * The setStrOrError() function sets the result as a string or blob but
- * if the string or blob is too large, it then sets the error code.
- *
- * The invokeValueDestructor(P,X) routine invokes destructor function X()
- * on value P is not going to be used and need to be destroyed.
- */
-static void
-setResultStrOrError(sql_context * pCtx, /* Function context */
- const char *z, /* String pointer */
- int n, /* Bytes in string, or negative */
- void (*xDel) (void *) /* Destructor function */
- )
-{
- if (xDel != SQL_TRANSIENT)
- return mem_set_strl(pCtx->pOut, (char *)z, n, xDel);
- if (mem_copy_strl(pCtx->pOut, z, n) != 0)
- pCtx->is_aborted = true;
-}
-
-static int
-invokeValueDestructor(const void *p, /* Value to destroy */
- void (*xDel) (void *), /* The destructor */
- sql_context *pCtx /* Set an error if no NULL */
- )
-{
- assert(xDel != SQL_DYNAMIC);
- if (xDel == 0) {
- /* noop */
- } else if (xDel == SQL_TRANSIENT) {
- /* noop */
- } else {
- xDel((void *)p);
- }
- if (pCtx) {
- diag_set(ClientError, ER_SQL_EXECUTE, "string or binary string"\
- "is too big");
- pCtx->is_aborted = true;
- }
- return -1;
-}
-
-void
-sql_result_blob(sql_context * pCtx,
- const void *z, int n, void (*xDel) (void *)
- )
-{
- assert(n >= 0);
- if (xDel != SQL_TRANSIENT)
- mem_set_binl(pCtx->pOut, (char *)z, n, xDel);
- else if (mem_copy_bin(pCtx->pOut, z, n) != 0)
- pCtx->is_aborted = true;
-}
-
-void
-sql_result_blob64(sql_context * pCtx,
- const void *z, sql_uint64 n, void (*xDel) (void *)
- )
-{
- assert(xDel != SQL_DYNAMIC);
- if (n > 0x7fffffff) {
- (void)invokeValueDestructor(z, xDel, pCtx);
- } else {
- setResultStrOrError(pCtx, z, (int)n, xDel);
- }
-}
-
-void
-sql_result_double(sql_context * pCtx, double rVal)
-{
- mem_set_double(pCtx->pOut, rVal);
-}
-
-void
-sql_result_uint(sql_context *ctx, uint64_t u_val)
-{
- mem_set_uint(ctx->pOut, u_val);
-}
-
-void
-sql_result_int(sql_context *ctx, int64_t val)
-{
- mem_set_int(ctx->pOut, val, val < 0);
-}
-
-void
-sql_result_bool(struct sql_context *ctx, bool value)
-{
- mem_set_bool(ctx->pOut, value);
-}
-
-void
-sql_result_null(sql_context * pCtx)
-{
- mem_set_null(pCtx->pOut);
-}
-
-void
-sql_result_text(sql_context * pCtx,
- const char *z, int n, void (*xDel) (void *)
- )
-{
- setResultStrOrError(pCtx, z, n, xDel);
-}
-
-void
-sql_result_text64(sql_context * pCtx,
- const char *z,
- sql_uint64 n,
- void (*xDel) (void *))
-{
- assert(xDel != SQL_DYNAMIC);
- if (n > 0x7fffffff) {
- (void)invokeValueDestructor(z, xDel, pCtx);
- } else {
- setResultStrOrError(pCtx, z, (int)n, xDel);
- }
-}
-
-void
-sql_result_value(sql_context * pCtx, sql_value * pValue)
-{
- if (mem_copy(pCtx->pOut, pValue) != 0)
- pCtx->is_aborted = true;
-}
-
/*
* Execute the statement pStmt, either until a row of data is ready, the
* statement is completely executed or an error occurs.
@@ -313,23 +184,6 @@ sql_step(sql_stmt * pStmt)
return sqlStep(v);
}
-/*
- * Extract the user data from a sql_context structure and return a
- * pointer to it.
- *
- * IMPLEMENTATION-OF: R-46798-50301 The sql_context_db_handle() interface
- * returns a copy of the pointer to the database connection (the 1st
- * parameter) of the sql_create_function() and
- * sql_create_function16() routines that originally registered the
- * application defined function.
- */
-sql *
-sql_context_db_handle(sql_context * p)
-{
- assert(p && p->pOut);
- return p->pOut->db;
-}
-
/*
* Return the number of columns in the result set for the statement pStmt.
*/
@@ -582,73 +436,6 @@ sql_unbind(struct sql_stmt *stmt)
}
}
-/*
- * Bind a text or BLOB value.
- */
-static int
-bindText(sql_stmt * pStmt, /* The statement to bind against */
- int i, /* Index of the parameter to bind */
- const void *zData, /* Pointer to the data to be bound */
- int nData, /* Number of bytes of data to be bound */
- void (*xDel) (void *) /* Destructor for the data */
- )
-{
- Vdbe *p = (Vdbe *) pStmt;
- Mem *pVar;
- if (vdbeUnbind(p, i) != 0) {
- if (xDel != SQL_STATIC && xDel != SQL_TRANSIENT)
- xDel((void *)zData);
- return -1;
- }
- if (zData == NULL)
- return 0;
- pVar = &p->aVar[i - 1];
- if (xDel != SQL_TRANSIENT)
- mem_set_strl(pVar, (char *)zData, nData, xDel);
- else if (mem_copy_strl(pVar, zData, nData) != 0)
- return -1;
- return sql_bind_type(p, i, "text");
-}
-
-/*
- * Bind a blob value to an SQL statement variable.
- */
-int
-sql_bind_blob(sql_stmt * pStmt,
- int i, const void *zData, int nData, void (*xDel) (void *)
- )
-{
- struct Vdbe *p = (Vdbe *) pStmt;
- if (vdbeUnbind(p, i) != 0) {
- if (xDel != SQL_STATIC && xDel != SQL_TRANSIENT)
- xDel((void *)zData);
- return -1;
- }
- if (zData == NULL)
- return 0;
- struct Mem *var = &p->aVar[i - 1];
- if (xDel != SQL_TRANSIENT)
- mem_set_binl(var, (char *)zData, nData, xDel);
- else if (mem_copy_bin(var, zData, nData) != 0)
- return -1;
- return sql_bind_type(p, i, "varbinary");
-}
-
-int
-sql_bind_blob64(sql_stmt * pStmt,
- int i,
- const void *zData,
- sql_uint64 nData, void (*xDel) (void *)
- )
-{
- assert(xDel != SQL_DYNAMIC);
- if (nData > 0x7fffffff) {
- return invokeValueDestructor(zData, xDel, 0);
- } else {
- return sql_bind_blob(pStmt, i, zData, (int)nData, xDel);
- }
-}
-
int
sql_bind_double(sql_stmt * pStmt, int i, double rValue)
{
@@ -722,18 +509,19 @@ sql_bind_ptr(struct sql_stmt *stmt, int i, void *ptr)
}
int
-sql_bind_text64(sql_stmt * pStmt,
- int i,
- const char *zData,
- sql_uint64 nData,
- void (*xDel) (void *))
-{
- assert(xDel != SQL_DYNAMIC);
- if (nData > 0x7fffffff) {
- return invokeValueDestructor(zData, xDel, 0);
- } else {
- return bindText(pStmt, i, zData, (int)nData, xDel);
- }
+sql_bind_str_static(sql_stmt *stmt, int i, const char *str, uint32_t len)
+{
+ struct Vdbe *vdbe = (struct Vdbe *)stmt;
+ mem_set_str_static(&vdbe->aVar[i - 1], (char *)str, len);
+ return sql_bind_type(vdbe, i, "text");
+}
+
+int
+sql_bind_bin_static(sql_stmt *stmt, int i, const char *str, uint32_t size)
+{
+ struct Vdbe *vdbe = (struct Vdbe *)stmt;
+ mem_set_bin_static(&vdbe->aVar[i - 1], (char *)str, size);
+ return sql_bind_type(vdbe, i, "text");
}
int
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index 1a429e7f1..b71f65966 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -447,21 +447,17 @@ sqlVdbeRunOnlyOnce(Vdbe * p)
* (1) For each jump instruction with a negative P2 value (a label)
* resolve the P2 value to an actual address.
*
- * (2) Compute the maximum number of arguments used by any SQL function
- * and store that value in *pMaxFuncArgs.
+ * (2) Initialize the p4.xAdvance pointer on opcodes that use it.
*
- * (3) Initialize the p4.xAdvance pointer on opcodes that use it.
- *
- * (4) Reclaim the memory allocated for storing labels.
+ * (3) Reclaim the memory allocated for storing labels.
*
* This routine will only function correctly if the mkopcodeh.sh generator
* script numbers the opcodes correctly. Changes to this routine must be
* coordinated with changes to mkopcodeh.sh.
*/
static void
-resolveP2Values(Vdbe * p, int *pMaxFuncArgs)
+resolveP2Values(Vdbe * p)
{
- int nMaxArgs = *pMaxFuncArgs;
Op *pOp;
Parse *pParse = p->pParse;
int *aLabel = pParse->aLabel;
@@ -506,7 +502,6 @@ resolveP2Values(Vdbe * p, int *pMaxFuncArgs)
sqlDbFree(p->db, pParse->aLabel);
pParse->aLabel = 0;
pParse->nLabel = 0;
- *pMaxFuncArgs = nMaxArgs;
}
/*
@@ -526,17 +521,15 @@ sqlVdbeCurrentAddr(Vdbe * p)
* vdbeFreeOpArray() function.
*
* Before returning, *pnOp is set to the number of entries in the returned
- * array. Also, *pnMaxArg is set to the larger of its current value and
- * the number of entries in the Vdbe.apArg[] array required to execute the
- * returned program.
+ * array.
*/
-VdbeOp *
-sqlVdbeTakeOpArray(Vdbe * p, int *pnOp, int *pnMaxArg)
+struct VdbeOp *
+sqlVdbeTakeOpArray(struct Vdbe *p, int *pnOp)
{
VdbeOp *aOp = p->aOp;
assert(aOp && !p->db->mallocFailed);
- resolveP2Values(p, pnMaxArg);
+ resolveP2Values(p);
*pnOp = p->nOp;
p->aOp = 0;
return aOp;
@@ -1490,7 +1483,6 @@ sqlVdbeMakeReady(Vdbe * p, /* The VDBE */
int nVar; /* Number of parameters */
int nMem; /* Number of VM memory registers */
int nCursor; /* Number of cursors required */
- int nArg; /* Number of arguments in subprograms */
int n; /* Loop counter */
struct ReusableSpace x; /* Reusable bulk memory */
@@ -1504,7 +1496,6 @@ sqlVdbeMakeReady(Vdbe * p, /* The VDBE */
nVar = pParse->nVar;
nMem = pParse->nMem;
nCursor = pParse->nTab;
- nArg = pParse->nMaxArg;
/* Each cursor uses a memory cell. The first cursor (cursor 0) can
* use aMem[0] which is not otherwise used by the VDBE program. Allocate
@@ -1526,7 +1517,7 @@ sqlVdbeMakeReady(Vdbe * p, /* The VDBE */
assert(x.nFree >= 0);
assert(EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]));
- resolveP2Values(p, &nArg);
+ resolveP2Values(p);
if (pParse->explain && nMem < 10) {
nMem = 10;
}
@@ -1546,7 +1537,6 @@ sqlVdbeMakeReady(Vdbe * p, /* The VDBE */
x.nNeeded = 0;
p->aMem = allocSpace(&x, p->aMem, nMem * sizeof(Mem));
p->aVar = allocSpace(&x, p->aVar, nVar * sizeof(Mem));
- p->apArg = allocSpace(&x, p->apArg, nArg * sizeof(Mem *));
p->apCsr =
allocSpace(&x, p->apCsr, nCursor * sizeof(VdbeCursor *));
if (x.nNeeded == 0)
--
2.25.1
More information about the Tarantool-patches
mailing list