[tarantool-patches] Re: [PATCH v2 1/1] Removed Expr pointer from SQL Column structure.
Kirill Shcherbatov
kshcherbatov at tarantool.org
Tue Apr 17 14:02:24 MSK 2018
New commit message:
sql: remove Expr pointer from SQL Column struct
Introduced space_def field in SQL Table structure which
already contains Expr field as it is required by
global Parser refactoring.
Needed for #3051.
>From 876a96547dfe69af760bfc39bdd0759b8dcadd1f Mon Sep 17 00:00:00 2001
From: Kirill Shcherbatov <kshcherbatov at tarantool.org>
Date: Tue, 17 Apr 2018 13:57:10 +0300
Subject: [PATCH] Accounted Vald's commits.
---
src/box/space_def.c | 2 --
src/box/sql.c | 11 +--------
src/box/sql.h | 11 ---------
src/box/sql/alter.c | 4 ++--
src/box/sql/build.c | 60 +++++++++++++++++++++----------------------------
src/box/sql/fkey.c | 12 ++++++----
src/box/sql/insert.c | 27 ++++++++++++----------
src/box/sql/pragma.c | 18 ++++++++-------
src/box/sql/sqliteInt.h | 3 +--
src/box/sql/update.c | 16 +++++++++++--
10 files changed, 77 insertions(+), 87 deletions(-)
diff --git a/src/box/space_def.c b/src/box/space_def.c
index 5a4fd6d..22bd3ca 100644
--- a/src/box/space_def.c
+++ b/src/box/space_def.c
@@ -239,8 +239,6 @@ space_def_destroy_fields(struct field_def *fields, uint32_t field_count)
void
space_def_delete(struct space_def *def)
{
- if (def == NULL)
- return;
space_opts_destroy(&def->opts);
tuple_dictionary_unref(def->dict);
space_def_destroy_fields(def->fields, def->field_count);
diff --git a/src/box/sql.c b/src/box/sql.c
index 6418cbd..6bc82c2 100644
--- a/src/box/sql.c
+++ b/src/box/sql.c
@@ -1466,7 +1466,7 @@ int tarantoolSqlite3MakeTableFormat(Table *pTable, void *buf)
for (i = 0; i < n; i++) {
const char *t;
struct coll *coll = NULL;
- struct field_def *field = sql_field_get(pTable, i);
+ struct field_def *field = &pTable->def->fields[i];
struct Expr *def = field->default_value_expr;
if (aCol[i].zColl != NULL &&
strcasecmp(aCol[i].zColl, "binary") != 0) {
@@ -1712,12 +1712,3 @@ space_column_default_expr(uint32_t space_id, uint32_t fieldno)
return space->def->fields[fieldno].default_value_expr;
}
-
-struct field_def *
-sql_field_get(struct Table *pTable, int id)
-{
- assert(pTable->def);
- assert((uint32_t)id < pTable->def->exact_field_count);
- assert((uint32_t)id < pTable->def->field_count);
- return &pTable->def->fields[id];
-}
diff --git a/src/box/sql.h b/src/box/sql.h
index d177341..54981a3 100644
--- a/src/box/sql.h
+++ b/src/box/sql.h
@@ -145,17 +145,6 @@ sql_expr_dup(struct sqlite3 *db, struct Expr *p, int flags, char **buffer);
void
sql_expr_free(struct sqlite3 *db, struct Expr *expr, bool extern_alloc);
-/**
- * Get field by id.
- * @param pParse SQL Parser object.
- * @param pTable SQL Table object.
- * @param id column identifier.
- * @retval not NULL on success.
- * @retval NULL on out of memory.
- */
-struct field_def *
-sql_field_get(struct Table *pTable, int id);
-
#if defined(__cplusplus)
} /* extern "C" { */
#endif
diff --git a/src/box/sql/alter.c b/src/box/sql/alter.c
index d2e0968..39ae070 100644
--- a/src/box/sql/alter.c
+++ b/src/box/sql/alter.c
@@ -161,8 +161,8 @@ sqlite3AlterFinishAddColumn(Parse * pParse, Token * pColDef)
zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */
pCol = &pNew->aCol[pNew->nCol - 1];
- struct field_def *field = sql_field_get(pNew, pNew->nCol - 1);
- pDflt = field->default_value_expr;
+ assert(pNew->def);
+ pDflt = pNew->def->fields[pNew->nCol - 1].default_value_expr;
pTab = sqlite3HashFind(&db->pSchema->tblHash, zTab);;
assert(pTab);
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index d6033c9..394ee3a 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -495,28 +495,26 @@ sqlite3PrimaryKeyIndex(Table * pTab)
return p;
}
+/**
+ * Create and initialize a new SQL Table object.
+ * @param pParse SQL Parser object.
+ * @param zName Table to create name.
+ * @retval NULL on memory allocation error, Parser state changed.
+ * @retval not NULL on success.
+ */
static Table *
-sql_table_new(Parse *pParse, char *zName, uint32_t nFields)
+sql_table_new(Parse *pParse, char *zName)
{
-
sqlite3 *db = pParse->db;
-
Table *pTable = sqlite3DbMallocZero(db, sizeof(Table));
- struct space_def *def = space_def_new(0 /* space id */, 0 /* user id */,
- 0, "ephemeral",
- strlen("ephemeral"), "memtx",
- strlen("memtx"),
+ struct space_def *def = space_def_new(0, 0, 0, NULL, 0, NULL, 0,
&space_opts_default,
- &field_def_default,
- 0/* length of field_def */);
- struct field_def *fields =
- sqlite3DbMallocZero(db,
- nFields*sizeof(struct field_def));
- if (pTable == NULL || def == NULL || fields == NULL) {
+ &field_def_default, 0);
+ if (pTable == NULL || def == NULL) {
assert(db->mallocFailed);
- space_def_delete(def);
- sqlite3DbFree(db, fields);
+ if (def != NULL)
+ space_def_delete(def);
sqlite3DbFree(db, pTable);
pParse->rc = SQLITE_NOMEM_BKPT;
pParse->nErr++;
@@ -524,12 +522,10 @@ sql_table_new(Parse *pParse, char *zName, uint32_t nFields)
}
pTable->def = def;
- pTable->def->fields = fields;
- for (uint32_t i = 0; i < nFields; i++)
- memcpy(&def->fields[i], &field_def_default,
- sizeof(struct field_def));
/* store allocated fields count */
- def->exact_field_count = nFields;
+ def->exact_field_count = 0;
+ def->field_count = 0;
+ pTable->def->fields = NULL;
pTable->zName = zName;
pTable->iPKey = -1;
@@ -599,7 +595,7 @@ sqlite3StartTable(Parse *pParse, Token *pName, int noErr)
goto begin_table_error;
}
- pTable = sql_table_new(pParse, zName, 1);
+ pTable = sql_table_new(pParse, zName);
if (pTable == NULL)
goto begin_table_error;
@@ -639,16 +635,15 @@ sql_field_retrieve(Parse *pParse, Table *pTable, uint32_t id)
{
sqlite3 *db = pParse->db;
struct field_def *field;
- assert(pTable->def && pTable->def->fields);
+ assert(pTable->def);
assert(pTable->def->exact_field_count >= (uint32_t)pTable->nCol);
- assert(id < pTable->def->exact_field_count * 2);
assert(id < (uint32_t)db->aLimit[SQLITE_LIMIT_COLUMN]);
if (id >= pTable->def->exact_field_count) {
- field =
- sqlite3DbRealloc(db, pTable->def->fields,
- pTable->def->exact_field_count * 2
- * sizeof(pTable->def->fields[0]));
+ uint32_t nCol = pTable->def->exact_field_count;
+ nCol = (nCol > 0) ? 2*nCol : 1;
+ field = sqlite3DbRealloc(db, pTable->def->fields,
+ nCol * sizeof(pTable->def->fields[0]));
if (field == NULL) {
assert(db->mallocFailed);
pParse->rc = SQLITE_NOMEM_BKPT;
@@ -656,13 +651,12 @@ sql_field_retrieve(Parse *pParse, Table *pTable, uint32_t id)
return NULL;
}
- for (uint32_t i = pTable->def->exact_field_count;
- i < 2*pTable->def->exact_field_count; i++)
+ for (uint32_t i = nCol/2; i < nCol; i++)
memcpy(&field[i], &field_def_default,
sizeof(struct field_def));
pTable->def->fields = field;
- pTable->def->exact_field_count *= 2;
+ pTable->def->exact_field_count = nCol;
}
field = &pTable->def->fields[id];
@@ -900,9 +894,9 @@ sqlite3AddDefaultValue(Parse * pParse, ExprSpan * pSpan)
* is required by pragma table_info.
*/
Expr x;
-
+ assert(p->def);
struct field_def *field =
- sql_field_get(p, (uint32_t) p->nCol - 1);
+ &p->def->fields[p->nCol - 1];
sql_expr_free(db, field->default_value_expr, false);
memset(&x, 0, sizeof(x));
@@ -915,8 +909,6 @@ sqlite3AddDefaultValue(Parse * pParse, ExprSpan * pSpan)
field->default_value_expr =
sqlite3ExprDup(db, &x, EXPRDUP_REDUCE);
-
- pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE);
sqlite3DbFree(db, x.u.zToken);
}
}
diff --git a/src/box/sql/fkey.c b/src/box/sql/fkey.c
index 625cf3c..d196fd4 100644
--- a/src/box/sql/fkey.c
+++ b/src/box/sql/fkey.c
@@ -36,6 +36,8 @@
#include <box/coll.h>
#include "sqliteInt.h"
#include "box/session.h"
+#include "box/schema.h"
+#include "tarantoolInt.h"
#ifndef SQLITE_OMIT_FOREIGN_KEY
#ifndef SQLITE_OMIT_TRIGGER
@@ -1346,10 +1348,12 @@ fkActionTrigger(Parse * pParse, /* Parse context */
&tToCol,
0));
} else if (action == OE_SetDflt) {
- struct field_def *field =
- sql_field_get(pFKey->pFrom,
- iFromCol);
- Expr *pDflt = field->default_value_expr;
+ uint32_t space_id =
+ SQLITE_PAGENO_TO_SPACEID(
+ pFKey->pFrom->tnum);
+ Expr *pDflt =
+ space_column_default_expr(
+ space_id, (uint32_t)iFromCol);
if (pDflt) {
pNew =
sqlite3ExprDup(db, pDflt,
diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
index f6db89a..067f50a 100644
--- a/src/box/sql/insert.c
+++ b/src/box/sql/insert.c
@@ -1801,18 +1801,21 @@ xferOptimization(Parse * pParse, /* Parser context */
}
/* Default values for second and subsequent columns need to match. */
if (i > 0) {
- struct field_def *pSrcField = sql_field_get(pSrc, i);
- struct field_def *pDestField = sql_field_get(pSrc, i);
- Expr *pSrcDflt = pSrcField->default_value_expr;
- Expr *pDestDflt = pDestField->default_value_expr;
- assert(pDestDflt == 0
- || pDestDflt->op == TK_SPAN);
- assert(pSrcDflt == 0
- || pSrcDflt->op == TK_SPAN);
- if ((pDestDflt == 0) != (pSrcDflt == 0)
- || (pDestDflt
- && strcmp(pDestDflt->u.zToken,
- pSrcDflt->u.zToken) != 0)
+ uint32_t src_space_id =
+ SQLITE_PAGENO_TO_SPACEID(pSrc->tnum);
+ struct space *src_space =
+ space_cache_find(src_space_id);
+ uint32_t dest_space_id =
+ SQLITE_PAGENO_TO_SPACEID(pDest->tnum);
+ struct space *dest_space =
+ space_cache_find(dest_space_id);
+ char *src_expr_str =
+ src_space->def->fields[i].default_value;
+ char *dest_expr_str =
+ dest_space->def->fields[i].default_value;
+ if ((dest_expr_str == NULL) != (src_expr_str == NULL)
+ || (dest_expr_str
+ && strcmp(src_expr_str, dest_expr_str) != 0)
) {
return 0; /* Default values must be the same for all columns */
}
diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index c0bf7fd..3ca94a1 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -36,6 +36,7 @@
#include <box/index.h>
#include <box/box.h>
#include <box/tuple.h>
+#include "box/schema.h"
#include "sqliteInt.h"
#include "vdbeInt.h"
#include "box/session.h"
@@ -64,6 +65,7 @@
* ../tool/mkpragmatab.tcl.
*/
#include "pragma.h"
+#include "tarantoolInt.h"
/*
* Interpret the given string as a safety level. Return 0 for OFF,
@@ -359,9 +361,6 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
sqlite3ViewGetColumnNames(pParse, pTab);
for (i = 0, pCol = pTab->aCol; i < pTab->nCol;
i++, pCol++) {
- struct field_def *field =
- sql_field_get(pTab, i);
- Expr *pDflt = field->default_value_expr;
if (!table_column_is_in_pk(pTab, i)) {
k = 0;
} else if (pPk == 0) {
@@ -373,18 +372,21 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
i; k++) {
}
}
- assert(pDflt == 0
- || pDflt->op == TK_SPAN);
bool nullable = table_column_is_nullable(pTab, i);
+ uint32_t space_id =
+ SQLITE_PAGENO_TO_SPACEID(
+ pTab->tnum);
+ struct space *space =
+ space_cache_find(space_id);
+ char *expr_str = space->
+ def->fields[i].default_value;
sqlite3VdbeMultiLoad(v, 1, "issisi",
i, pCol->zName,
field_type_strs[
sqlite3ColumnType
(pCol)],
nullable == 0,
- pDflt ?
- pDflt->u.zToken
- : 0, k);
+ expr_str, k);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1,
6);
}
diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
index 9a7d99c..90b7e08 100644
--- a/src/box/sql/sqliteInt.h
+++ b/src/box/sql/sqliteInt.h
@@ -1877,7 +1877,6 @@ struct Savepoint {
struct Column {
char *zName; /* Name of this column */
enum field_type type; /* Column type. */
- Expr *pDflt; /* Default value of this column */
char *zColl; /* Collating sequence. If NULL, use the default */
enum on_conflict_action notNull; /* An ON_CONFLICT_ACTION code for
* handling a NOT NULL constraint
@@ -1970,7 +1969,7 @@ struct Table {
Trigger *pTrigger; /* List of triggers stored in pSchema */
Schema *pSchema; /* Schema that contains this table */
Table *pNextZombie; /* Next on the Parse.pZombieTab list */
- struct space_def *def;
+ struct space_def *def; /* Space definition with Tarantool metadata */
};
/*
diff --git a/src/box/sql/update.c b/src/box/sql/update.c
index f6aa24b..2505a5d 100644
--- a/src/box/sql/update.c
+++ b/src/box/sql/update.c
@@ -35,6 +35,8 @@
*/
#include "sqliteInt.h"
#include "box/session.h"
+#include "tarantoolInt.h"
+#include "box/schema.h"
/*
* The most recently coded instruction was an OP_Column to retrieve the
@@ -75,8 +77,18 @@ sqlite3ColumnDefault(Vdbe * v, Table * pTab, int i, int iReg)
Column *pCol = &pTab->aCol[i];
VdbeComment((v, "%s.%s", pTab->zName, pCol->zName));
assert(i < pTab->nCol);
- Expr *expr = pTab->def ?
- sql_field_get(pTab, i)->default_value_expr : NULL;
+
+ Expr *expr = NULL;
+ struct space *space =
+ space_cache_find(SQLITE_PAGENO_TO_SPACEID(pTab->tnum));
+ /* FIXME: ephemeral spaces are not present in the cache now */
+ if (space != NULL) {
+ expr = space->def->fields[i].default_value_expr;
+ } else {
+ expr = pTab->def ?
+ pTab->def->fields[i].default_value_expr : NULL;
+ }
+
sqlite3ValueFromExpr(sqlite3VdbeDb(v),
expr,
pCol->affinity, &pValue);
--
2.7.4
On 16.04.2018 22:23, Vladislav Shpilevoy wrote:
> Hello. Thanks for the patch, it looks almost ok, your patches become
> better and better! See my 11 comments below.
>
>
> On 16/04/2018 19:35, Kirill Shcherbatov wrote:
>> Introduced space_def field in SQL Table structure which
>> already contains Expr field.
>>
>> Needed for #3051.
>
> 1. Please, use this guide to write commit messages:
> https://tarantool.io/en/doc/1.9/dev_guide/developer_guidelines.html#how-to-write-a-commit-message
>
> In particular this:
> - limit the subject line to 50 characters,
> - prefix the subject with a subsystem name. Here it is 'sql: ',
> - do not end the subject line with a period,
> - use the imperative mood in the subject line.
>
>> diff --git a/src/box/space_def.c b/src/box/space_def.c
>> index 22bd3ca..5a4fd6d 100644
>> --- a/src/box/space_def.c
>> +++ b/src/box/space_def.c
>> @@ -239,6 +239,8 @@ space_def_destroy_fields(struct field_def *fields, uint32_t field_count)
>> void
>> space_def_delete(struct space_def *def)
>> {
>> + if (def == NULL)
>> + return;
>
> 2. The space_def_delete must not be called with NULL. Please, fix the
> caller function instead of space_def_delete.
>
>> space_opts_destroy(&def->opts);
>> tuple_dictionary_unref(def->dict);
>> space_def_destroy_fields(def->fields, def->field_count);
>> diff --git a/src/box/sql.c b/src/box/sql.c
>> index a6713f1..6418cbd 100644
>> --- a/src/box/sql.c
>> +++ b/src/box/sql.c
>> @@ -1466,7 +1466,8 @@ int tarantoolSqlite3MakeTableFormat(Table *pTable, void *buf)
>> for (i = 0; i < n; i++) {
>> const char *t;
>> struct coll *coll = NULL;
>> - struct Expr *def = aCol[i].pDflt;
>> + struct field_def *field = sql_field_get(pTable, i);
>
> 3. The wrapper for assertions only is useless. Please, inline it with
> no these obvious assertions.
>
>> diff --git a/src/box/sql/alter.c b/src/box/sql/alter.c
>> index 129ef82..d2e0968 100644
>> --- a/src/box/sql/alter.c
>> +++ b/src/box/sql/alter.c
>> @@ -297,7 +298,6 @@ sqlite3AlterBeginAddColumn(Parse * pParse, SrcList * pSrc)
>> Column *pCol = &pNew->aCol[i];
>> pCol->zName = sqlite3DbStrDup(db, pCol->zName);
>> pCol->zColl = 0;
>> - pCol->pDflt = 0;
>
> 4. I jumped around the patch and it looks, that you forgot the main part
> of it - removal of struct Column.pDflt. Thanks to you, now it is very
> easy.
>> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
>> index 92f3cb6..d6033c9 100644
>> --- a/src/box/sql/build.c
>> +++ b/src/box/sql/build.c
>> @@ -490,6 +495,53 @@ sqlite3PrimaryKeyIndex(Table * pTab)
>> return p;
>> }
>>
>> +static Table *
>> +sql_table_new(Parse *pParse, char *zName, uint32_t nFields)
>
> 5. Why do you need nFields argument? It is always 1. And I
> can not understand why 1? When a parser sees 'CREATE TABLE name (', it
> does not know even about a first column. Please, write a comments for
> the function.
>
>> +{
>> +
>> + sqlite3 *db = pParse->db;
>> +
>> +
>> + Table *pTable = sqlite3DbMallocZero(db, sizeof(Table));
>> + struct space_def *def = space_def_new(0 /* space id */, 0 /* user id */,
>> + 0, "ephemeral",
>> + strlen("ephemeral"), "memtx",
>> + strlen("memtx"),
>> + &space_opts_default,
>> + &field_def_default,
>> + 0/* length of field_def */);
>
> 6. Looks like you copy-pasted this code. The space_def is created for
> defaults only, and it must be mentioned here in comments. Other
> space_def fields are dummy and invalid. It means that its name must be
> NULL, engine must be NULL, fields array must be NULL. And do not put
> comments on each argument - it must be done in function declaration, but
> not on each function call. Ok? Please, fix it. I do not know, why
> ephemeral tables violate these rules(
>> @@ -585,6 +626,49 @@ sqlite3StartTable(Parse *pParse, Token *pName, int noErr)
>> return;
>> }
>>
>> +/**
>> + * Get field by id. Allocate memory if needed.
>> + * @param pParse SQL Parser object.
>> + * @param pTable SQL Table object.
>> + * @param id column identifier.
>> + * @retval not NULL on success.
>> + * @retval NULL on out of memory.
>> + */
>> +static struct field_def *
>> +sql_field_retrieve(Parse *pParse, Table *pTable, uint32_t id)
>
> Off topic: good name.
>
>> diff --git a/src/box/sql/fkey.c b/src/box/sql/fkey.c
>> index f56b6d9..625cf3c 100644
>> --- a/src/box/sql/fkey.c
>> +++ b/src/box/sql/fkey.c
>> @@ -1346,8 +1346,10 @@ fkActionTrigger(Parse * pParse, /* Parse context */
>> &tToCol,
>> 0));
>> } else if (action == OE_SetDflt) {
>> - Expr *pDflt =
>> - pFKey->pFrom->aCol[iFromCol].pDflt;
>> + struct field_def *field =
>> + sql_field_get(pFKey->pFrom,
>> + iFromCol);
>
> 7. It is not DDL, so here please use space_def from the space, not from
> the table. Use here space_column_default_expr.
>> diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
>> index b24d55b..f6db89a 100644
>> --- a/src/box/sql/insert.c
>> +++ b/src/box/sql/insert.c
>> @@ -1801,14 +1801,18 @@ xferOptimization(Parse * pParse, /* Parser context */
>> }
>> /* Default values for second and subsequent columns need to match. */
>> if (i > 0) {
>> - assert(pDestCol->pDflt == 0
>> - || pDestCol->pDflt->op == TK_SPAN);
>> - assert(pSrcCol->pDflt == 0
>> - || pSrcCol->pDflt->op == TK_SPAN);
>> - if ((pDestCol->pDflt == 0) != (pSrcCol->pDflt == 0)
>> - || (pDestCol->pDflt
>> - && strcmp(pDestCol->pDflt->u.zToken,
>> - pSrcCol->pDflt->u.zToken) != 0)
>> + struct field_def *pSrcField = sql_field_get(pSrc, i);
>> + struct field_def *pDestField = sql_field_get(pSrc, i);
>
> 8. Same as 7.
>> diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
>> index b724c98..c0bf7fd 100644
>> --- a/src/box/sql/pragma.c
>> +++ b/src/box/sql/pragma.c
>> @@ -359,6 +359,9 @@ sqlite3Pragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */
>> sqlite3ViewGetColumnNames(pParse, pTab);
>> for (i = 0, pCol = pTab->aCol; i < pTab->nCol;
>> i++, pCol++) {
>> + struct field_def *field =
>> + sql_field_get(pTab, i);
>> + Expr *pDflt = field->default_value_expr;
>
> 9. Same as 7.
>> diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
>> index 59662cf..9a7d99c 100644
>> --- a/src/box/sql/sqliteInt.h
>> +++ b/src/box/sql/sqliteInt.h
>> @@ -1970,6 +1970,7 @@ struct Table {
>> Trigger *pTrigger; /* List of triggers stored in pSchema */
>> Schema *pSchema; /* Schema that contains this table */
>> Table *pNextZombie; /* Next on the Parse.pZombieTab list */
>> + struct space_def *def;
>
> 10. Please, write a comment, for what this member is used, and what
> stores.
>
>
>> };
>>
>> /*
>> diff --git a/src/box/sql/update.c b/src/box/sql/update.c
>> index 83c05ab..f6aa24b 100644
>> --- a/src/box/sql/update.c
>> +++ b/src/box/sql/update.c
>> @@ -75,7 +75,10 @@ sqlite3ColumnDefault(Vdbe * v, Table * pTab, int i, int iReg)
>> Column *pCol = &pTab->aCol[i];
>> VdbeComment((v, "%s.%s", pTab->zName, pCol->zName));
>> assert(i < pTab->nCol);
>> - sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt,
>> + Expr *expr = pTab->def ?
>> + sql_field_get(pTab, i)->default_value_expr : NULL;
>> + sqlite3ValueFromExpr(sqlite3VdbeDb(v),
>> + expr,
>> pCol->affinity, &pValue);
>
> 11. Same as 7.
>
>> if (pValue) {
>> sqlite3VdbeAppendP4(v, pValue, P4_MEM);
>>
>
More information about the Tarantool-patches
mailing list