From f1b78234716bd639b045873c7be0c9424b897f16 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Tue, 2 Feb 1999 20:30:18 +0000
Subject: [PATCH] Make GEQO use dependent on table and index count.

---
 doc/src/sgml/ref/set.sgml             |  7 ++++++-
 src/backend/optimizer/path/allpaths.c | 25 +++++++++++++++----------
 src/backend/parser/gram.c             | 14 +++++++++++++-
 src/man/set.l                         |  6 +++---
 4 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml
index 9627c1f354c..ac3c225267a 100644
--- a/doc/src/sgml/ref/set.sgml
+++ b/doc/src/sgml/ref/set.sgml
@@ -406,7 +406,7 @@ SET TIME ZONE { '<REPLACEABLE CLASS="PARAMETER">timezone</REPLACEABLE>' | LOCAL
 	  </para>
 	  <para>
 		This algorithm is on by default, which used GEQO for
-		statements of six or more tables.
+		statements of six or more tables and indexes.
 		(See the chapter on GEQO in the Programmer's Guide
 		for more information).
 	  </para>
@@ -676,6 +676,11 @@ SET TIME ZONE { '<REPLACEABLE CLASS="PARAMETER">timezone</REPLACEABLE>' | LOCAL
 	  --
 	  SET DATESTYLE TO 'ISO';
 	</programlisting>
+	<programlisting> 
+	  --Enable GEQO for queries with 4 or more tables and indexes
+	  --
+	  SET GEQO ON=4;
+	</programlisting>
 	<programlisting> 
 	  --Set GEQO to default:
 	  --
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 8de364a04af..4e5ab10094d 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.23 1998/09/01 04:29:27 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.24 1999/02/02 20:30:05 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -78,7 +78,6 @@ find_paths(Query *root, List *rels)
 
 	if (levels_needed <= 1)
 	{
-
 		/*
 		 * Unsorted single relation, no more processing is required.
 		 */
@@ -86,7 +85,6 @@ find_paths(Query *root, List *rels)
 	}
 	else
 	{
-
 		/*
 		 * this means that joins or sorts are required. set selectivities
 		 * of clauses that have not been set by an index.
@@ -123,7 +121,7 @@ find_rel_paths(Query *root, List *rels)
 
 		rel_index_scan_list = find_index_paths(root,
 											   rel,
-										find_relation_indices(root, rel),
+											   find_relation_indices(root, rel),
 											   rel->clauseinfo,
 											   rel->joininfo);
 
@@ -182,18 +180,27 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed)
 	 * genetic query optimizer entry point	   *
 	 *	  <utesch@aut.tu-freiberg.de>		   *
 	 *******************************************/
+	{
+		List	   *temp;
+		int			paths_to_consider = 0;
 
-	if ((_use_geqo_) && length(root->base_rel_list) >= _use_geqo_rels_)
-		return lcons(geqo(root), NIL);	/* returns *one* RelOptInfo, so
-										 * lcons it */
+		foreach(temp, outer_rels)
+		{
+			RelOptInfo *rel = (RelOptInfo *) lfirst(temp);
+			paths_to_consider += length(rel->pathlist);
+		}
 
+		if ((_use_geqo_) && paths_to_consider >= _use_geqo_rels_)
+			/* returns _one_ RelOptInfo, so lcons it */
+			return lcons(geqo(root), NIL);	
+	}
+	
 	/*******************************************
 	 * rest will be deprecated in case of GEQO *
 	 *******************************************/
 
 	while (--levels_needed)
 	{
-
 		/*
 		 * Determine all possible pairs of relations to be joined at this
 		 * level. Determine paths for joining these relation pairs and
@@ -207,7 +214,6 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed)
 		prune_joinrels(new_rels);
 
 #if 0
-
 		/*
 		 * * for each expensive predicate in each path in each distinct
 		 * rel, * consider doing pullup  -- JMH
@@ -247,7 +253,6 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed)
 
 		if (BushyPlanFlag)
 		{
-
 			/*
 			 * prune rels that have been completely incorporated into new
 			 * join rels
diff --git a/src/backend/parser/gram.c b/src/backend/parser/gram.c
index 8ae45f764fe..2081b741f9e 100644
--- a/src/backend/parser/gram.c
+++ b/src/backend/parser/gram.c
@@ -240,7 +240,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.66 1999/02/02 03:44:34 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.67 1999/02/02 20:30:07 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -11450,11 +11450,17 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
 				least->val.val.str = match_least;
 				most->val.type = T_String;
 				most->val.val.str = match_most;
+#ifdef USE_LOCALE
+				result = makeA_Expr(AND, NULL,
+						makeA_Expr(OP, "~", lexpr, rexpr),
+						makeA_Expr(OP, ">=", lexpr, (Node *)least));
+#else
 				result = makeA_Expr(AND, NULL,
 						makeA_Expr(OP, "~", lexpr, rexpr),
 						makeA_Expr(AND, NULL,
 							makeA_Expr(OP, ">=", lexpr, (Node *)least),
 							makeA_Expr(OP, "<=", lexpr, (Node *)most)));
+#endif
 			}
 		}
 	}
@@ -11497,11 +11503,17 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
 				least->val.val.str = match_least;
 				most->val.type = T_String;
 				most->val.val.str = match_most;
+#ifdef USE_LOCALE
+				result = makeA_Expr(AND, NULL,
+						makeA_Expr(OP, "~~", lexpr, rexpr),
+						makeA_Expr(OP, ">=", lexpr, (Node *)least));
+#else
 				result = makeA_Expr(AND, NULL,
 						makeA_Expr(OP, "~~", lexpr, rexpr),
 						makeA_Expr(AND, NULL,
 							makeA_Expr(OP, ">=", lexpr, (Node *)least),
 							makeA_Expr(OP, "<=", lexpr, (Node *)most)));
+#endif
 			}
 		}
 	}
diff --git a/src/man/set.l b/src/man/set.l
index 3ce8896cd47..d3e5f53bf32 100644
--- a/src/man/set.l
+++ b/src/man/set.l
@@ -1,6 +1,6 @@
 .\" This is -*-nroff-*-
 .\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.12 1999/02/02 03:45:33 momjian Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.13 1999/02/02 20:30:18 momjian Exp $
 .TH SET SQL 05/14/97 PostgreSQL PostgreSQL
 .SH NAME
 set - set run-time parameters for session
@@ -44,7 +44,7 @@ determines the output format for the date and time data types.
 .IR GEQO
 enables or disables the genetic optimizer algorithm. This algorithm is
 .IR on
-by default, which used GEQO for statements of six or more tables.
+by default, which used GEQO for statements of six or more tables and indexes.
 Set the
 .IR Programmer's Guide
 for more information.
@@ -101,7 +101,7 @@ set DateStyle to 'SQL,European'
 .PP
 .nf
 --
---Use GEQO for statements with 4 or more tables
+--Use GEQO for statements with 4 or more tables and indexes
 --
 set GEQO to 'on=4'
 --
-- 
GitLab