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.

Functions

char * pg_get_indexdef_string (Oid indexrelid)
 
char * pg_get_indexdef_columns (Oid indexrelid, bool pretty)
 
char * pg_get_partkeydef_columns (Oid relid, bool pretty)
 
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_rtable (List *rtable, List *rtable_names)
 
Listset_deparse_context_planstate (List *dpcontext, Node *planstate, List *ancestors)
 
Listselect_rtable_names_for_explain (List *rtable, Bitmapset *rels_used)
 
char * generate_collation_name (Oid collid)
 
char * get_range_partbound_string (List *bound_datums)
 

Function Documentation

◆ deparse_context_for()

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

Definition at line 3130 of file ruleutils.c.

References RangeTblEntry::alias, deparse_namespace::ctes, RangeTblEntry::eref, RangeTblEntry::inFromCl, RangeTblEntry::inh, RangeTblEntry::lateral, list_make1, makeAlias(), makeNode, NIL, palloc0(), RangeTblEntry::relid, RangeTblEntry::relkind, deparse_namespace::rtable, RTE_RELATION, RangeTblEntry::rtekind, set_rtable_names(), and set_simple_column_names().

Referenced by pg_get_constraintdef_worker(), pg_get_expr_worker(), pg_get_indexdef_worker(), pg_get_partition_constraintdef(), pg_get_partkeydef_worker(), StoreAttrDefault(), StoreRelCheck(), and transformPartitionBound().

3131 {
3132  deparse_namespace *dpns;
3133  RangeTblEntry *rte;
3134 
3135  dpns = (deparse_namespace *) palloc0(sizeof(deparse_namespace));
3136 
3137  /* Build a minimal RTE for the rel */
3138  rte = makeNode(RangeTblEntry);
3139  rte->rtekind = RTE_RELATION;
3140  rte->relid = relid;
3141  rte->relkind = RELKIND_RELATION; /* no need for exactness here */
3142  rte->alias = makeAlias(aliasname, NIL);
3143  rte->eref = rte->alias;
3144  rte->lateral = false;
3145  rte->inh = false;
3146  rte->inFromCl = true;
3147 
3148  /* Build one-element rtable */
3149  dpns->rtable = list_make1(rte);
3150  dpns->ctes = NIL;
3151  set_rtable_names(dpns, NIL, NULL);
3153 
3154  /* Return a one-deep namespace stack */
3155  return list_make1(dpns);
3156 }
#define NIL
Definition: pg_list.h:69
Alias * alias
Definition: parsenodes.h:1065
#define list_make1(x1)
Definition: pg_list.h:139
Alias * makeAlias(const char *aliasname, List *colnames)
Definition: makefuncs.c:386
static void set_rtable_names(deparse_namespace *dpns, List *parent_namespaces, Bitmapset *rels_used)
Definition: ruleutils.c:3274
void * palloc0(Size size)
Definition: mcxt.c:955
#define makeNode(_type_)
Definition: nodes.h:565
static void set_simple_column_names(deparse_namespace *dpns)
Definition: ruleutils.c:3487
RTEKind rtekind
Definition: parsenodes.h:962
Alias * eref
Definition: parsenodes.h:1066

◆ deparse_context_for_plan_rtable()

List* deparse_context_for_plan_rtable ( List rtable,
List rtable_names 
)

Definition at line 3172 of file ruleutils.c.

References deparse_namespace::ctes, list_make1, NIL, palloc0(), deparse_namespace::rtable, deparse_namespace::rtable_names, and set_simple_column_names().

Referenced by ExplainPrintPlan().

3173 {
3174  deparse_namespace *dpns;
3175 
3176  dpns = (deparse_namespace *) palloc0(sizeof(deparse_namespace));
3177 
3178  /* Initialize fields that stay the same across the whole plan tree */
3179  dpns->rtable = rtable;
3180  dpns->rtable_names = rtable_names;
3181  dpns->ctes = NIL;
3182 
3183  /*
3184  * Set up column name aliases. We will get rather bogus results for join
3185  * RTEs, but that doesn't matter because plan trees don't contain any join
3186  * alias Vars.
3187  */
3189 
3190  /* Return a one-deep namespace stack */
3191  return list_make1(dpns);
3192 }
#define NIL
Definition: pg_list.h:69
List * rtable_names
Definition: ruleutils.c:153
#define list_make1(x1)
Definition: pg_list.h:139
void * palloc0(Size size)
Definition: mcxt.c:955
static void set_simple_column_names(deparse_namespace *dpns)
Definition: ruleutils.c:3487

◆ deparse_expression()

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

Definition at line 3071 of file ruleutils.c.

References deparse_expression_pretty().

Referenced by AlterDomainDefault(), DefineDomain(), domainAddConstraint(), pg_get_function_arg_default(), print_function_arguments(), show_expression(), show_grouping_set_keys(), show_plan_tlist(), show_sort_group_keys(), show_tablesample(), StoreAttrDefault(), StoreRelCheck(), and transformPartitionBound().

3073 {
3074  return deparse_expression_pretty(expr, dpcontext, forceprefix,
3075  showimplicit, 0, 0);
3076 }
static char * deparse_expression_pretty(Node *expr, List *dpcontext, bool forceprefix, bool showimplicit, int prettyFlags, int startIndent)
Definition: ruleutils.c:3098

◆ generate_collation_name()

char* generate_collation_name ( Oid  collid)

Definition at line 11011 of file ruleutils.c.

References CollationIsVisible(), COLLOID, elog, ERROR, get_namespace_name(), 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().

11012 {
11013  HeapTuple tp;
11014  Form_pg_collation colltup;
11015  char *collname;
11016  char *nspname;
11017  char *result;
11018 
11019  tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid));
11020  if (!HeapTupleIsValid(tp))
11021  elog(ERROR, "cache lookup failed for collation %u", collid);
11022  colltup = (Form_pg_collation) GETSTRUCT(tp);
11023  collname = NameStr(colltup->collname);
11024 
11025  if (!CollationIsVisible(collid))
11026  nspname = get_namespace_name(colltup->collnamespace);
11027  else
11028  nspname = NULL;
11029 
11030  result = quote_qualified_identifier(nspname, collname);
11031 
11032  ReleaseSysCache(tp);
11033 
11034  return result;
11035 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:668
#define ObjectIdGetDatum(X)
Definition: postgres.h:492
#define ERROR
Definition: elog.h:43
char * get_namespace_name(Oid nspid)
Definition: lsyscache.c:3051
bool CollationIsVisible(Oid collid)
Definition: namespace.c:2027
char * quote_qualified_identifier(const char *qualifier, const char *ident)
Definition: ruleutils.c:10574
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
FormData_pg_collation * Form_pg_collation
Definition: pg_collation.h:49
#define NameStr(name)
Definition: c.h:576
#define elog
Definition: elog.h:219

◆ get_range_partbound_string()

char* get_range_partbound_string ( List bound_datums)

Definition at line 11136 of file ruleutils.c.

References appendStringInfoChar(), appendStringInfoString(), buf, deparse_context::buf, castNode, StringInfoData::data, get_const_expr(), PartitionRangeDatum::kind, lfirst, makeStringInfo(), PARTITION_RANGE_DATUM_MAXVALUE, PARTITION_RANGE_DATUM_MINVALUE, val, and PartitionRangeDatum::value.

Referenced by check_new_partition_bound(), and get_rule_expr().

11137 {
11138  deparse_context context;
11140  ListCell *cell;
11141  char *sep;
11142 
11143  memset(&context, 0, sizeof(deparse_context));
11144  context.buf = buf;
11145 
11146  appendStringInfoString(buf, "(");
11147  sep = "";
11148  foreach(cell, bound_datums)
11149  {
11150  PartitionRangeDatum *datum =
11152 
11153  appendStringInfoString(buf, sep);
11154  if (datum->kind == PARTITION_RANGE_DATUM_MINVALUE)
11155  appendStringInfoString(buf, "MINVALUE");
11156  else if (datum->kind == PARTITION_RANGE_DATUM_MAXVALUE)
11157  appendStringInfoString(buf, "MAXVALUE");
11158  else
11159  {
11160  Const *val = castNode(Const, datum->value);
11161 
11162  get_const_expr(val, &context, -1);
11163  }
11164  sep = ", ";
11165  }
11166  appendStringInfoChar(buf, ')');
11167 
11168  return buf->data;
11169 }
#define castNode(_type_, nodeptr)
Definition: nodes.h:586
StringInfo makeStringInfo(void)
Definition: stringinfo.c:28
PartitionRangeDatumKind kind
Definition: parsenodes.h:845
static void get_const_expr(Const *constval, deparse_context *context, int showtype)
Definition: ruleutils.c:9355
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:157
static char * buf
Definition: pg_test_fsync.c:67
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:169
#define lfirst(lc)
Definition: pg_list.h:106
StringInfo buf
Definition: ruleutils.c:111
long val
Definition: informix.c:689

◆ pg_get_constraintdef_command()

char* pg_get_constraintdef_command ( Oid  constraintId)

Definition at line 1853 of file ruleutils.c.

References pg_get_constraintdef_worker().

Referenced by ATExecAlterColumnType().

1854 {
1855  return pg_get_constraintdef_worker(constraintId, true, 0, false);
1856 }
static char * pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, int prettyFlags, bool missing_ok)
Definition: ruleutils.c:1862

◆ pg_get_indexdef_columns()

char* pg_get_indexdef_columns ( Oid  indexrelid,
bool  pretty 
)

Definition at line 1142 of file ruleutils.c.

References pg_get_indexdef_worker(), PRETTYFLAG_INDENT, PRETTYFLAG_PAREN, and PRETTYFLAG_SCHEMA.

Referenced by BuildIndexValueDescription().

1143 {
1144  int prettyFlags;
1145 
1147 
1148  return pg_get_indexdef_worker(indexrelid, 0, NULL, true, false, false,
1149  prettyFlags, false);
1150 }
static char * pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *excludeOps, bool attrsOnly, bool showTblSpc, bool inherits, int prettyFlags, bool missing_ok)
Definition: ruleutils.c:1159
#define PRETTYFLAG_INDENT
Definition: ruleutils.c:91
#define PRETTYFLAG_SCHEMA
Definition: ruleutils.c:92
#define PRETTYFLAG_PAREN
Definition: ruleutils.c:90

◆ pg_get_indexdef_string()

char* pg_get_indexdef_string ( Oid  indexrelid)

Definition at line 1135 of file ruleutils.c.

References pg_get_indexdef_worker().

Referenced by ATExecAlterColumnType().

1136 {
1137  return pg_get_indexdef_worker(indexrelid, 0, NULL, false, true, true, 0, false);
1138 }
static char * pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *excludeOps, bool attrsOnly, bool showTblSpc, bool inherits, int prettyFlags, bool missing_ok)
Definition: ruleutils.c:1159

◆ pg_get_partkeydef_columns()

char* pg_get_partkeydef_columns ( Oid  relid,
bool  pretty 
)

Definition at line 1606 of file ruleutils.c.

References pg_get_partkeydef_worker(), PRETTYFLAG_INDENT, PRETTYFLAG_PAREN, and PRETTYFLAG_SCHEMA.

Referenced by ExecBuildSlotPartitionKeyDescription().

1607 {
1608  int prettyFlags;
1609 
1611 
1612  return pg_get_partkeydef_worker(relid, prettyFlags, true, false);
1613 }
#define PRETTYFLAG_INDENT
Definition: ruleutils.c:91
#define PRETTYFLAG_SCHEMA
Definition: ruleutils.c:92
static char * pg_get_partkeydef_worker(Oid relid, int prettyFlags, bool attrsOnly, bool missing_ok)
Definition: ruleutils.c:1619
#define PRETTYFLAG_PAREN
Definition: ruleutils.c:90

◆ select_rtable_names_for_explain()

List* select_rtable_names_for_explain ( List rtable,
Bitmapset rels_used 
)

Definition at line 3247 of file ruleutils.c.

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

Referenced by ExplainPrintPlan().

3248 {
3249  deparse_namespace dpns;
3250 
3251  memset(&dpns, 0, sizeof(dpns));
3252  dpns.rtable = rtable;
3253  dpns.ctes = NIL;
3254  set_rtable_names(&dpns, NIL, rels_used);
3255  /* We needn't bother computing column aliases yet */
3256 
3257  return dpns.rtable_names;
3258 }
#define NIL
Definition: pg_list.h:69
List * rtable_names
Definition: ruleutils.c:153
static void set_rtable_names(deparse_namespace *dpns, List *parent_namespaces, Bitmapset *rels_used)
Definition: ruleutils.c:3274

◆ set_deparse_context_planstate()

List* set_deparse_context_planstate ( List dpcontext,
Node planstate,
List ancestors 
)

Definition at line 3223 of file ruleutils.c.

References deparse_namespace::ancestors, Assert, linitial, list_length(), and set_deparse_planstate().

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

3225 {
3226  deparse_namespace *dpns;
3227 
3228  /* Should always have one-entry namespace list for Plan deparsing */
3229  Assert(list_length(dpcontext) == 1);
3230  dpns = (deparse_namespace *) linitial(dpcontext);
3231 
3232  /* Set our attention on the specific plan node passed in */
3233  set_deparse_planstate(dpns, (PlanState *) planstate);
3234  dpns->ancestors = ancestors;
3235 
3236  return dpcontext;
3237 }
static void set_deparse_planstate(deparse_namespace *dpns, PlanState *ps)
Definition: ruleutils.c:4511
#define linitial(l)
Definition: pg_list.h:111
#define Assert(condition)
Definition: c.h:699
static int list_length(const List *l)
Definition: pg_list.h:89