Commit 649b5ec7 authored by Tom Lane's avatar Tom Lane

Add the ability to store inheritance-tree statistics in pg_statistic,

and teach ANALYZE to compute such stats for tables that have subclasses.
Per my proposal of yesterday.

autovacuum still needs to be taught about running ANALYZE on parent tables
when their subclasses change, but the feature is useful even without that.
parent 84d723b6
<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.214 2009/12/17 14:36:15 rhaas Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.215 2009/12/29 20:11:42 tgl Exp $ -->
<!--
Documentation of the system catalogs, directed toward PostgreSQL developers
-->
......@@ -4506,19 +4506,32 @@
The catalog <structname>pg_statistic</structname> stores
statistical data about the contents of the database. Entries are
created by <xref linkend="sql-analyze" endterm="sql-analyze-title">
and subsequently used by the query planner. There is one entry for
each table column that has been analyzed. Note that all the
and subsequently used by the query planner. Note that all the
statistical data is inherently approximate, even assuming that it
is up-to-date.
</para>
<para>
Normally there is one entry, with <structfield>stainherit</> =
<literal>false</>, for each table column that has been analyzed.
If the table has inheritance children, a second entry with
<structfield>stainherit</> = <literal>true</> is also created. This row
represents the column's statistics over the inheritance tree, i.e.,
statistics for the data you'd see with
<literal>SELECT <replaceable>column</> FROM <replaceable>table</>*</literal>,
whereas the <structfield>stainherit</> = <literal>false</> row represents
the results of
<literal>SELECT <replaceable>column</> FROM ONLY <replaceable>table</></literal>.
</para>
<para>
<structname>pg_statistic</structname> also stores statistical data about
the values of index expressions. These are described as if they were
actual data columns; in particular, <structfield>starelid</structfield>
references the index. No entry is made for an ordinary non-expression
index column, however, since it would be redundant with the entry
for the underlying table column.
for the underlying table column. Currently, entries for index expressions
always have <structfield>stainherit</> = <literal>false</>.
</para>
<para>
......@@ -4572,6 +4585,14 @@
<entry>The number of the described column</entry>
</row>
<row>
<entry><structfield>stainherit</structfield></entry>
<entry><type>bool</type></entry>
<entry></entry>
<entry>If true, the stats include inheritance child columns, not just the
values in the specified relation</entry>
</row>
<row>
<entry><structfield>stanullfrac</structfield></entry>
<entry><type>float4</type></entry>
......@@ -7114,6 +7135,14 @@
<entry>Name of the column described by this row</entry>
</row>
<row>
<entry><structfield>inherited</structfield></entry>
<entry><type>bool</type></entry>
<entry></entry>
<entry>If true, this row includes inheritance child columns, not just the
values in the specified table</entry>
</row>
<row>
<entry><structfield>null_frac</structfield></entry>
<entry><type>real</type></entry>
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.362 2009/12/24 22:09:23 momjian Exp $
* $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.363 2009/12/29 20:11:43 tgl Exp $
*
*
* INTERFACE ROUTINES
......@@ -2314,7 +2314,7 @@ cookConstraint(ParseState *pstate,
/*
* RemoveStatistics --- remove entries in pg_statistic for a rel or column
*
* If attnum is zero, remove all entries for rel; else remove only the one
* If attnum is zero, remove all entries for rel; else remove only the one(s)
* for that column.
*/
void
......@@ -2344,9 +2344,10 @@ RemoveStatistics(Oid relid, AttrNumber attnum)
nkeys = 2;
}
scan = systable_beginscan(pgstatistic, StatisticRelidAttnumIndexId, true,
scan = systable_beginscan(pgstatistic, StatisticRelidAttnumInhIndexId, true,
SnapshotNow, nkeys, key);
/* we must loop even when attnum != 0, in case of inherited stats */
while (HeapTupleIsValid(tuple = systable_getnext(scan)))
simple_heap_delete(pgstatistic, &tuple->t_self);
......
......@@ -3,7 +3,7 @@
*
* Copyright (c) 1996-2009, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.63 2009/11/29 18:14:30 tgl Exp $
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.64 2009/12/29 20:11:44 tgl Exp $
*/
CREATE VIEW pg_roles AS
......@@ -109,6 +109,7 @@ CREATE VIEW pg_stats AS
nspname AS schemaname,
relname AS tablename,
attname AS attname,
stainherit AS inherited,
stanullfrac AS null_frac,
stawidth AS avg_width,
stadistinct AS n_distinct,
......
This diff is collapsed.
......@@ -13,7 +13,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.399 2009/12/19 01:32:34 sriggs Exp $
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.400 2009/12/29 20:11:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -292,7 +292,6 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
BufferAccessStrategy bstrategy, bool for_wraparound, bool isTopLevel)
{
const char *stmttype;
volatile MemoryContext anl_context = NULL;
volatile bool all_rels,
in_outer_xact,
use_own_xacts;
......@@ -403,17 +402,6 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
use_own_xacts = false;
}
/*
* If we are running ANALYZE without per-table transactions, we'll need a
* memory context with table lifetime.
*/
if (!use_own_xacts)
anl_context = AllocSetContextCreate(PortalContext,
"Analyze",
ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE,
ALLOCSET_DEFAULT_MAXSIZE);
/*
* vacuum_rel expects to be entered with no transaction active; it will
* start and commit its own transaction. But we are called by an SQL
......@@ -454,14 +442,9 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
if (vacstmt->options & VACOPT_ANALYZE)
{
MemoryContext old_context = NULL;
/*
* If using separate xacts, start one for analyze. Otherwise,
* we can use the outer transaction, but we still need to call
* analyze_rel in a memory context that will be cleaned up on
* return (else we leak memory while processing multiple
* tables).
* we can use the outer transaction.
*/
if (use_own_xacts)
{
......@@ -469,8 +452,6 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
/* functions in indexes may want a snapshot set */
PushActiveSnapshot(GetTransactionSnapshot());
}
else
old_context = MemoryContextSwitchTo(anl_context);
analyze_rel(relid, vacstmt, vac_strategy, !scanned_all);
......@@ -479,11 +460,6 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
PopActiveSnapshot();
CommitTransactionCommand();
}
else
{
MemoryContextSwitchTo(old_context);
MemoryContextResetAndDeleteChildren(anl_context);
}
}
}
}
......@@ -528,9 +504,6 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
*/
MemoryContextDelete(vac_context);
vac_context = NULL;
if (anl_context)
MemoryContextDelete(anl_context);
}
/*
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.123 2009/10/30 20:58:45 tgl Exp $
* $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.124 2009/12/29 20:11:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -996,10 +996,11 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse)
/*
* Try to find the MCV statistics for the outer relation's join key.
*/
statsTuple = SearchSysCache(STATRELATT,
statsTuple = SearchSysCache(STATRELATTINH,
ObjectIdGetDatum(node->skewTable),
Int16GetDatum(node->skewColumn),
0, 0);
BoolGetDatum(node->skewInherit),
0);
if (!HeapTupleIsValid(statsTuple))
return;
......
......@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.455 2009/12/23 02:35:20 tgl Exp $
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.456 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -763,6 +763,7 @@ _copyHash(Hash *from)
*/
COPY_SCALAR_FIELD(skewTable);
COPY_SCALAR_FIELD(skewColumn);
COPY_SCALAR_FIELD(skewInherit);
COPY_SCALAR_FIELD(skewColType);
COPY_SCALAR_FIELD(skewColTypmod);
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.376 2009/12/23 02:35:21 tgl Exp $
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.377 2009/12/29 20:11:45 tgl Exp $
*
* NOTES
* Every node type that can appear in stored rules' parsetrees *must*
......@@ -693,6 +693,7 @@ _outHash(StringInfo str, Hash *node)
WRITE_OID_FIELD(skewTable);
WRITE_INT_FIELD(skewColumn);
WRITE_BOOL_FIELD(skewInherit);
WRITE_OID_FIELD(skewColType);
WRITE_INT_FIELD(skewColTypmod);
}
......
......@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.267 2009/11/15 02:45:35 tgl Exp $
* $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.268 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -115,6 +115,7 @@ static HashJoin *make_hashjoin(List *tlist,
static Hash *make_hash(Plan *lefttree,
Oid skewTable,
AttrNumber skewColumn,
bool skewInherit,
Oid skewColType,
int32 skewColTypmod);
static MergeJoin *make_mergejoin(List *tlist,
......@@ -1898,6 +1899,7 @@ create_hashjoin_plan(PlannerInfo *root,
List *hashclauses;
Oid skewTable = InvalidOid;
AttrNumber skewColumn = InvalidAttrNumber;
bool skewInherit = false;
Oid skewColType = InvalidOid;
int32 skewColTypmod = -1;
HashJoin *join_plan;
......@@ -1969,6 +1971,7 @@ create_hashjoin_plan(PlannerInfo *root,
{
skewTable = rte->relid;
skewColumn = var->varattno;
skewInherit = rte->inh;
skewColType = var->vartype;
skewColTypmod = var->vartypmod;
}
......@@ -1981,6 +1984,7 @@ create_hashjoin_plan(PlannerInfo *root,
hash_plan = make_hash(inner_plan,
skewTable,
skewColumn,
skewInherit,
skewColType,
skewColTypmod);
join_plan = make_hashjoin(tlist,
......@@ -2794,6 +2798,7 @@ static Hash *
make_hash(Plan *lefttree,
Oid skewTable,
AttrNumber skewColumn,
bool skewInherit,
Oid skewColType,
int32 skewColTypmod)
{
......@@ -2814,6 +2819,7 @@ make_hash(Plan *lefttree,
node->skewTable = skewTable;
node->skewColumn = skewColumn;
node->skewInherit = skewInherit;
node->skewColType = skewColType;
node->skewColTypmod = skewColTypmod;
......
......@@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.263 2009/10/21 20:38:58 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.264 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -4046,20 +4046,13 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid,
!vardata->freefunc)
elog(ERROR, "no function provided to release variable stats with");
}
else if (rte->inh)
{
/*
* XXX This means the Var represents a column of an append
* relation. Later add code to look at the member relations and
* try to derive some kind of combined statistics?
*/
}
else if (rte->rtekind == RTE_RELATION)
{
vardata->statsTuple = SearchSysCache(STATRELATT,
vardata->statsTuple = SearchSysCache(STATRELATTINH,
ObjectIdGetDatum(rte->relid),
Int16GetDatum(var->varattno),
0, 0);
BoolGetDatum(rte->inh),
0);
vardata->freefunc = ReleaseSysCache;
}
else
......@@ -4196,10 +4189,11 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid,
else if (index->indpred == NIL)
{
vardata->statsTuple =
SearchSysCache(STATRELATT,
SearchSysCache(STATRELATTINH,
ObjectIdGetDatum(index->indexoid),
Int16GetDatum(pos + 1),
0, 0);
BoolGetDatum(false),
0);
vardata->freefunc = ReleaseSysCache;
}
if (vardata->statsTuple)
......@@ -5830,10 +5824,11 @@ btcostestimate(PG_FUNCTION_ARGS)
}
else
{
vardata.statsTuple = SearchSysCache(STATRELATT,
vardata.statsTuple = SearchSysCache(STATRELATTINH,
ObjectIdGetDatum(relid),
Int16GetDatum(colnum),
0, 0);
BoolGetDatum(rte->inh),
0);
vardata.freefunc = ReleaseSysCache;
}
}
......@@ -5856,10 +5851,11 @@ btcostestimate(PG_FUNCTION_ARGS)
}
else
{
vardata.statsTuple = SearchSysCache(STATRELATT,
vardata.statsTuple = SearchSysCache(STATRELATTINH,
ObjectIdGetDatum(relid),
Int16GetDatum(colnum),
0, 0);
BoolGetDatum(false),
0);
vardata.freefunc = ReleaseSysCache;
}
}
......
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.163 2009/08/10 05:46:50 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.164 2009/12/29 20:11:45 tgl Exp $
*
* NOTES
* Eventually, the index information should go through here, too.
......@@ -2524,6 +2524,9 @@ get_typmodout(Oid typid)
* Given the table and attribute number of a column, get the average
* width of entries in the column. Return zero if no data available.
*
* Currently this is only consulted for individual tables, not for inheritance
* trees, so we don't need an "inh" parameter.
*
* Calling a hook at this point looks somewhat strange, but is required
* because the optimizer calls this function without any other way for
* plug-ins to control the result.
......@@ -2540,10 +2543,11 @@ get_attavgwidth(Oid relid, AttrNumber attnum)
if (stawidth > 0)
return stawidth;
}
tp = SearchSysCache(STATRELATT,
tp = SearchSysCache(STATRELATTINH,
ObjectIdGetDatum(relid),
Int16GetDatum(attnum),
0, 0);
BoolGetDatum(false),
0);
if (HeapTupleIsValid(tp))
{
stawidth = ((Form_pg_statistic) GETSTRUCT(tp))->stawidth;
......@@ -2609,7 +2613,7 @@ get_attstatsslot(HeapTuple statstuple,
if (values)
{
val = SysCacheGetAttr(STATRELATT, statstuple,
val = SysCacheGetAttr(STATRELATTINH, statstuple,
Anum_pg_statistic_stavalues1 + i,
&isnull);
if (isnull)
......@@ -2658,7 +2662,7 @@ get_attstatsslot(HeapTuple statstuple,
if (numbers)
{
val = SysCacheGetAttr(STATRELATT, statstuple,
val = SysCacheGetAttr(STATRELATTINH, statstuple,
Anum_pg_statistic_stanumbers1 + i,
&isnull);
if (isnull)
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/syscache.c,v 1.121 2009/10/05 19:24:45 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/cache/syscache.c,v 1.122 2009/12/29 20:11:45 tgl Exp $
*
* NOTES
* These routines allow the parser/planner/executor to perform
......@@ -597,14 +597,14 @@ static const struct cachedesc cacheinfo[] = {
},
1024
},
{StatisticRelationId, /* STATRELATT */
StatisticRelidAttnumIndexId,
{StatisticRelationId, /* STATRELATTINH */
StatisticRelidAttnumInhIndexId,
Anum_pg_statistic_starelid,
2,
3,
{
Anum_pg_statistic_starelid,
Anum_pg_statistic_staattnum,
0,
Anum_pg_statistic_stainherit,
0
},
1024
......
......@@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.561 2009/12/27 14:50:46 momjian Exp $
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.562 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 200912271
#define CATALOG_VERSION_NO 200912281
#endif
......@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/catalog/indexing.h,v 1.111 2009/12/11 03:34:56 itagaki Exp $
* $PostgreSQL: pgsql/src/include/catalog/indexing.h,v 1.112 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -208,8 +208,8 @@ DECLARE_INDEX(pg_shdepend_depender_index, 1232, on pg_shdepend using btree(dbid
DECLARE_INDEX(pg_shdepend_reference_index, 1233, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops));
#define SharedDependReferenceIndexId 1233
DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_index, 2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops));
#define StatisticRelidAttnumIndexId 2696
DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_inh_index, 2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
#define StatisticRelidAttnumInhIndexId 2696
DECLARE_UNIQUE_INDEX(pg_tablespace_oid_index, 2697, on pg_tablespace using btree(oid oid_ops));
#define TablespaceOidIndexId 2697
......
......@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/catalog/pg_statistic.h,v 1.39 2009/06/11 14:49:10 momjian Exp $
* $PostgreSQL: pgsql/src/include/catalog/pg_statistic.h,v 1.40 2009/12/29 20:11:45 tgl Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
......@@ -43,6 +43,7 @@ CATALOG(pg_statistic,2619) BKI_WITHOUT_OIDS
/* These fields form the unique key for the entry: */
Oid starelid; /* relation containing attribute */
int2 staattnum; /* attribute (column) stats are for */
bool stainherit; /* true if inheritance children are included */
/* the fraction of the column's entries that are NULL: */
float4 stanullfrac;
......@@ -142,28 +143,29 @@ typedef FormData_pg_statistic *Form_pg_statistic;
* compiler constants for pg_statistic
* ----------------
*/
#define Natts_pg_statistic 21
#define Natts_pg_statistic 22
#define Anum_pg_statistic_starelid 1
#define Anum_pg_statistic_staattnum 2
#define Anum_pg_statistic_stanullfrac 3
#define Anum_pg_statistic_stawidth 4
#define Anum_pg_statistic_stadistinct 5
#define Anum_pg_statistic_stakind1 6
#define Anum_pg_statistic_stakind2 7
#define Anum_pg_statistic_stakind3 8
#define Anum_pg_statistic_stakind4 9
#define Anum_pg_statistic_staop1 10
#define Anum_pg_statistic_staop2 11
#define Anum_pg_statistic_staop3 12
#define Anum_pg_statistic_staop4 13
#define Anum_pg_statistic_stanumbers1 14
#define Anum_pg_statistic_stanumbers2 15
#define Anum_pg_statistic_stanumbers3 16
#define Anum_pg_statistic_stanumbers4 17
#define Anum_pg_statistic_stavalues1 18
#define Anum_pg_statistic_stavalues2 19
#define Anum_pg_statistic_stavalues3 20
#define Anum_pg_statistic_stavalues4 21
#define Anum_pg_statistic_stainherit 3
#define Anum_pg_statistic_stanullfrac 4
#define Anum_pg_statistic_stawidth 5
#define Anum_pg_statistic_stadistinct 6
#define Anum_pg_statistic_stakind1 7
#define Anum_pg_statistic_stakind2 8
#define Anum_pg_statistic_stakind3 9
#define Anum_pg_statistic_stakind4 10
#define Anum_pg_statistic_staop1 11
#define Anum_pg_statistic_staop2 12
#define Anum_pg_statistic_staop3 13
#define Anum_pg_statistic_staop4 14
#define Anum_pg_statistic_stanumbers1 15
#define Anum_pg_statistic_stanumbers2 16
#define Anum_pg_statistic_stanumbers3 17
#define Anum_pg_statistic_stanumbers4 18
#define Anum_pg_statistic_stavalues1 19
#define Anum_pg_statistic_stavalues2 20
#define Anum_pg_statistic_stavalues3 21
#define Anum_pg_statistic_stavalues4 22
/*
* Currently, three statistical slot "kinds" are defined: most common values,
......
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/nodes/plannodes.h,v 1.113 2009/10/26 02:26:42 tgl Exp $
* $PostgreSQL: pgsql/src/include/nodes/plannodes.h,v 1.114 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -570,9 +570,9 @@ typedef struct Unique
* hash build node
*
* If the executor is supposed to try to apply skew join optimization, then
* skewTable/skewColumn identify the outer relation's join key column, from
* which the relevant MCV statistics can be fetched. Also, its type
* information is provided to save a lookup.
* skewTable/skewColumn/skewInherit identify the outer relation's join key
* column, from which the relevant MCV statistics can be fetched. Also, its
* type information is provided to save a lookup.
* ----------------
*/
typedef struct Hash
......@@ -580,6 +580,7 @@ typedef struct Hash
Plan plan;
Oid skewTable; /* outer join key's table OID, or InvalidOid */
AttrNumber skewColumn; /* outer join key's column #, or zero */
bool skewInherit; /* is outer join rel an inheritance tree? */
Oid skewColType; /* datatype of the outer key column */
int32 skewColTypmod; /* typmod of the outer key column */
/* all other info is in the parent HashJoin node */
......
......@@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/utils/syscache.h,v 1.75 2009/10/05 19:24:49 tgl Exp $
* $PostgreSQL: pgsql/src/include/utils/syscache.h,v 1.76 2009/12/29 20:11:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -70,7 +70,7 @@ enum SysCacheIdentifier
RELNAMENSP,
RELOID,
RULERELNAME,
STATRELATT,
STATRELATTINH,
TSCONFIGMAP,
TSCONFIGNAMENSP,
TSCONFIGOID,
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment