mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
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
This commit is contained in:
@@ -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:
|
||||
@@ -16705,6 +16705,18 @@ makeFloatConst(char *str, int location)
|
||||
return (Node *)n;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -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
|
||||
*/
|
||||
|
@@ -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:
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user