mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Be more tense about not creating tuplestores with randomAccess = true unless
backwards scan could actually happen. In particular, pass a flag to materialize-mode SRFs that tells them whether they need to require random access. In passing, also suppress unneeded backward-scan overhead for a Portal's holdStore tuplestore. Per my proposal about reducing I/O costs for tuplestores.
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $PostgreSQL: pgsql/contrib/tablefunc/tablefunc.c,v 1.54 2008/10/28 22:02:05 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/tablefunc/tablefunc.c,v 1.55 2008/10/29 00:00:38 tgl Exp $
|
||||
*
|
||||
*
|
||||
* tablefunc
|
||||
@ -51,7 +51,8 @@ static HTAB *load_categories_hash(char *cats_sql, MemoryContext per_query_ctx);
|
||||
static Tuplestorestate *get_crosstab_tuplestore(char *sql,
|
||||
HTAB *crosstab_hash,
|
||||
TupleDesc tupdesc,
|
||||
MemoryContext per_query_ctx);
|
||||
MemoryContext per_query_ctx,
|
||||
bool randomAccess);
|
||||
static void validateConnectbyTupleDesc(TupleDesc tupdesc, bool show_branch, bool show_serial);
|
||||
static bool compatCrosstabTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2);
|
||||
static bool compatConnectbyTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2);
|
||||
@ -66,6 +67,7 @@ static Tuplestorestate *connectby(char *relname,
|
||||
bool show_branch,
|
||||
bool show_serial,
|
||||
MemoryContext per_query_ctx,
|
||||
bool randomAccess,
|
||||
AttInMetadata *attinmeta);
|
||||
static Tuplestorestate *build_tuplestore_recursively(char *key_fld,
|
||||
char *parent_key_fld,
|
||||
@ -745,7 +747,8 @@ crosstab_hash(PG_FUNCTION_ARGS)
|
||||
rsinfo->setResult = get_crosstab_tuplestore(sql,
|
||||
crosstab_hash,
|
||||
tupdesc,
|
||||
per_query_ctx);
|
||||
per_query_ctx,
|
||||
rsinfo->allowedModes & SFRM_Materialize_Random);
|
||||
|
||||
/*
|
||||
* SFRM_Materialize mode expects us to return a NULL Datum. The actual
|
||||
@ -852,7 +855,8 @@ static Tuplestorestate *
|
||||
get_crosstab_tuplestore(char *sql,
|
||||
HTAB *crosstab_hash,
|
||||
TupleDesc tupdesc,
|
||||
MemoryContext per_query_ctx)
|
||||
MemoryContext per_query_ctx,
|
||||
bool randomAccess)
|
||||
{
|
||||
Tuplestorestate *tupstore;
|
||||
int num_categories = hash_get_num_entries(crosstab_hash);
|
||||
@ -863,8 +867,8 @@ get_crosstab_tuplestore(char *sql,
|
||||
int proc;
|
||||
MemoryContext SPIcontext;
|
||||
|
||||
/* initialize our tuplestore */
|
||||
tupstore = tuplestore_begin_heap(true, false, work_mem);
|
||||
/* initialize our tuplestore (while still in query context!) */
|
||||
tupstore = tuplestore_begin_heap(randomAccess, false, work_mem);
|
||||
|
||||
/* Connect to SPI manager */
|
||||
if ((ret = SPI_connect()) < 0)
|
||||
@ -1113,6 +1117,7 @@ connectby_text(PG_FUNCTION_ARGS)
|
||||
show_branch,
|
||||
show_serial,
|
||||
per_query_ctx,
|
||||
rsinfo->allowedModes & SFRM_Materialize_Random,
|
||||
attinmeta);
|
||||
rsinfo->setDesc = tupdesc;
|
||||
|
||||
@ -1192,6 +1197,7 @@ connectby_text_serial(PG_FUNCTION_ARGS)
|
||||
show_branch,
|
||||
show_serial,
|
||||
per_query_ctx,
|
||||
rsinfo->allowedModes & SFRM_Materialize_Random,
|
||||
attinmeta);
|
||||
rsinfo->setDesc = tupdesc;
|
||||
|
||||
@ -1222,6 +1228,7 @@ connectby(char *relname,
|
||||
bool show_branch,
|
||||
bool show_serial,
|
||||
MemoryContext per_query_ctx,
|
||||
bool randomAccess,
|
||||
AttInMetadata *attinmeta)
|
||||
{
|
||||
Tuplestorestate *tupstore = NULL;
|
||||
@ -1239,7 +1246,7 @@ connectby(char *relname,
|
||||
oldcontext = MemoryContextSwitchTo(per_query_ctx);
|
||||
|
||||
/* initialize our tuplestore */
|
||||
tupstore = tuplestore_begin_heap(true, false, work_mem);
|
||||
tupstore = tuplestore_begin_heap(randomAccess, false, work_mem);
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
|
||||
|
Reference in New Issue
Block a user