/* ------------------------------------------------------------------------- * * analyze.h * parse analysis for optimizable statements * * * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/analyze.h * * ------------------------------------------------------------------------- */ #ifndef ANALYZE_H #define ANALYZE_H #include "parser/parse_node.h" #include "utils/plancache.h" /* Hook for plugins to get control at end of parse analysis */ typedef void (*post_parse_analyze_hook_type)(ParseState* pstate, Query* query); extern THR_LOCAL PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook; extern Query* parse_analyze(Node* parseTree, const char* sourceText, Oid* paramTypes, int numParams, bool isFirstNode = true, bool isCreateView = false); extern Query* parse_analyze_varparams(Node* parseTree, const char* sourceText, Oid** paramTypes, int* numParams, char** paramTypeNames); extern Query* parse_sub_analyze(Node* parseTree, ParseState* parentParseState, CommonTableExpr* parentCTE, bool locked_from_parent, bool resolve_unknowns); extern List* transformInsertRow(ParseState* pstate, List* exprlist, List* stmtcols, List* icolumns, List* attrnos); extern Query* transformTopLevelStmt( ParseState* pstate, Node* parseTree, bool isFirstNode = true, bool isCreateView = false); extern Query* transformStmt(ParseState* pstate, Node* parseTree, bool isFirstNode = true, bool isCreateView = false); extern bool analyze_requires_snapshot(Node* parseTree); extern void CheckSelectLocking(Query* qry); extern void applyLockingClause(Query* qry, Index rtindex, bool forUpdate, bool noWait, bool pushedDown); extern void CheckTablesStorageEngine(Query* qry, StorageEngineType* type); extern bool IsMMIndexedColumnUpdate(Query* qry); /* Record the rel name and corresponding columan name info */ typedef struct RelColumnInfo { char* relname; List* colnames; } RelColumnInfo; typedef struct PlusJoinRTEItem { RangeTblEntry* rte; /* The RTE that the column referennce */ bool hasplus; /* Does the Expr contains ''(+)" ? */ } PlusJoinRTEItem; typedef struct OperatorPlusProcessContext { List* jointerms; /* List of Jointerm */ bool contain_plus_outerjoin; ParseState* ps; /* ParseState of Current level */ Node** whereClause; bool in_orclause; bool contain_joinExpr; } OperatorPlusProcessContext; typedef struct RTEDetectorContext { bool isMotTable; bool isPageTable; List* queryNodes; int sublevels_up; } RTEDetectorContext; extern void transformOperatorPlus(ParseState* pstate, Node** whereClause); extern bool IsColumnRefPlusOuterJoin(const ColumnRef* cf); extern PlusJoinRTEItem* makePlusJoinRTEItem(RangeTblEntry* rte, bool hasplus); extern void setIgnorePlusFlag(ParseState* pstate, bool ignore); extern void resetOperatorPlusFlag(); extern bool getOperatorPlusFlag(); extern void fixResTargetNameWithTableNameRef(Relation rd, RangeVar* rel, ResTarget* res); extern void fixResTargetListWithTableNameRef(Relation rd, RangeVar* rel, List* clause_list); #endif /* ANALYZE_H */