Re: remaining sql/json patches - Mailing list pgsql-hackers
From | jian he |
---|---|
Subject | Re: remaining sql/json patches |
Date | |
Msg-id | CACJufxGJV7e=r2tn3QMinfnJZNS2TmXyyzvez9rNoAPOb2j2ZA@mail.gmail.com Whole thread Raw |
In response to | Re: remaining sql/json patches (Amit Langote <amitlangote09@gmail.com>) |
Responses |
Re: remaining sql/json patches
Re: remaining sql/json patches Re: remaining sql/json patches |
List | pgsql-hackers |
FAILED: src/interfaces/ecpg/test/sql/sqljson_jsontable.c /home/jian/postgres/buildtest6/src/interfaces/ecpg/preproc/ecpg --regression -I../../Desktop/pg_src/src6/postgres/src/interfaces/ecpg/test/sql -I../../Desktop/pg_src/src6/postgres/src/interfaces/ecpg/include/ -o src/interfaces/ecpg/test/sql/sqljson_jsontable.c ../../Desktop/pg_src/src6/postgres/src/interfaces/ecpg/test/sql/sqljson_jsontable.pgc ../../Desktop/pg_src/src6/postgres/src/interfaces/ecpg/test/sql/sqljson_jsontable.pgc:21: WARNING: unsupported feature will be passed to server ../../Desktop/pg_src/src6/postgres/src/interfaces/ecpg/test/sql/sqljson_jsontable.pgc:32: ERROR: syntax error at or near ";" need an extra closing parenthesis? <para> The rows produced by <function>JSON_TABLE</function> are laterally joined to the row that generated them, so you do not have to explicitly join the constructed view with the original table holding <acronym>JSON</acronym> - data. need closing para. SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 text PATH '$' error on empty error on error) EMPTY ON ERROR); should i expect it return one row? is there any example to make it return one row from top level "EMPTY ON ERROR"? + { + JsonTablePlan *scan = (JsonTablePlan *) plan; + + JsonTableInitPathScan(cxt, planstate, args, mcxt); + + planstate->nested = scan->child ? + JsonTableInitPlan(cxt, scan->child, planstate, args, mcxt) : NULL; + } first line seems strange, do we just simply change from "plan" to "scan"? + case JTC_REGULAR: + typenameTypeIdAndMod(pstate, rawc->typeName, &typid, &typmod); + + /* + * Use implicit FORMAT JSON for composite types (arrays and + * records) or if a non-default WRAPPER / QUOTES behavior is + * specified. + */ + if (typeIsComposite(typid) || + rawc->quotes != JS_QUOTES_UNSPEC || + rawc->wrapper != JSW_UNSPEC) + rawc->coltype = JTC_FORMATTED; per previous discussion, should we refactor the above comment? +/* Recursively set 'reset' flag of planstate and its child nodes */ +static void +JsonTablePlanReset(JsonTablePlanState *planstate) +{ + if (IsA(planstate->plan, JsonTableSiblingJoin)) + { + JsonTablePlanReset(planstate->left); + JsonTablePlanReset(planstate->right); + planstate->advanceRight = false; + } + else + { + planstate->reset = true; + planstate->advanceNested = false; + + if (planstate->nested) + JsonTablePlanReset(planstate->nested); + } per coverage, the first part of the IF branch never executed. i also found out that JsonTablePlanReset is quite similar to JsonTableRescan, i don't fully understand these two functions though. SELECT * FROM JSON_TABLE(jsonb'{"a": {"z":[1111]}, "b": 1,"c": 2, "d": 91}', '$' COLUMNS ( c int path '$.c', d int path '$.d', id1 for ordinality, NESTED PATH '$.a.z[*]' columns (z int path '$', id for ordinality) )); doc seems to say that duplicated ordinality columns in different nest levels are not allowed? "currentRow" naming seems misleading, generally, when we think of "row", we think of several (not one) datums, or several columns. but here, we only have one datum. I don't have good optional naming though. + case JTC_FORMATTED: + case JTC_EXISTS: + { + Node *je; + CaseTestExpr *param = makeNode(CaseTestExpr); + + param->collation = InvalidOid; + param->typeId = contextItemTypid; + param->typeMod = -1; + + je = transformJsonTableColumn(rawc, (Node *) param, + NIL, errorOnError); + + colexpr = transformExpr(pstate, je, EXPR_KIND_FROM_FUNCTION); + assign_expr_collations(pstate, colexpr); + + typid = exprType(colexpr); + typmod = exprTypmod(colexpr); + break; + } + + default: + elog(ERROR, "unknown JSON_TABLE column type: %d", rawc->coltype); + break; + } + + tf->coltypes = lappend_oid(tf->coltypes, typid); + tf->coltypmods = lappend_int(tf->coltypmods, typmod); + tf->colcollations = lappend_oid(tf->colcollations, get_typcollation(typid)); + tf->colvalexprs = lappend(tf->colvalexprs, colexpr); why not use exprCollation(colexpr) for tf->colcollations, similar to exprType(colexpr)? +-- Should fail (JSON arguments are not passed to column paths) +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 10 AS x + COLUMNS (y text FORMAT JSON PATH '$ ? (@ < $x)') + ) jt; +ERROR: could not find jsonpath variable "x" the error message does not correspond to the comments intention. also "y text FORMAT JSON" should be fine? only the second last example really using the PASSING clause. should the following query work just fine in this context? create table s(js jsonb); insert into s select '{"a":{"za":[{"z1": [11,2222]},{"z21": [22, 234,2345]}]},"c": 3}'; SELECT sub.* FROM s,JSON_TABLE(js, '$' passing 11 AS "b c", 1 + 2 as y COLUMNS (xx int path '$.c ? (@ == $y)')) sub; I thought the json and text data type were quite similar. should these following two queries return the same result? SELECT sub.* FROM s, JSON_TABLE(js, '$' COLUMNS( xx int path '$.c', nested PATH '$.a.za[1]' columns (NESTED PATH '$.z21[*]' COLUMNS (a12 jsonb path '$')) ))sub; SELECT sub.* FROM s,JSON_TABLE(js, '$' COLUMNS ( c int path '$.c', NESTED PATH '$.a.za[1]' columns (z json path '$') )) sub;
pgsql-hackers by date: