Remove query_planner's overhasty rejection of cases where

tlist and qual are NULL.  It ought to handle these the same as the cases
where tlist contains only constant expressions, ie, be willing to generate
a Result-node plan.  This did not use to matter, but it does now because
union_planner will flatten the tlist when aggregates are present.  Thus,
'select count(1) from table' now causes query_planner to be given a null
tlist, and to duplicate 6.4's behavior we need it to give back a Result
plan rather than refusing the query.  6.4 was arguably doing the Wrong
Thing for this query, but I'm not going to open a semantics issue right
before 6.5 release ... can revisit that problem later.
This commit is contained in:
Tom Lane 1999-06-12 19:38:30 +00:00
parent acf242da97
commit aaf2442472
1 changed files with 11 additions and 25 deletions

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.36 1999/05/25 16:09:36 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.37 1999/06/12 19:38:30 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -68,9 +68,9 @@ query_planner(Query *root,
List *qual)
{
List *constant_qual = NIL;
List *var_only_tlist = NIL;
List *level_tlist = NIL;
Plan *subplan = NULL;
List *var_only_tlist;
List *level_tlist;
Plan *subplan;
if (PlannerQueryLevel > 1)
{
@ -87,29 +87,15 @@ query_planner(Query *root,
pprint(qual);
#endif
/*
* A command without a target list or qualification is an error,
* except for "delete foo".
*/
if (tlist == NIL && qual == NULL)
{
if (command_type == CMD_DELETE)
{
return ((Plan *) make_seqscan(NIL,
NIL,
root->resultRelation,
(Plan *) NULL));
}
else
return (Plan *) NULL;
}
/*
* Pull out any non-variable qualifications so these can be put in the
* topmost result node. The opids for the remaining qualifications
* will be changed to regprocs later.
* topmost result node.
*/
qual = pull_constant_clauses(qual, &constant_qual);
/*
* The opids for the variable qualifications will be fixed later, but
* someone seems to think that the constant quals need to be fixed here.
*/
fix_opids(constant_qual);
/*
@ -143,13 +129,13 @@ query_planner(Query *root,
case CMD_UPDATE:
{
SeqScan *scan = make_seqscan(tlist,
(List *) NULL,
NIL,
root->resultRelation,
(Plan *) NULL);
if (constant_qual != NULL)
return ((Plan *) make_result(tlist,
(Node *) constant_qual,
(Node *) constant_qual,
(Plan *) scan));
else
return (Plan *) scan;