-C Column\snames\scoming\sback\sfrom\sa\sSELECT\sare\snow\sjust\sthe\sname\sof\sthe\nsource\scolumn\swithout\sthe\s"table."\sprefix.\sIn\sother\swords,\n"PRAGMA\sshort_column_names=ON"\sis\snow\sthe\sdefault.\nThis\smakes\sthe\snames\sof\scolumns\sbehave\smore\slike\sother\sSQL\sengines.\nThe\sold\sbehavior\scan\sbe\srestored\sby\ssetting\s"PRAGMA\sshort_column_names=OFF".\s(CVS\s2231)
-D 2005-01-18T16:02:40
+C CREATE\sTABLE\s...\sAS\s...\suses\sshort\snames\sfor\scolumns.\s\sTicket\s#1036.\s(CVS\s2232)
+D 2005-01-18T17:20:10
F Makefile.in ffd81f5e926d40b457071b4de8d7c1fa18f39b5a
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
F src/cursor.c f883813759742068890b1f699335872bfa8fdf41
F src/date.c f3d1f5cd1503dabf426a198f3ebef5afbc122a7f
F src/delete.c 728a02e5b5c62d294f8cdbdb21dbaa3e188983ab
-F src/expr.c fa983460a064ee9ba55a0b3be1bd7db6b0545622
+F src/expr.c fdacfb27a5803eadda1a14980553ca394d1d5612
F src/func.c dc188d862d7276ea897655b248e2cb17022686e3
F src/hash.c a97721a55440b7bea31ffe471bb2f6b4123cddd5
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
F src/pragma.c ac594f74c90ffec043c43e49358719ffeb491eec
F src/printf.c 3d20b21cfecadacecac3fb7274e746cb81d3d357
F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3
-F src/select.c 56f018292ce467c276440916d455671d884e9141
+F src/select.c f9239c5936598de7f20710d82b024ff0a1582cd3
F src/shell.c 591364a0e9ca4ce53873e21e0294476c0c2b4770
F src/sqlite.h.in 0d5e48e506845b74a845c9470e01d3f472b59611
F src/sqliteInt.h c6414179a23cab108b4b07e8665f30829ce47f2a
F test/misc1.test 744f60d1025fa978708b96cb222a07a1feb1524a
F test/misc2.test bc852f1622d98b610d1f3e2ceb36ed7271256050
F test/misc3.test 928a2f1e1189924ed14e1ae074e34f40688bdf94
-F test/misc4.test 33fd2ef6e9443acd73257a8f49aee0baec125888
+F test/misc4.test 74e6b9e8f96ec60ad0afa61f7fad681f88daa473
F test/misuse.test 600738a8e611989bc5f544303f5e311c5f228084
F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
F test/null.test 5a945790ef21b24fd602fe2c7a23847b903f8687
F test/rollback.test 94cd981ee3a627d9f6466f69dcf1f7dbfe695d7a
F test/rowid.test 1ce3f1520d2082b0363e7d9bdef904cb72b9efe8
F test/safety.test 907b64fee719554a3622853812af3886fddbbb4f
-F test/select1.test 0b4d3883a9c4e4b78e9f81b4f5d339e4e1494d26
+F test/select1.test 6d4a42c2fb7fca7196435d6bc90aac5b180e8d94
F test/select2.test 91a2225926039b0d1687840735c284dbbf89f0bc
F test/select3.test 9de435aa84fc406708cd8dc1b1d60e7f27cea685
F test/select4.test 1ae6f2bd6177d4428df8644eb95d09f4568fb149
F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
F www/whentouse.tcl c3b50d3ac31c54be2a1af9b488a89d22f1e6e746
-P 88d4834fec7583a9b6400a1ce5b928c1f8a390dd
-R b82899e5e20c2e403cd6bfa3ba754b75
+P 9295050af1bf2d9d4dc63adc225a2848d67cbe17
+R a088aa4bf87c4c0ebda525aa7fbfbf2e
U drh
-Z fb3a884afe1488504ff81cd6dd7f3e7e
+Z 81817808d93adb08227cfb0c57264748
-9295050af1bf2d9d4dc63adc225a2848d67cbe17
\ No newline at end of file
+b1d4c42d2be07adda68d31c570ba7cf8b115c3ad
\ No newline at end of file
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
-** $Id: expr.c,v 1.180 2005/01/18 04:00:44 drh Exp $
+** $Id: expr.c,v 1.181 2005/01/18 17:20:10 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
** Note that the expression in the result set should have already been
** resolved by the time the WHERE clause is resolved.
*/
- if( cnt==0 && pEList!=0 ){
+ if( cnt==0 && pEList!=0 && zTab==0 ){
for(j=0; j<pEList->nExpr; j++){
char *zAs = pEList->a[j].zName;
if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
** This file contains C code routines that are called by the parser
** to handle SELECT statements in SQLite.
**
-** $Id: select.c,v 1.226 2005/01/18 16:02:40 drh Exp $
+** $Id: select.c,v 1.227 2005/01/18 17:20:10 drh Exp $
*/
#include "sqliteInt.h"
assert( pTab->nCol>0 );
pTab->aCol = aCol = sqliteMalloc( sizeof(pTab->aCol[0])*pTab->nCol );
for(i=0, pCol=aCol; i<pTab->nCol; i++, pCol++){
- Expr *pR;
+ Expr *p, *pR;
char *zType;
char *zName;
- Expr *p = pEList->a[i].pExpr;
+ char *zBasename;
+ int cnt;
+
+ /* Get an appropriate name for the column
+ */
+ p = pEList->a[i].pExpr;
assert( p->pRight==0 || p->pRight->token.z==0 || p->pRight->token.z[0]!=0 );
if( (zName = pEList->a[i].zName)!=0 ){
+ /* If the column contains an "AS <name>" phrase, use <name> as the name */
zName = sqliteStrDup(zName);
}else if( p->op==TK_DOT
- && (pR=p->pRight)!=0 && pR->token.z && pR->token.z[0] ){
- int cnt;
+ && (pR=p->pRight)!=0 && pR->token.z && pR->token.z[0] ){
+ /* For columns of the from A.B use B as the name */
zName = sqlite3MPrintf("%T", &pR->token);
- for(j=cnt=0; j<i; j++){
- if( sqlite3StrICmp(aCol[j].zName, zName)==0 ){
- sqliteFree(zName);
- zName = sqlite3MPrintf("%T_%d", &pR->token, ++cnt);
- j = -1;
- }
- }
}else if( p->span.z && p->span.z[0] ){
+ /* Use the original text of the column expression as its name */
zName = sqlite3MPrintf("%T", &p->span);
}else{
+ /* If all else fails, make up a name */
zName = sqlite3MPrintf("column%d", i+1);
}
sqlite3Dequote(zName);
+
+ /* Make sure the column name is unique. If the name is not unique,
+ ** append a integer to the name so that it becomes unique.
+ */
+ zBasename = zName;
+ for(j=cnt=0; j<i; j++){
+ if( sqlite3StrICmp(aCol[j].zName, zName)==0 ){
+ zName = sqlite3MPrintf("%s:%d", zBasename, ++cnt);
+ j = -1;
+ }
+ }
+ if( zBasename!=zName ){
+ sqliteFree(zBasename);
+ }
pCol->zName = zName;
+ /* Get the typename, type affinity, and collating sequence for the
+ ** column.
+ */
zType = sqliteStrDup(columnType(pParse, pSelect->pSrc ,p));
pCol->zType = zType;
pCol->affinity = SQLITE_AFF_NUMERIC;
pExpr = pRight;
pExpr->span = pExpr->token;
}
- pNew = sqlite3ExprListAppend(pNew, pExpr, 0);
+ pNew = sqlite3ExprListAppend(pNew, pExpr, &pRight->token);
}
}
if( !tableSeen ){
# This file implements tests for miscellanous features that were
# left out of other test files.
#
-# $Id: misc4.test,v 1.10 2005/01/18 14:45:49 drh Exp $
+# $Id: misc4.test,v 1.11 2005/01/18 17:20:10 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
}
} {01 data01 01 3.0 +1 data+1 +1 7.0}
+# Ticket #1036. When creating tables from a SELECT on a view, use the
+# short names of columns.
+#
+do_test misc4-5.1 {
+ execsql {
+ create table t4(a,b);
+ create table t5(a,c);
+ insert into t4 values (1,2);
+ insert into t5 values (1,3);
+ create view myview as select t4.a a from t4 inner join t5 on t4.a=t5.a;
+ create table problem as select * from myview;
+ }
+ execsql2 {
+ select * FROM problem;
+ }
+} {a 1}
+do_test misc4-5.2 {
+ execsql2 {
+ create table t6 as select * from t4, t5;
+ select * from t6;
+ }
+} {a 1 b 2 a:1 1 c 3}
+
finish_test
# This file implements regression tests for SQLite library. The
# focus of this file is testing the SELECT statement.
#
-# $Id: select1.test,v 1.39 2005/01/18 16:02:41 drh Exp $
+# $Id: select1.test,v 1.40 2005/01/18 17:20:10 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_test select1-6.1.3 {
set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
lappend v $msg
-} {0 {test1.f1 11 test1.f2 22}}
+} {0 {f1 11 f2 22}}
do_test select1-6.1.4 {
set v [catch {execsql2 {SELECT DISTINCT * FROM test1 WHERE f1==11}} msg]
execsql {PRAGMA full_column_names=off}
lappend v $msg
-} {0 {test1.f1 11 test1.f2 22}}
+} {0 {f1 11 f2 22}}
do_test select1-6.1.5 {
set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
lappend v $msg