104 lines
5.7 KiB
C
104 lines
5.7 KiB
C
/* -------------------------------------------------------------------------
|
|
*
|
|
* parse_utilcmd.h
|
|
* parse analysis for utility commands
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
|
|
*
|
|
* Portions Copyright (c) 2021, openGauss Contributors
|
|
* src/include/parser/parse_utilcmd.h
|
|
*
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PARSE_UTILCMD_H
|
|
#define PARSE_UTILCMD_H
|
|
|
|
#include "parser/parse_node.h"
|
|
|
|
/* State shared by transformCreateStmt and its subroutines */
|
|
typedef struct {
|
|
ParseState* pstate; /* overall parser state */
|
|
const char* stmtType; /* "CREATE [FOREIGN] TABLE" or "ALTER TABLE" */
|
|
RangeVar* relation; /* relation to create */
|
|
Relation rel; /* opened/locked rel, if ALTER */
|
|
List* inhRelations; /* relations to inherit from */
|
|
bool isalter; /* true if altering existing table */
|
|
bool ispartitioned; /* true if it is for a partitioned table */
|
|
bool hasoids; /* does relation have an OID column? */
|
|
bool canInfomationalConstraint; /* If the value id true, it means that we can build informational constraint. */
|
|
List* columns; /* ColumnDef items */
|
|
List* ckconstraints; /* CHECK constraints */
|
|
List* clusterConstraints; /* PARTIAL CLUSTER KEY constraints */
|
|
List* fkconstraints; /* FOREIGN KEY constraints */
|
|
List* ixconstraints; /* index-creating constraints */
|
|
List* inh_indexes; /* cloned indexes from INCLUDING INDEXES */
|
|
List* blist; /* "before list" of things to do before creating the table */
|
|
List* alist; /* "after list" of things to do after creating the table */
|
|
PartitionState* csc_partTableState;
|
|
List* reloptions;
|
|
List* partitionKey; /* partitionkey for partiitoned table */
|
|
List* subPartitionKey; /* subpartitionkey for subpartiitoned table */
|
|
IndexStmt* pkey; /* PRIMARY KEY index, if any */
|
|
#ifdef PGXC
|
|
List* fallback_dist_col; /* suggested column to distribute on */
|
|
DistributeBy* distributeby; /* original distribute by column of CREATE TABLE */
|
|
PGXCSubCluster* subcluster; /* original subcluster option of CREATE TABLE */
|
|
#endif
|
|
Node* node; /* @hdfs record a CreateStmt or AlterTableStmt object. */
|
|
char* internalData;
|
|
List* uuids; /* used for create sequence */
|
|
bool isResizing; /* true if the table is resizing */
|
|
bool ofType; /* true if statement contains OF typename */
|
|
Oid rel_coll_id; /* relation collation oid */
|
|
} CreateStmtContext;
|
|
|
|
typedef enum TransformTableType { TRANSFORM_INVALID = 0, TRANSFORM_TO_HASHBUCKET, TRANSFORM_TO_NONHASHBUCKET} TransformTableType;
|
|
|
|
extern void checkPartitionSynax(CreateStmt *stmt);
|
|
extern Oid fill_relation_collation(const char* collate, int charset, List** options,
|
|
Oid nsp_coll_oid = InvalidOid);
|
|
extern List* transformCreateStmt(CreateStmt* stmt, const char* queryString, const List* uuids,
|
|
bool preCheck, Oid *namespaceid, bool isFirstNode = true);
|
|
extern List* transformAlterTableStmt(Oid relid, AlterTableStmt* stmt, const char* queryString);
|
|
extern IndexStmt* transformIndexStmt(Oid relid, IndexStmt* stmt, const char* queryString);
|
|
extern void transformRuleStmt(RuleStmt* stmt, const char* queryString, List** actions, Node** whereClause);
|
|
extern List* transformCreateSchemaStmt(CreateSchemaStmt* stmt);
|
|
extern void transformPartitionValue(ParseState* pstate, Node* rangePartDef, bool needCheck);
|
|
extern List* transformListPartitionValue(ParseState* pstate, List* boundary, bool needCheck, bool needFree);
|
|
extern List* transformRangePartitionValueInternal(ParseState* pstate, List* boundary,
|
|
bool needCheck, bool needFree, bool isPartition = true);
|
|
extern Node* transformIntoConst(ParseState* pstate, ParseExprKind exprKind, Node* maxElem, bool isPartition = true);
|
|
|
|
#ifdef PGXC
|
|
extern bool CheckLocalIndexColumn(char loctype, char* partcolname, char* indexcolname);
|
|
#endif
|
|
extern Oid generateClonedIndex(Relation source_idx, Relation source_relation, char* tempIndexName, Oid targetTblspcOid,
|
|
bool skip_build, bool partitionedIndex);
|
|
extern void checkPartitionName(List* partitionList, bool isPartition = true);
|
|
extern void checkSubPartitionName(List* partitionList);
|
|
extern List* GetPartitionNameList(List* partitionList);
|
|
extern char* GetPartitionDefStateName(Node *partitionDefState);
|
|
extern NodeTag GetPartitionStateType(char type);
|
|
|
|
extern Oid searchSeqidFromExpr(Node* cooked_default);
|
|
extern bool is_start_end_def_list(List* def_list);
|
|
extern void get_range_partition_name_prefix(char* namePrefix, char* srcName, bool printNotice, bool isPartition);
|
|
extern List* transformRangePartStartEndStmt(ParseState* pstate, List* partitionList, List* pos,
|
|
FormData_pg_attribute* attrs, int32 existPartNum, Const* lowBound, Const* upBound, bool needFree,
|
|
bool isPartition = true);
|
|
extern bool check_contains_tbllike_in_multi_nodegroup(CreateStmt* stmt);
|
|
extern bool is_multi_nodegroup_createtbllike(PGXCSubCluster* subcluster, Oid oid);
|
|
extern char* getTmptableIndexName(const char* srcSchema, const char* srcIndex);
|
|
|
|
extern IndexStmt* generateClonedIndexStmt(
|
|
CreateStmtContext* cxt, Relation source_idx, const AttrNumber* attmap, int attmap_length, Relation rel,
|
|
TransformTableType transformType);
|
|
extern Oid transform_default_collation(const char* collate, int charset, Oid def_coll_oid = InvalidOid,
|
|
bool is_attr = false);
|
|
extern Oid check_collation_by_charset(const char* collate, int charset);
|
|
|
|
#endif /* PARSE_UTILCMD_H */
|