X-Git-Url: http://www.sigaev.ru/git/gitweb.cgi?a=blobdiff_plain;f=gevel.c;fp=gevel.c;h=b464de064238f96c57bd235ba67898a9eabcb7db;hb=bf5ed50f54f041782049b93abe9fa4bc43a4867d;hp=6a62b85380aef668508ab094aebae4d82c4d439d;hpb=4260adfef76b868d8ae939ea17a2923c22f06a08;p=gevel.git diff --git a/gevel.c b/gevel.c index 6a62b85..b464de0 100644 --- a/gevel.c +++ b/gevel.c @@ -1042,8 +1042,8 @@ typedef struct SPGistPrintStackElem { typedef struct SPGistPrint { SpGistState state; Relation index; - Datum dvalues[7 /* see CreateTemplateTupleDesc call */]; - char nulls[7 /* see CreateTemplateTupleDesc call */]; + Datum dvalues[8 /* see CreateTemplateTupleDesc call */]; + char nulls[8 /* see CreateTemplateTupleDesc call */]; List *stack; } SPGistPrint; @@ -1108,16 +1108,17 @@ spgist_print(PG_FUNCTION_ARGS) prst->index = index; initSpGistState(&prst->state, index); - tupdesc = CreateTemplateTupleDesc(3 /* types */ + 1 /* level */ + 1 /* nlabel */ + 2 /* tids */, false); + tupdesc = CreateTemplateTupleDesc(3 /* types */ + 1 /* level */ + 1 /* nlabel */ + 2 /* tids */ + 1, false); TupleDescInitEntry(tupdesc, 1, "tid", TIDOID, -1, 0); - TupleDescInitEntry(tupdesc, 2, "node", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, 3, "level", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, 4, "tid_pointer", TIDOID, -1, 0); - TupleDescInitEntry(tupdesc, 5, "prefix", + TupleDescInitEntry(tupdesc, 2, "allthesame", BOOLOID, -1, 0); + TupleDescInitEntry(tupdesc, 3, "node", INT4OID, -1, 0); + TupleDescInitEntry(tupdesc, 4, "level", INT4OID, -1, 0); + TupleDescInitEntry(tupdesc, 5, "tid_pointer", TIDOID, -1, 0); + TupleDescInitEntry(tupdesc, 6, "prefix", (prst->state.attPrefixType.type == VOIDOID) ? INT4OID : prst->state.attPrefixType.type, -1, 0); - TupleDescInitEntry(tupdesc, 6, "label", + TupleDescInitEntry(tupdesc, 7, "label", (prst->state.attLabelType.type == VOIDOID) ? INT4OID : prst->state.attLabelType.type, -1, 0); - TupleDescInitEntry(tupdesc, 7, "leaf", + TupleDescInitEntry(tupdesc, 8, "leaf", (prst->state.attType.type == VOIDOID) ? INT4OID : prst->state.attType.type, -1, 0); funcctx->slot = TupleDescGetSlot(tupdesc); @@ -1186,14 +1187,15 @@ next: prst->dvalues[0] = PointerGetDatum(tid); prst->nulls[0] = ISNOTNULL; prst->nulls[1] = ISNULL; - prst->dvalues[2] = s->level; - prst->nulls[2] = ISNOTNULL; - prst->nulls[3] = ISNULL; + prst->nulls[2] = ISNULL; + prst->dvalues[3] = s->level; + prst->nulls[3] = ISNOTNULL; prst->nulls[4] = ISNULL; prst->nulls[5] = ISNULL; - prst->dvalues[6] = datumCopy(SGLTDATUM(leafTuple, &prst->state), + prst->nulls[6] = ISNULL; + prst->dvalues[7] = datumCopy(SGLTDATUM(leafTuple, &prst->state), prst->state.attType.attbyval, prst->state.attType.attlen); - prst->nulls[6] = ISNOTNULL; + prst->nulls[7] = ISNOTNULL; } else { SpGistInnerTuple innerTuple = (SpGistInnerTuple)dtuple; int i; @@ -1216,27 +1218,29 @@ next: *tid = s->iptr; prst->dvalues[0] = PointerGetDatum(tid); prst->nulls[0] = ISNOTNULL; - prst->dvalues[1] = Int32GetDatum(s->nlabel); + prst->dvalues[1] = innerTuple->allTheSame; prst->nulls[1] = ISNOTNULL; - prst->dvalues[2] = s->level; + prst->dvalues[2] = Int32GetDatum(s->nlabel); prst->nulls[2] = ISNOTNULL; + prst->dvalues[3] = s->level; + prst->nulls[3] = ISNOTNULL; tid = palloc(sizeof(ItemPointerData)); *tid = node->t_tid; - prst->dvalues[3] = PointerGetDatum(tid); - prst->nulls[3] = ISNOTNULL; + prst->dvalues[4] = PointerGetDatum(tid); + prst->nulls[5] = ISNOTNULL; if (innerTuple->prefixSize > 0) { - prst->dvalues[4] = datumCopy(SGITDATUM(innerTuple, &prst->state), + prst->dvalues[5] = datumCopy(SGITDATUM(innerTuple, &prst->state), prst->state.attPrefixType.attbyval, prst->state.attPrefixType.attlen); - prst->nulls[4] = ISNOTNULL; + prst->nulls[5] = ISNOTNULL; } else - prst->nulls[4] = ISNULL; + prst->nulls[5] = ISNULL; if (!IndexTupleHasNulls(node)) { - prst->dvalues[5] = datumCopy(SGNTDATUM(node, &prst->state), + prst->dvalues[6] = datumCopy(SGNTDATUM(node, &prst->state), prst->state.attLabelType.attbyval, prst->state.attLabelType.attlen); - prst->nulls[5] = ISNOTNULL; + prst->nulls[6] = ISNOTNULL; } else - prst->nulls[5] = ISNULL; - prst->nulls[6] = ISNULL; + prst->nulls[6] = ISNULL; + prst->nulls[7] = ISNULL; pushSPGistPrint(funcctx, prst, &node->t_tid, s->level + 1); s->nlabel = i + 1;