diff --git a/manifest b/manifest index 40fccead7f..93337414f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C An\sattempt\sto\smake\sthe\sauthorizer\seffective\sat\spreventing\sthe\suse\sof\nsome\sfunctions\swithin\sthe\sDEFAULT\sclause\sof\sa\stable. -D 2026-08-26T19:37:23.291 +C Split\sthe\ssqlite3ColumnExpr()\sroutine\sout\sinto\stwo\sroutines,\sone\sthat\sworks\nas\sbefore\sand\sthe\ssecond\ssqlite3ColumnExprAuth()\sto\sdeal\swith\sthe\nauthenticator\sin\splaces\swhere\sthat\sis\sneeded. +D 2026-08-26T21:04:25.031 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -676,7 +676,7 @@ F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 1b9c24374a85dfc7eb8fa7c4266ee0db4f9609cceecfc5481cd8307e5af04366 F sqlite3.pc.in e6dee284fba59ef500092fdc1843df3be8433323a3733c91da96690a50a5b398 -F src/alter.c b62e69718e3d300d0e0c08c954e0571d850b98b85ba0cd833160aad2496e1671 +F src/alter.c 82f7d0c073d9612c1223369ef55e1cedd4cb9041cc017a5ac8ec38c2f5bfcb26 F src/analyze.c 73162482c656187823217f4c00758c9ee13a420c8745bc542129e0279b792287 F src/attach.c c58278c7d2d954785591c4fde81669ec3e4d52f348c453b028a19ae8adf4f338 F src/auth.c b5ece4e1edccad082c0332fa0087df225473bae0feea9269f824312201377185 @@ -686,7 +686,7 @@ F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea F src/btree.c d454bbda4b2a25b7a852c70ab61bcd6c0e5b3f6cda212d6e7529177c0518fb0e F src/btree.h 2ee0ddfdf4f8530ad1d46afffd7da21a0e243bfab10973011ac6f6b7fb4109a1 F src/btreeInt.h df956bca48cd49d2a38886bc3b02045c039e8a16353f86fccd116c6487f79d82 -F src/build.c bc234dd29b71501e2238d4df1ce1af36c4f2c1c8b669248a22cd0178bd3850c2 +F src/build.c bf548c70d9950bcb0f25bea215b0e4c02f39d72278fd73f81307ae00409ec495 F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad F src/carray.c 22879bbd9e14fc4868f223b0d49bcdbbda4616c89f1519ec6a5e64b98a4137b1 F src/complete.c f216b970ce99c5a657556cf1f17e7ddd494515d3beb63df426bf59ff43bd3d9a @@ -694,16 +694,16 @@ F src/date.c e1a002a4199bfa85e8778c0f72182c679580b131147d8e46d9221cfceffb8500 F src/dbpage.c ec8590c5e7a564cef28ca3c6156521316a4d26cb572a34841b0bcb26b67b3f97 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451 -F src/expr.c bca3bb56cc9f79afaf3fc8ff5b1b90bc6666f5fa5b6e7a531e2a558e4d0e6920 +F src/expr.c 3e4b36f0517128ea7e0a349373816d783b7313f8b8c59bbc6779f3200ed69ea4 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 0a72ed1a189c141a196a54dae32d94d20c483954041c33facc0e324cd18ade1d +F src/fkey.c 26788ae6c785d70f9829c4176e9764447014fc73e6ba31e9f1881720a64ae7f1 F src/func.c d833ab92ed95e84af60247e7d752cda33234d8979173442079d54d96e9853dd9 F src/global.c 7eea537ac0c113ac55cb2dd4d8fc2a6a91ae478be34231b4efaffc46817fee85 F src/hash.c 03c8c0f4be9e8bcb6de65aa26d34a61d48a9430747084a69f9469fbb00ea52ca F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h 5cb15147c8583d0fc4748e1c12ea6f38c9deaeefa147a4d8d379fd9bc81fee9a F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 423ed92248bf83e133021d50129e257f05e7513ad84a0b0b0fd993ccce9eee7d +F src/insert.c 68b898cb17607b36fa751b8985da06531932c502d77186f82842817286c7fd03 F src/json.c 507a7be1d4c7ca435a6b22e742cc344a3f318d68b49995dadb921502b374aa18 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 5cd4cd7ec6e1a46416806899086363fbf95eecd3bfb9a388b436c9a77243c902 @@ -737,7 +737,7 @@ F src/parse.y d5a3c5b0277a441c38b35071c05e2b61ff5fc918a63309c809f4b6706179c320 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 00c5797ddf546ee0fe2828d7f75d1afbf1b40ba054f362905326c5ccca15e60c F src/pcache1.c 6bc38b44961f767985ae5022fb7887eda206040f57475812473929c702f6799d -F src/pragma.c 9ee911bc2a0b06c133e066400ff309a76cf675d0a37d5a1beaf09d124303a3f7 +F src/pragma.c 959c32cfd1fb186546e5c4d4383258cc709596b2acdac72ef5ce6a27b9486bf2 F src/prepare.c 8954bb69defe377cd6a926f8c61d8215ea4f1974838d3ec6f22681a2c0a2939f F src/printf.c 1ee57184d4b8f36333f6b5a9904984594b977798aaeee76a39103a99436e794c F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c @@ -748,7 +748,7 @@ F src/shell.c.in af532e274c05b70578de3d9350bee1d16ba668259e85410cb592fbf0c097ebe F src/sqlite.h.in efc3f7aa00a2bb01c087435e6fa5f86103e310e6c3ea072b12cc110cf2715a75 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 0efd4723bad9124ea1f581d9f1ea0254ac1c6f3e5fb29e4f3dcf36c72485a456 -F src/sqliteInt.h 6f536be43ec05f706174490c9a78c9d0802b98b4a6d69dc8097fa48af92fb137 +F src/sqliteInt.h 17bd8fbcc55552f20e87913a07ca793a0091fb5cc5aa5da4f68e6d87491f5923 F src/sqliteLimit.h c433b3fdb5e52f4226bf78d7e8081dff8fd8fbb0ce0cb1a5fee282aaa8976813 F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -805,7 +805,7 @@ F src/threads.c 85d8b9f05f78211c61e3739ab5db761d7118766d1916ae7f2764735106bc4e13 F src/tokenize.c e9d52d9f7374d82dadcd11726bea8a597d43709d6672704f3f0375bf1d726912 F src/treeview.c feaa59f14db4f7b5aacca9c5ad5aeb562c1f98262c1ffd74371f4186ade91fc5 F src/trigger.c d6d8991ca346eb6f56e50a3c5df486176b67a9179336798a75bb05e622c72cac -F src/update.c f82960cd70c97fd169b5094e5bcdac8b5beb903cdc239312d20e11c5b965c2d2 +F src/update.c dad5c89cbeee91cab10cd5c746be2be220e1155f9444f28c6a720441a88a965c F src/upsert.c dd9f0fcccbfb4f20e1026a21a7254ba3f2c08e9cfa92affaff5b5ec3b00ea549 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165 F src/util.c cfdf9c6e5323af886d5ce766709da607ba1d14193ad3a15f4f462a45420e8211 @@ -825,7 +825,7 @@ F src/vxworks.h 9d18819c5235b49c2340a8a4d48195ec5d5afb637b152406de95a9436beeaeab F src/wal.c cb28ab3a71cb73ea422a2fcc26283b65a1e5a2a65c44de86951c7d6a186381ac F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c a562a3343fb9ce17356bd7016ad48c7ff300ed5e7cdd290bbbbe1e607d88b0f9 +F src/where.c 523806acab93c82979a37143ac76b51fde659bf69e3aa7d1aa3e472963d276c4 F src/whereInt.h f039ad303bc2913de673e431821ef8db3b619d249e6e5548d90072a684e72285 F src/wherecode.c 0e5772dedc65a4f4eee3399b04c6b0b02ccdb4949c5b08c558e3678c5aa102ae F src/whereexpr.c 76f72a95c5cf0e8a8edb679ca4fb7afa17ba45ff4effe73c414266510109e701 @@ -2219,11 +2219,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P da1e7d73c64d0a0c140c17794a60772d842d38204cf9a1b16c9ba338d733e9b9 -R f9853f77aa2bcedb4a95ab10848f4515 -T *branch * authorize-default -T *sym-authorize-default * -T -sym-trunk * +P 321e41b09179acba59958bdd6b07e4b7d915b9c0dfca143e4914b3690692c201 +R 613e1004f09be2b0d449123efd47588e U drh -Z c4dd722908e51122ee262e39364ad14a +Z 0e7a3160f3611cf6d33df1a7f0ae6582 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f1635b61b6..17a8f05093 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -321e41b09179acba59958bdd6b07e4b7d915b9c0dfca143e4914b3690692c201 +51a1149bdcbe142b8eb92c2b817d3973bf88aaa73859e0c475505aa201da920b diff --git a/src/alter.c b/src/alter.c index 375c7bebaa..d4c0f42475 100644 --- a/src/alter.c +++ b/src/alter.c @@ -359,7 +359,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ zDb = db->aDb[iDb].zDbSName; zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ pCol = &pNew->aCol[pNew->nCol-1]; - pDflt = sqlite3ColumnExpr(0, pNew, pCol); + pDflt = sqlite3ColumnExpr(pNew, pCol); pTab = sqlite3FindTable(db, zTab, zDb); assert( pTab ); @@ -1642,7 +1642,7 @@ static void renameColumnFunc( } #ifndef SQLITE_OMIT_GENERATED_COLUMNS for(i=0; inCol; i++){ - Expr *pExpr = sqlite3ColumnExpr(0, sParse.pNewTable, + Expr *pExpr = sqlite3ColumnExpr(sParse.pNewTable, &sParse.pNewTable->aCol[i]); sqlite3WalkExpr(&sWalker, pExpr); } @@ -2011,7 +2011,7 @@ static void renameQuotefixFunc( #ifndef SQLITE_OMIT_GENERATED_COLUMNS for(i=0; inCol; i++){ sqlite3WalkExpr(&sWalker, - sqlite3ColumnExpr(0, sParse.pNewTable, + sqlite3ColumnExpr(sParse.pNewTable, &sParse.pNewTable->aCol[i])); } #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ diff --git a/src/build.c b/src/build.c index 9413b6be2f..d662a98f22 100644 --- a/src/build.c +++ b/src/build.c @@ -734,14 +734,16 @@ static void sqlite3FuncAuth(Parse *pParse, Expr *pExpr){ ** callback on any function calls within the expression and raises an error ** if that callback ever returns anything other then SQLITE_OK. */ -Expr *sqlite3ColumnExpr(Parse *pParse, Table *pTab, Column *pCol){ - Expr *pExpr; +Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){ if( pCol->iDflt==0 ) return 0; if( !IsOrdinaryTable(pTab) ) return 0; if( NEVER(pTab->u.tab.pDfltList==0) ) return 0; if( NEVER(pTab->u.tab.pDfltList->nExpriDflt) ) return 0; - pExpr = pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; - if( pParse && pParse->db->xAuth!=0 ){ + return pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; +} +Expr *sqlite3ColumnExprAuth(Table *pTab, Column *pCol, Parse *pParse){ + Expr *pExpr = sqlite3ColumnExpr(pTab,pCol); + if( pParse->db->xAuth!=0 ){ sqlite3FuncAuth(pParse, pExpr); } return pExpr; @@ -2828,7 +2830,7 @@ void sqlite3EndTable( for(ii=0; iinCol; ii++){ u32 colFlags = p->aCol[ii].colFlags; if( (colFlags & COLFLAG_GENERATED)!=0 ){ - Expr *pX = sqlite3ColumnExpr(0, p, &p->aCol[ii]); + Expr *pX = sqlite3ColumnExpr(p, &p->aCol[ii]); testcase( colFlags & COLFLAG_VIRTUAL ); testcase( colFlags & COLFLAG_STORED ); if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){ diff --git a/src/expr.c b/src/expr.c index 91b93079af..45d76157b3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4502,7 +4502,7 @@ void sqlite3ExprCodeGeneratedColumn( }else{ iAddr = 0; } - sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(0,pTab,pCol), regOut); + sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut); if( (pCol->colFlags & COLFLAG_VIRTUAL)!=0 && (pTab->tabFlags & TF_Strict)!=0 ){ diff --git a/src/fkey.c b/src/fkey.c index 43d6efaf0e..bfb1409761 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1306,7 +1306,7 @@ static Trigger *fkActionTrigger( testcase( pCol->colFlags & COLFLAG_STORED ); pDflt = 0; }else{ - pDflt = sqlite3ColumnExpr(0, pFKey->pFrom, pCol); + pDflt = sqlite3ColumnExprAuth(pFKey->pFrom, pCol, pParse); } if( pDflt ){ pNew = sqlite3ExprDup(db, pDflt, 0); diff --git a/src/insert.c b/src/insert.c index 70fe344183..968738a806 100644 --- a/src/insert.c +++ b/src/insert.c @@ -360,7 +360,7 @@ void sqlite3ComputeGeneratedColumns( int x; pCol->colFlags |= COLFLAG_BUSY; w.eCode = 0; - sqlite3WalkExpr(&w, sqlite3ColumnExpr(0, pTab, pCol)); + sqlite3WalkExpr(&w, sqlite3ColumnExpr(pTab, pCol)); pCol->colFlags &= ~COLFLAG_BUSY; if( w.eCode & COLFLAG_NOTAVAIL ){ pRedo = pCol; @@ -1387,7 +1387,7 @@ void sqlite3Insert( /* Hidden columns that are not explicitly named in the INSERT ** get their default value */ sqlite3ExprCodeFactorable(pParse, - sqlite3ColumnExpr(pParse, pTab, &pTab->aCol[i]), + sqlite3ColumnExprAuth(pTab, &pTab->aCol[i], pParse), iRegStore); continue; } @@ -1399,7 +1399,7 @@ void sqlite3Insert( /* A column not named in the insert column list gets its ** default value */ sqlite3ExprCodeFactorable(pParse, - sqlite3ColumnExpr(pParse, pTab, &pTab->aCol[i]), + sqlite3ColumnExprAuth(pTab, &pTab->aCol[i], pParse), iRegStore); continue; } @@ -1407,7 +1407,7 @@ void sqlite3Insert( }else if( nColumn==0 ){ /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ sqlite3ExprCodeFactorable(pParse, - sqlite3ColumnExpr(pParse, pTab, &pTab->aCol[i]), + sqlite3ColumnExprAuth(pTab, &pTab->aCol[i], pParse), iRegStore); continue; }else{ @@ -2005,7 +2005,7 @@ void sqlite3GenerateConstraintChecks( assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); nSeenReplace++; sqlite3ExprCodeCopy(pParse, - sqlite3ColumnExpr(pParse, pTab, pCol), iReg); + sqlite3ColumnExprAuth(pTab, pCol, pParse), iReg); sqlite3VdbeJumpHere(v, addr1); break; } @@ -3216,8 +3216,8 @@ static int xferOptimization( */ if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ if( sqlite3ExprCompare(0, - sqlite3ColumnExpr(0, pSrc, pSrcCol), - sqlite3ColumnExpr(0, pDest, pDestCol), -1)!=0 ){ + sqlite3ColumnExpr(pSrc, pSrcCol), + sqlite3ColumnExpr(pDest, pDestCol), -1)!=0 ){ testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); testcase( pDestCol->colFlags & COLFLAG_STORED ); return 0; /* Different generator expressions */ @@ -3236,8 +3236,8 @@ static int xferOptimization( } /* Default values for second and subsequent columns need to match. */ if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){ - Expr *pDestExpr = sqlite3ColumnExpr(0, pDest, pDestCol); - Expr *pSrcExpr = sqlite3ColumnExpr(0, pSrc, pSrcCol); + Expr *pDestExpr = sqlite3ColumnExpr(pDest, pDestCol); + Expr *pSrcExpr = sqlite3ColumnExpr(pSrc, pSrcCol); assert( pDestExpr==0 || pDestExpr->op==TK_SPAN ); assert( pDestExpr==0 || !ExprHasProperty(pDestExpr, EP_IntValue) ); assert( pSrcExpr==0 || pSrcExpr->op==TK_SPAN ); diff --git a/src/pragma.c b/src/pragma.c index 2da455f39e..48645ccace 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1242,7 +1242,7 @@ void sqlite3Pragma( }else{ for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } - pColExpr = sqlite3ColumnExpr(0,pTab,pCol); + pColExpr = sqlite3ColumnExpr(pTab,pCol); assert( pColExpr==0 || pColExpr->op==TK_SPAN || isHidden>=2 ); assert( pColExpr==0 || !ExprHasProperty(pColExpr, EP_IntValue) || isHidden>=2 ); @@ -1933,8 +1933,8 @@ void sqlite3Pragma( }else{ if( pCol->iDflt ){ sqlite3_value *pDfltValue = 0; - sqlite3ValueFromExpr(db, sqlite3ColumnExpr(0,pTab,pCol), ENC(db), - pCol->affinity, &pDfltValue); + sqlite3ValueFromExpr(db, sqlite3ColumnExprAuth(pTab,pCol,pParse), + ENC(db), pCol->affinity, &pDfltValue); if( pDfltValue ){ p4 = sqlite3_value_type(pDfltValue); sqlite3ValueFree(pDfltValue); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4aba46263b..c53c06f797 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -5075,7 +5075,8 @@ void sqlite3ResetOneSchema(sqlite3*,int); void sqlite3CollapseDatabaseArray(sqlite3*); void sqlite3CommitInternalChanges(sqlite3*); void sqlite3ColumnSetExpr(Parse*,Table*,Column*,Expr*); -Expr *sqlite3ColumnExpr(Parse*,Table*,Column*); +Expr *sqlite3ColumnExpr(Table*,Column*); +Expr *sqlite3ColumnExprAuth(Table*,Column*,Parse*); void sqlite3ColumnSetColl(sqlite3*,Column*,const char*zColl); const char *sqlite3ColumnColl(Column*); void sqlite3DeleteColumnNames(sqlite3*,Table*); diff --git a/src/update.c b/src/update.c index 6eb2f6a66e..c43ed9aed4 100644 --- a/src/update.c +++ b/src/update.c @@ -66,11 +66,12 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ if( pCol->iDflt ){ sqlite3_value *pValue = 0; u8 enc = ENC(sqlite3VdbeDb(v)); + Parse *pParse = sqlite3VdbeParser(v); assert( !IsView(pTab) ); VdbeComment((v, "%s.%s", pTab->zName, pCol->zCnName)); assert( inCol ); sqlite3ValueFromExpr(sqlite3VdbeDb(v), - sqlite3ColumnExpr(0,pTab,pCol), enc, + sqlite3ColumnExprAuth(pTab,pCol,pParse), enc, pCol->affinity, &pValue); if( pValue ){ sqlite3VdbeAppendP4(v, pValue, P4_MEM); @@ -539,7 +540,7 @@ void sqlite3Update( if( aXRef[i]>=0 ) continue; if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue; if( sqlite3ExprReferencesUpdatedColumn( - sqlite3ColumnExpr(0,pTab, &pTab->aCol[i]), + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), aXRef, chngRowid) ){ aXRef[i] = 99999; diff --git a/src/where.c b/src/where.c index 2760d21994..dab75c5d27 100644 --- a/src/where.c +++ b/src/where.c @@ -6692,7 +6692,7 @@ static SQLITE_NOINLINE void whereAddIndexedExpr( if( j==XN_EXPR ){ pExpr = pIdx->aColExpr->a[i].pExpr; }else if( j>=0 && (pTab->aCol[j].colFlags & COLFLAG_VIRTUAL)!=0 ){ - pExpr = sqlite3ColumnExpr(0, pTab, &pTab->aCol[j]); + pExpr = sqlite3ColumnExpr(pTab, &pTab->aCol[j]); }else{ continue; }