mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
SQL/JSON constructors
This patch introduces the SQL/JSON standard constructors for JSON: JSON() JSON_ARRAY() JSON_ARRAYAGG() JSON_OBJECT() JSON_OBJECTAGG() For the most part these functions provide facilities that mimic existing json/jsonb functions. However, they also offer some useful additional functionality. In addition to text input, the JSON() function accepts bytea input, which it will decode and constuct a json value from. The other functions provide useful options for handling duplicate keys and null values. This series of patches will be followed by a consolidated documentation patch. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru
This commit is contained in:
@@ -871,6 +871,111 @@ _equalJsonValueExpr(const JsonValueExpr *a, const JsonValueExpr *b)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonConstructorExpr(const JsonConstructorExpr *a, const JsonConstructorExpr *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(type);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_NODE_FIELD(func);
|
||||
COMPARE_NODE_FIELD(coercion);
|
||||
COMPARE_NODE_FIELD(returning);
|
||||
COMPARE_SCALAR_FIELD(absent_on_null);
|
||||
COMPARE_SCALAR_FIELD(unique);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonKeyValue(const JsonKeyValue *a, const JsonKeyValue *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(key);
|
||||
COMPARE_NODE_FIELD(value);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonObjectConstructor(const JsonObjectConstructor *a,
|
||||
const JsonObjectConstructor *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(exprs);
|
||||
COMPARE_NODE_FIELD(output);
|
||||
COMPARE_SCALAR_FIELD(absent_on_null);
|
||||
COMPARE_SCALAR_FIELD(unique);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonAggConstructor(const JsonAggConstructor *a,
|
||||
const JsonAggConstructor *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(output);
|
||||
COMPARE_NODE_FIELD(agg_filter);
|
||||
COMPARE_NODE_FIELD(agg_order);
|
||||
COMPARE_NODE_FIELD(over);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonObjectAgg(const JsonObjectAgg *a, const JsonObjectAgg *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(constructor);
|
||||
COMPARE_NODE_FIELD(arg);
|
||||
COMPARE_SCALAR_FIELD(absent_on_null);
|
||||
COMPARE_SCALAR_FIELD(unique);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonOutput(const JsonOutput *a, const JsonOutput *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(typeName);
|
||||
COMPARE_NODE_FIELD(returning);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonArrayConstructor(const JsonArrayConstructor *a,
|
||||
const JsonArrayConstructor *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(exprs);
|
||||
COMPARE_NODE_FIELD(output);
|
||||
COMPARE_SCALAR_FIELD(absent_on_null);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonArrayAgg(const JsonArrayAgg *a, const JsonArrayAgg *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(constructor);
|
||||
COMPARE_NODE_FIELD(arg);
|
||||
COMPARE_SCALAR_FIELD(absent_on_null);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalJsonArrayQueryConstructor(const JsonArrayQueryConstructor *a,
|
||||
const JsonArrayQueryConstructor *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(query);
|
||||
COMPARE_NODE_FIELD(output);
|
||||
COMPARE_NODE_FIELD(format);
|
||||
COMPARE_SCALAR_FIELD(absent_on_null);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Stuff from pathnodes.h
|
||||
*/
|
||||
@@ -3398,6 +3503,9 @@ equal(const void *a, const void *b)
|
||||
case T_JsonValueExpr:
|
||||
retval = _equalJsonValueExpr(a, b);
|
||||
break;
|
||||
case T_JsonConstructorExpr:
|
||||
retval = _equalJsonConstructorExpr(a, b);
|
||||
break;
|
||||
|
||||
/*
|
||||
* RELATION NODES
|
||||
@@ -3978,6 +4086,30 @@ equal(const void *a, const void *b)
|
||||
case T_PublicationTable:
|
||||
retval = _equalPublicationTable(a, b);
|
||||
break;
|
||||
case T_JsonKeyValue:
|
||||
retval = _equalJsonKeyValue(a, b);
|
||||
break;
|
||||
case T_JsonObjectConstructor:
|
||||
retval = _equalJsonObjectConstructor(a, b);
|
||||
break;
|
||||
case T_JsonAggConstructor:
|
||||
retval = _equalJsonAggConstructor(a, b);
|
||||
break;
|
||||
case T_JsonObjectAgg:
|
||||
retval = _equalJsonObjectAgg(a, b);
|
||||
break;
|
||||
case T_JsonOutput:
|
||||
retval = _equalJsonOutput(a, b);
|
||||
break;
|
||||
case T_JsonArrayConstructor:
|
||||
retval = _equalJsonArrayConstructor(a, b);
|
||||
break;
|
||||
case T_JsonArrayQueryConstructor:
|
||||
retval = _equalJsonArrayQueryConstructor(a, b);
|
||||
break;
|
||||
case T_JsonArrayAgg:
|
||||
retval = _equalJsonArrayAgg(a, b);
|
||||
break;
|
||||
|
||||
default:
|
||||
elog(ERROR, "unrecognized node type: %d",
|
||||
|
Reference in New Issue
Block a user