Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4b3a5f7

Browse files
author
Nikita Glukhov
committed
Refactor transformJsonIsPredicate()
1 parent62db6a7 commit4b3a5f7

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

‎src/backend/parser/parse_expr.c

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4346,28 +4346,25 @@ transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor)
43464346
ctor->location);
43474347
}
43484348

4349-
/*
4350-
* Transform IS JSON predicate into
4351-
* json[b]_is_valid(json, value_type [, check_key_uniqueness]) call.
4352-
*/
43534349
staticNode*
4354-
transformJsonIsPredicate(ParseState*pstate,JsonIsPredicate*pred)
4350+
transformJsonParseArg(ParseState*pstate,Node*jsexpr,JsonFormat*format,
4351+
Oid*exprtype)
43554352
{
4356-
Node*raw_expr=transformExprRecurse(pstate,pred->expr);
4353+
Node*raw_expr=transformExprRecurse(pstate,jsexpr);
43574354
Node*expr=raw_expr;
4358-
Oidexprtype=exprType(expr);
4355+
4356+
*exprtype=exprType(expr);
43594357

43604358
/* prepare input document */
4361-
if (exprtype==BYTEAOID)
4359+
if (*exprtype==BYTEAOID)
43624360
{
43634361
JsonValueExpr*jve;
43644362

43654363
expr=makeCaseTestExpr(raw_expr);
4366-
expr=makeJsonByteaToTextConversion(expr,pred->format,
4367-
exprLocation(expr));
4368-
exprtype=TEXTOID;
4364+
expr=makeJsonByteaToTextConversion(expr,format,exprLocation(expr));
4365+
*exprtype=TEXTOID;
43694366

4370-
jve=makeJsonValueExpr((Expr*)raw_expr,pred->format);
4367+
jve=makeJsonValueExpr((Expr*)raw_expr,format);
43714368

43724369
jve->formatted_expr= (Expr*)expr;
43734370
expr= (Node*)jve;
@@ -4377,31 +4374,45 @@ transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred)
43774374
chartypcategory;
43784375
booltypispreferred;
43794376

4380-
get_type_category_preferred(exprtype,&typcategory,&typispreferred);
4377+
get_type_category_preferred(*exprtype,&typcategory,&typispreferred);
43814378

4382-
if (exprtype==UNKNOWNOID||typcategory==TYPCATEGORY_STRING)
4379+
if (*exprtype==UNKNOWNOID||typcategory==TYPCATEGORY_STRING)
43834380
{
4384-
expr=coerce_to_target_type(pstate, (Node*)expr,exprtype,
4381+
expr=coerce_to_target_type(pstate, (Node*)expr,*exprtype,
43854382
TEXTOID,-1,
43864383
COERCION_IMPLICIT,
43874384
COERCE_IMPLICIT_CAST,-1);
4388-
exprtype=TEXTOID;
4385+
*exprtype=TEXTOID;
43894386
}
43904387

4391-
if (pred->format->encoding!=JS_ENC_DEFAULT)
4388+
if (format->encoding!=JS_ENC_DEFAULT)
43924389
ereport(ERROR,
43934390
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4394-
parser_errposition(pstate,pred->format->location),
4391+
parser_errposition(pstate,format->location),
43954392
errmsg("cannot use JSON FORMAT ENCODING clause for non-bytea input types")));
43964393
}
43974394

4395+
returnexpr;
4396+
}
4397+
4398+
/*
4399+
* Transform IS JSON predicate into
4400+
* json[b]_is_valid(json, value_type [, check_key_uniqueness]) call.
4401+
*/
4402+
staticNode*
4403+
transformJsonIsPredicate(ParseState*pstate,JsonIsPredicate*pred)
4404+
{
4405+
Oidexprtype;
4406+
Node*expr=transformJsonParseArg(pstate,pred->expr,pred->format,
4407+
&exprtype);
4408+
43984409
/* make resulting expression */
43994410
if (exprtype!=TEXTOID&&exprtype!=JSONOID&&exprtype!=JSONBOID)
44004411
ereport(ERROR,
44014412
(errcode(ERRCODE_DATATYPE_MISMATCH),
44024413
errmsg("cannot use type %s in IS JSON predicate",
44034414
format_type_be(exprtype))));
44044415

4405-
returnmakeJsonIsPredicate((Node*)expr,NULL,pred->value_type,
4416+
returnmakeJsonIsPredicate(expr,NULL,pred->value_type,
44064417
pred->unique_keys,pred->location);
44074418
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp