]> granicus.if.org Git - postgresql/commitdiff
Remove query_planner's overhasty rejection of cases where
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 Jun 1999 19:38:30 +0000 (19:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 Jun 1999 19:38:30 +0000 (19:38 +0000)
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.

src/backend/optimizer/plan/planmain.c

index dae0443e1e83aafc466f05f205b7008c585a5e34..80eaaf9a055716dafcbe817101eb182e054ec2f6 100644 (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;