OR clause - check code - Mailing list pgsql-hackers
From | Bruce Momjian |
---|---|
Subject | OR clause - check code |
Date | |
Msg-id | 199808011055.GAA21311@candle.pha.pa.us Whole thread Raw |
List | pgsql-hackers |
Vadim, would you please review this code, and let me know if it is correct. I am unsure about the calls to ExecStoreTuple(), ExecQual() (is proper context used?), and placement of ReleaseBuffer(). Do I need to free the tuple buffer if I decide it doesn't meet my ExecQual test? You will see the old code, then the new for IndexNext(). --------------------------------------------------------------------------- *************** *** 120,155 **** * appropriate heap tuple.. else return NULL. * ---------------- */ ! while ((result = index_getnext(scandesc, direction)) != NULL) { ! tuple = heap_fetch(heapRelation, false, &result->heap_iptr, &buffer); ! /* be tidy */ ! pfree(result); ! ! if (tuple != NULL) { ! /* ---------------- ! * store the scanned tuple in the scan tuple slot of ! * the scan state. Eventually we will only do this and not ! * return a tuple. Note: we pass 'false' because tuples ! * returned by amgetnext are pointers onto disk pages and ! * were not created with palloc() and so should not be pfree()'d. ! * ---------------- ! */ ! ExecStoreTuple(tuple, /* tuple to store */ ! slot, /* slot to store in */ ! buffer, /* buffer associated with tuple */ ! false); /* don't pfree */ ! ! return slot; ! } ! else ! { if (BufferIsValid(buffer)) ReleaseBuffer(buffer); } } - /* ---------------- * if we get here it means the index scan failed so we * are at the end of the scan.. --- 119,170 ---- * appropriate heap tuple.. else return NULL. * ---------------- */ ! while (indexstate->iss_IndexPtr < numIndices) { ! scandesc = scanDescs[indexstate->iss_IndexPtr]; ! while ((result = index_getnext(scandesc, direction)) != NULL) { ! tuple = heap_fetch(heapRelation, false, &result->heap_iptr, &buffer); ! /* be tidy */ ! pfree(result); ! ! if (tuple != NULL) ! { ! bool prev_matches = false; ! int prev_index; ! ! /* ---------------- ! * store the scanned tuple in the scan tuple slot of ! * the scan state. Eventually we will only do this and not ! * return a tuple. Note: we pass 'false' because tuples ! * returned by amgetnext are pointers onto disk pages and ! * were not created with palloc() and so should not be pfree()'d. ! * ---------------- ! */ ! ExecStoreTuple(tuple, /* tuple to store */ ! slot, /* slot to store in */ ! buffer, /* buffer associated with tuple */ ! false); /* don't pfree */ ! ! for (prev_index = 0; prev_index < indexstate->iss_IndexPtr; ! prev_index++) ! { ! if (ExecQual(nth(prev_index, node->indxqual), ! scanstate->cstate.cs_ExprContext)) ! { ! prev_matches = true; ! break; ! } ! } ! if (!prev_matches) ! return slot; ! } if (BufferIsValid(buffer)) ReleaseBuffer(buffer); } + if (indexstate->iss_IndexPtr < numIndices) + indexstate->iss_IndexPtr++; } /* ---------------- * if we get here it means the index scan failed so we * are at the end of the scan.. -- Bruce Momjian | 830 Blythe Avenue maillist@candle.pha.pa.us | Drexel Hill, Pennsylvania 19026 + If your life is a hard drive, | (610) 353-9879(w) + Christ can be your backup. | (610) 853-3000(h)
pgsql-hackers by date: