Hi, sorry for the noise. Again trying to supply attachments.
Bye. -- Reinhard Nißl -----Ursprüngliche Nachricht----- Von: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-boun...@sqlite.org] Im Auftrag von Nißl Reinhard Gesendet: Montag, 14. Februar 2011 13:56 An: General Discussion of SQLite Database Betreff: Re: [sqlite] BUG (3.7.5): identifier quotation characters get part of column names for certain statements Hi, looks like the patch did got stripped. I've attached it again. And please find attached a further patch which addresses TK_AGG_COLUMNS. Bye. -- Reinhard Nißl -----Ursprüngliche Nachricht----- Von: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-boun...@sqlite.org] Im Auftrag von Nißl Reinhard Gesendet: Samstag, 12. Februar 2011 23:42 An: General Discussion of SQLite Database Betreff: Re: [sqlite] BUG (3.7.5): identifier quotation characters get part of column names for certain statements Hi, it took me 6 hours to find the source location which behaves inconsistent. Please find attached a fix for this bug. Bye. -- Reinhard Nißl -----Ursprüngliche Nachricht----- Von: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-boun...@sqlite.org] Im Auftrag von Nißl Reinhard Gesendet: Freitag, 11. Februar 2011 10:42 An: j...@kreibi.ch; General Discussion of SQLite Database Betreff: Re: [sqlite] BUG (3.7.5): identifier quotation characters get part of column names for certain statements I'd like to create a patch which changes the behavior in that way, but I'm not that used to the sqlite3 internals. From a quick glance at the source, I think it has something to do with TK_COLUMN and TK_VARIABLE. It would be nice if you could give me a pointer where to place the change in the source code.
--- src/select.c +++ src/select.c @@ -2710,10 +2710,53 @@ } } /***** If we reach this point, flattening is permitted. *****/ + pList = p->pEList; + { + SrcList *pTabList = pSrc; /* List of tables to select from */ + int fullNames, shortNames; + fullNames = (db->flags & SQLITE_FullColNames)!=0; + shortNames = (db->flags & SQLITE_ShortColNames)!=0; + /* generate alias names for columns that are consistent with generateColumnNames() */ + for(i=0; i<pList->nExpr; i++){ + if( pList->a[i].zName==0 ){ + Expr *p; + p = pList->a[i].pExpr; + + if( (p->op==TK_COLUMN || p->op==TK_AGG_COLUMN) && pTabList && (shortNames || fullNames) ){ + Table *pTab; + char *zCol; + int j, iCol = p->iColumn; + for(j=0; ALWAYS(j<pTabList->nSrc); j++){ + if( pTabList->a[j].iCursor==p->iTable ) break; + } + assert( j<pTabList->nSrc ); + pTab = pTabList->a[j].pTab; + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); + if( iCol<0 ){ + zCol = "rowid"; + }else{ + zCol = pTab->aCol[iCol].zName; + } + if( fullNames ){ + pList->a[i].zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); + }else{ + pList->a[i].zName = sqlite3DbStrDup(db, zCol); + } + }else{ + const char *zSpan = pList->a[i].zSpan; + if( ALWAYS(zSpan) ){ + pList->a[i].zName = sqlite3DbStrDup(db, zSpan); + } + } + } + } + } + /* Authorize the subquery */ pParse->zAuthContext = pSubitem->zName; sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0); pParse->zAuthContext = zSavedAuthContext; @@ -2884,19 +2927,10 @@ ** \_____________________ outer query ______________________________/ ** ** We look at every expression in the outer query and every place we see ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". */ - pList = pParent->pEList; - for(i=0; i<pList->nExpr; i++){ - if( pList->a[i].zName==0 ){ - const char *zSpan = pList->a[i].zSpan; - if( ALWAYS(zSpan) ){ - pList->a[i].zName = sqlite3DbStrDup(db, zSpan); - } - } - } substExprList(db, pParent->pEList, iParent, pSub->pEList); if( isAgg ){ substExprList(db, pParent->pGroupBy, iParent, pSub->pEList); pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); }
--- src/select.c +++ src/select.c @@ -89284,7 +89284,7 @@ Expr *pColExpr = p; /* The expression that is the result column name */ Table *pTab; /* Table associated with this expression */ while( pColExpr->op==TK_DOT ) pColExpr = pColExpr->pRight; - if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){ + if( (pColExpr->op==TK_COLUMN || pColExpr->op==TK_AGG_COLUMN) && ALWAYS(pColExpr->pTab!=0) ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; pTab = pColExpr->pTab;
_______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users