mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
When computing the datatypes for columns in a view, use the same datatype name
as the underlying table if such is available and is consistent with the computed affinity of the column. [forum:/forumpost/7fb1fe9dcf310ef5|Forum thread 7fb1fe9dcf310ef5]. FossilOrigin-Name: 497a98363fd1ed079544620ec5d0883f987ed03013131542741c93d7568e8568
This commit is contained in:
54
src/select.c
54
src/select.c
@@ -1870,7 +1870,6 @@ static void generateSortTail(
|
||||
#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */
|
||||
# define columnType(A,B,C,D,E) columnTypeImpl(A,B)
|
||||
#endif
|
||||
#ifndef SQLITE_OMIT_DECLTYPE
|
||||
static const char *columnTypeImpl(
|
||||
NameContext *pNC,
|
||||
#ifndef SQLITE_ENABLE_COLUMN_METADATA
|
||||
@@ -1901,7 +1900,7 @@ static const char *columnTypeImpl(
|
||||
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( ALWAYS(pNC) && !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 ){
|
||||
@@ -1912,7 +1911,7 @@ static const char *columnTypeImpl(
|
||||
}
|
||||
}
|
||||
|
||||
if( NEVER(pTab==0) ){
|
||||
if( pTab==0 ){
|
||||
/* At one time, code such as "SELECT new.x" within a trigger would
|
||||
** cause this condition to run. Since then, we have restructured how
|
||||
** trigger code is generated and so this condition is no longer
|
||||
@@ -2017,7 +2016,6 @@ static const char *columnTypeImpl(
|
||||
#endif
|
||||
return zType;
|
||||
}
|
||||
#endif /* !defined(SQLITE_OMIT_DECLTYPE) */
|
||||
|
||||
/*
|
||||
** Generate code that will tell the VDBE the declaration types of columns
|
||||
@@ -2311,6 +2309,7 @@ void sqlite3SubqueryColumnTypes(
|
||||
int i,j;
|
||||
Expr *p;
|
||||
struct ExprList_item *a;
|
||||
NameContext sNC;
|
||||
|
||||
assert( pSelect!=0 );
|
||||
assert( (pSelect->selFlags & SF_Resolved)!=0 );
|
||||
@@ -2319,6 +2318,8 @@ void sqlite3SubqueryColumnTypes(
|
||||
if( db->mallocFailed ) return;
|
||||
while( pSelect->pPrior ) pSelect = pSelect->pPrior;
|
||||
a = pSelect->pEList->a;
|
||||
memset(&sNC, 0, sizeof(sNC));
|
||||
sNC.pSrcList = pSelect->pSrc;
|
||||
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
|
||||
const char *zType;
|
||||
i64 n;
|
||||
@@ -2344,28 +2345,31 @@ void sqlite3SubqueryColumnTypes(
|
||||
pCol->affinity = SQLITE_AFF_BLOB;
|
||||
}
|
||||
}
|
||||
if( pCol->affinity==SQLITE_AFF_NUMERIC
|
||||
|| pCol->affinity==SQLITE_AFF_FLEXNUM
|
||||
){
|
||||
zType = "NUM";
|
||||
}else{
|
||||
zType = 0;
|
||||
for(j=1; j<SQLITE_N_STDTYPE; j++){
|
||||
if( sqlite3StdTypeAffinity[j]==pCol->affinity ){
|
||||
zType = sqlite3StdType[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( zType ){
|
||||
i64 m = sqlite3Strlen30(zType);
|
||||
n = sqlite3Strlen30(pCol->zCnName);
|
||||
pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+m+2);
|
||||
if( pCol->zCnName ){
|
||||
memcpy(&pCol->zCnName[n+1], zType, m+1);
|
||||
pCol->colFlags |= COLFLAG_HASTYPE;
|
||||
zType = columnType(&sNC, p, 0, 0, 0);
|
||||
if( zType==0 || pCol->affinity!=sqlite3AffinityType(zType, 0) ){
|
||||
if( pCol->affinity==SQLITE_AFF_NUMERIC
|
||||
|| pCol->affinity==SQLITE_AFF_FLEXNUM
|
||||
){
|
||||
zType = "NUM";
|
||||
}else{
|
||||
testcase( pCol->colFlags & COLFLAG_HASTYPE );
|
||||
zType = 0;
|
||||
for(j=1; j<SQLITE_N_STDTYPE; j++){
|
||||
if( sqlite3StdTypeAffinity[j]==pCol->affinity ){
|
||||
zType = sqlite3StdType[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if( zType ){
|
||||
i64 m = sqlite3Strlen30(zType);
|
||||
n = sqlite3Strlen30(pCol->zCnName);
|
||||
pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+m+2);
|
||||
if( pCol->zCnName ){
|
||||
memcpy(&pCol->zCnName[n+1], zType, m+1);
|
||||
pCol->colFlags |= COLFLAG_HASTYPE;
|
||||
}else{
|
||||
testcase( pCol->colFlags & COLFLAG_HASTYPE );
|
||||
pCol->colFlags &= ~(COLFLAG_HASTYPE|COLFLAG_HASCOLL);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user