Skip to content
Snippets Groups Projects
Commit beeb3562 authored by Teodor Sigaev's avatar Teodor Sigaev
Browse files

During repeated rescan of GiST index it's possible that scan key

is NULL but SK_SEARCHNULL is not set. Add checking IS NULL of keys
to set during key initialization. If key is NULL and SK_SEARCHNULL is not
set then nothnig can be satisfied.
With assert-enabled compilation that causes coredump.

Bug was introduced in 8.3 by support of IS NULL index scan.
parent e034e517
No related branches found
No related tags found
No related merge requests found
......@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.75 2008/08/23 10:37:24 teodor Exp $
* $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.76 2008/10/17 17:02:21 teodor Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -134,6 +134,9 @@ gistnext(IndexScanDesc scan, ScanDirection dir, TIDBitmap *tbm)
so = (GISTScanOpaque) scan->opaque;
if ( so->qual_ok == false )
return 0;
if (ItemPointerIsValid(&so->curpos) == false)
{
/* Being asked to fetch the first entry, so start at the root */
......
......@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.71 2008/08/23 10:37:24 teodor Exp $
* $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.72 2008/10/17 17:02:21 teodor Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -98,9 +98,19 @@ gistrescan(PG_FUNCTION_ARGS)
* function in the form of its strategy number, which is available
* from the sk_strategy field, and its subtype from the sk_subtype
* field.
*
* Next, if any of keys is a NULL and that key is not marked with
* SK_SEARCHNULL then nothing can be found.
*/
for (i = 0; i < scan->numberOfKeys; i++)
so->qual_ok = true;
for (i = 0; i < scan->numberOfKeys; i++) {
scan->keyData[i].sk_func = so->giststate->consistentFn[scan->keyData[i].sk_attno - 1];
if ( scan->keyData[i].sk_flags & SK_ISNULL ) {
if ( (scan->keyData[i].sk_flags & SK_SEARCHNULL) == 0 )
so->qual_ok = false;
}
}
}
PG_RETURN_VOID();
......
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.32 2008/08/23 10:37:24 teodor Exp $
* $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.33 2008/10/17 17:02:21 teodor Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -73,6 +73,7 @@ typedef struct GISTScanOpaqueData
GISTSearchStack *stack;
GISTSearchStack *markstk;
uint16 flags;
bool qual_ok; /* false if qual can never be satisfied */
GISTSTATE *giststate;
MemoryContext tempCxt;
Buffer curbuf;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment