summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2022-01-14 10:46:49 +0100
committerPeter Eisentraut <peter@eisentraut.org>2022-01-17 10:38:23 +0100
commit941460fcf731a32e6a90691508d5cfa3d1f8eeaf (patch)
tree2de0be4abcf7db131607ce9ba590a8040c16d6e3 /src/backend/parser
parentca86a63d207aca1f52ff13a1ce13854681d1bbf9 (diff)
Add Boolean node
Before, SQL-level boolean constants were represented by a string with a cast, and internal Boolean values in DDL commands were usually represented by Integer nodes. This takes the place of both of these uses, making the intent clearer and having some amount of type safety. Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/8c1a2e37-c68d-703c-5a83-7a6077f4f997@enterprisedb.com
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y99
-rw-r--r--src/backend/parser/parse_node.c8
2 files changed, 58 insertions, 49 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index bb015a8bbd3..b5966712ce1 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -177,10 +177,10 @@ static Node *makeStringConst(char *str, int location);
static Node *makeStringConstCast(char *str, int location, TypeName *typename);
static Node *makeIntConst(int val, int location);
static Node *makeFloatConst(char *str, int location);
+static Node *makeBoolAConst(bool state, int location);
static Node *makeBitStringConst(char *str, int location);
static Node *makeNullAConst(int location);
static Node *makeAConst(Node *v, int location);
-static Node *makeBoolAConst(bool state, int location);
static RoleSpec *makeRoleSpec(RoleSpecType type, int location);
static void check_qualified_name(List *names, core_yyscan_t yyscanner);
static List *check_func_name(List *names, core_yyscan_t yyscanner);
@@ -1133,7 +1133,7 @@ AlterOptRoleElem:
}
| INHERIT
{
- $$ = makeDefElem("inherit", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("inherit", (Node *)makeBoolean(true), @1);
}
| CONNECTION LIMIT SignedIconst
{
@@ -1156,36 +1156,36 @@ AlterOptRoleElem:
* size of the main parser.
*/
if (strcmp($1, "superuser") == 0)
- $$ = makeDefElem("superuser", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("superuser", (Node *)makeBoolean(true), @1);
else if (strcmp($1, "nosuperuser") == 0)
- $$ = makeDefElem("superuser", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("superuser", (Node *)makeBoolean(false), @1);
else if (strcmp($1, "createrole") == 0)
- $$ = makeDefElem("createrole", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("createrole", (Node *)makeBoolean(true), @1);
else if (strcmp($1, "nocreaterole") == 0)
- $$ = makeDefElem("createrole", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("createrole", (Node *)makeBoolean(false), @1);
else if (strcmp($1, "replication") == 0)
- $$ = makeDefElem("isreplication", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("isreplication", (Node *)makeBoolean(true), @1);
else if (strcmp($1, "noreplication") == 0)
- $$ = makeDefElem("isreplication", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("isreplication", (Node *)makeBoolean(false), @1);
else if (strcmp($1, "createdb") == 0)
- $$ = makeDefElem("createdb", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("createdb", (Node *)makeBoolean(true), @1);
else if (strcmp($1, "nocreatedb") == 0)
- $$ = makeDefElem("createdb", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("createdb", (Node *)makeBoolean(false), @1);
else if (strcmp($1, "login") == 0)
- $$ = makeDefElem("canlogin", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("canlogin", (Node *)makeBoolean(true), @1);
else if (strcmp($1, "nologin") == 0)
- $$ = makeDefElem("canlogin", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("canlogin", (Node *)makeBoolean(false), @1);
else if (strcmp($1, "bypassrls") == 0)
- $$ = makeDefElem("bypassrls", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("bypassrls", (Node *)makeBoolean(true), @1);
else if (strcmp($1, "nobypassrls") == 0)
- $$ = makeDefElem("bypassrls", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("bypassrls", (Node *)makeBoolean(false), @1);
else if (strcmp($1, "noinherit") == 0)
{
/*
* Note that INHERIT is a keyword, so it's handled by main parser, but
* NOINHERIT is handled here.
*/
- $$ = makeDefElem("inherit", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("inherit", (Node *)makeBoolean(false), @1);
}
else
ereport(ERROR,
@@ -3175,7 +3175,7 @@ copy_opt_item:
}
| FREEZE
{
- $$ = makeDefElem("freeze", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("freeze", (Node *)makeBoolean(true), @1);
}
| DELIMITER opt_as Sconst
{
@@ -3191,7 +3191,7 @@ copy_opt_item:
}
| HEADER_P
{
- $$ = makeDefElem("header", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("header", (Node *)makeBoolean(true), @1);
}
| QUOTE opt_as Sconst
{
@@ -4499,11 +4499,11 @@ SeqOptElem: AS SimpleTypename
}
| CYCLE
{
- $$ = makeDefElem("cycle", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("cycle", (Node *)makeBoolean(true), @1);
}
| NO CYCLE
{
- $$ = makeDefElem("cycle", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("cycle", (Node *)makeBoolean(false), @1);
}
| INCREMENT opt_by NumericOnly
{
@@ -4739,7 +4739,7 @@ create_extension_opt_item:
}
| CASCADE
{
- $$ = makeDefElem("cascade", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("cascade", (Node *)makeBoolean(true), @1);
}
;
@@ -7934,15 +7934,15 @@ createfunc_opt_list:
common_func_opt_item:
CALLED ON NULL_P INPUT_P
{
- $$ = makeDefElem("strict", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("strict", (Node *)makeBoolean(false), @1);
}
| RETURNS NULL_P ON NULL_P INPUT_P
{
- $$ = makeDefElem("strict", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("strict", (Node *)makeBoolean(true), @1);
}
| STRICT_P
{
- $$ = makeDefElem("strict", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("strict", (Node *)makeBoolean(true), @1);
}
| IMMUTABLE
{
@@ -7958,27 +7958,27 @@ common_func_opt_item:
}
| EXTERNAL SECURITY DEFINER
{
- $$ = makeDefElem("security", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("security", (Node *)makeBoolean(true), @1);
}
| EXTERNAL SECURITY INVOKER
{
- $$ = makeDefElem("security", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("security", (Node *)makeBoolean(false), @1);
}
| SECURITY DEFINER
{
- $$ = makeDefElem("security", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("security", (Node *)makeBoolean(true), @1);
}
| SECURITY INVOKER
{
- $$ = makeDefElem("security", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("security", (Node *)makeBoolean(false), @1);
}
| LEAKPROOF
{
- $$ = makeDefElem("leakproof", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("leakproof", (Node *)makeBoolean(true), @1);
}
| NOT LEAKPROOF
{
- $$ = makeDefElem("leakproof", (Node *)makeInteger(false), @1);
+ $$ = makeDefElem("leakproof", (Node *)makeBoolean(false), @1);
}
| COST NumericOnly
{
@@ -8018,7 +8018,7 @@ createfunc_opt_item:
}
| WINDOW
{
- $$ = makeDefElem("window", (Node *)makeInteger(true), @1);
+ $$ = makeDefElem("window", (Node *)makeBoolean(true), @1);
}
| common_func_opt_item
{
@@ -9941,7 +9941,7 @@ AlterSubscriptionStmt:
n->kind = ALTER_SUBSCRIPTION_ENABLED;
n->subname = $3;
n->options = list_make1(makeDefElem("enabled",
- (Node *)makeInteger(true), @1));
+ (Node *)makeBoolean(true), @1));
$$ = (Node *)n;
}
| ALTER SUBSCRIPTION name DISABLE_P
@@ -9951,7 +9951,7 @@ AlterSubscriptionStmt:
n->kind = ALTER_SUBSCRIPTION_ENABLED;
n->subname = $3;
n->options = list_make1(makeDefElem("enabled",
- (Node *)makeInteger(false), @1));
+ (Node *)makeBoolean(false), @1));
$$ = (Node *)n;
}
;
@@ -12874,7 +12874,7 @@ xmltable_column_el:
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("conflicting or redundant NULL / NOT NULL declarations for column \"%s\"", fc->colname),
parser_errposition(defel->location)));
- fc->is_not_null = intVal(defel->arg);
+ fc->is_not_null = boolVal(defel->arg);
nullability_seen = true;
}
else
@@ -12914,9 +12914,9 @@ xmltable_column_option_el:
| DEFAULT b_expr
{ $$ = makeDefElem("default", $2, @1); }
| NOT NULL_P
- { $$ = makeDefElem("is_not_null", (Node *) makeInteger(true), @1); }
+ { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); }
| NULL_P
- { $$ = makeDefElem("is_not_null", (Node *) makeInteger(false), @1); }
+ { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); }
;
xml_namespace_list:
@@ -16706,6 +16706,18 @@ makeFloatConst(char *str, int location)
}
static Node *
+makeBoolAConst(bool state, int location)
+{
+ A_Const *n = makeNode(A_Const);
+
+ n->val.boolval.type = T_Boolean;
+ n->val.boolval.boolval = state;
+ n->location = location;
+
+ return (Node *)n;
+}
+
+static Node *
makeBitStringConst(char *str, int location)
{
A_Const *n = makeNode(A_Const);
@@ -16743,26 +16755,15 @@ makeAConst(Node *v, int location)
n = makeIntConst(castNode(Integer, v)->ival, location);
break;
- case T_String:
default:
- n = makeStringConst(castNode(String, v)->sval, location);
- break;
+ /* currently not used */
+ Assert(false);
+ n = NULL;
}
return n;
}
-/* makeBoolAConst()
- * Create an A_Const string node and put it inside a boolean cast.
- */
-static Node *
-makeBoolAConst(bool state, int location)
-{
- return makeStringConstCast((state ? "t" : "f"),
- location,
- SystemTypeName("bool"));
-}
-
/* makeRoleSpec
* Create a RoleSpec with the given type
*/
diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c
index 95913c80215..35db6b6c988 100644
--- a/src/backend/parser/parse_node.c
+++ b/src/backend/parser/parse_node.c
@@ -426,6 +426,14 @@ make_const(ParseState *pstate, A_Const *aconst)
}
break;
+ case T_Boolean:
+ val = BoolGetDatum(boolVal(&aconst->val));
+
+ typeid = BOOLOID;
+ typelen = 1;
+ typebyval = true;
+ break;
+
case T_String:
/*