Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb7a86e4

Browse files
Jan WieckJan Wieck
Jan Wieck
authored and
Jan Wieck
committed
Fixed wrong hasAggs when aggregate columns of view aren't
selected.Disabled ability of defining DISTINCT or ORDER BY on views.Jan
1 parent79c2576 commitb7a86e4

File tree

2 files changed

+146
-4
lines changed

2 files changed

+146
-4
lines changed

‎src/backend/rewrite/rewriteDefine.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.27 1999/05/10 00:45:30 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.28 1999/05/12 17:04:46 wieck Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -317,6 +317,18 @@ DefineQueryRewrite(RuleStmt *stmt)
317317
if (query->limitOffset!=NULL||query->limitCount!=NULL)
318318
elog(ERROR,"LIMIT clause not supported in views");
319319

320+
/*
321+
* DISTINCT on view is not supported
322+
*/
323+
if (query->uniqueFlag!=NULL)
324+
elog(ERROR,"DISTINCT not supported in views");
325+
326+
/*
327+
* ORDER BY in view is not supported
328+
*/
329+
if (query->sortClause!=NIL)
330+
elog(ERROR,"ORDER BY not supported in views");
331+
320332
/*
321333
* ... and finally the rule must be named _RETviewname.
322334
*/

‎src/backend/rewrite/rewriteHandler.c

Lines changed: 133 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
*
88
* IDENTIFICATION
9-
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.39 1999/05/1215:01:53 wieck Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.40 1999/05/1217:04:47 wieck Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -59,6 +59,7 @@ static void modifyAggrefChangeVarnodes(Node **nodePtr, int rt_index, int new_ind
5959
staticvoidmodifyAggrefDropQual(Node**nodePtr,Node*orignode,Expr*expr);
6060
staticSubLink*modifyAggrefMakeSublink(Expr*origexp,Query*parsetree);
6161
staticvoidmodifyAggrefQual(Node**nodePtr,Query*parsetree);
62+
staticboolcheckQueryHasAggs(Node*node);
6263
staticQuery*fireRIRrules(Query*parsetree);
6364

6465

@@ -1272,6 +1273,126 @@ modifyAggrefQual(Node **nodePtr, Query *parsetree)
12721273
}
12731274

12741275

1276+
/*
1277+
* checkQueryHasAggs -
1278+
*Queries marked hasAggs might not have them any longer after
1279+
*rewriting. Check it.
1280+
*/
1281+
staticbool
1282+
checkQueryHasAggs(Node*node)
1283+
{
1284+
if (node==NULL)
1285+
return FALSE;
1286+
1287+
switch(nodeTag(node)) {
1288+
caseT_TargetEntry:
1289+
{
1290+
TargetEntry*tle= (TargetEntry*)node;
1291+
1292+
returncheckQueryHasAggs((Node*)(tle->expr));
1293+
}
1294+
break;
1295+
1296+
caseT_Aggref:
1297+
return TRUE;
1298+
1299+
caseT_Expr:
1300+
{
1301+
Expr*exp= (Expr*)node;
1302+
1303+
returncheckQueryHasAggs((Node*)(exp->args));
1304+
}
1305+
break;
1306+
1307+
caseT_Iter:
1308+
{
1309+
Iter*iter= (Iter*)node;
1310+
1311+
returncheckQueryHasAggs((Node*)(iter->iterexpr));
1312+
}
1313+
break;
1314+
1315+
caseT_ArrayRef:
1316+
{
1317+
ArrayRef*ref= (ArrayRef*)node;
1318+
1319+
if (checkQueryHasAggs((Node*)(ref->refupperindexpr)))
1320+
return TRUE;
1321+
1322+
if (checkQueryHasAggs((Node*)(ref->reflowerindexpr)))
1323+
return TRUE;
1324+
1325+
if (checkQueryHasAggs((Node*)(ref->refexpr)))
1326+
return TRUE;
1327+
1328+
if (checkQueryHasAggs((Node*)(ref->refassgnexpr)))
1329+
return TRUE;
1330+
1331+
return FALSE;
1332+
}
1333+
break;
1334+
1335+
caseT_Var:
1336+
return FALSE;
1337+
1338+
caseT_Param:
1339+
return FALSE;
1340+
1341+
caseT_Const:
1342+
return FALSE;
1343+
1344+
caseT_List:
1345+
{
1346+
List*l;
1347+
1348+
foreach (l, (List*)node) {
1349+
if (checkQueryHasAggs((Node*)lfirst(l)))
1350+
return TRUE;
1351+
}
1352+
return FALSE;
1353+
}
1354+
break;
1355+
1356+
caseT_CaseExpr:
1357+
{
1358+
CaseExpr*exp= (CaseExpr*)node;
1359+
1360+
if (checkQueryHasAggs((Node*)(exp->args)))
1361+
return TRUE;
1362+
1363+
if (checkQueryHasAggs((Node*)(exp->defresult)))
1364+
return TRUE;
1365+
1366+
return FALSE;
1367+
}
1368+
break;
1369+
1370+
caseT_CaseWhen:
1371+
{
1372+
CaseWhen*when= (CaseWhen*)node;
1373+
1374+
if (checkQueryHasAggs((Node*)(when->expr)))
1375+
return TRUE;
1376+
1377+
if (checkQueryHasAggs((Node*)(when->result)))
1378+
return TRUE;
1379+
1380+
return FALSE;
1381+
}
1382+
break;
1383+
1384+
default:
1385+
elog(NOTICE,"unknown node tag %d in checkQueryHasAggs()",nodeTag(node));
1386+
elog(NOTICE,"Node is: %s",nodeToString(node));
1387+
break;
1388+
1389+
1390+
}
1391+
1392+
return FALSE;
1393+
}
1394+
1395+
12751396
staticNode*
12761397
FindMatchingTLEntry(List*tlist,char*e_attname)
12771398
{
@@ -2574,8 +2695,17 @@ BasicQueryRewrite(Query *parsetree)
25742695
* Apply all the RIR rules on each query
25752696
*/
25762697
foreach (l,querylist) {
2577-
query= (Query*)lfirst(l);
2578-
results=lappend(results,fireRIRrules(query));
2698+
query=fireRIRrules((Query*)lfirst(l));
2699+
/*
2700+
* If the query was marked having aggregates, check if
2701+
* this is still true after rewriting. This check must get
2702+
* expanded when someday aggregates can appear somewhere
2703+
* else than in the targetlist or the having qual.
2704+
*/
2705+
if (query->hasAggs)
2706+
query->hasAggs=checkQueryHasAggs((Node*)(query->targetList))
2707+
|checkQueryHasAggs((Node*)(query->havingQual));
2708+
results=lappend(results,query);
25792709
}
25802710
returnresults;
25812711
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp