PostgreSQL Source Code git master
ruleutils.h File Reference
#include "nodes/nodes.h"
#include "nodes/parsenodes.h"
#include "nodes/pg_list.h"
Include dependency graph for ruleutils.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define RULE_INDEXDEF_PRETTY   0x01
 
#define RULE_INDEXDEF_KEYS_ONLY   0x02 /* ignore included attributes */
 

Typedefs

typedef struct Plan Plan
 
typedef struct PlannedStmt PlannedStmt
 

Functions

char * pg_get_indexdef_string (Oid indexrelid)
 
char * pg_get_indexdef_columns (Oid indexrelid, bool pretty)
 
char * pg_get_indexdef_columns_extended (Oid indexrelid, bits16 flags)
 
char * pg_get_querydef (Query *query, bool pretty)
 
char * pg_get_partkeydef_columns (Oid relid, bool pretty)
 
char * pg_get_partconstrdef_string (Oid partitionId, char *aliasname)
 
char * pg_get_constraintdef_command (Oid constraintId)
 
char * deparse_expression (Node *expr, List *dpcontext, bool forceprefix, bool showimplicit)
 
Listdeparse_context_for (const char *aliasname, Oid relid)
 
Listdeparse_context_for_plan_tree (PlannedStmt *pstmt, List *rtable_names)
 
Listset_deparse_context_plan (List *dpcontext, Plan *plan, List *ancestors)
 
Listselect_rtable_names_for_explain (List *rtable, Bitmapset *rels_used)
 
char * get_window_frame_options_for_explain (int frameOptions, Node *startOffset, Node *endOffset, List *dpcontext, bool forceprefix)
 
char * generate_collation_name (Oid collid)
 
char * generate_opclass_name (Oid opclass)
 
char * get_range_partbound_string (List *bound_datums)
 
char * pg_get_statisticsobjdef_string (Oid statextid)
 

Macro Definition Documentation

◆ RULE_INDEXDEF_KEYS_ONLY

#define RULE_INDEXDEF_KEYS_ONLY   0x02 /* ignore included attributes */

Definition at line 25 of file ruleutils.h.

◆ RULE_INDEXDEF_PRETTY

#define RULE_INDEXDEF_PRETTY   0x01

Definition at line 24 of file ruleutils.h.

Typedef Documentation

◆ Plan

typedef struct Plan Plan

Definition at line 20 of file ruleutils.h.

◆ PlannedStmt

typedef struct PlannedStmt PlannedStmt

Definition at line 21 of file ruleutils.h.

Function Documentation

◆ deparse_context_for()

List * deparse_context_for ( const char *  aliasname,
Oid  relid 
)

Definition at line 3711 of file ruleutils.c.

3712{
3713 deparse_namespace *dpns;
3714 RangeTblEntry *rte;
3715
3716 dpns = (deparse_namespace *) palloc0(sizeof(deparse_namespace));
3717
3718 /* Build a minimal RTE for the rel */
3719 rte = makeNode(RangeTblEntry);
3720 rte->rtekind = RTE_RELATION;
3721 rte->relid = relid;
3722 rte->relkind = RELKIND_RELATION; /* no need for exactness here */
3723 rte->rellockmode = AccessShareLock;
3724 rte->alias = makeAlias(aliasname, NIL);
3725 rte->eref = rte->alias;
3726 rte->lateral = false;
3727 rte->inh = false;
3728 rte->inFromCl = true;
3729
3730 /* Build one-element rtable */
3731 dpns->rtable = list_make1(rte);
3732 dpns->subplans = NIL;
3733 dpns->ctes = NIL;
3734 dpns->appendrels = NULL;
3735 set_rtable_names(dpns, NIL, NULL);
3737
3738 /* Return a one-deep namespace stack */
3739 return list_make1(dpns);
3740}
#define AccessShareLock
Definition: lockdefs.h:36
Alias * makeAlias(const char *aliasname, List *colnames)
Definition: makefuncs.c:438
void * palloc0(Size size)
Definition: mcxt.c:1395
#define makeNode(_type_)
Definition: nodes.h:161
@ RTE_RELATION
Definition: parsenodes.h:1043
#define NIL
Definition: pg_list.h:68
#define list_make1(x1)
Definition: pg_list.h:212
static void set_simple_column_names(deparse_namespace *dpns)
Definition: ruleutils.c:4101
static void set_rtable_names(deparse_namespace *dpns, List *parent_namespaces, Bitmapset *rels_used)
Definition: ruleutils.c:3887
RTEKind rtekind
Definition: parsenodes.h:1078
AppendRelInfo ** appendrels
Definition: ruleutils.c:169

References AccessShareLock, deparse_namespace::appendrels, deparse_namespace::ctes, RangeTblEntry::inh, list_make1, makeAlias(), makeNode, NIL, palloc0(), deparse_namespace::rtable, RTE_RELATION, RangeTblEntry::rtekind, set_rtable_names(), set_simple_column_names(), and deparse_namespace::subplans.

Referenced by pg_get_constraintdef_worker(), pg_get_expr_worker(), pg_get_indexdef_worker(), pg_get_partconstrdef_string(), pg_get_partition_constraintdef(), pg_get_partkeydef_worker(), pg_get_statisticsobj_worker(), pg_get_statisticsobjdef_expressions(), transformPartitionBound(), and transformPartitionRangeBounds().

◆ deparse_context_for_plan_tree()

List * deparse_context_for_plan_tree ( PlannedStmt pstmt,
List rtable_names 
)

Definition at line 3756 of file ruleutils.c.

3757{
3758 deparse_namespace *dpns;
3759
3760 dpns = (deparse_namespace *) palloc0(sizeof(deparse_namespace));
3761
3762 /* Initialize fields that stay the same across the whole plan tree */
3763 dpns->rtable = pstmt->rtable;
3764 dpns->rtable_names = rtable_names;
3765 dpns->subplans = pstmt->subplans;
3766 dpns->ctes = NIL;
3767 if (pstmt->appendRelations)
3768 {
3769 /* Set up the array, indexed by child relid */
3770 int ntables = list_length(dpns->rtable);
3771 ListCell *lc;
3772
3773 dpns->appendrels = (AppendRelInfo **)
3774 palloc0((ntables + 1) * sizeof(AppendRelInfo *));
3775 foreach(lc, pstmt->appendRelations)
3776 {
3777 AppendRelInfo *appinfo = lfirst_node(AppendRelInfo, lc);
3778 Index crelid = appinfo->child_relid;
3779
3780 Assert(crelid > 0 && crelid <= ntables);
3781 Assert(dpns->appendrels[crelid] == NULL);
3782 dpns->appendrels[crelid] = appinfo;
3783 }
3784 }
3785 else
3786 dpns->appendrels = NULL; /* don't need it */
3787
3788 /*
3789 * Set up column name aliases, ignoring any join RTEs; they don't matter
3790 * because plan trees don't contain any join alias Vars.
3791 */
3793
3794 /* Return a one-deep namespace stack */
3795 return list_make1(dpns);
3796}
unsigned int Index
Definition: c.h:622
Assert(PointerIsAligned(start, uint64))
#define lfirst_node(type, lc)
Definition: pg_list.h:176
static int list_length(const List *l)
Definition: pg_list.h:152
Index child_relid
Definition: pathnodes.h:3193
List * appendRelations
Definition: plannodes.h:127
List * subplans
Definition: plannodes.h:132
List * rtable
Definition: plannodes.h:109
List * rtable_names
Definition: ruleutils.c:165

References PlannedStmt::appendRelations, deparse_namespace::appendrels, Assert(), AppendRelInfo::child_relid, deparse_namespace::ctes, lfirst_node, list_length(), list_make1, NIL, palloc0(), deparse_namespace::rtable, PlannedStmt::rtable, deparse_namespace::rtable_names, set_simple_column_names(), deparse_namespace::subplans, and PlannedStmt::subplans.

Referenced by ExplainPrintPlan().

◆ deparse_expression()

char * deparse_expression ( Node expr,
List dpcontext,
bool  forceprefix,
bool  showimplicit 
)

Definition at line 3648 of file ruleutils.c.

3650{
3651 return deparse_expression_pretty(expr, dpcontext, forceprefix,
3652 showimplicit, 0, 0);
3653}
static char * deparse_expression_pretty(Node *expr, List *dpcontext, bool forceprefix, bool showimplicit, int prettyFlags, int startIndent)
Definition: ruleutils.c:3675

References deparse_expression_pretty().

Referenced by AlterDomainDefault(), DefineDomain(), pg_get_function_arg_default(), pg_get_partconstrdef_string(), print_function_arguments(), show_expression(), show_grouping_set_keys(), show_memoize_info(), show_plan_tlist(), show_sort_group_keys(), show_tablesample(), show_window_keys(), transformPartitionBound(), and transformPartitionRangeBounds().

◆ generate_collation_name()

char * generate_collation_name ( Oid  collid)

Definition at line 13578 of file ruleutils.c.

13579{
13580 HeapTuple tp;
13581 Form_pg_collation colltup;
13582 char *collname;
13583 char *nspname;
13584 char *result;
13585
13586 tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid));
13587 if (!HeapTupleIsValid(tp))
13588 elog(ERROR, "cache lookup failed for collation %u", collid);
13589 colltup = (Form_pg_collation) GETSTRUCT(tp);
13590 collname = NameStr(colltup->collname);
13591
13593 nspname = get_namespace_name_or_temp(colltup->collnamespace);
13594 else
13595 nspname = NULL;
13596
13597 result = quote_qualified_identifier(nspname, collname);
13598
13599 ReleaseSysCache(tp);
13600
13601 return result;
13602}
#define NameStr(name)
Definition: c.h:754
Oid collid
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
Definition: htup_details.h:728
char * get_namespace_name_or_temp(Oid nspid)
Definition: lsyscache.c:3557
bool CollationIsVisible(Oid collid)
Definition: namespace.c:2474
FormData_pg_collation * Form_pg_collation
Definition: pg_collation.h:58
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:262
char * quote_qualified_identifier(const char *qualifier, const char *ident)
Definition: ruleutils.c:13146
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:264
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:220

References CollationIsVisible(), collid, elog, ERROR, get_namespace_name_or_temp(), GETSTRUCT(), HeapTupleIsValid, NameStr, ObjectIdGetDatum(), quote_qualified_identifier(), ReleaseSysCache(), and SearchSysCache1().

Referenced by get_const_collation(), get_from_clause_coldeflist(), get_rule_expr(), pg_collation_for(), pg_get_indexdef_worker(), and pg_get_partkeydef_worker().

◆ generate_opclass_name()

char * generate_opclass_name ( Oid  opclass)

Definition at line 12932 of file ruleutils.c.

12933{
12935
12937 get_opclass_name(opclass, InvalidOid, &buf);
12938
12939 return &buf.data[1]; /* get_opclass_name() prepends space */
12940}
static char * buf
Definition: pg_test_fsync.c:72
#define InvalidOid
Definition: postgres_ext.h:37
static void get_opclass_name(Oid opclass, Oid actual_datatype, StringInfo buf)
Definition: ruleutils.c:12894
void initStringInfo(StringInfo str)
Definition: stringinfo.c:97

References buf, get_opclass_name(), initStringInfo(), and InvalidOid.

Referenced by index_opclass_options().

◆ get_range_partbound_string()

char * get_range_partbound_string ( List bound_datums)

Definition at line 13711 of file ruleutils.c.

13712{
13713 deparse_context context;
13715 ListCell *cell;
13716 char *sep;
13717
13719 memset(&context, 0, sizeof(deparse_context));
13720 context.buf = &buf;
13721
13723 sep = "";
13724 foreach(cell, bound_datums)
13725 {
13726 PartitionRangeDatum *datum =
13728
13731 appendStringInfoString(&buf, "MINVALUE");
13732 else if (datum->kind == PARTITION_RANGE_DATUM_MAXVALUE)
13733 appendStringInfoString(&buf, "MAXVALUE");
13734 else
13735 {
13736 Const *val = castNode(Const, datum->value);
13737
13738 get_const_expr(val, &context, -1);
13739 }
13740 sep = ", ";
13741 }
13743
13744 return buf.data;
13745}
long val
Definition: informix.c:689
#define castNode(_type_, nodeptr)
Definition: nodes.h:182
@ PARTITION_RANGE_DATUM_MAXVALUE
Definition: parsenodes.h:954
@ PARTITION_RANGE_DATUM_MINVALUE
Definition: parsenodes.h:952
static void get_const_expr(Const *constval, deparse_context *context, int showtype)
Definition: ruleutils.c:11498
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:242
PartitionRangeDatumKind kind
Definition: parsenodes.h:961
StringInfo buf
Definition: ruleutils.c:114

References appendStringInfoChar(), appendStringInfoString(), deparse_context::buf, buf, castNode, get_const_expr(), initStringInfo(), PartitionRangeDatum::kind, lfirst_node, PARTITION_RANGE_DATUM_MAXVALUE, PARTITION_RANGE_DATUM_MINVALUE, val, and PartitionRangeDatum::value.

Referenced by check_new_partition_bound(), and get_rule_expr().

◆ get_window_frame_options_for_explain()

char * get_window_frame_options_for_explain ( int  frameOptions,
Node startOffset,
Node endOffset,
List dpcontext,
bool  forceprefix 
)

Definition at line 6912 of file ruleutils.c.

6915{
6917 deparse_context context;
6918
6920 context.buf = &buf;
6921 context.namespaces = dpcontext;
6922 context.resultDesc = NULL;
6923 context.targetList = NIL;
6924 context.windowClause = NIL;
6925 context.varprefix = forceprefix;
6926 context.prettyFlags = 0;
6928 context.indentLevel = 0;
6929 context.colNamesVisible = true;
6930 context.inGroupBy = false;
6931 context.varInOrderBy = false;
6932 context.appendparents = NULL;
6933
6934 get_window_frame_options(frameOptions, startOffset, endOffset, &context);
6935
6936 return buf.data;
6937}
static void get_window_frame_options(int frameOptions, Node *startOffset, Node *endOffset, deparse_context *context)
Definition: ruleutils.c:6843
#define WRAP_COLUMN_DEFAULT
Definition: ruleutils.c:98
TupleDesc resultDesc
Definition: ruleutils.c:116
List * targetList
Definition: ruleutils.c:117
bool colNamesVisible
Definition: ruleutils.c:123
List * namespaces
Definition: ruleutils.c:115
List * windowClause
Definition: ruleutils.c:118
Bitmapset * appendparents
Definition: ruleutils.c:126

References deparse_context::appendparents, deparse_context::buf, buf, deparse_context::colNamesVisible, get_window_frame_options(), deparse_context::indentLevel, deparse_context::inGroupBy, initStringInfo(), deparse_context::namespaces, NIL, deparse_context::prettyFlags, deparse_context::resultDesc, deparse_context::targetList, deparse_context::varInOrderBy, deparse_context::varprefix, deparse_context::windowClause, WRAP_COLUMN_DEFAULT, and deparse_context::wrapColumn.

Referenced by show_window_def().

◆ pg_get_constraintdef_command()

char * pg_get_constraintdef_command ( Oid  constraintId)

Definition at line 2183 of file ruleutils.c.

2184{
2185 return pg_get_constraintdef_worker(constraintId, true, 0, false);
2186}
static char * pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, int prettyFlags, bool missing_ok)
Definition: ruleutils.c:2192

References pg_get_constraintdef_worker().

Referenced by RememberConstraintForRebuilding().

◆ pg_get_indexdef_columns()

char * pg_get_indexdef_columns ( Oid  indexrelid,
bool  pretty 
)

Definition at line 1235 of file ruleutils.c.

1236{
1237 int prettyFlags;
1238
1239 prettyFlags = GET_PRETTY_FLAGS(pretty);
1240
1241 return pg_get_indexdef_worker(indexrelid, 0, NULL,
1242 true, true,
1243 false, false,
1244 prettyFlags, false);
1245}
static char * pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *excludeOps, bool attrsOnly, bool keysOnly, bool showTblSpc, bool inherits, int prettyFlags, bool missing_ok)
Definition: ruleutils.c:1270
#define GET_PRETTY_FLAGS(pretty)
Definition: ruleutils.c:93

References GET_PRETTY_FLAGS, and pg_get_indexdef_worker().

Referenced by BuildIndexValueDescription().

◆ pg_get_indexdef_columns_extended()

char * pg_get_indexdef_columns_extended ( Oid  indexrelid,
bits16  flags 
)

Definition at line 1249 of file ruleutils.c.

1250{
1251 bool pretty = ((flags & RULE_INDEXDEF_PRETTY) != 0);
1252 bool keys_only = ((flags & RULE_INDEXDEF_KEYS_ONLY) != 0);
1253 int prettyFlags;
1254
1255 prettyFlags = GET_PRETTY_FLAGS(pretty);
1256
1257 return pg_get_indexdef_worker(indexrelid, 0, NULL,
1258 true, keys_only,
1259 false, false,
1260 prettyFlags, false);
1261}
#define RULE_INDEXDEF_PRETTY
Definition: ruleutils.h:24
#define RULE_INDEXDEF_KEYS_ONLY
Definition: ruleutils.h:25

References GET_PRETTY_FLAGS, pg_get_indexdef_worker(), RULE_INDEXDEF_KEYS_ONLY, and RULE_INDEXDEF_PRETTY.

Referenced by gist_page_items().

◆ pg_get_indexdef_string()

char * pg_get_indexdef_string ( Oid  indexrelid)

Definition at line 1225 of file ruleutils.c.

1226{
1227 return pg_get_indexdef_worker(indexrelid, 0, NULL,
1228 false, false,
1229 true, true,
1230 0, false);
1231}

References pg_get_indexdef_worker().

Referenced by RememberIndexForRebuilding().

◆ pg_get_partconstrdef_string()

char * pg_get_partconstrdef_string ( Oid  partitionId,
char *  aliasname 
)

Definition at line 2127 of file ruleutils.c.

2128{
2129 Expr *constr_expr;
2130 List *context;
2131
2132 constr_expr = get_partition_qual_relid(partitionId);
2133 context = deparse_context_for(aliasname, partitionId);
2134
2135 return deparse_expression((Node *) constr_expr, context, true, false);
2136}
Expr * get_partition_qual_relid(Oid relid)
Definition: partcache.c:299
List * deparse_context_for(const char *aliasname, Oid relid)
Definition: ruleutils.c:3711
char * deparse_expression(Node *expr, List *dpcontext, bool forceprefix, bool showimplicit)
Definition: ruleutils.c:3648
Definition: pg_list.h:54
Definition: nodes.h:135

References deparse_context_for(), deparse_expression(), and get_partition_qual_relid().

Referenced by RI_PartitionRemove_Check().

◆ pg_get_partkeydef_columns()

char * pg_get_partkeydef_columns ( Oid  relid,
bool  pretty 
)

Definition at line 1923 of file ruleutils.c.

1924{
1925 int prettyFlags;
1926
1927 prettyFlags = GET_PRETTY_FLAGS(pretty);
1928
1929 return pg_get_partkeydef_worker(relid, prettyFlags, true, false);
1930}
static char * pg_get_partkeydef_worker(Oid relid, int prettyFlags, bool attrsOnly, bool missing_ok)
Definition: ruleutils.c:1936

References GET_PRETTY_FLAGS, and pg_get_partkeydef_worker().

Referenced by ExecBuildSlotPartitionKeyDescription().

◆ pg_get_querydef()

char * pg_get_querydef ( Query query,
bool  pretty 
)

Definition at line 1588 of file ruleutils.c.

1589{
1591 int prettyFlags;
1592
1593 prettyFlags = GET_PRETTY_FLAGS(pretty);
1594
1596
1597 get_query_def(query, &buf, NIL, NULL, true,
1598 prettyFlags, WRAP_COLUMN_DEFAULT, 0);
1599
1600 return buf.data;
1601}
static void get_query_def(Query *query, StringInfo buf, List *parentnamespace, TupleDesc resultDesc, bool colNamesVisible, int prettyFlags, int wrapColumn, int startIndent)
Definition: ruleutils.c:5627

References buf, GET_PRETTY_FLAGS, get_query_def(), initStringInfo(), NIL, and WRAP_COLUMN_DEFAULT.

◆ pg_get_statisticsobjdef_string()

char * pg_get_statisticsobjdef_string ( Oid  statextid)

Definition at line 1626 of file ruleutils.c.

1627{
1628 return pg_get_statisticsobj_worker(statextid, false, false);
1629}
static char * pg_get_statisticsobj_worker(Oid statextid, bool columns_only, bool missing_ok)
Definition: ruleutils.c:1653

References pg_get_statisticsobj_worker().

Referenced by RememberStatisticsForRebuilding().

◆ select_rtable_names_for_explain()

List * select_rtable_names_for_explain ( List rtable,
Bitmapset rels_used 
)

Definition at line 3858 of file ruleutils.c.

3859{
3860 deparse_namespace dpns;
3861
3862 memset(&dpns, 0, sizeof(dpns));
3863 dpns.rtable = rtable;
3864 dpns.subplans = NIL;
3865 dpns.ctes = NIL;
3866 dpns.appendrels = NULL;
3867 set_rtable_names(&dpns, NIL, rels_used);
3868 /* We needn't bother computing column aliases yet */
3869
3870 return dpns.rtable_names;
3871}

References deparse_namespace::appendrels, deparse_namespace::ctes, NIL, deparse_namespace::rtable, deparse_namespace::rtable_names, set_rtable_names(), and deparse_namespace::subplans.

Referenced by ExplainPrintPlan().

◆ set_deparse_context_plan()

List * set_deparse_context_plan ( List dpcontext,
Plan plan,
List ancestors 
)

Definition at line 3828 of file ruleutils.c.

3829{
3830 deparse_namespace *dpns;
3831
3832 /* Should always have one-entry namespace list for Plan deparsing */
3833 Assert(list_length(dpcontext) == 1);
3834 dpns = (deparse_namespace *) linitial(dpcontext);
3835
3836 /* Set our attention on the specific plan node passed in */
3837 dpns->ancestors = ancestors;
3838 set_deparse_plan(dpns, plan);
3839
3840 /* For ModifyTable, set aliases for OLD and NEW in RETURNING */
3841 if (IsA(plan, ModifyTable))
3842 {
3843 dpns->ret_old_alias = ((ModifyTable *) plan)->returningOldAlias;
3844 dpns->ret_new_alias = ((ModifyTable *) plan)->returningNewAlias;
3845 }
3846
3847 return dpcontext;
3848}
#define IsA(nodeptr, _type_)
Definition: nodes.h:164
#define linitial(l)
Definition: pg_list.h:178
#define plan(x)
Definition: pg_regress.c:161
static void set_deparse_plan(deparse_namespace *dpns, Plan *plan)
Definition: ruleutils.c:5155
char * ret_old_alias
Definition: ruleutils.c:170
char * ret_new_alias
Definition: ruleutils.c:171

References deparse_namespace::ancestors, Assert(), IsA, linitial, list_length(), plan, deparse_namespace::ret_new_alias, deparse_namespace::ret_old_alias, and set_deparse_plan().

Referenced by show_expression(), show_grouping_sets(), show_memoize_info(), show_plan_tlist(), show_sort_group_keys(), show_tablesample(), show_window_def(), and show_window_keys().