PostgreSQL Source Code  git master
parse_node.h File Reference
Include dependency graph for parse_node.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ParseState
 
struct  ParseNamespaceItem
 
struct  ParseNamespaceColumn
 
struct  ParseCallbackState
 

Typedefs

typedef struct ParseState ParseState
 
typedef struct ParseNamespaceItem ParseNamespaceItem
 
typedef struct ParseNamespaceColumn ParseNamespaceColumn
 
typedef enum ParseExprKind ParseExprKind
 
typedef Node *(* PreParseColumnRefHook) (ParseState *pstate, ColumnRef *cref)
 
typedef Node *(* PostParseColumnRefHook) (ParseState *pstate, ColumnRef *cref, Node *var)
 
typedef Node *(* ParseParamRefHook) (ParseState *pstate, ParamRef *pref)
 
typedef Node *(* CoerceParamHook) (ParseState *pstate, Param *param, Oid targetTypeId, int32 targetTypeMod, int location)
 
typedef struct ParseCallbackState ParseCallbackState
 

Enumerations

enum  ParseExprKind {
  EXPR_KIND_NONE = 0, EXPR_KIND_OTHER, EXPR_KIND_JOIN_ON, EXPR_KIND_JOIN_USING,
  EXPR_KIND_FROM_SUBSELECT, EXPR_KIND_FROM_FUNCTION, EXPR_KIND_WHERE, EXPR_KIND_HAVING,
  EXPR_KIND_FILTER, EXPR_KIND_WINDOW_PARTITION, EXPR_KIND_WINDOW_ORDER, EXPR_KIND_WINDOW_FRAME_RANGE,
  EXPR_KIND_WINDOW_FRAME_ROWS, EXPR_KIND_WINDOW_FRAME_GROUPS, EXPR_KIND_SELECT_TARGET, EXPR_KIND_INSERT_TARGET,
  EXPR_KIND_UPDATE_SOURCE, EXPR_KIND_UPDATE_TARGET, EXPR_KIND_GROUP_BY, EXPR_KIND_ORDER_BY,
  EXPR_KIND_DISTINCT_ON, EXPR_KIND_LIMIT, EXPR_KIND_OFFSET, EXPR_KIND_RETURNING,
  EXPR_KIND_VALUES, EXPR_KIND_VALUES_SINGLE, EXPR_KIND_CHECK_CONSTRAINT, EXPR_KIND_DOMAIN_CHECK,
  EXPR_KIND_COLUMN_DEFAULT, EXPR_KIND_FUNCTION_DEFAULT, EXPR_KIND_INDEX_EXPRESSION, EXPR_KIND_INDEX_PREDICATE,
  EXPR_KIND_ALTER_COL_TRANSFORM, EXPR_KIND_EXECUTE_PARAMETER, EXPR_KIND_TRIGGER_WHEN, EXPR_KIND_POLICY,
  EXPR_KIND_PARTITION_BOUND, EXPR_KIND_PARTITION_EXPRESSION, EXPR_KIND_CALL_ARGUMENT, EXPR_KIND_COPY_WHERE,
  EXPR_KIND_GENERATED_COLUMN
}
 

Functions

ParseStatemake_parsestate (ParseState *parentParseState)
 
void free_parsestate (ParseState *pstate)
 
int parser_errposition (ParseState *pstate, int location)
 
void setup_parser_errposition_callback (ParseCallbackState *pcbstate, ParseState *pstate, int location)
 
void cancel_parser_errposition_callback (ParseCallbackState *pcbstate)
 
void transformContainerType (Oid *containerType, int32 *containerTypmod)
 
SubscriptingReftransformContainerSubscripts (ParseState *pstate, Node *containerBase, Oid containerType, int32 containerTypMod, List *indirection, bool isAssignment)
 
Constmake_const (ParseState *pstate, Value *value, int location)
 

Typedef Documentation

◆ CoerceParamHook

typedef Node*(* CoerceParamHook) (ParseState *pstate, Param *param, Oid targetTypeId, int32 targetTypeMod, int location)

Definition at line 90 of file parse_node.h.

◆ ParseCallbackState

◆ ParseExprKind

◆ ParseNamespaceColumn

Definition at line 25 of file parse_node.h.

◆ ParseNamespaceItem

Definition at line 24 of file parse_node.h.

◆ ParseParamRefHook

typedef Node*(* ParseParamRefHook) (ParseState *pstate, ParamRef *pref)

Definition at line 89 of file parse_node.h.

◆ ParseState

typedef struct ParseState ParseState

Definition at line 23 of file parse_node.h.

◆ PostParseColumnRefHook

typedef Node*(* PostParseColumnRefHook) (ParseState *pstate, ColumnRef *cref, Node *var)

Definition at line 88 of file parse_node.h.

◆ PreParseColumnRefHook

typedef Node*(* PreParseColumnRefHook) (ParseState *pstate, ColumnRef *cref)

Definition at line 87 of file parse_node.h.

Enumeration Type Documentation

◆ ParseExprKind

Enumerator
EXPR_KIND_NONE 
EXPR_KIND_OTHER 
EXPR_KIND_JOIN_ON 
EXPR_KIND_JOIN_USING 
EXPR_KIND_FROM_SUBSELECT 
EXPR_KIND_FROM_FUNCTION 
EXPR_KIND_WHERE 
EXPR_KIND_HAVING 
EXPR_KIND_FILTER 
EXPR_KIND_WINDOW_PARTITION 
EXPR_KIND_WINDOW_ORDER 
EXPR_KIND_WINDOW_FRAME_RANGE 
EXPR_KIND_WINDOW_FRAME_ROWS 
EXPR_KIND_WINDOW_FRAME_GROUPS 
EXPR_KIND_SELECT_TARGET 
EXPR_KIND_INSERT_TARGET 
EXPR_KIND_UPDATE_SOURCE 
EXPR_KIND_UPDATE_TARGET 
EXPR_KIND_GROUP_BY 
EXPR_KIND_ORDER_BY 
EXPR_KIND_DISTINCT_ON 
EXPR_KIND_LIMIT 
EXPR_KIND_OFFSET 
EXPR_KIND_RETURNING 
EXPR_KIND_VALUES 
EXPR_KIND_VALUES_SINGLE 
EXPR_KIND_CHECK_CONSTRAINT 
EXPR_KIND_DOMAIN_CHECK 
EXPR_KIND_COLUMN_DEFAULT 
EXPR_KIND_FUNCTION_DEFAULT 
EXPR_KIND_INDEX_EXPRESSION 
EXPR_KIND_INDEX_PREDICATE 
EXPR_KIND_ALTER_COL_TRANSFORM 
EXPR_KIND_EXECUTE_PARAMETER 
EXPR_KIND_TRIGGER_WHEN 
EXPR_KIND_POLICY 
EXPR_KIND_PARTITION_BOUND 
EXPR_KIND_PARTITION_EXPRESSION 
EXPR_KIND_CALL_ARGUMENT 
EXPR_KIND_COPY_WHERE 
EXPR_KIND_GENERATED_COLUMN 

Definition at line 38 of file parse_node.h.

39 {
40  EXPR_KIND_NONE = 0, /* "not in an expression" */
41  EXPR_KIND_OTHER, /* reserved for extensions */
42  EXPR_KIND_JOIN_ON, /* JOIN ON */
43  EXPR_KIND_JOIN_USING, /* JOIN USING */
44  EXPR_KIND_FROM_SUBSELECT, /* sub-SELECT in FROM clause */
45  EXPR_KIND_FROM_FUNCTION, /* function in FROM clause */
46  EXPR_KIND_WHERE, /* WHERE */
47  EXPR_KIND_HAVING, /* HAVING */
48  EXPR_KIND_FILTER, /* FILTER */
49  EXPR_KIND_WINDOW_PARTITION, /* window definition PARTITION BY */
50  EXPR_KIND_WINDOW_ORDER, /* window definition ORDER BY */
51  EXPR_KIND_WINDOW_FRAME_RANGE, /* window frame clause with RANGE */
52  EXPR_KIND_WINDOW_FRAME_ROWS, /* window frame clause with ROWS */
53  EXPR_KIND_WINDOW_FRAME_GROUPS, /* window frame clause with GROUPS */
54  EXPR_KIND_SELECT_TARGET, /* SELECT target list item */
55  EXPR_KIND_INSERT_TARGET, /* INSERT target list item */
56  EXPR_KIND_UPDATE_SOURCE, /* UPDATE assignment source item */
57  EXPR_KIND_UPDATE_TARGET, /* UPDATE assignment target item */
58  EXPR_KIND_GROUP_BY, /* GROUP BY */
59  EXPR_KIND_ORDER_BY, /* ORDER BY */
60  EXPR_KIND_DISTINCT_ON, /* DISTINCT ON */
61  EXPR_KIND_LIMIT, /* LIMIT */
62  EXPR_KIND_OFFSET, /* OFFSET */
63  EXPR_KIND_RETURNING, /* RETURNING */
64  EXPR_KIND_VALUES, /* VALUES */
65  EXPR_KIND_VALUES_SINGLE, /* single-row VALUES (in INSERT only) */
66  EXPR_KIND_CHECK_CONSTRAINT, /* CHECK constraint for a table */
67  EXPR_KIND_DOMAIN_CHECK, /* CHECK constraint for a domain */
68  EXPR_KIND_COLUMN_DEFAULT, /* default value for a table column */
69  EXPR_KIND_FUNCTION_DEFAULT, /* default parameter value for function */
70  EXPR_KIND_INDEX_EXPRESSION, /* index expression */
71  EXPR_KIND_INDEX_PREDICATE, /* index predicate */
72  EXPR_KIND_ALTER_COL_TRANSFORM, /* transform expr in ALTER COLUMN TYPE */
73  EXPR_KIND_EXECUTE_PARAMETER, /* parameter value in EXECUTE */
74  EXPR_KIND_TRIGGER_WHEN, /* WHEN condition in CREATE TRIGGER */
75  EXPR_KIND_POLICY, /* USING or WITH CHECK expr in policy */
76  EXPR_KIND_PARTITION_BOUND, /* partition bound expression */
77  EXPR_KIND_PARTITION_EXPRESSION, /* PARTITION BY expression */
78  EXPR_KIND_CALL_ARGUMENT, /* procedure argument in CALL */
79  EXPR_KIND_COPY_WHERE, /* WHERE condition in COPY FROM */
80  EXPR_KIND_GENERATED_COLUMN, /* generation expression for a column */
ParseExprKind
Definition: parse_node.h:38

Function Documentation

◆ cancel_parser_errposition_callback()

void cancel_parser_errposition_callback ( ParseCallbackState pcbstate)

◆ free_parsestate()

void free_parsestate ( ParseState pstate)

Definition at line 77 of file parse_node.c.

References ereport, errcode(), errmsg(), ERROR, MaxTupleAttributeNumber, NoLock, ParseState::p_next_resno, ParseState::p_target_relation, pfree(), and table_close().

Referenced by AlterPolicy(), CreatePolicy(), CreateTrigger(), inline_function(), parse_analyze(), parse_analyze_varparams(), parse_sub_analyze(), pg_analyze_and_rewrite_params(), RemoveRoleFromObjectPolicy(), standard_ProcessUtility(), transformIndexStmt(), transformInsertStmt(), and transformRuleStmt().

78 {
79  /*
80  * Check that we did not produce too many resnos; at the very least we
81  * cannot allow more than 2^16, since that would exceed the range of a
82  * AttrNumber. It seems safest to use MaxTupleAttributeNumber.
83  */
84  if (pstate->p_next_resno - 1 > MaxTupleAttributeNumber)
85  ereport(ERROR,
86  (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
87  errmsg("target lists can have at most %d entries",
89 
90  if (pstate->p_target_relation != NULL)
92 
93  pfree(pstate);
94 }
void table_close(Relation relation, LOCKMODE lockmode)
Definition: table.c:167
#define MaxTupleAttributeNumber
Definition: htup_details.h:33
int errcode(int sqlerrcode)
Definition: elog.c:704
void pfree(void *pointer)
Definition: mcxt.c:1057
#define ERROR
Definition: elog.h:45
#define NoLock
Definition: lockdefs.h:34
int p_next_resno
Definition: parse_node.h:195
#define ereport(elevel,...)
Definition: elog.h:155
int errmsg(const char *fmt,...)
Definition: elog.c:915
Relation p_target_relation
Definition: parse_node.h:190

◆ make_const()

Const* make_const ( ParseState pstate,
Value value,
int  location 
)

Definition at line 352 of file parse_node.c.

References bit_in(), cancel_parser_errposition_callback(), CStringGetDatum, DirectFunctionCall3, elog, ERROR, FLOAT8PASSBYVAL, Int32GetDatum, Int64GetDatum(), intVal, InvalidOid, Const::location, makeConst(), nodeTag, numeric_in(), ObjectIdGetDatum, scanint8(), setup_parser_errposition_callback(), strVal, T_BitString, T_Float, T_Integer, T_Null, T_String, and val.

Referenced by transformExprRecurse().

353 {
354  Const *con;
355  Datum val;
356  int64 val64;
357  Oid typeid;
358  int typelen;
359  bool typebyval;
360  ParseCallbackState pcbstate;
361 
362  switch (nodeTag(value))
363  {
364  case T_Integer:
365  val = Int32GetDatum(intVal(value));
366 
367  typeid = INT4OID;
368  typelen = sizeof(int32);
369  typebyval = true;
370  break;
371 
372  case T_Float:
373  /* could be an oversize integer as well as a float ... */
374  if (scanint8(strVal(value), true, &val64))
375  {
376  /*
377  * It might actually fit in int32. Probably only INT_MIN can
378  * occur, but we'll code the test generally just to be sure.
379  */
380  int32 val32 = (int32) val64;
381 
382  if (val64 == (int64) val32)
383  {
384  val = Int32GetDatum(val32);
385 
386  typeid = INT4OID;
387  typelen = sizeof(int32);
388  typebyval = true;
389  }
390  else
391  {
392  val = Int64GetDatum(val64);
393 
394  typeid = INT8OID;
395  typelen = sizeof(int64);
396  typebyval = FLOAT8PASSBYVAL; /* int8 and float8 alike */
397  }
398  }
399  else
400  {
401  /* arrange to report location if numeric_in() fails */
402  setup_parser_errposition_callback(&pcbstate, pstate, location);
404  CStringGetDatum(strVal(value)),
406  Int32GetDatum(-1));
408 
409  typeid = NUMERICOID;
410  typelen = -1; /* variable len */
411  typebyval = false;
412  }
413  break;
414 
415  case T_String:
416 
417  /*
418  * We assume here that UNKNOWN's internal representation is the
419  * same as CSTRING
420  */
421  val = CStringGetDatum(strVal(value));
422 
423  typeid = UNKNOWNOID; /* will be coerced later */
424  typelen = -2; /* cstring-style varwidth type */
425  typebyval = false;
426  break;
427 
428  case T_BitString:
429  /* arrange to report location if bit_in() fails */
430  setup_parser_errposition_callback(&pcbstate, pstate, location);
432  CStringGetDatum(strVal(value)),
434  Int32GetDatum(-1));
436  typeid = BITOID;
437  typelen = -1;
438  typebyval = false;
439  break;
440 
441  case T_Null:
442  /* return a null const */
443  con = makeConst(UNKNOWNOID,
444  -1,
445  InvalidOid,
446  -2,
447  (Datum) 0,
448  true,
449  false);
450  con->location = location;
451  return con;
452 
453  default:
454  elog(ERROR, "unrecognized node type: %d", (int) nodeTag(value));
455  return NULL; /* keep compiler quiet */
456  }
457 
458  con = makeConst(typeid,
459  -1, /* typmod -1 is OK for all cases */
460  InvalidOid, /* all cases are uncollatable types */
461  typelen,
462  val,
463  false,
464  typebyval);
465  con->location = location;
466 
467  return con;
468 }
#define strVal(v)
Definition: value.h:54
unsigned int Oid
Definition: postgres_ext.h:31
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
Definition: makefuncs.c:299
signed int int32
Definition: c.h:417
void cancel_parser_errposition_callback(ParseCallbackState *pcbstate)
Definition: parse_node.c:161
#define ObjectIdGetDatum(X)
Definition: postgres.h:507
#define ERROR
Definition: elog.h:45
Datum bit_in(PG_FUNCTION_ARGS)
Definition: varbit.c:146
#define CStringGetDatum(X)
Definition: postgres.h:578
Datum numeric_in(PG_FUNCTION_ARGS)
Definition: numeric.c:621
Datum Int64GetDatum(int64 X)
Definition: fmgr.c:1700
void setup_parser_errposition_callback(ParseCallbackState *pcbstate, ParseState *pstate, int location)
Definition: parse_node.c:145
#define DirectFunctionCall3(func, arg1, arg2, arg3)
Definition: fmgr.h:630
int location
Definition: primnodes.h:221
uintptr_t Datum
Definition: postgres.h:367
#define InvalidOid
Definition: postgres_ext.h:36
#define FLOAT8PASSBYVAL
Definition: c.h:558
#define nodeTag(nodeptr)
Definition: nodes.h:533
Definition: nodes.h:293
Definition: nodes.h:290
#define Int32GetDatum(X)
Definition: postgres.h:479
#define intVal(v)
Definition: value.h:52
#define elog(elevel,...)
Definition: elog.h:228
long val
Definition: informix.c:664
bool scanint8(const char *str, bool errorOK, int64 *result)
Definition: int8.c:55

◆ make_parsestate()

ParseState* make_parsestate ( ParseState parentParseState)

Definition at line 44 of file parse_node.c.

References ParseState::p_coerce_param_hook, ParseState::p_next_resno, ParseState::p_paramref_hook, ParseState::p_post_columnref_hook, ParseState::p_pre_columnref_hook, ParseState::p_queryEnv, ParseState::p_ref_hook_state, ParseState::p_resolve_unknowns, ParseState::p_sourcetext, palloc0(), and ParseState::parentParseState.

Referenced by AddRelationNewConstraints(), AlterDomainDefault(), AlterPolicy(), ATExecAttachPartition(), ATPrepAlterColumnType(), convert_ANY_sublink_to_join(), copy_table(), CreatePolicy(), CreateTrigger(), DefineDomain(), DefineRelation(), domainAddConstraint(), ExplainExecuteQuery(), inline_function(), parse_analyze(), parse_analyze_varparams(), parse_sub_analyze(), pg_analyze_and_rewrite_params(), RemoveRoleFromObjectPolicy(), rewriteTargetView(), standard_ProcessUtility(), test_rls_hooks_permissive(), test_rls_hooks_restrictive(), transformAlterTableStmt(), transformCreateStmt(), transformIndexStmt(), transformInsertStmt(), transformPartitionSpec(), transformRuleStmt(), and UpdateRangeTableOfViewParse().

45 {
46  ParseState *pstate;
47 
48  pstate = palloc0(sizeof(ParseState));
49 
50  pstate->parentParseState = parentParseState;
51 
52  /* Fill in fields that don't start at null/false/zero */
53  pstate->p_next_resno = 1;
54  pstate->p_resolve_unknowns = true;
55 
56  if (parentParseState)
57  {
58  pstate->p_sourcetext = parentParseState->p_sourcetext;
59  /* all hooks are copied from parent */
60  pstate->p_pre_columnref_hook = parentParseState->p_pre_columnref_hook;
61  pstate->p_post_columnref_hook = parentParseState->p_post_columnref_hook;
62  pstate->p_paramref_hook = parentParseState->p_paramref_hook;
63  pstate->p_coerce_param_hook = parentParseState->p_coerce_param_hook;
64  pstate->p_ref_hook_state = parentParseState->p_ref_hook_state;
65  /* query environment stays in context for the whole parse analysis */
66  pstate->p_queryEnv = parentParseState->p_queryEnv;
67  }
68 
69  return pstate;
70 }
QueryEnvironment * p_queryEnv
Definition: parse_node.h:203
ParseState * parentParseState
Definition: parse_node.h:178
CoerceParamHook p_coerce_param_hook
Definition: parse_node.h:221
PostParseColumnRefHook p_post_columnref_hook
Definition: parse_node.h:219
bool p_resolve_unknowns
Definition: parse_node.h:200
ParseParamRefHook p_paramref_hook
Definition: parse_node.h:220
int p_next_resno
Definition: parse_node.h:195
const char * p_sourcetext
Definition: parse_node.h:179
void * palloc0(Size size)
Definition: mcxt.c:981
void * p_ref_hook_state
Definition: parse_node.h:222
PreParseColumnRefHook p_pre_columnref_hook
Definition: parse_node.h:218

◆ parser_errposition()

int parser_errposition ( ParseState pstate,
int  location 
)

Definition at line 111 of file parse_node.c.

References errposition(), ParseState::p_sourcetext, and pg_mbstrlen_with_len().

Referenced by addRangeTableEntryForCTE(), addRangeTableEntryForFunction(), AlterDatabase(), analyzeCTE(), analyzeCTETargetList(), array_subscript_transform(), assign_collations_walker(), assign_hypothetical_collations(), check_agg_arguments(), check_agg_arguments_walker(), check_agglevels_and_constraints(), check_lateral_ref_ok(), check_nested_generated_walker(), check_new_partition_bound(), check_parameter_resolution_walker(), check_srf_call_placement(), check_ungrouped_columns_walker(), checkExprIsVarFree(), checkInsertTargets(), checkTargetlistEntrySQL92(), checkWellFormedRecursion(), checkWellFormedRecursionWalker(), cluster(), coerce_to_boolean(), coerce_to_common_type(), coerce_to_specific_type_typmod(), colNameToVar(), compatible_oper(), compute_common_attribute(), compute_function_attributes(), ComputePartitionAttrs(), createdb(), CreateExtension(), CreateRole(), CreateTrigger(), DefineCollation(), DefineType(), DropDatabase(), errorMissingColumn(), errorMissingRTE(), EvaluateParams(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionStmt(), ExecReindex(), ExecVacuum(), ExpandAllTables(), ExpandColumnRefStar(), ExplainQuery(), finalize_grouping_exprs_walker(), findTargetlistEntrySQL92(), fixed_paramref_hook(), GetColumnDefCollation(), hstore_subscript_transform(), init_params(), LookupOperName(), LookupTypeNameExtended(), LookupTypeNameOid(), make_distinct_op(), make_op(), make_row_comparison_op(), make_row_distinct_op(), make_scalar_array_op(), merge_collation_state(), op_error(), parseCheckAggregates(), ParseFuncOrColumn(), parser_coercion_errposition(), parseTypeString(), pcb_error_callback(), plpgsql_post_column_ref(), ProcessCopyOptions(), resolve_column_ref(), resolve_unique_index_expr(), scanNameSpaceForRefname(), scanNameSpaceForRelid(), scanNSItemForColumn(), scanRTEForColumn(), select_common_collation(), select_common_type(), TopologicalSort(), transformAExprNullIf(), transformAggregateCall(), transformArrayExpr(), transformAssignedExpr(), transformAssignmentIndirection(), transformAssignmentSubscripts(), transformCaseExpr(), transformCoalesceExpr(), transformCollateClause(), transformColumnDefinition(), transformColumnRef(), transformColumnType(), transformConstraintAttrs(), transformContainerSubscripts(), transformDistinctClause(), transformDistinctOnClause(), transformExprRecurse(), transformFrameOffset(), transformFromClauseItem(), transformGroupingFunc(), transformGroupingSet(), transformIndexConstraint(), transformIndirection(), transformInsertRow(), transformInsertStmt(), transformLockingClause(), transformMultiAssignRef(), transformOnConflictArbiter(), transformParamRef(), transformPartitionBound(), transformPartitionBoundValue(), transformPLAssignStmt(), transformRangeFunction(), transformRangeTableFunc(), transformRangeTableSample(), transformReturningList(), transformSelectStmt(), transformSetOperationStmt(), transformSetOperationTree(), transformSubLink(), transformTableConstraint(), transformUpdateTargetList(), transformValuesClause(), transformWindowDefinitions(), transformWindowFuncCall(), transformWithClause(), transformXmlExpr(), transformXmlSerialize(), typenameType(), typenameTypeMod(), unknown_attribute(), validateInfiniteBounds(), variable_coerce_param_hook(), and variable_paramref_hook().

112 {
113  int pos;
114 
115  /* No-op if location was not provided */
116  if (location < 0)
117  return 0;
118  /* Can't do anything if source text is not available */
119  if (pstate == NULL || pstate->p_sourcetext == NULL)
120  return 0;
121  /* Convert offset to character number */
122  pos = pg_mbstrlen_with_len(pstate->p_sourcetext, location) + 1;
123  /* And pass it to the ereport mechanism */
124  return errposition(pos);
125 }
int pg_mbstrlen_with_len(const char *mbstr, int limit)
Definition: mbutils.c:941
const char * p_sourcetext
Definition: parse_node.h:179
int errposition(int cursorpos)
Definition: elog.c:1290

◆ setup_parser_errposition_callback()

void setup_parser_errposition_callback ( ParseCallbackState pcbstate,
ParseState pstate,
int  location 
)

Definition at line 145 of file parse_node.c.

References ErrorContextCallback::arg, ErrorContextCallback::callback, ParseCallbackState::errcallback, error_context_stack, ParseCallbackState::location, pcb_error_callback(), ErrorContextCallback::previous, and ParseCallbackState::pstate.

Referenced by addTargetToGroupList(), addTargetToSortList(), coerce_type(), LookupCollation(), LookupTypeNameExtended(), make_const(), make_oper_cache_key(), ParseFuncOrColumn(), parserOpenTable(), transformCreateStmt(), transformSetOperationTree(), transformTableLikeClause(), and typenameTypeMod().

147 {
148  /* Setup error traceback support for ereport() */
149  pcbstate->pstate = pstate;
150  pcbstate->location = location;
152  pcbstate->errcallback.arg = (void *) pcbstate;
154  error_context_stack = &pcbstate->errcallback;
155 }
ErrorContextCallback errcallback
Definition: parse_node.h:304
void(* callback)(void *arg)
Definition: elog.h:243
struct ErrorContextCallback * previous
Definition: elog.h:242
ErrorContextCallback * error_context_stack
Definition: elog.c:93
ParseState * pstate
Definition: parse_node.h:302
static void pcb_error_callback(void *arg)
Definition: parse_node.c:175

◆ transformContainerSubscripts()

SubscriptingRef* transformContainerSubscripts ( ParseState pstate,
Node containerBase,
Oid  containerType,
int32  containerTypMod,
List indirection,
bool  isAssignment 
)

Definition at line 248 of file parse_node.c.

References ereport, errcode(), errmsg(), ERROR, exprLocation(), format_type_be(), getSubscriptingRoutines(), idx(), A_Indices::is_slice, lfirst_node, makeNode, OidIsValid, parser_errposition(), SubscriptingRef::refassgnexpr, SubscriptingRef::refcontainertype, SubscriptingRef::refelemtype, SubscriptingRef::refexpr, SubscriptingRef::refrestype, SubscriptingRef::reftypmod, SubscriptRoutines::transform, and transformContainerType().

Referenced by transformAssignmentSubscripts(), and transformIndirection().

254 {
255  SubscriptingRef *sbsref;
256  const SubscriptRoutines *sbsroutines;
257  Oid elementType;
258  bool isSlice = false;
259  ListCell *idx;
260 
261  /*
262  * Determine the actual container type, smashing any domain. In the
263  * assignment case the caller already did this, since it also needs to
264  * know the actual container type.
265  */
266  if (!isAssignment)
267  transformContainerType(&containerType, &containerTypMod);
268 
269  /*
270  * Verify that the container type is subscriptable, and get its support
271  * functions and typelem.
272  */
273  sbsroutines = getSubscriptingRoutines(containerType, &elementType);
274  if (!sbsroutines)
275  ereport(ERROR,
276  (errcode(ERRCODE_DATATYPE_MISMATCH),
277  errmsg("cannot subscript type %s because it does not support subscripting",
278  format_type_be(containerType)),
279  parser_errposition(pstate, exprLocation(containerBase))));
280 
281  /*
282  * Detect whether any of the indirection items are slice specifiers.
283  *
284  * A list containing only simple subscripts refers to a single container
285  * element. If any of the items are slice specifiers (lower:upper), then
286  * the subscript expression means a container slice operation.
287  */
288  foreach(idx, indirection)
289  {
290  A_Indices *ai = lfirst_node(A_Indices, idx);
291 
292  if (ai->is_slice)
293  {
294  isSlice = true;
295  break;
296  }
297  }
298 
299  /*
300  * Ready to build the SubscriptingRef node.
301  */
302  sbsref = makeNode(SubscriptingRef);
303 
304  sbsref->refcontainertype = containerType;
305  sbsref->refelemtype = elementType;
306  /* refrestype is to be set by container-specific logic */
307  sbsref->reftypmod = containerTypMod;
308  /* refcollid will be set by parse_collate.c */
309  /* refupperindexpr, reflowerindexpr are to be set by container logic */
310  sbsref->refexpr = (Expr *) containerBase;
311  sbsref->refassgnexpr = NULL; /* caller will fill if it's an assignment */
312 
313  /*
314  * Call the container-type-specific logic to transform the subscripts and
315  * determine the subscripting result type.
316  */
317  sbsroutines->transform(sbsref, indirection, pstate,
318  isSlice, isAssignment);
319 
320  /*
321  * Verify we got a valid type (this defends, for example, against someone
322  * using array_subscript_handler as typsubscript without setting typelem).
323  */
324  if (!OidIsValid(sbsref->refrestype))
325  ereport(ERROR,
326  (errcode(ERRCODE_DATATYPE_MISMATCH),
327  errmsg("cannot subscript type %s because it does not support subscripting",
328  format_type_be(containerType))));
329 
330  return sbsref;
331 }
int exprLocation(const Node *expr)
Definition: nodeFuncs.c:1231
int errcode(int sqlerrcode)
Definition: elog.c:704
char * format_type_be(Oid type_oid)
Definition: format_type.c:339
Datum idx(PG_FUNCTION_ARGS)
Definition: _int_op.c:259
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:698
const struct SubscriptRoutines * getSubscriptingRoutines(Oid typid, Oid *typelemp)
Definition: lsyscache.c:3050
bool is_slice
Definition: parsenodes.h:383
#define ERROR
Definition: elog.h:45
#define lfirst_node(type, lc)
Definition: pg_list.h:172
void transformContainerType(Oid *containerType, int32 *containerTypmod)
Definition: parse_node.c:194
#define ereport(elevel,...)
Definition: elog.h:155
#define makeNode(_type_)
Definition: nodes.h:576
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:111
Expr * refassgnexpr
Definition: primnodes.h:446
int errmsg(const char *fmt,...)
Definition: elog.c:915
SubscriptTransform transform
Definition: subscripting.h:160
Oid refcontainertype
Definition: primnodes.h:434
Expr * refexpr
Definition: primnodes.h:444

◆ transformContainerType()

void transformContainerType ( Oid containerType,
int32 containerTypmod 
)

Definition at line 194 of file parse_node.c.

References getBaseTypeAndTypmod().

Referenced by transformAssignmentSubscripts(), and transformContainerSubscripts().

195 {
196  /*
197  * If the input is a domain, smash to base type, and extract the actual
198  * typmod to be applied to the base type. Subscripting a domain is an
199  * operation that necessarily works on the base container type, not the
200  * domain itself. (Note that we provide no method whereby the creator of a
201  * domain over a container type could hide its ability to be subscripted.)
202  */
203  *containerType = getBaseTypeAndTypmod(*containerType, containerTypmod);
204 
205  /*
206  * We treat int2vector and oidvector as though they were domains over
207  * int2[] and oid[]. This is needed because array slicing could create an
208  * array that doesn't satisfy the dimensionality constraints of the
209  * xxxvector type; so we want the result of a slice operation to be
210  * considered to be of the more general type.
211  */
212  if (*containerType == INT2VECTOROID)
213  *containerType = INT2ARRAYOID;
214  else if (*containerType == OIDVECTOROID)
215  *containerType = OIDARRAYOID;
216 }
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
Definition: lsyscache.c:2458