diff options
author | stephan <stephan@noemail.net> | 2023-02-06 22:25:18 +0000 |
---|---|---|
committer | stephan <stephan@noemail.net> | 2023-02-06 22:25:18 +0000 |
commit | f8c73aed6716f911d8a19511586751e5b9aa1e9f (patch) | |
tree | 8d35e728901da3454cbff9c600fd0bc1602b2ce8 /src/resolve.c | |
parent | 87ce1ff7f72621cb8a8a99dc93141d253899eba0 (diff) | |
parent | 9f29998d2a8890d58b52d13605324193703525c3 (diff) | |
download | sqlite-f8c73aed6716f911d8a19511586751e5b9aa1e9f.tar.gz sqlite-f8c73aed6716f911d8a19511586751e5b9aa1e9f.zip |
Merge trunk into wasi-patches branch.
FossilOrigin-Name: 656d36f50f630da68262469087bad1ac71b10325e233a7963103c8cbc232f61a
Diffstat (limited to 'src/resolve.c')
-rw-r--r-- | src/resolve.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/resolve.c b/src/resolve.c index 0d196ac37..9677f9de9 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -203,6 +203,32 @@ static void extendFJMatch( } /* +** Return TRUE (non-zero) if zTab is a valid name for the schema table pTab. +*/ +static SQLITE_NOINLINE int isValidSchemaTableName( + const char *zTab, /* Name as it appears in the SQL */ + Table *pTab, /* The schema table we are trying to match */ + Schema *pSchema /* non-NULL if a database qualifier is present */ +){ + const char *zLegacy; + assert( pTab!=0 ); + assert( pTab->tnum==1 ); + if( sqlite3StrNICmp(zTab, "sqlite_", 7)!=0 ) return 0; + zLegacy = pTab->zName; + if( strcmp(zLegacy+7, &LEGACY_TEMP_SCHEMA_TABLE[7])==0 ){ + if( sqlite3StrICmp(zTab+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){ + return 1; + } + if( pSchema==0 ) return 0; + if( sqlite3StrICmp(zTab+7, &LEGACY_SCHEMA_TABLE[7])==0 ) return 1; + if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1; + }else{ + if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1; + } + return 0; +} + +/* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr ** expression node refer back to that source column. The following changes @@ -355,15 +381,17 @@ static int lookupName( } assert( zDb==0 || zTab!=0 ); if( zTab ){ - const char *zTabName; if( zDb ){ if( pTab->pSchema!=pSchema ) continue; if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; } - zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; - assert( zTabName!=0 ); - if( sqlite3StrICmp(zTabName, zTab)!=0 ){ - continue; + if( pItem->zAlias!=0 ){ + if( sqlite3StrICmp(zTab, pItem->zAlias)!=0 ){ + continue; + } + }else if( sqlite3StrICmp(zTab, pTab->zName)!=0 ){ + if( pTab->tnum!=1 ) continue; + if( !isValidSchemaTableName(zTab, pTab, pSchema) ) continue; } assert( ExprUseYTab(pExpr) ); if( IN_RENAME_OBJECT && pItem->zAlias ){ |