Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Work around a bug in the Borland C compiler. Ticket #172. (CVS 765) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
3ef2925650bfbeb4ee5dbd0aaf8e606f |
User & Date: | drh 2002-10-20 15:53:04.000 |
Context
2002-10-20
| ||
15:55 | Export the sqlite_function_type function from windows DLLs. Ticket #173. (CVS 766) (check-in: d5470dfe10 user: drh tags: trunk) | |
15:53 | Work around a bug in the Borland C compiler. Ticket #172. (CVS 765) (check-in: 3ef2925650 user: drh tags: trunk) | |
15:46 | Make sure malloc(0) always returns NULL. Fix for ticket #171. (CVS 764) (check-in: 4622b7ce8f user: drh tags: trunk) | |
Changes
Changes to src/select.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** | | > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** ** $Id: select.c,v 1.113 2002/10/20 15:53:04 drh Exp $ */ #include "sqliteInt.h" /* ** Allocate a new Select structure and return a pointer to that ** structure. */ Select *sqliteSelectNew( ExprList *pEList, /* which columns to include in the result */ |
︙ | ︙ | |||
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 | case TK_INTERSECT: z = "INTERSECT"; break; case TK_EXCEPT: z = "EXCEPT"; break; default: z = "UNION"; break; } return z; } /* ** Given a SELECT statement, generate a Table structure that describes ** the result set of that SELECT. */ Table *sqliteResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){ Table *pTab; int i; ExprList *pEList; | > > > > > < | 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 | case TK_INTERSECT: z = "INTERSECT"; break; case TK_EXCEPT: z = "EXCEPT"; break; default: z = "UNION"; break; } return z; } /* ** Forward declaration */ static int fillInColumnList(Parse*, Select*); /* ** Given a SELECT statement, generate a Table structure that describes ** the result set of that SELECT. */ Table *sqliteResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){ Table *pTab; int i; ExprList *pEList; if( fillInColumnList(pParse, pSelect) ){ return 0; } pTab = sqliteMalloc( sizeof(Table) ); if( pTab==0 ){ return 0; |
︙ | ︙ | |||
1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 | } /* ** Recursively scan through an expression tree. For every reference ** to a column in table number iFrom, change that reference to the ** same column in table number iTo. */ static void changeTables(Expr *pExpr, int iFrom, int iTo){ if( pExpr==0 ) return; if( pExpr->op==TK_COLUMN && pExpr->iTable==iFrom ){ pExpr->iTable = iTo; }else{ | > < | 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 | } /* ** Recursively scan through an expression tree. For every reference ** to a column in table number iFrom, change that reference to the ** same column in table number iTo. */ static void changeTablesInList(ExprList*, int, int); /* Forward Declaration */ static void changeTables(Expr *pExpr, int iFrom, int iTo){ if( pExpr==0 ) return; if( pExpr->op==TK_COLUMN && pExpr->iTable==iFrom ){ pExpr->iTable = iTo; }else{ changeTables(pExpr->pLeft, iFrom, iTo); changeTables(pExpr->pRight, iFrom, iTo); changeTablesInList(pExpr->pList, iFrom, iTo); } } static void changeTablesInList(ExprList *pList, int iFrom, int iTo){ if( pList ){ |
︙ | ︙ | |||
1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 | ** This routine is part of the flattening procedure. A subquery ** whose result set is defined by pEList appears as entry in the ** FROM clause of a SELECT such that the VDBE cursor assigned to that ** FORM clause entry is iTable. This routine make the necessary ** changes to pExpr so that it refers directly to the source table ** of the subquery rather the result set of the subquery. */ static void substExpr(Expr *pExpr, int iTable, ExprList *pEList, int iSub){ if( pExpr==0 ) return; if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable && pExpr->iColumn>=0 ){ Expr *pNew; assert( pEList!=0 && pExpr->iColumn<pEList->nExpr ); assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 ); pNew = pEList->a[pExpr->iColumn].pExpr; | > | 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 | ** This routine is part of the flattening procedure. A subquery ** whose result set is defined by pEList appears as entry in the ** FROM clause of a SELECT such that the VDBE cursor assigned to that ** FORM clause entry is iTable. This routine make the necessary ** changes to pExpr so that it refers directly to the source table ** of the subquery rather the result set of the subquery. */ static void substExprList(ExprList*,int,ExprList*,int); /* Forward Decl */ static void substExpr(Expr *pExpr, int iTable, ExprList *pEList, int iSub){ if( pExpr==0 ) return; if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable && pExpr->iColumn>=0 ){ Expr *pNew; assert( pEList!=0 && pExpr->iColumn<pEList->nExpr ); assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 ); pNew = pEList->a[pExpr->iColumn].pExpr; |
︙ | ︙ | |||
1340 1341 1342 1343 1344 1345 1346 | pExpr->iAgg = pNew->iAgg; pExpr->nFuncName = pNew->nFuncName; sqliteTokenCopy(&pExpr->token, &pNew->token); if( iSub!=iTable ){ changeTables(pExpr, iSub, iTable); } }else{ | < | 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 | pExpr->iAgg = pNew->iAgg; pExpr->nFuncName = pNew->nFuncName; sqliteTokenCopy(&pExpr->token, &pNew->token); if( iSub!=iTable ){ changeTables(pExpr, iSub, iTable); } }else{ substExpr(pExpr->pLeft, iTable, pEList, iSub); substExpr(pExpr->pRight, iTable, pEList, iSub); substExprList(pExpr->pList, iTable, pEList, iSub); } } static void substExprList(ExprList *pList, int iTable, ExprList *pEList, int iSub){ |
︙ | ︙ |