/* Forward references for some structs declared below */ typedefstruct ParseState ParseState; typedefstruct ParseNamespaceItem ParseNamespaceItem; typedefstruct ParseNamespaceColumn ParseNamespaceColumn;
/* *ExpressionkindsdistinguishedbytransformExpr().Manyofthesearenot *semanticallydistinctsofarasexpressiontransformationgoes;rather, *wedistinguishthemsothatcontext-specificerrormessagescanbeprinted. * *Note:EXPR_KIND_OTHERisnotusedinthecorecode,butisleftforuse *byextensioncodethatmightneedtocalltransformExpr().Thecorecode *willnotenforceanycontext-drivenrestrictionsonEXPR_KIND_OTHER *expressions,sothecallerwouldhavetocheckforsub-selects,aggregates, *windowfunctions,SRFs,etcifthoseneedtobedisallowed.
*/ typedefenum ParseExprKind
{
EXPR_KIND_NONE = 0, /* "not in an expression" */
EXPR_KIND_OTHER, /* reserved for extensions */
EXPR_KIND_JOIN_ON, /* JOIN ON */
EXPR_KIND_JOIN_USING, /* JOIN USING */
EXPR_KIND_FROM_SUBSELECT, /* sub-SELECT in FROM clause */
EXPR_KIND_FROM_FUNCTION, /* function in FROM clause */
EXPR_KIND_WHERE, /* WHERE */
EXPR_KIND_HAVING, /* HAVING */
EXPR_KIND_FILTER, /* FILTER */
EXPR_KIND_WINDOW_PARTITION, /* window definition PARTITION BY */
EXPR_KIND_WINDOW_ORDER, /* window definition ORDER BY */
EXPR_KIND_WINDOW_FRAME_RANGE, /* window frame clause with RANGE */
EXPR_KIND_WINDOW_FRAME_ROWS, /* window frame clause with ROWS */
EXPR_KIND_WINDOW_FRAME_GROUPS, /* window frame clause with GROUPS */
EXPR_KIND_SELECT_TARGET, /* SELECT target list item */
EXPR_KIND_INSERT_TARGET, /* INSERT target list item */
EXPR_KIND_UPDATE_SOURCE, /* UPDATE assignment source item */
EXPR_KIND_UPDATE_TARGET, /* UPDATE assignment target item */
EXPR_KIND_MERGE_WHEN, /* MERGE WHEN [NOT] MATCHED condition */
EXPR_KIND_GROUP_BY, /* GROUP BY */
EXPR_KIND_ORDER_BY, /* ORDER BY */
EXPR_KIND_DISTINCT_ON, /* DISTINCT ON */
EXPR_KIND_LIMIT, /* LIMIT */
EXPR_KIND_OFFSET, /* OFFSET */
EXPR_KIND_RETURNING, /* RETURNING in INSERT/UPDATE/DELETE */
EXPR_KIND_MERGE_RETURNING, /* RETURNING in MERGE */
EXPR_KIND_VALUES, /* VALUES */
EXPR_KIND_VALUES_SINGLE, /* single-row VALUES (in INSERT only) */
EXPR_KIND_CHECK_CONSTRAINT, /* CHECK constraint for a table */
EXPR_KIND_DOMAIN_CHECK, /* CHECK constraint for a domain */
EXPR_KIND_COLUMN_DEFAULT, /* default value for a table column */
EXPR_KIND_FUNCTION_DEFAULT, /* default parameter value for function */
EXPR_KIND_INDEX_EXPRESSION, /* index expression */
EXPR_KIND_INDEX_PREDICATE, /* index predicate */
EXPR_KIND_STATS_EXPRESSION, /* extended statistics expression */
EXPR_KIND_ALTER_COL_TRANSFORM, /* transform expr in ALTER COLUMN TYPE */
EXPR_KIND_EXECUTE_PARAMETER, /* parameter value in EXECUTE */
EXPR_KIND_TRIGGER_WHEN, /* WHEN condition in CREATE TRIGGER */
EXPR_KIND_POLICY, /* USING or WITH CHECK expr in policy */
EXPR_KIND_PARTITION_BOUND, /* partition bound expression */
EXPR_KIND_PARTITION_EXPRESSION, /* PARTITION BY expression */
EXPR_KIND_CALL_ARGUMENT, /* procedure argument in CALL */
EXPR_KIND_COPY_WHERE, /* WHERE condition in COPY FROM */
EXPR_KIND_GENERATED_COLUMN, /* generation expression for a column */
EXPR_KIND_CYCLE_MARK, /* cycle mark value */
} ParseExprKind;
/* Flags telling about things found in the query: */ bool p_hasAggs; bool p_hasWindowFuncs; bool p_hasTargetSRFs; bool p_hasSubLinks; bool p_hasModifyingCTE;
Node *p_last_srf; /* most recent set-returning func/op found */
/* *Optionalhookfunctionsforparsercallbacks.Thesearenullunless *setupbythecallerofmake_parsestate.
*/
PreParseColumnRefHook p_pre_columnref_hook;
PostParseColumnRefHook p_post_columnref_hook;
ParseParamRefHook p_paramref_hook;
CoerceParamHook p_coerce_param_hook; void *p_ref_hook_state; /* common passthrough link for above */
};
/* *Anelementofanamespacelist. * *p_namescontainsthetablenameandcolumnnamesexposedbythisnsitem. *(Typicallyit'sequaltop_rte->eref,butforaJOINUSINGaliasit's *equaltop_rte->join_using_alias.SincetheUSINGcolumnswillbethe *join'sfirstNcolumns,theneteffectisjustthatweexposeonlythose *joincolumnsviathisnsitem.) * *p_rteandp_rtindexlinktotheunderlyingrangetableentry,and *p_perminfototheentryinrteperminfos. * *Thep_nscolumnsarraycontainsinfoshowinghowtoconstructVars *referencingthenamesappearinginthep_names->colnameslist. * *Namespaceitemswithp_rel_visiblesetdefinewhichRTEsareaccessibleby *qualifiednames,whilethosewithp_cols_visiblesetdefinewhichRTEsare *accessiblebyunqualifiednames.ThesesetsaredifferentbecauseaJOIN *withoutanaliasdoesnothidethecontainedtables(sotheymustbe *visibleforqualifiedreferences)butitdoeshidetheircolumns *(unqualifiedreferencestothecolumnsrefertotheJOIN,notthemember *tables,sowemustnotcomplainthatsuchareferenceisambiguous). *Conversely,asubquerywithoutanaliasdoesnothidethecolumnsselected *bythesubquery,butitdoeshidetheauto-generatedrelationname(sothe *subquerycolumnsarevisibleforunqualifiedreferencesonly).Various *specialRTEssuchasNEW/OLDforrulesmayalsoappearwithonlyoneflag *set. * *WhileprocessingtheFROMclause,namespaceitemsmayappearwith *p_lateral_onlyset,meaningtheyarevisibleonlytoLATERAL *subexpressions.(Thepstate'sp_lateral_activeflagtellswhetherweare *insidesuchasubexpressionatthemoment.)Ifp_lateral_okisnotset, *it'sanerrortoactuallyusesuchanamespaceitem.Onemightthinkit *wouldbebettertojustexcludesuchitemsfromvisibility,butthewording *ofSQL:2008requiresustodoitthisway.Wealsousep_lateral_okto *forbidLATERALreferencestoanUPDATE/DELETEtargettable. * *WhileprocessingtheRETURNINGclause,specialnamespaceitemsareaddedto *refertotheOLDandNEWstateoftheresultrelation.Thesenamespace *itemshavep_returning_typesetappropriately,forusewhencreatingVars. *Forconvenience,thisinformationisduplicatedoneachnamespacecolumn. * *Atnotimeshouldanamespacelistcontaintwoentriesthatconflict *accordingtotherulesincheckNameSpaceConflicts;butnotethatthose *aremorecomplicatedthan"musthavedifferentaliasnames",soinpractice *codesearchinganamespacelisthastocheckforambiguousreferences.
*/ struct ParseNamespaceItem
{
Alias *p_names; /* Table and column names */
RangeTblEntry *p_rte; /* The relation's rangetable entry */ int p_rtindex; /* The relation's index in the rangetable */
RTEPermissionInfo *p_perminfo; /* The relation's rteperminfos entry */ /* array of same length as p_names->colnames: */
ParseNamespaceColumn *p_nscolumns; /* per-column data */ bool p_rel_visible; /* Relation name is visible? */ bool p_cols_visible; /* Column names visible as unqualified refs? */ bool p_lateral_only; /* Is only visible to LATERAL expressions? */ bool p_lateral_ok; /* If so, does join type allow use? */
VarReturningType p_returning_type; /* Is OLD/NEW for use in RETURNING? */
};
/* *DataaboutonecolumnofaParseNamespaceItem. * *WetracktheinfoneededtoconstructaVarreferencingthecolumn *(butonlyforuser-definedcolumns;systemcolumnreferencesand *whole-rowreferencesarehandledseparately). * *p_varnoandp_varattnoidentifythesemanticreferent,whichisa *base-relationcolumnunlessthereferenceistoajoinUSINGcolumnthat *isn'tsemanticallyequivalenttoeitherjoininputcolumn(becauseitisa *FULLjoinortheinputcolumnrequiresatypecoercion).Inthosecases *p_varnoandp_varattnorefertotheJOINRTE. * *p_varnosynandp_varattnosynareeitheridenticaltop_varno/p_varattno, *ortheyspecifythecolumn'spositioninanaliasedJOINRTEthathides *thesemanticreferentRTE'srefname.(ThatcouldbeeithertheJOINRTE *inwhichthisParseNamespaceColumnentryexists,orsomelowerjoinlevel.) * *IfanRTEcontainsadroppedcolumn,itsParseNamespaceColumnstruct *isall-zeroes.(Conventionally,testforp_varno==0todetectthis.)
*/ struct ParseNamespaceColumn
{
Index p_varno; /* rangetable index */
AttrNumber p_varattno; /* attribute number of the column */
Oid p_vartype; /* pg_type OID */
int32 p_vartypmod; /* type modifier value */
Oid p_varcollid; /* OID of collation, or InvalidOid */
VarReturningType p_varreturningtype; /* for RETURNING OLD/NEW */
Index p_varnosyn; /* rangetable index of syntactic referent */
AttrNumber p_varattnosyn; /* attribute number of syntactic referent */ bool p_dontexpand; /* not included in star expansion */
};
/* Support for parser_errposition_callback function */ typedefstruct ParseCallbackState
{
ParseState *pstate; int location;
ErrorContextCallback errcallback;
} ParseCallbackState;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.