]> granicus.if.org Git - postgresql/commitdiff
Optimizer cleanups.
authorBruce Momjian <bruce@momjian.us>
Thu, 11 Feb 1999 21:05:28 +0000 (21:05 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 11 Feb 1999 21:05:28 +0000 (21:05 +0000)
src/backend/optimizer/util/ordering.c
src/backend/optimizer/util/pathnode.c

index 412879e8c7e2205891dc85a52f9e36c399d3e512..268f16df0e2d34afd4c1daa13880438981c44e3d 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/ordering.c,v 1.13 1999/02/11 17:00:48 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/ordering.c,v 1.14 1999/02/11 21:05:28 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -18,7 +18,8 @@
 #include "optimizer/internal.h"
 #include "optimizer/ordering.h"
 
-static bool equal_sortops_order(Oid *ordering1, Oid *ordering2, int *better_sort);
+static bool sortops_order_match(Oid *ordering1, Oid *ordering2,
+                                                               int *better_sort);
 
 /*
  * equal-path-ordering--
@@ -56,7 +57,7 @@ pathorder_match(PathOrder *path_ordering1,
        else if (path_ordering1->ordtype == SORTOP_ORDER &&
                         path_ordering2->ordtype == SORTOP_ORDER)
        {
-               return equal_sortops_order(path_ordering1->ord.sortop,
+               return sortops_order_match(path_ordering1->ord.sortop,
                                                                        path_ordering2->ord.sortop,
                                                                        better_sort);
        }
@@ -127,7 +128,7 @@ equal_merge_ordering(MergeOrder *merge_ordering1,
  *       Returns true iff the sort operators are in the same order.
  */
 static bool
-equal_sortops_order(Oid *ordering1, Oid *ordering2, int *better_sort)
+sortops_order_match(Oid *ordering1, Oid *ordering2, int *better_sort)
 {
        int                     i = 0;
 
@@ -160,7 +161,7 @@ equal_sortops_order(Oid *ordering1, Oid *ordering2, int *better_sort)
                *better_sort = 1;
                return true;
        }
-       
+
        if (ordering1[i] == 0 && ordering2[i] != 0)
        {
                *better_sort = 2;
index 2a45890d3dcbcaef95eff929b056d19f08cdd49d..23e3e8ee0c21c04fec8ba880c09f87f3a02b8162 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.30 1999/02/11 17:21:51 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.31 1999/02/11 21:05:28 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -29,7 +29,7 @@
 
 #include "parser/parsetree.h"  /* for getrelid() */
 
-static Path *better_path(Path *new_path, List *unique_paths, bool *isNew);
+static Path *better_path(Path *new_path, List *unique_paths, bool *is_new);
 
 
 /*****************************************************************************
@@ -173,11 +173,14 @@ better_path(Path *new_path, List *unique_paths, bool *is_new)
                        printf("newpath\n");
                        pprint(new_path->pathkeys);
                        if (path->pathkeys && new_path->pathkeys &&
-                               length(lfirst(path->pathkeys)) >= 2 &&
-                               length(lfirst(path->pathkeys)) < length(lfirst(new_path->pathkeys)))
+                               length(lfirst(path->pathkeys)) >= 2/* &&
+                               length(lfirst(path->pathkeys)) <
+                               length(lfirst(new_path->pathkeys))*/)
                                sleep(0); /* set breakpoint here */
                }
-               if (!pathorder_match(new_path->pathorder, path->pathorder, &better_sort))
+               if (!pathorder_match(new_path->pathorder, path->pathorder,
+                       &better_sort) ||
+                       better_sort != 0)
                {
                        printf("oldord\n");
                        pprint(path->pathorder);
@@ -186,43 +189,43 @@ better_path(Path *new_path, List *unique_paths, bool *is_new)
                }
 #endif
 
-               if (pathkeys_match(new_path->pathkeys, path->pathkeys, &better_key))
+               if (pathkeys_match(new_path->pathkeys, path->pathkeys,
+                       &better_key) &&
+                       pathorder_match(new_path->pathorder, path->pathorder,
+                       &better_sort))
                {
-                       if (pathorder_match(new_path->pathorder, path->pathorder, &better_sort))
+                       /*
+                        * Replace pathkeys that match exactly, (1,2), (1,2).
+                        * Replace pathkeys (1,2) with (1,2,3) if the latter is not
+                        * more expensive and replace unordered path with ordered
+                        * path if it is not more expensive.  Favor sorted keys
+                        * over unsorted keys in the same way.
+                        */
+                                                       /* same keys, and new is cheaper, use it */
+                   if ((better_key == 0 && better_sort == 0 &&
+                                new_path->path_cost < path->path_cost) ||
+
+                                                       /* new is better, and cheaper, use it */
+                               (((better_key == 1 && better_sort != 2) ||
+                                 (better_key != 2 && better_sort == 1)) &&
+                                 new_path->path_cost <= path->path_cost))
                        {
-                               /*
-                                * Replace pathkeys that match exactly, (1,2), (1,2).
-                                * Replace pathkeys (1,2) with (1,2,3) if the latter is not
-                                * more expensive and replace unordered path with ordered
-                                * path if it is not more expensive.  Favor sorted keys
-                                * over unsorted keys in the same way.
-                                */
-                                                               /* same keys, and new is cheaper, use it */
-                           if ((better_key == 0 && better_sort == 0 &&
-                                        new_path->path_cost <  path->path_cost) ||
-
-                                                               /* new is better, and cheaper, use it */
-                                       (((better_key == 1 && better_sort != 2) ||
-                                         (better_key != 2 && better_sort == 1)) &&
-                                         new_path->path_cost <= path->path_cost))
-                               {
-                                       *is_new = false;
-                                       return new_path;
-                               }
-
-                                                               /* same keys, new is more expensive, stop */
-                           else if
-                                       ((better_key == 0 && better_sort == 0 &&
-                                         new_path->path_cost >= path->path_cost) ||
-
-                                                               /* old is better, and less expensive, stop */
-                                       (((better_key == 2 && better_sort != 1) ||
-                                         (better_key != 1 && better_sort == 2)) &&
-                                         new_path->path_cost >= path->path_cost))
-                               {
-                                       *is_new = false;
-                                       return NULL;
-                               }
+                               *is_new = false;
+                               return new_path;
+                       }
+
+                                                       /* same keys, new is more expensive, stop */
+                   else if
+                               ((better_key == 0 && better_sort == 0 &&
+                                 new_path->path_cost >= path->path_cost) ||
+
+                                                       /* old is better, and less expensive, stop */
+                               (((better_key == 2 && better_sort != 1) ||
+                                 (better_key != 1 && better_sort == 2)) &&
+                                 new_path->path_cost >= path->path_cost))
+                       {
+                               *is_new = false;
+                               return NULL;
                        }
                }
        }