--- [EMAIL PROTECTED] wrote: > Joe Wilson <[EMAIL PROTECTED]> wrote: > > > > What is the recommended way to match a TK_COLUMN Expr from > > a Select's pEList with its corresponding Select.pSrc > > SrcList_item? > > > > Do you forsee any technical problem with recursively descending > > the entire parse tree and calling sqlite3SelectResolve() > > on every nested Select prior to any code generation in > > order to perform high-level AST manipulation? > > > > I would like to do a number of AST transformations before any > > VDBE code is generated, but I still lack a clear understanding > > of how to reliably map a TK_COLUMN Expr with its associated > > SrcList_item. > > > > Please explain to me more about what you are doing. What > is an AST manipulation?
If anyone else is interested in the internal SQLite parse tree format, this code fragment from select.c confirms my original guess. To match a (resolved) TK_COLUMN Expr with its table it seems that you must search all SrcLists in the name context chain in order to find the SrcList_item entry whose iCursor matches the TK_COLUMN's pExpr->iTable. switch( pExpr->op ){ case TK_AGG_COLUMN: case TK_COLUMN: { /* The expression is a column. Locate the table the column is being ** extracted from in NameContext.pSrcList. This table may be real ** database table or a subquery. */ Table *pTab = 0; /* Table structure column is extracted from */ Select *pS = 0; /* Select the column is extracted from */ int iCol = pExpr->iColumn; /* Index of column in pTab */ while( pNC && !pTab ){ SrcList *pTabList = pNC->pSrcList; for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); if( j<pTabList->nSrc ){ pTab = pTabList->a[j].pTab; pS = pTabList->a[j].pSelect; }else{ pNC = pNC->pNext; } } I reckon I'll turn this into a function returning pTab. __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com