PostgreSQL Source Code git master
define.c File Reference
#include "postgres.h"
#include <ctype.h>
#include <math.h>
#include "catalog/namespace.h"
#include "commands/defrem.h"
#include "nodes/makefuncs.h"
#include "parser/parse_type.h"
#include "utils/fmgrprotos.h"
Include dependency graph for define.c:

Go to the source code of this file.

Functions

char * defGetString (DefElem *def)
 
double defGetNumeric (DefElem *def)
 
bool defGetBoolean (DefElem *def)
 
int32 defGetInt32 (DefElem *def)
 
int64 defGetInt64 (DefElem *def)
 
Oid defGetObjectId (DefElem *def)
 
ListdefGetQualifiedName (DefElem *def)
 
TypeNamedefGetTypeName (DefElem *def)
 
int defGetTypeLength (DefElem *def)
 
ListdefGetStringList (DefElem *def)
 
void errorConflictingDefElem (DefElem *defel, ParseState *pstate)
 

Function Documentation

◆ defGetBoolean()

bool defGetBoolean ( DefElem def)

Definition at line 94 of file define.c.

95{
96 /*
97 * If no parameter value given, assume "true" is meant.
98 */
99 if (def->arg == NULL)
100 return true;
101
102 /*
103 * Allow 0, 1, "true", "false", "on", "off"
104 */
105 switch (nodeTag(def->arg))
106 {
107 case T_Integer:
108 switch (intVal(def->arg))
109 {
110 case 0:
111 return false;
112 case 1:
113 return true;
114 default:
115 /* otherwise, error out below */
116 break;
117 }
118 break;
119 default:
120 {
121 char *sval = defGetString(def);
122
123 /*
124 * The set of strings accepted here should match up with the
125 * grammar's opt_boolean_or_string production.
126 */
127 if (pg_strcasecmp(sval, "true") == 0)
128 return true;
129 if (pg_strcasecmp(sval, "false") == 0)
130 return false;
131 if (pg_strcasecmp(sval, "on") == 0)
132 return true;
133 if (pg_strcasecmp(sval, "off") == 0)
134 return false;
135 }
136 break;
137 }
139 (errcode(ERRCODE_SYNTAX_ERROR),
140 errmsg("%s requires a Boolean value",
141 def->defname)));
142 return false; /* keep compiler quiet */
143}
char * defGetString(DefElem *def)
Definition: define.c:35
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149
#define nodeTag(nodeptr)
Definition: nodes.h:133
int pg_strcasecmp(const char *s1, const char *s2)
Definition: pgstrcasecmp.c:36
char * defname
Definition: parsenodes.h:826
Node * arg
Definition: parsenodes.h:827
#define intVal(v)
Definition: value.h:79

References DefElem::arg, defGetString(), DefElem::defname, ereport, errcode(), errmsg(), ERROR, intVal, nodeTag, and pg_strcasecmp().

Referenced by AlterDatabase(), AlterOperator(), AlterReplicationSlot(), apply_server_options(), apply_table_options(), cluster(), createdb(), CreateExtension(), DefineAggregate(), DefineCollation(), DefineOperator(), DefineType(), dintdict_init(), dsimple_init(), dsynonym_init(), dxsyn_init(), ExecReindex(), ExecVacuum(), ExplainQuery(), file_fdw_validator(), get_file_fdw_attribute_options(), get_vacoptval_from_boolean(), GetCommandLogLevel(), make_new_connection(), parse_basebackup_options(), parse_output_parameters(), parse_publication_options(), parse_subscription_options(), parseCreateReplSlotOptions(), postgres_fdw_validator(), postgresExecForeignTruncate(), postgresImportForeignSchema(), postgresIsForeignRelUpdatable(), ProcessCopyOptions(), transformExplainStmt(), transformRelOptions(), UserMappingPasswordRequired(), and UseScramPassthrough().

◆ defGetInt32()

int32 defGetInt32 ( DefElem def)

Definition at line 149 of file define.c.

150{
151 if (def->arg == NULL)
153 (errcode(ERRCODE_SYNTAX_ERROR),
154 errmsg("%s requires an integer value",
155 def->defname)));
156 switch (nodeTag(def->arg))
157 {
158 case T_Integer:
159 return (int32) intVal(def->arg);
160 default:
162 (errcode(ERRCODE_SYNTAX_ERROR),
163 errmsg("%s requires an integer value",
164 def->defname)));
165 }
166 return 0; /* keep compiler quiet */
167}
int32_t int32
Definition: c.h:484

References DefElem::arg, DefElem::defname, ereport, errcode(), errmsg(), ERROR, intVal, and nodeTag.

Referenced by AlterDatabase(), ATExecSetIdentity(), createdb(), DefineAggregate(), and ExecVacuum().

◆ defGetInt64()

int64 defGetInt64 ( DefElem def)

Definition at line 173 of file define.c.

174{
175 if (def->arg == NULL)
177 (errcode(ERRCODE_SYNTAX_ERROR),
178 errmsg("%s requires a numeric value",
179 def->defname)));
180 switch (nodeTag(def->arg))
181 {
182 case T_Integer:
183 return (int64) intVal(def->arg);
184 case T_Float:
185
186 /*
187 * Values too large for int4 will be represented as Float
188 * constants by the lexer. Accept these if they are valid int8
189 * strings.
190 */
192 CStringGetDatum(castNode(Float, def->arg)->fval)));
193 default:
195 (errcode(ERRCODE_SYNTAX_ERROR),
196 errmsg("%s requires a numeric value",
197 def->defname)));
198 }
199 return 0; /* keep compiler quiet */
200}
int64_t int64
Definition: c.h:485
#define DirectFunctionCall1(func, arg1)
Definition: fmgr.h:641
Datum int8in(PG_FUNCTION_ARGS)
Definition: int8.c:50
#define castNode(_type_, nodeptr)
Definition: nodes.h:176
static int64 DatumGetInt64(Datum X)
Definition: postgres.h:390
static Datum CStringGetDatum(const char *X)
Definition: postgres.h:355
Definition: value.h:48

References DefElem::arg, castNode, CStringGetDatum(), DatumGetInt64(), DefElem::defname, DirectFunctionCall1, ereport, errcode(), errmsg(), ERROR, int8in(), intVal, and nodeTag.

Referenced by defGetCopyRejectLimitOption(), init_params(), and parse_basebackup_options().

◆ defGetNumeric()

double defGetNumeric ( DefElem def)

Definition at line 68 of file define.c.

69{
70 if (def->arg == NULL)
72 (errcode(ERRCODE_SYNTAX_ERROR),
73 errmsg("%s requires a numeric value",
74 def->defname)));
75 switch (nodeTag(def->arg))
76 {
77 case T_Integer:
78 return (double) intVal(def->arg);
79 case T_Float:
80 return floatVal(def->arg);
81 default:
83 (errcode(ERRCODE_SYNTAX_ERROR),
84 errmsg("%s requires a numeric value",
85 def->defname)));
86 }
87 return 0; /* keep compiler quiet */
88}
#define floatVal(v)
Definition: value.h:80

References DefElem::arg, DefElem::defname, ereport, errcode(), errmsg(), ERROR, floatVal, intVal, and nodeTag.

Referenced by AlterFunction(), and compute_function_attributes().

◆ defGetObjectId()

Oid defGetObjectId ( DefElem def)

Definition at line 206 of file define.c.

207{
208 if (def->arg == NULL)
210 (errcode(ERRCODE_SYNTAX_ERROR),
211 errmsg("%s requires a numeric value",
212 def->defname)));
213 switch (nodeTag(def->arg))
214 {
215 case T_Integer:
216 return (Oid) intVal(def->arg);
217 case T_Float:
218
219 /*
220 * Values too large for int4 will be represented as Float
221 * constants by the lexer. Accept these if they are valid OID
222 * strings.
223 */
225 CStringGetDatum(castNode(Float, def->arg)->fval)));
226 default:
228 (errcode(ERRCODE_SYNTAX_ERROR),
229 errmsg("%s requires a numeric value",
230 def->defname)));
231 }
232 return 0; /* keep compiler quiet */
233}
Datum oidin(PG_FUNCTION_ARGS)
Definition: oid.c:37
static Oid DatumGetObjectId(Datum X)
Definition: postgres.h:247
unsigned int Oid
Definition: postgres_ext.h:32

References DefElem::arg, castNode, CStringGetDatum(), DatumGetObjectId(), DefElem::defname, DirectFunctionCall1, ereport, errcode(), errmsg(), ERROR, intVal, nodeTag, and oidin().

Referenced by createdb().

◆ defGetQualifiedName()

List * defGetQualifiedName ( DefElem def)

Definition at line 239 of file define.c.

240{
241 if (def->arg == NULL)
243 (errcode(ERRCODE_SYNTAX_ERROR),
244 errmsg("%s requires a parameter",
245 def->defname)));
246 switch (nodeTag(def->arg))
247 {
248 case T_TypeName:
249 return ((TypeName *) def->arg)->names;
250 case T_List:
251 return (List *) def->arg;
252 case T_String:
253 /* Allow quoted name for backwards compatibility */
254 return list_make1(def->arg);
255 default:
257 (errcode(ERRCODE_SYNTAX_ERROR),
258 errmsg("argument of %s must be a name",
259 def->defname)));
260 }
261 return NIL; /* keep compiler quiet */
262}
#define NIL
Definition: pg_list.h:68
#define list_make1(x1)
Definition: pg_list.h:212
Definition: pg_list.h:54

References DefElem::arg, DefElem::defname, ereport, errcode(), errmsg(), ERROR, list_make1, NIL, and nodeTag.

Referenced by AlterOperator(), AlterType(), DefineAggregate(), DefineCollation(), DefineOperator(), DefineRange(), DefineTSConfiguration(), DefineTSDictionary(), DefineType(), get_ts_parser_func(), get_ts_template_func(), init_params(), and interpret_func_support().

◆ defGetString()

char * defGetString ( DefElem def)

Definition at line 35 of file define.c.

36{
37 if (def->arg == NULL)
39 (errcode(ERRCODE_SYNTAX_ERROR),
40 errmsg("%s requires a parameter",
41 def->defname)));
42 switch (nodeTag(def->arg))
43 {
44 case T_Integer:
45 return psprintf("%ld", (long) intVal(def->arg));
46 case T_Float:
47 return castNode(Float, def->arg)->fval;
48 case T_Boolean:
49 return boolVal(def->arg) ? "true" : "false";
50 case T_String:
51 return strVal(def->arg);
52 case T_TypeName:
53 return TypeNameToString((TypeName *) def->arg);
54 case T_List:
55 return NameListToString((List *) def->arg);
56 case T_A_Star:
57 return pstrdup("*");
58 default:
59 elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg));
60 }
61 return NULL; /* keep compiler quiet */
62}
#define elog(elevel,...)
Definition: elog.h:225
char * pstrdup(const char *in)
Definition: mcxt.c:1696
char * NameListToString(const List *names)
Definition: namespace.c:3594
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:478
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
#define boolVal(v)
Definition: value.h:81
#define strVal(v)
Definition: value.h:82

References DefElem::arg, boolVal, castNode, DefElem::defname, elog, ereport, errcode(), errmsg(), ERROR, intVal, NameListToString(), nodeTag, psprintf(), pstrdup(), strVal, and TypeNameToString().

Referenced by AlterDatabase(), AlterType(), apply_server_options(), apply_table_options(), check_selective_binary_conversion(), createdb(), CreateExtension(), defGetBoolean(), defGetCopyHeaderChoice(), defGetCopyLogVerbosityChoice(), defGetCopyOnErrorChoice(), defGetGeneratedColsOption(), defGetStreamingMode(), defGetTypeLength(), DefineAggregate(), DefineCollation(), DefineType(), deparseAnalyzeSql(), deparseColumnRef(), deparseRelation(), dintdict_init(), dispell_init(), dsimple_init(), dsnowball_init(), dsynonym_init(), dxsyn_init(), ExecReindex(), ExecVacuum(), ExplainQuery(), ExplainResultDesc(), ExtractConnectionOptions(), extractModify(), file_fdw_validator(), fileGetOptions(), get_batch_size_option(), GrantRole(), optionListToArray(), parse_basebackup_options(), parse_output_parameters(), parse_publication_options(), parse_subscription_options(), parseCreateReplSlotOptions(), postgres_fdw_validator(), postgresAcquireSampleRowsFunc(), ProcessCopyOptions(), prsd_headline(), serialize_deflist(), thesaurus_init(), transformRelOptions(), and unaccent_init().

◆ defGetStringList()

List * defGetStringList ( DefElem def)

Definition at line 343 of file define.c.

344{
345 ListCell *cell;
346
347 if (def->arg == NULL)
349 (errcode(ERRCODE_SYNTAX_ERROR),
350 errmsg("%s requires a parameter",
351 def->defname)));
352 if (nodeTag(def->arg) != T_List)
353 elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg));
354
355 foreach(cell, (List *) def->arg)
356 {
357 Node *str = (Node *) lfirst(cell);
358
359 if (!IsA(str, String))
360 elog(ERROR, "unexpected node type in name list: %d",
361 (int) nodeTag(str));
362 }
363
364 return (List *) def->arg;
365}
const char * str
#define IsA(nodeptr, _type_)
Definition: nodes.h:158
#define lfirst(lc)
Definition: pg_list.h:172
Definition: nodes.h:129
Definition: value.h:64

References DefElem::arg, DefElem::defname, elog, ereport, errcode(), errmsg(), ERROR, IsA, lfirst, nodeTag, and str.

◆ defGetTypeLength()

int defGetTypeLength ( DefElem def)

Definition at line 299 of file define.c.

300{
301 if (def->arg == NULL)
303 (errcode(ERRCODE_SYNTAX_ERROR),
304 errmsg("%s requires a parameter",
305 def->defname)));
306 switch (nodeTag(def->arg))
307 {
308 case T_Integer:
309 return intVal(def->arg);
310 case T_Float:
312 (errcode(ERRCODE_SYNTAX_ERROR),
313 errmsg("%s requires an integer value",
314 def->defname)));
315 break;
316 case T_String:
317 if (pg_strcasecmp(strVal(def->arg), "variable") == 0)
318 return -1; /* variable length */
319 break;
320 case T_TypeName:
321 /* cope if grammar chooses to believe "variable" is a typename */
323 "variable") == 0)
324 return -1; /* variable length */
325 break;
326 case T_List:
327 /* must be an operator name */
328 break;
329 default:
330 elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg));
331 }
333 (errcode(ERRCODE_SYNTAX_ERROR),
334 errmsg("invalid argument for %s: \"%s\"",
335 def->defname, defGetString(def))));
336 return 0; /* keep compiler quiet */
337}

References DefElem::arg, defGetString(), DefElem::defname, elog, ereport, errcode(), errmsg(), ERROR, intVal, nodeTag, pg_strcasecmp(), strVal, and TypeNameToString().

Referenced by DefineType().

◆ defGetTypeName()

TypeName * defGetTypeName ( DefElem def)

Definition at line 271 of file define.c.

272{
273 if (def->arg == NULL)
275 (errcode(ERRCODE_SYNTAX_ERROR),
276 errmsg("%s requires a parameter",
277 def->defname)));
278 switch (nodeTag(def->arg))
279 {
280 case T_TypeName:
281 return (TypeName *) def->arg;
282 case T_String:
283 /* Allow quoted typename for backwards compatibility */
285 default:
287 (errcode(ERRCODE_SYNTAX_ERROR),
288 errmsg("argument of %s must be a type name",
289 def->defname)));
290 }
291 return NULL; /* keep compiler quiet */
292}
TypeName * makeTypeNameFromNameList(List *names)
Definition: makefuncs.c:484

References DefElem::arg, DefElem::defname, ereport, errcode(), errmsg(), ERROR, list_make1, makeTypeNameFromNameList(), and nodeTag.

Referenced by DefineAggregate(), DefineOperator(), DefineRange(), DefineType(), and init_params().

◆ errorConflictingDefElem()