Re: possible wierd boolean bug? - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: possible wierd boolean bug? |
Date | |
Msg-id | 5605.1103138330@sss.pgh.pa.us Whole thread Raw |
In response to | Re: possible wierd boolean bug? ("Merlin Moncure" <merlin.moncure@rcsonline.com>) |
List | pgsql-hackers |
"Merlin Moncure" <merlin.moncure@rcsonline.com> writes: > I confirmed the problem on a linux server running beta3...so this > problem is quite reproducible by running the attached scripts on a > freshly loaded database. The attached patch fixes the problem for me. regards, tom lane *** src/backend/access/nbtree/nbtutils.c.orig Sun Aug 29 01:06:40 2004 --- src/backend/access/nbtree/nbtutils.c Wed Dec 15 14:00:59 2004 *************** *** 224,234 **** BTScanOpaque so = (BTScanOpaque) scan->opaque; int numberOfKeys = scan->numberOfKeys; int new_numberOfKeys; ScanKey inkeys; ScanKey outkeys; ScanKey cur; ScanKey xform[BTMaxStrategyNumber]; - bool allEqualSoFar; bool hasOtherTypeEqual; Datum test; int i, --- 224,234 ---- BTScanOpaque so = (BTScanOpaque) scan->opaque; int numberOfKeys = scan->numberOfKeys; int new_numberOfKeys; + int numberOfEqualCols; ScanKey inkeys; ScanKey outkeys; ScanKey cur; ScanKey xform[BTMaxStrategyNumber]; bool hasOtherTypeEqual; Datum test; int i, *************** *** 278,284 **** * Otherwise, do the full set of pushups. */ new_numberOfKeys = 0; ! allEqualSoFar = true; /* * Initialize for processing of keys for attr 1. --- 278,284 ---- * Otherwise, do the full set of pushups. */ new_numberOfKeys = 0; ! numberOfEqualCols = 0; /* * Initialize for processing of keys for attr 1. *************** *** 321,327 **** */ if (i == numberOfKeys || cur->sk_attno != attno) { ! bool priorAllEqualSoFar = allEqualSoFar; /* check input keys are correctly ordered */ if (i < numberOfKeys && cur->sk_attno != attno + 1) --- 321,327 ---- */ if (i == numberOfKeys || cur->sk_attno != attno) { ! int priorNumberOfEqualCols = numberOfEqualCols; /* check input keys are correctly ordered*/ if (i < numberOfKeys && cur->sk_attno != attno + 1) *************** *** 355,368 **** xform[BTLessEqualStrategyNumber - 1] = NULL; xform[BTGreaterEqualStrategyNumber- 1] = NULL; xform[BTGreaterStrategyNumber - 1] = NULL; } else { ! /* ! * If no "=" for this key, we're done with required keys ! */ ! if (!hasOtherTypeEqual) ! allEqualSoFar = false; } /* keep only one of <, <= */ --- 355,368 ---- xform[BTLessEqualStrategyNumber - 1] = NULL; xform[BTGreaterEqualStrategyNumber- 1] = NULL; xform[BTGreaterStrategyNumber - 1] = NULL; + /* track number of attrs for which we have "=" keys */ + numberOfEqualCols++; } else { ! /* track number of attrs for which we have "=" keys */ ! if (hasOtherTypeEqual) ! numberOfEqualCols++; } /* keep only one of <, <= */ *************** *** 411,417 **** * If all attrs before this one had "=", include these keys * into the required-keyscount. */ ! if (priorAllEqualSoFar) so->numberOfRequiredKeys = new_numberOfKeys; /* --- 411,417 ---- * If all attrs before this one had "=", include these keys * into the required-keyscount. */ ! if (priorNumberOfEqualCols == attno - 1) so->numberOfRequiredKeys = new_numberOfKeys; /* *************** *** 468,475 **** * If unique index and we have equality keys for all columns, set * keys_are_unique flag for higherlevels. */ ! if (allEqualSoFar && relation->rd_index->indisunique && ! relation->rd_rel->relnatts == new_numberOfKeys) scan->keys_are_unique = true; } --- 468,475 ---- * If unique index and we have equality keys for all columns, set * keys_are_unique flag for higherlevels. */ ! if (relation->rd_index->indisunique && ! relation->rd_rel->relnatts == numberOfEqualCols) scan->keys_are_unique = true; }
pgsql-hackers by date: