-C Bug\sfixes\sin\sthe\sINSERT\slogic\sfor\sVALUES\scontaining\sDEFAULT\sterms.
-D 2025-02-15T23:47:25.843
+C Cleanup\sof\sthe\schanges\sfor\sthis\sbranch.
+D 2025-02-16T10:50:44.058
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
-F src/expr.c 7a78794a6432f90e6f029f79907a8c649b2c1cce7e3782a05466f0141a94209f
+F src/expr.c 78b8d7cec11c4d4dee381cc1893037254da98b862d955b4e5fc06c5d5e490e4b
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
F src/func.c b2fb33139972d7d65640b27ea962a49f1616265428001090cab39fcf270228e1
F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
-F src/insert.c 1525752ebd9a3fc09692a631a8b3a3a3d51e0df479a598164e268d9886f90d2e
+F src/insert.c cb5baffb416bbbf7dd22b1effb8d1840f08fde2c02e194220c1ebcdf130b29e6
F src/json.c 2663a0c7e574cb928de944720dcdcc11c931877d877549b8f1258a4002efd6f7
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
-F src/sqliteInt.h a844632bfd2814d13fcad0c535ea0654b869930142a827c41818a1e8d1bcb1a2
+F src/sqliteInt.h 522450a18f7d3ba5ff95cecb342ae27bc47c91f9429ecad5f31f44af5e90d990
F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523
F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9
F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279
F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383
-F src/update.c f46f629c6df90b940f8d5d50da568aab0c9fa4c08c68febd49c97b00cc514174
+F src/update.c a431db0e255cf9f53506c1e377cdb703df1f338a353a96ee7090655aaaaaa8ea
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
F src/util.c 9ff6470dabcf943fd796d2da766c98bd328c8f6fe036a31e5b338e628603f989
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 1902a0c16875c46b7e6f6a99d0d90c407b93fa44c4962474b13301e375f217b4
-R ee73b001203f5bc2912c6537f9cb08ca
+P 2b129c3761315791becdf36289f5076b8db84c8ab7404518b7de2711e498ba8f
+R f664a23899b9a2d544da09176a6ca449
U drh
-Z 72f3edef63ba837099141ae37b5faae7
+Z 1d806d6ec1d9203ebf64215b302f699c
# Remove this line to create a well-formed Fossil manifest.
-2b129c3761315791becdf36289f5076b8db84c8ab7404518b7de2711e498ba8f
+9349398e15195318ded786330fc33edea9d1d6d44e3428e5f9a643a3b48ee248
return target;
}
case TK_DEFAULT: {
+ /* If the DEFAULT keyword ever gets this far, that means it was used
+ ** in a context that is not supported. So raise an error. */
sqlite3ErrorMsg(pParse, "near \"default\": syntax error");
sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr);
return target;
** e) The DEFAULT keyword cannot have been used in any of the terms
** of the VALUES clause. This optimization won't work in that case
** because we do not yet know the mapping from VALUES-clause terms
-** into table columns, so we cannot construct the mapping.
+** into table columns, so we cannot figure out which column default
+** value to use in place of the DEFAULT keyword.
*/
Select *sqlite3MultiValues(Parse *pParse, Select *pLeft, ExprList *pRow){
aColTabMap = sqlite3DbMallocZero(pParse->db, sizeof(int)*nId);
if( aColTabMap==0 ) return 0;
if( aTabColMap ){
+ /* Invert the aTabColMap[] */
int i;
assert( sqlite3DbMallocSize(pParse->db, aTabColMap) >=
sizeof(int)*pTab->nCol );
}
}
}else{
+ /* Construct a new mapping that merely skips over non-insertable terms */
int i, j;
for(i=j=0; i<pTab->nCol; i++){
if( (pTab->aCol[i].colFlags & COLFLAG_NOINSERT)==0 ){
return aColTabMap;
}
+/*
+** Expression pExpr is a DEFAULT keyword. Transform that expression to
+** an expansion of the actual default value for the iCol-th column of
+** table pTab.
+*/
+void sqlite3ExpandDefaultValue(
+ Parse *pParse, /* Parsing context */
+ Expr *pExpr, /* Expression to be transformed */
+ Table *pTab, /* Table that supplies the new value to pExpr */
+ int iCol /* Column of pTab that contains the new value for pExpr */
+){
+ assert( pExpr->op==TK_DEFAULT );
+ assert( iCol>=0 && iCol<pTab->nCol );
+ if( pTab->aCol[iCol].iDflt==0 ){
+ pExpr->op = TK_NULL;
+ }else{
+ Expr *pDfltVal = sqlite3ColumnExpr(pTab, &pTab->aCol[iCol]);
+ pExpr->op = TK_UPLUS;
+ assert( pExpr->pLeft==0 );
+ pExpr->pLeft = sqlite3ExprDup(pParse->db, pDfltVal, 0);
+ }
+}
+
/*
** Scan all expressions in pList. If any is just a DEFAULT keyword,
-** convert that expression into a new expressionthat evaluates to
+** convert that expression into a new expression that evaluates to
** the default value of the corresponding table.
*/
static void convertDefaultExpr(
ExprList *pList, /* The list to scan */
int nId /* Number of columns in aColTabMap */
){
- int i, iCol;
+ int i;
+ assert( aColTabMap!=0 );
+ assert( sqlite3DbMallocSize(pParse->db, aColTabMap) >= sizeof(int)*nId );
for(i=0; i<pList->nExpr && i<nId; i++){
Expr *p = pList->a[i].pExpr;
- if( p->op!=TK_DEFAULT ) continue;
- iCol = aColTabMap[i];
- assert( iCol>=0 && iCol<pTab->nCol );
- if( pTab->aCol[iCol].iDflt==0 ){
- p->op = TK_NULL;
- }else{
- p->op = TK_UPLUS;
- assert( p->pLeft==0 );
- p->pLeft = sqlite3ExprDup(pParse->db,
- sqlite3ColumnExpr(pTab, &pTab->aCol[iCol]), 0);
+ if( p->op==TK_DEFAULT ){
+ sqlite3ExpandDefaultValue(pParse, p, pTab, aColTabMap[i]);
}
}
}
# define sqlite3AutoincrementBegin(X)
# define sqlite3AutoincrementEnd(X)
#endif
+void sqlite3ExpandDefaultValue(Parse*, Expr*, Table*, int);
void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*);
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
void sqlite3ComputeGeneratedColumns(Parse*, int, Table*);
#endif
aXRef[j] = i;
if( pChanges->a[i].pExpr->op==TK_DEFAULT ){
- Expr *p = pChanges->a[i].pExpr;
- if( pTab->aCol[j].iDflt==0 ){
- p->op = TK_NULL;
- }else{
- p->op = TK_UPLUS;
- assert( p->pLeft==0 );
- p->pLeft = sqlite3ExprDup(pParse->db,
- sqlite3ColumnExpr(pTab, &pTab->aCol[j]), 0);
- }
+ sqlite3ExpandDefaultValue(pParse, pChanges->a[i].pExpr, pTab, j);
}
}else{
if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){