| 1 | /*-------------------------------------------------------------------- |
| 2 | * Symbols referenced in this file: |
| 3 | * - makeDefElem |
| 4 | * - makeTypeNameFromNameList |
| 5 | * - makeDefElemExtended |
| 6 | * - makeAlias |
| 7 | * - makeSimpleAExpr |
| 8 | * - makeGroupingSet |
| 9 | * - makeTypeName |
| 10 | * - makeFuncCall |
| 11 | * - makeAExpr |
| 12 | * - makeRangeVar |
| 13 | * - makeBoolExpr |
| 14 | *-------------------------------------------------------------------- |
| 15 | */ |
| 16 | |
| 17 | /*------------------------------------------------------------------------- |
| 18 | * |
| 19 | * makefuncs.c |
| 20 | * creator functions for primitive nodes. The functions here are for |
| 21 | * the most frequently created nodes. |
| 22 | * |
| 23 | * Portions Copyright (c) 1996-2017, PostgreSQL Global Development PGGroup |
| 24 | * Portions Copyright (c) 1994, Regents of the University of California |
| 25 | * |
| 26 | * |
| 27 | * IDENTIFICATION |
| 28 | * src/backend/nodes/makefuncs.c |
| 29 | * |
| 30 | *------------------------------------------------------------------------- |
| 31 | */ |
| 32 | #include "pg_functions.hpp" |
| 33 | |
| 34 | |
| 35 | |
| 36 | #include "fmgr.hpp" |
| 37 | #include "nodes/makefuncs.hpp" |
| 38 | #include "nodes/nodeFuncs.hpp" |
| 39 | |
| 40 | namespace duckdb_libpgquery { |
| 41 | |
| 42 | /* |
| 43 | * makeAExpr - |
| 44 | * makes an PGAExpr node |
| 45 | */ |
| 46 | PGAExpr *makeAExpr(PGAExpr_Kind kind, PGList *name, PGNode *lexpr, PGNode *rexpr, int location) { |
| 47 | PGAExpr *a = makeNode(PGAExpr); |
| 48 | |
| 49 | a->kind = kind; |
| 50 | a->name = name; |
| 51 | a->lexpr = lexpr; |
| 52 | a->rexpr = rexpr; |
| 53 | a->location = location; |
| 54 | return a; |
| 55 | } |
| 56 | |
| 57 | /* |
| 58 | * makeSimpleAExpr - |
| 59 | * As above, given a simple (unqualified) operator name |
| 60 | */ |
| 61 | PGAExpr *makeSimpleAExpr(PGAExpr_Kind kind, const char *name, PGNode *lexpr, PGNode *rexpr, int location) { |
| 62 | PGAExpr *a = makeNode(PGAExpr); |
| 63 | |
| 64 | a->kind = kind; |
| 65 | a->name = list_make1(makeString((char *)name)); |
| 66 | a->lexpr = lexpr; |
| 67 | a->rexpr = rexpr; |
| 68 | a->location = location; |
| 69 | return a; |
| 70 | } |
| 71 | |
| 72 | /* |
| 73 | * makeVar - |
| 74 | * creates a PGVar node |
| 75 | */ |
| 76 | |
| 77 | /* |
| 78 | * makeVarFromTargetEntry - |
| 79 | * convenience function to create a same-level PGVar node from a |
| 80 | * PGTargetEntry |
| 81 | */ |
| 82 | |
| 83 | /* |
| 84 | * makeWholeRowVar - |
| 85 | * creates a PGVar node representing a whole row of the specified RTE |
| 86 | * |
| 87 | * A whole-row reference is a PGVar with varno set to the correct range |
| 88 | * table entry, and varattno == 0 to signal that it references the whole |
| 89 | * tuple. (Use of zero here is unclean, since it could easily be confused |
| 90 | * with error cases, but it's not worth changing now.) The vartype indicates |
| 91 | * a rowtype; either a named composite type, or RECORD. This function |
| 92 | * encapsulates the logic for determining the correct rowtype OID to use. |
| 93 | * |
| 94 | * If allowScalar is true, then for the case where the RTE is a single function |
| 95 | * returning a non-composite result type, we produce a normal PGVar referencing |
| 96 | * the function's result directly, instead of the single-column composite |
| 97 | * value that the whole-row notation might otherwise suggest. |
| 98 | */ |
| 99 | |
| 100 | /* |
| 101 | * makeTargetEntry - |
| 102 | * creates a PGTargetEntry node |
| 103 | */ |
| 104 | |
| 105 | /* |
| 106 | * flatCopyTargetEntry - |
| 107 | * duplicate a PGTargetEntry, but don't copy substructure |
| 108 | * |
| 109 | * This is commonly used when we just want to modify the resno or substitute |
| 110 | * a new expression. |
| 111 | */ |
| 112 | |
| 113 | /* |
| 114 | * makeFromExpr - |
| 115 | * creates a PGFromExpr node |
| 116 | */ |
| 117 | |
| 118 | /* |
| 119 | * makeConst - |
| 120 | * creates a PGConst node |
| 121 | */ |
| 122 | |
| 123 | /* |
| 124 | * makeNullConst - |
| 125 | * creates a PGConst node representing a NULL of the specified type/typmod |
| 126 | * |
| 127 | * This is a convenience routine that just saves a lookup of the type's |
| 128 | * storage properties. |
| 129 | */ |
| 130 | |
| 131 | /* |
| 132 | * makeBoolConst - |
| 133 | * creates a PGConst node representing a boolean value (can be NULL too) |
| 134 | */ |
| 135 | |
| 136 | /* |
| 137 | * makeBoolExpr - |
| 138 | * creates a PGBoolExpr node |
| 139 | */ |
| 140 | PGExpr *makeBoolExpr(PGBoolExprType boolop, PGList *args, int location) { |
| 141 | PGBoolExpr *b = makeNode(PGBoolExpr); |
| 142 | |
| 143 | b->boolop = boolop; |
| 144 | b->args = args; |
| 145 | b->location = location; |
| 146 | |
| 147 | return (PGExpr *)b; |
| 148 | } |
| 149 | |
| 150 | /* |
| 151 | * makeAlias - |
| 152 | * creates an PGAlias node |
| 153 | * |
| 154 | * NOTE: the given name is copied, but the colnames list (if any) isn't. |
| 155 | */ |
| 156 | PGAlias *makeAlias(const char *aliasname, PGList *colnames) { |
| 157 | PGAlias *a = makeNode(PGAlias); |
| 158 | |
| 159 | a->aliasname = pstrdup(in: aliasname); |
| 160 | a->colnames = colnames; |
| 161 | |
| 162 | return a; |
| 163 | } |
| 164 | |
| 165 | /* |
| 166 | * makeRelabelType - |
| 167 | * creates a PGRelabelType node |
| 168 | */ |
| 169 | |
| 170 | /* |
| 171 | * makeRangeVar - |
| 172 | * creates a PGRangeVar node (rather oversimplified case) |
| 173 | */ |
| 174 | PGRangeVar *makeRangeVar(char *schemaname, char *relname, int location) { |
| 175 | PGRangeVar *r = makeNode(PGRangeVar); |
| 176 | |
| 177 | r->catalogname = NULL; |
| 178 | r->schemaname = schemaname; |
| 179 | r->relname = relname; |
| 180 | r->inh = true; |
| 181 | r->relpersistence = RELPERSISTENCE_PERMANENT; |
| 182 | r->alias = NULL; |
| 183 | r->location = location; |
| 184 | r->sample = NULL; |
| 185 | |
| 186 | return r; |
| 187 | } |
| 188 | |
| 189 | /* |
| 190 | * makeTypeName - |
| 191 | * build a PGTypeName node for an unqualified name. |
| 192 | * |
| 193 | * typmod is defaulted, but can be changed later by caller. |
| 194 | */ |
| 195 | PGTypeName *makeTypeName(char *typnam) { |
| 196 | return makeTypeNameFromNameList(list_make1(makeString(typnam))); |
| 197 | } |
| 198 | |
| 199 | /* |
| 200 | * makeTypeNameFromNameList - |
| 201 | * build a PGTypeName node for a String list representing a qualified name. |
| 202 | * |
| 203 | * typmod is defaulted, but can be changed later by caller. |
| 204 | */ |
| 205 | PGTypeName *makeTypeNameFromNameList(PGList *names) { |
| 206 | PGTypeName *n = makeNode(PGTypeName); |
| 207 | |
| 208 | n->names = names; |
| 209 | n->typmods = NIL; |
| 210 | n->typemod = -1; |
| 211 | n->location = -1; |
| 212 | return n; |
| 213 | } |
| 214 | |
| 215 | /* |
| 216 | * makeTypeNameFromOid - |
| 217 | * build a PGTypeName node to represent a type already known by OID/typmod. |
| 218 | */ |
| 219 | |
| 220 | /* |
| 221 | * makeColumnDef - |
| 222 | * build a PGColumnDef node to represent a simple column definition. |
| 223 | * |
| 224 | * Type and collation are specified by OID. |
| 225 | * Other properties are all basic to start with. |
| 226 | */ |
| 227 | |
| 228 | /* |
| 229 | * makeFuncExpr - |
| 230 | * build an expression tree representing a function call. |
| 231 | * |
| 232 | * The argument expressions must have been transformed already. |
| 233 | */ |
| 234 | |
| 235 | /* |
| 236 | * makeDefElem - |
| 237 | * build a PGDefElem node |
| 238 | * |
| 239 | * This is sufficient for the "typical" case with an unqualified option name |
| 240 | * and no special action. |
| 241 | */ |
| 242 | PGDefElem *makeDefElem(const char *name, PGNode *arg, int location) { |
| 243 | PGDefElem *res = makeNode(PGDefElem); |
| 244 | |
| 245 | res->defnamespace = NULL; |
| 246 | res->defname = (char *)name; |
| 247 | res->arg = arg; |
| 248 | res->defaction = PG_DEFELEM_UNSPEC; |
| 249 | res->location = location; |
| 250 | |
| 251 | return res; |
| 252 | } |
| 253 | |
| 254 | /* |
| 255 | * makeDefElemExtended - |
| 256 | * build a PGDefElem node with all fields available to be specified |
| 257 | */ |
| 258 | PGDefElem *makeDefElemExtended(const char *nameSpace, const char *name, PGNode *arg, PGDefElemAction defaction, |
| 259 | int location) { |
| 260 | PGDefElem *res = makeNode(PGDefElem); |
| 261 | |
| 262 | res->defnamespace = (char *)nameSpace; |
| 263 | res->defname = (char *)name; |
| 264 | res->arg = arg; |
| 265 | res->defaction = defaction; |
| 266 | res->location = location; |
| 267 | |
| 268 | return res; |
| 269 | } |
| 270 | |
| 271 | /* |
| 272 | * makeFuncCall - |
| 273 | * |
| 274 | * Initialize a PGFuncCall struct with the information every caller must |
| 275 | * supply. Any non-default parameters have to be inserted by the caller. |
| 276 | */ |
| 277 | PGFuncCall *makeFuncCall(PGList *name, PGList *args, int location) { |
| 278 | PGFuncCall *n = makeNode(PGFuncCall); |
| 279 | |
| 280 | n->funcname = name; |
| 281 | n->args = args; |
| 282 | n->agg_order = NIL; |
| 283 | n->agg_filter = NULL; |
| 284 | n->agg_within_group = false; |
| 285 | n->agg_star = false; |
| 286 | n->agg_distinct = false; |
| 287 | n->func_variadic = false; |
| 288 | n->over = NULL; |
| 289 | n->location = location; |
| 290 | return n; |
| 291 | } |
| 292 | |
| 293 | /* |
| 294 | * makeGroupingSet |
| 295 | * |
| 296 | */ |
| 297 | PGGroupingSet *makeGroupingSet(GroupingSetKind kind, PGList *content, int location) { |
| 298 | PGGroupingSet *n = makeNode(PGGroupingSet); |
| 299 | |
| 300 | n->kind = kind; |
| 301 | n->content = content; |
| 302 | n->location = location; |
| 303 | return n; |
| 304 | } |
| 305 | } |