📄 copyfuncs.c
字号:
/* ---------------- * copy remainder of node * ---------------- */ Node_Copy(from, newnode, path_hashclauses); Node_Copy(from, newnode, outerhashkeys); Node_Copy(from, newnode, innerhashkeys); return newnode;}/* ---------------- * _copyOrderKey * ---------------- */static OrderKey *_copyOrderKey(OrderKey *from){ OrderKey *newnode = makeNode(OrderKey); /* ---------------- * copy remainder of node * ---------------- */ newnode->attribute_number = from->attribute_number; newnode->array_index = from->array_index; return newnode;}/* ---------------- * _copyJoinKey * ---------------- */static JoinKey *_copyJoinKey(JoinKey *from){ JoinKey *newnode = makeNode(JoinKey); /* ---------------- * copy remainder of node * ---------------- */ Node_Copy(from, newnode, outer); Node_Copy(from, newnode, inner); return newnode;}/* ---------------- * _copyMergeOrder * ---------------- */static MergeOrder *_copyMergeOrder(MergeOrder *from){ MergeOrder *newnode = makeNode(MergeOrder); /* ---------------- * copy remainder of node * ---------------- */ newnode->join_operator = from->join_operator; newnode->left_operator = from->left_operator; newnode->right_operator = from->right_operator; newnode->left_type = from->left_type; newnode->right_type = from->right_type; return newnode;}/* ---------------- * _copyRestrictInfo * ---------------- */static RestrictInfo *_copyRestrictInfo(RestrictInfo *from){ RestrictInfo *newnode = makeNode(RestrictInfo); /* ---------------- * copy remainder of node * ---------------- */ Node_Copy(from, newnode, clause); newnode->selectivity = from->selectivity; newnode->notclause = from->notclause; Node_Copy(from, newnode, indexids); Node_Copy(from, newnode, mergejoinorder); newnode->hashjoinoperator = from->hashjoinoperator; newnode->restrictinfojoinid = listCopy(from->restrictinfojoinid); return newnode;}/* ---------------- * CopyJoinMethodFields * * This function copies the fields of the JoinMethod node. It is used by * all the copy functions for classes which inherit from JoinMethod. * ---------------- */static voidCopyJoinMethodFields(JoinMethod *from, JoinMethod *newnode){ Node_Copy(from, newnode, jmkeys); Node_Copy(from, newnode, clauses); return;}/* ---------------- * _copyJoinMethod * ---------------- */static JoinMethod *_copyJoinMethod(JoinMethod *from){ JoinMethod *newnode = makeNode(JoinMethod); CopyJoinMethodFields(from, newnode); return newnode;}/* ---------------- * _copyHashInfo * ---------------- */static HashInfo *_copyHashInfo(HashInfo *from){ HashInfo *newnode = makeNode(HashInfo); /* ---------------- * copy remainder of node * ---------------- */ CopyJoinMethodFields((JoinMethod *) from, (JoinMethod *) newnode); newnode->hashop = from->hashop; return newnode;}/* ---------------- * _copyMergeInfo * ---------------- */static MergeInfo *_copyMergeInfo(MergeInfo *from){ MergeInfo *newnode = makeNode(MergeInfo); /* ---------------- * copy remainder of node * ---------------- */ CopyJoinMethodFields((JoinMethod *) from, (JoinMethod *) newnode); Node_Copy(from, newnode, m_ordering); return newnode;}/* ---------------- * _copyJoinInfo * ---------------- */static JoinInfo *_copyJoinInfo(JoinInfo *from){ JoinInfo *newnode = makeNode(JoinInfo); /* ---------------- * copy remainder of node * ---------------- */ newnode->unjoined_relids = listCopy(from->unjoined_relids); Node_Copy(from, newnode, jinfo_restrictinfo); newnode->mergejoinable = from->mergejoinable; newnode->hashjoinable = from->hashjoinable; return newnode;}static Iter *_copyIter(Iter *from){ Iter *newnode = makeNode(Iter); Node_Copy(from, newnode, iterexpr); newnode->itertype = from->itertype; return newnode;}static Stream *_copyStream(Stream *from){ Stream *newnode = makeNode(Stream); newnode->pathptr = from->pathptr; newnode->cinfo = from->cinfo; newnode->clausetype = from->clausetype; newnode->upstream = (StreamPtr) NULL; /* only copy nodes * downwards! */ Node_Copy(from, newnode, downstream); if (newnode->downstream) ((Stream *) newnode->downstream)->upstream = (Stream *) newnode; newnode->groupup = from->groupup; newnode->groupcost = from->groupcost; newnode->groupsel = from->groupsel; return newnode;}/* * parsenodes.h routines have no copy functions */static TargetEntry *_copyTargetEntry(TargetEntry *from){ TargetEntry *newnode = makeNode(TargetEntry); Node_Copy(from, newnode, resdom); Node_Copy(from, newnode, fjoin); Node_Copy(from, newnode, expr); return newnode;}static RangeTblEntry *_copyRangeTblEntry(RangeTblEntry *from){ RangeTblEntry *newnode = makeNode(RangeTblEntry); if (from->relname) newnode->relname = pstrdup(from->relname); if (from->refname) newnode->refname = pstrdup(from->refname); newnode->relid = from->relid; newnode->inh = from->inh; newnode->inFromCl = from->inFromCl; newnode->skipAcl = from->skipAcl; return newnode;}static RowMark *_copyRowMark(RowMark *from){ RowMark *newnode = makeNode(RowMark); newnode->rti = from->rti; newnode->info = from->info; return newnode;}static SortClause *_copySortClause(SortClause *from){ SortClause *newnode = makeNode(SortClause); Node_Copy(from, newnode, resdom); newnode->opoid = from->opoid; return newnode;}static A_Const *_copyAConst(A_Const *from){ A_Const *newnode = makeNode(A_Const); newnode->val = *((Value *) (copyObject(&(from->val)))); Node_Copy(from, newnode, typename); return newnode;}static TypeName *_copyTypeName(TypeName *from){ TypeName *newnode = makeNode(TypeName); if (from->name) newnode->name = pstrdup(from->name); newnode->timezone = from->timezone; newnode->setof = from->setof; newnode->typmod = from->typmod; Node_Copy(from, newnode, arrayBounds); return newnode;}static Query *_copyQuery(Query *from){ Query *newnode = makeNode(Query); newnode->commandType = from->commandType; if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt) { NotifyStmt *from_notify = (NotifyStmt *) from->utilityStmt; NotifyStmt *n = makeNode(NotifyStmt); n->relname = pstrdup(from_notify->relname); newnode->utilityStmt = (Node *) n; } newnode->resultRelation = from->resultRelation; if (from->into) newnode->into = pstrdup(from->into); newnode->isPortal = from->isPortal; newnode->isBinary = from->isBinary; newnode->isTemp = from->isTemp; newnode->unionall = from->unionall; if (from->uniqueFlag) newnode->uniqueFlag = pstrdup(from->uniqueFlag); Node_Copy(from, newnode, sortClause); Node_Copy(from, newnode, rtable); Node_Copy(from, newnode, targetList); Node_Copy(from, newnode, qual); Node_Copy(from, newnode, groupClause); Node_Copy(from, newnode, havingQual); newnode->hasAggs = from->hasAggs; newnode->hasSubLinks = from->hasSubLinks; if (from->unionClause) { List *ulist, *temp_list = NIL; foreach(ulist, from->unionClause) temp_list = lappend(temp_list, copyObject(lfirst(ulist))); newnode->unionClause = temp_list; } Node_Copy(from, newnode, limitOffset); Node_Copy(from, newnode, limitCount); Node_Copy(from, newnode, rowMark); return newnode;}/* * mnodes.h routines have no copy functions *//* **************************************************************** * pg_list.h copy functions * **************************************************************** */static Value *_copyValue(Value *from){ Value *newnode = makeNode(Value); newnode->type = from->type; switch (from->type) { case T_String: newnode->val.str = pstrdup(from->val.str); break; case T_Integer: newnode->val.ival = from->val.ival; break; case T_Float: newnode->val.dval = from->val.dval; break; default: break; } return newnode;}/* ---------------- * copyObject returns a copy of the node or list. If it is a list, it * recursively copies its items. * ---------------- */void *copyObject(void *from){ void *retval; if (from == NULL) return NULL; switch (nodeTag(from)) { /* * PLAN NODES */ case T_Plan: retval = _copyPlan(from); break; case T_Result: retval = _copyResult(from); break; case T_Append: retval = _copyAppend(from); break; case T_Scan: retval = _copyScan(from); break; case T_SeqScan: retval = _copySeqScan(from); break; case T_IndexScan: retval = _copyIndexScan(from); break; case T_Join: retval = _copyJoin(from); break; case T_NestLoop: retval = _copyNestLoop(from); break; case T_MergeJoin: retval = _copyMergeJoin(from); break; case T_HashJoin: retval = _copyHashJoin(from); break; case T_Noname: retval = _copyNoname(from); break; case T_Material: retval = _copyMaterial(from); break; case T_Sort: retval = _copySort(from); break; case T_Group: retval = _copyGroup(from); break; case T_Agg: retval = _copyAgg(from); break; case T_GroupClause: retval = _copyGroupClause(from); break; case T_Unique: retval = _copyUnique(from); break; case T_Hash: retval = _copyHash(from); break; case T_SubPlan: retval = _copySubPlan(from); break; /* * PRIMITIVE NODES */ case T_Resdom: retval = _copyResdom(from); break; case T_Fjoin: retval = _copyFjoin(from); break; case T_Expr: retval = _copyExpr(from); break; case T_Var: retval = _copyVar(from); break; case T_Oper: retval = _copyOper(from); break; case T_Const: retval = _copyConst(from); break; case T_Param: retval = _copyParam(from); break; case T_Func: retval = _copyFunc(from); break; case T_Array: retval = _copyArray(from); break; case T_ArrayRef: retval = _copyArrayRef(from); break; case T_Aggref: retval = _copyAggref(from); break; case T_SubLink: retval = _copySubLink(from); break; case T_CaseExpr: retval = _copyCaseExpr(from); break; case T_CaseWhen: retval = _copyCaseWhen(from); break; /* * RELATION NODES */ case T_RelOptInfo: retval = _copyRelOptInfo(from); break; case T_Path: retval = _copyPath(from); break; case T_IndexPath: retval = _copyIndexPath(from); break; case T_NestPath: retval = _copyNestPath(from); break; case T_MergePath: retval = _copyMergePath(from); break; case T_HashPath: retval = _copyHashPath(from); break; case T_OrderKey: retval = _copyOrderKey(from); break; case T_JoinKey: retval = _copyJoinKey(from); break; case T_MergeOrder: retval = _copyMergeOrder(from); break; case T_RestrictInfo: retval = _copyRestrictInfo(from); break; case T_JoinMethod: retval = _copyJoinMethod(from); break; case T_HashInfo: retval = _copyHashInfo(from); break; case T_MergeInfo: retval = _copyMergeInfo(from); break; case T_JoinInfo: retval = _copyJoinInfo(from); break; case T_Iter: retval = _copyIter(from); break; case T_Stream: retval = _copyStream(from); break; /* * PARSE NODES */ case T_Query: retval = _copyQuery(from); break; case T_TargetEntry: retval = _copyTargetEntry(from); break; case T_RangeTblEntry: retval = _copyRangeTblEntry(from); break; case T_RowMark: retval = _copyRowMark(from); break; case T_SortClause: retval = _copySortClause(from); break; case T_A_Const: retval = _copyAConst(from); break; case T_TypeName: retval = _copyTypeName(from); break; /* * VALUE NODES */ case T_Integer: case T_String: case T_Float: retval = _copyValue(from); break; case T_List: { List *list = from, *l; List *newlist = NIL, *nl = NIL; foreach(l, list) { if (newlist == NIL) newlist = nl = lcons(copyObject(lfirst(l)), NIL); else { lnext(nl) = lcons(copyObject(lfirst(l)), NIL); nl = lnext(nl); } } retval = newlist; } break; default: elog(ERROR, "copyObject: don't know how to copy %d", nodeTag(from)); retval = from; break; } return retval;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -