Re: [PERFORM] Feature request: smarter use of conditional indexes

Поиск
Список
Период
Сортировка
Искать
От
John Siracusa
Тема
Re: [PERFORM] Feature request: smarter use of conditional indexes
Дата
Msg-id
2BF3597E-6FEB-11D8-83AC-000A95BA4506@mindspring.com
Список
Дерево обсуждения
Re: [PERFORM] Feature request: smarter use of conditional indexes John Siracusa <siracusa@mindspring.com>
Re: [PERFORM] Feature request: smarter use of conditional indexes Tom Lane <tgl@sss.pgh.pa.us>
Re: [PERFORM] Feature request: smarter use of John Siracusa <siracusa@mindspring.com>
Re: [PERFORM] Feature request: smarter use of Tom Lane <tgl@sss.pgh.pa.us>
Re: [PERFORM] Feature request: smarter use of conditional Neil Conway <neilc@samurai.com>
Re: [PERFORM] Feature request: smarter use of conditional Tom Lane <tgl@sss.pgh.pa.us>
Re: [PERFORM] Feature request: smarter use of John Siracusa <siracusa@mindspring.com>
Re: [PERFORM] Feature request: smarter use of Tom Lane <tgl@sss.pgh.pa.us>
On 3/3/04 6:53 PM, Tom Lane wrote:
>  John Siracusa  writes:
>>  Given an index like this:
>>      CREATE UNIQUE INDEX i1 ON t1 (c1) WHERE c1 IS NOT NULL;
>>  and a query like this:
>>      SELECT * FROM t1 WHERE c1 = 123;
>>  I'd like the planner to be smart enough to use an index scan using 
>> i1.
>
>  Send a patch ;-)

(Originally sent to the wrong list and in the wrong format...sorry :)

How does this look?  It seems to do what I want without horribly 
breaking anything as far as I can tell.  I ran "make check" and got the 
same result as I did before my changes (5 failures in OS X 10.3.2).  
But then, I also got the same result when I wasn't even checking to 
make sure that both clauses were looking at the same variable :)  I'm 
not sure how to add a test for this particular change either.

Index: src/backend/optimizer/path/indxpath.c
===================================================================
RCS file: 
/projects/cvsroot/pgsql-server/src/backend/optimizer/path/indxpath.c,v
retrieving revision 1.156
diff -c -r1.156 indxpath.c
*** src/backend/optimizer/path/indxpath.c	7 Jan 2004 22:02:48 
-0000	1.156
--- src/backend/optimizer/path/indxpath.c	7 Mar 2004 03:49:17 -0000
***************
*** 1030,1036 ****
--- 1030,1060 ----
   	 * the test operator will always be strict.
   	 */
   	if (!is_opclause(predicate))
+ 	{
+ 		/* One last chance: "var = const" or "const = var" implies "var is 
not null" */
+ 		if (IsA(predicate, NullTest) &&
+ 			((NullTest *) predicate)->nulltesttype == IS_NOT_NULL &&
+ 			is_opclause(clause) && op_strict(((OpExpr *) clause)->opno) &&
+ 			length(((OpExpr *) clause)->args) == 2)
+ 		{
+ 			leftop = get_leftop((Expr *) clause);
+ 			rightop = get_rightop((Expr *) clause);
+
+ 			/* One of the two arguments must be a constant */
+ 			if (IsA(rightop, Const))
+ 				clause_var = leftop;
+ 			else if (IsA(leftop, Const))
+ 				clause_var = rightop;
+ 			else
+ 				return false;
+
+ 			/* Finally, make sure "var" is the same var in both clauses */
+ 			if (equal(((NullTest *) predicate)->arg, clause_var))
+ 				return true;
+ 		}
+
   		return false;
+ 	}
   	leftop = get_leftop(predicate);
   	rightop = get_rightop(predicate);
   	if (rightop == NULL)

В списке pgsql-patches по дате отправления
От: Neil Conway
Дата:
Сообщение: minor doc work
От: Neil Conway
Дата:
FAQ