diff options
author | marsaly <marsaly@ydb.tech> | 2023-12-14 19:36:48 +0300 |
---|---|---|
committer | marsaly <marsaly@ydb.tech> | 2023-12-14 20:29:33 +0300 |
commit | 7f3897e948d99ad46654f4c256948296692b45d0 (patch) | |
tree | c052d1f7b50b3ec54f47d54ad99012360f2f5ab4 | |
parent | c68f7e8d18583fc189c8349895f3f3d8e84bd7bc (diff) | |
download | ydb-7f3897e948d99ad46654f4c256948296692b45d0.tar.gz |
Fix WriteTableToStream in pgrun
Fixed null output in table
94 files changed, 51025 insertions, 590 deletions
diff --git a/ydb/library/yql/tests/postgresql/cases/aggregates.err b/ydb/library/yql/tests/postgresql/cases/aggregates.err index 6915806ab1..695de54f18 100644 --- a/ydb/library/yql/tests/postgresql/cases/aggregates.err +++ b/ydb/library/yql/tests/postgresql/cases/aggregates.err @@ -152,17 +152,1206 @@ SELECT var_samp(b::numeric) FROM aggtest; -- is not SELECT var_pop(1.0::float8), var_samp(2.0::float8); </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F8A03C29D90) -__libc_start_main+128 (0x7F8A03C29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8); +</sql-statement> +<sql-statement> +SELECT var_pop('inf'::float8), var_samp('inf'::float8); +</sql-statement> +<sql-statement> +SELECT stddev_pop('inf'::float8), stddev_samp('inf'::float8); +</sql-statement> +<sql-statement> +SELECT var_pop('nan'::float8), var_samp('nan'::float8); +</sql-statement> +<sql-statement> +SELECT stddev_pop('nan'::float8), stddev_samp('nan'::float8); +</sql-statement> +<sql-statement> +SELECT var_pop(1.0::float4), var_samp(2.0::float4); +</sql-statement> +<sql-statement> +SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4); +</sql-statement> +<sql-statement> +SELECT var_pop('inf'::float4), var_samp('inf'::float4); +</sql-statement> +<sql-statement> +SELECT stddev_pop('inf'::float4), stddev_samp('inf'::float4); +</sql-statement> +<sql-statement> +SELECT var_pop('nan'::float4), var_samp('nan'::float4); +</sql-statement> +<sql-statement> +SELECT stddev_pop('nan'::float4), stddev_samp('nan'::float4); +</sql-statement> +<sql-statement> +SELECT var_pop(1.0::numeric), var_samp(2.0::numeric); +</sql-statement> +<sql-statement> +SELECT stddev_pop(3.0::numeric), stddev_samp(4.0::numeric); +</sql-statement> +<sql-statement> +SELECT var_pop('inf'::numeric), var_samp('inf'::numeric); +</sql-statement> +<sql-statement> +SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric); +</sql-statement> +<sql-statement> +SELECT var_pop('nan'::numeric), var_samp('nan'::numeric); +</sql-statement> +<sql-statement> +SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric); +</sql-statement> +<sql-statement> +-- verify correct results for null and NaN inputs +select sum(null::int4) from generate_series(1,3); +</sql-statement> +<sql-statement> +select sum(null::int8) from generate_series(1,3); +</sql-statement> +<sql-statement> +select sum(null::numeric) from generate_series(1,3); +</sql-statement> +<sql-statement> +select sum(null::float8) from generate_series(1,3); +</sql-statement> +<sql-statement> +select avg(null::int4) from generate_series(1,3); +</sql-statement> +<sql-statement> +select avg(null::int8) from generate_series(1,3); +</sql-statement> +<sql-statement> +select avg(null::numeric) from generate_series(1,3); +</sql-statement> +<sql-statement> +select avg(null::float8) from generate_series(1,3); +</sql-statement> +<sql-statement> +select sum('NaN'::numeric) from generate_series(1,3); +</sql-statement> +<sql-statement> +select avg('NaN'::numeric) from generate_series(1,3); +</sql-statement> +<sql-statement> +-- verify correct results for infinite inputs +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('1'), ('infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('infinity'), ('1')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('infinity'), ('infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('-infinity'), ('infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('1'), ('infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('1')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('infinity')) v(x); +</sql-statement> +<sql-statement> +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); +</sql-statement> +<sql-statement> +-- test accuracy with a large input offset +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x); +</sql-statement> +<sql-statement> +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (7000000000005), (7000000000007)) v(x); +</sql-statement> +<sql-statement> +-- SQL2003 binary aggregates +SELECT regr_count(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT regr_sxx(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT regr_syy(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT regr_sxy(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT regr_avgx(b, a), regr_avgy(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT regr_r2(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT regr_slope(b, a), regr_intercept(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +SELECT corr(b, a) FROM aggtest; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.aggtest + +<sql-statement> +-- check single-tuple behavior +SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8); +</sql-statement> +<sql-statement> +SELECT covar_pop(1::float8,'inf'::float8), covar_samp(3::float8,'inf'::float8); +</sql-statement> +<sql-statement> +SELECT covar_pop(1::float8,'nan'::float8), covar_samp(3::float8,'nan'::float8); +</sql-statement> +<sql-statement> +-- test accum and combine functions directly +CREATE TABLE regr_test (x float8, y float8); +</sql-statement> +<sql-statement> +INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200); +</sql-statement> +<sql-statement> +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (10,20,30,80); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) + ^ + -stdin-:<main>:2:24: Error: At function: PgIn + FROM regr_test WHERE x IN (10,20,30,80); + ^ + -stdin-:<main>:2:24: Error: Mismatch of types in IN expressions: float8 is not equal to int4 + FROM regr_test WHERE x IN (10,20,30,80); + ^ +<sql-statement> +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test; +</sql-statement> +<sql-statement> +SELECT float8_accum('{4,140,2900}'::float8[], 100); +</sql-statement> +<sql-statement> +SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100); +</sql-statement> +<sql-statement> +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (10,20,30); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) + ^ + -stdin-:<main>:2:24: Error: At function: PgIn + FROM regr_test WHERE x IN (10,20,30); + ^ + -stdin-:<main>:2:24: Error: Mismatch of types in IN expressions: float8 is not equal to int4 + FROM regr_test WHERE x IN (10,20,30); + ^ +<sql-statement> +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (80,100); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) + ^ + -stdin-:<main>:2:24: Error: At function: PgIn + FROM regr_test WHERE x IN (80,100); + ^ + -stdin-:<main>:2:24: Error: Mismatch of types in IN expressions: float8 is not equal to int4 + FROM regr_test WHERE x IN (80,100); + ^ +<sql-statement> +SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]); +</sql-statement> +<sql-statement> +SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]); +</sql-statement> +<sql-statement> +SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]); +</sql-statement> +<sql-statement> +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{0,0,0,0,0,0}'::float8[]); +</sql-statement> +<sql-statement> +SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); +</sql-statement> +<sql-statement> +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); +</sql-statement> +<sql-statement> +DROP TABLE regr_test; +</sql-statement> +<sql-statement> +-- test count, distinct +SELECT count(four) AS cnt_1000 FROM onek; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +SELECT count(DISTINCT four) AS cnt_4 FROM onek; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +select ten, count(*), sum(four) from onek +group by ten order by ten; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +select ten, count(four), sum(DISTINCT four) from onek +group by ten order by ten; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +-- user-defined aggregates +SELECT newavg(four) AS avg_1 FROM onek; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +SELECT newsum(four) AS sum_1500 FROM onek; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +SELECT newcnt(four) AS cnt_1000 FROM onek; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek + +<sql-statement> +SELECT newcnt(*) AS cnt_1000 FROM onek; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: * is expected only in count function + SELECT newcnt(*) AS cnt_1000 FROM onek; + ^ +<sql-statement> +SELECT oldcnt(*) AS cnt_1000 FROM onek; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: * is expected only in count function + SELECT oldcnt(*) AS cnt_1000 FROM onek; + ^ +<sql-statement> +SELECT sum2(q1,q2) FROM int8_tbl; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +-- test for outer-level aggregates +-- this should work +select ten, sum(distinct four) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:43: Error: Aggregate functions are not allowed in: WHERE + having exists (select 1 from onek b where sum(distinct a.four) = b.four); + ^ +<sql-statement> +-- this should fail because subquery has an agg of its own in WHERE +select ten, sum(distinct four) from onek a +group by ten +having exists (select 1 from onek b + where sum(distinct a.four + b.four) = b.four); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:22: Error: Aggregate functions are not allowed in: WHERE + where sum(distinct a.four + b.four) = b.four); + ^ +<sql-statement> +-- Test handling of sublinks within outer-level aggregates. +-- Per bug report from Daniel Grace. +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1))) +from tenk1 o; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- Test handling of Params within aggregate arguments in hashed aggregation. +-- Per bug report from Jeevan Chalke. +explain (verbose, costs off) +select s1, s2, sm +from generate_series(1, 3) s1, + lateral (select s2, sum(s1 + s2) sm + from generate_series(1, 3) s2 group by s2) ss +order by 1, 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test handling of Params within aggregate arguments in hashed aggregation. + ^ +<sql-statement> +select s1, s2, sm +from generate_series(1, 3) s1, + lateral (select s2, sum(s1 + s2) sm + from generate_series(1, 3) s2 group by s2) ss +order by 1, 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeSubselect: unsupported lateral + select s1, s2, sm + ^ +<sql-statement> +explain (verbose, costs off) +select array(select sum(x+y) s + from generate_series(1,3) y group by y order by s) + from generate_series(1,3) x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (verbose, costs off) + ^ +<sql-statement> +select array(select sum(x+y) s + from generate_series(1,3) y group by y order by s) + from generate_series(1,3) x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: SublinkExpr: unsupported link type: 6 + select array(select sum(x+y) s + ^ +<sql-statement> +-- +-- test for bitwise integer aggregates +-- +CREATE TEMPORARY TABLE bitwise_test( + i2 INT2, + i4 INT4, + i8 INT8, + i INTEGER, + x INT2, + y BIT(4) +); +</sql-statement> +<sql-statement> +-- empty case +SELECT + BIT_AND(i2) AS "?", + BIT_OR(i4) AS "?", + BIT_XOR(i8) AS "?" +FROM bitwise_test; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- empty case + ^ + -stdin-:<main>:1:1: Error: Duplicated member: ? + -- empty case + ^ +<sql-statement> +COPY bitwise_test FROM STDIN NULL 'null'; +1 1 1 1 1 B0101 +3 3 3 null 2 B0100 +7 7 7 3 4 B1100 +\. +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "1" + + 1 1 1 1 1 B0101 + ^ +<sql-statement> +SELECT + BIT_AND(i2) AS "1", + BIT_AND(i4) AS "1", + BIT_AND(i8) AS "1", + BIT_AND(i) AS "?", + BIT_AND(x) AS "0", + BIT_AND(y) AS "0100", + BIT_OR(i2) AS "7", + BIT_OR(i4) AS "7", + BIT_OR(i8) AS "7", + BIT_OR(i) AS "?", + BIT_OR(x) AS "7", + BIT_OR(y) AS "1101", + BIT_XOR(i2) AS "5", + BIT_XOR(i4) AS "5", + BIT_XOR(i8) AS "5", + BIT_XOR(i) AS "?", + BIT_XOR(x) AS "7", + BIT_XOR(y) AS "1101" +FROM bitwise_test; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT + ^ + -stdin-:<main>:1:1: Error: Duplicated member: 1 + SELECT + ^ +<sql-statement> +-- +-- test boolean aggregates +-- +-- first test all possible transition and final states +SELECT + -- boolean and transitions + -- null because strict + booland_statefunc(NULL, NULL) IS NULL AS "t", + booland_statefunc(TRUE, NULL) IS NULL AS "t", + booland_statefunc(FALSE, NULL) IS NULL AS "t", + booland_statefunc(NULL, TRUE) IS NULL AS "t", + booland_statefunc(NULL, FALSE) IS NULL AS "t", + -- and actual computations + booland_statefunc(TRUE, TRUE) AS "t", + NOT booland_statefunc(TRUE, FALSE) AS "t", + NOT booland_statefunc(FALSE, TRUE) AS "t", + NOT booland_statefunc(FALSE, FALSE) AS "t"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- + ^ + -stdin-:<main>:1:1: Error: Duplicated member: t + -- + ^ +<sql-statement> +SELECT + -- boolean or transitions + -- null because strict + boolor_statefunc(NULL, NULL) IS NULL AS "t", + boolor_statefunc(TRUE, NULL) IS NULL AS "t", + boolor_statefunc(FALSE, NULL) IS NULL AS "t", + boolor_statefunc(NULL, TRUE) IS NULL AS "t", + boolor_statefunc(NULL, FALSE) IS NULL AS "t", + -- actual computations + boolor_statefunc(TRUE, TRUE) AS "t", + boolor_statefunc(TRUE, FALSE) AS "t", + boolor_statefunc(FALSE, TRUE) AS "t", + NOT boolor_statefunc(FALSE, FALSE) AS "t"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT + ^ + -stdin-:<main>:1:1: Error: Duplicated member: t + SELECT + ^ +<sql-statement> +CREATE TEMPORARY TABLE bool_test( + b1 BOOL, + b2 BOOL, + b3 BOOL, + b4 BOOL); +</sql-statement> +<sql-statement> +-- empty case +SELECT + BOOL_AND(b1) AS "n", + BOOL_OR(b3) AS "n" +FROM bool_test; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- empty case + ^ + -stdin-:<main>:1:1: Error: Duplicated member: n + -- empty case + ^ +<sql-statement> +COPY bool_test FROM STDIN NULL 'null'; +TRUE null FALSE null +FALSE TRUE null null +null TRUE FALSE null +\. +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "TRUE" + + TRUE null FALSE null + ^ +<sql-statement> +SELECT + BOOL_AND(b1) AS "f", + BOOL_AND(b2) AS "t", + BOOL_AND(b3) AS "f", + BOOL_AND(b4) AS "n", + BOOL_AND(NOT b2) AS "f", + BOOL_AND(NOT b3) AS "t" +FROM bool_test; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT + ^ + -stdin-:<main>:1:1: Error: Duplicated member: f + SELECT + ^ +<sql-statement> +SELECT + EVERY(b1) AS "f", + EVERY(b2) AS "t", + EVERY(b3) AS "f", + EVERY(b4) AS "n", + EVERY(NOT b2) AS "f", + EVERY(NOT b3) AS "t" +FROM bool_test; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT + ^ + -stdin-:<main>:1:1: Error: Duplicated member: f + SELECT + ^ +<sql-statement> +SELECT + BOOL_OR(b1) AS "t", + BOOL_OR(b2) AS "t", + BOOL_OR(b3) AS "f", + BOOL_OR(b4) AS "n", + BOOL_OR(NOT b2) AS "f", + BOOL_OR(NOT b3) AS "t" +FROM bool_test; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT + ^ + -stdin-:<main>:1:1: Error: Duplicated member: f + SELECT + ^ +<sql-statement> +-- +-- Test cases that should be optimized into indexscans instead of +-- the generic aggregate implementation. +-- +-- Basic cases +explain (costs off) + select min(unique1) from tenk1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select min(unique1) from tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique1) from tenk1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique1) from tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique1) from tenk1 where unique1 < 42; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique1) from tenk1 where unique1 < 42; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique1) from tenk1 where unique1 > 42; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique1) from tenk1 where unique1 > 42; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- the planner may choose a generic aggregate here if parallel query is +-- enabled, since that plan will be parallel safe and the "optimized" +-- plan, which has almost identical cost, will not be. we want to test +-- the optimized plan, so temporarily disable parallel query. +begin; +</sql-statement> +<sql-statement> +set local max_parallel_workers_per_gather = 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: max_parallel_workers_per_gather + set local max_parallel_workers_per_gather = 0; + ^ +<sql-statement> +explain (costs off) + select max(unique1) from tenk1 where unique1 > 42000; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique1) from tenk1 where unique1 > 42000; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +rollback; +</sql-statement> +<sql-statement> +-- multi-column index (uses tenk1_thous_tenthous) +explain (costs off) + select max(tenthous) from tenk1 where thousand = 33; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- multi-column index (uses tenk1_thous_tenthous) + ^ +<sql-statement> +select max(tenthous) from tenk1 where thousand = 33; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select min(tenthous) from tenk1 where thousand = 33; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select min(tenthous) from tenk1 where thousand = 33; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- check parameter propagation into an indexscan subquery +explain (costs off) + select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt + from int4_tbl; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- check parameter propagation into an indexscan subquery + ^ +<sql-statement> +select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt + from int4_tbl; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- check some cases that were handled incorrectly in 8.3.0 +explain (costs off) + select distinct max(unique2) from tenk1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- check some cases that were handled incorrectly in 8.3.0 + ^ +<sql-statement> +select distinct max(unique2) from tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique2) from tenk1 order by 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique2) from tenk1 order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique2) from tenk1 order by max(unique2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique2) from tenk1 order by max(unique2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique2) from tenk1 order by max(unique2)+1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique2) from tenk1 order by max(unique2)+1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +explain (costs off) + select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:22: Error: Generator functions are not allowed in: SELECT + select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; + ^ +<sql-statement> +-- interesting corner case: constant gets optimized into a seqscan +explain (costs off) + select max(100) from tenk1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- interesting corner case: constant gets optimized into a seqscan + ^ +<sql-statement> +select max(100) from tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- try it on an inheritance tree +create table minmaxtest(f1 int); +</sql-statement> +<sql-statement> +create table minmaxtest1() inherits (minmaxtest); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table minmaxtest1() inherits (minmaxtest); + ^ +<sql-statement> +create table minmaxtest2() inherits (minmaxtest); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table minmaxtest2() inherits (minmaxtest); + ^ +<sql-statement> +create table minmaxtest3() inherits (minmaxtest); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table minmaxtest3() inherits (minmaxtest); + ^ +<sql-statement> +create index minmaxtesti on minmaxtest(f1); +</sql-statement> +<sql-statement> +create index minmaxtest1i on minmaxtest1(f1); +</sql-statement> +<sql-statement> +create index minmaxtest2i on minmaxtest2(f1 desc); +</sql-statement> +<sql-statement> +create index minmaxtest3i on minmaxtest3(f1) where f1 is not null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: partial index is not supported yet + create index minmaxtest3i on minmaxtest3(f1) where f1 is not null; + ^ +<sql-statement> +insert into minmaxtest values(11), (12); +</sql-statement> +<sql-statement> +insert into minmaxtest1 values(13), (14); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.minmaxtest1 + +<sql-statement> +insert into minmaxtest2 values(15), (16); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.minmaxtest2 + +<sql-statement> +insert into minmaxtest3 values(17), (18); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.minmaxtest3 + +<sql-statement> +explain (costs off) + select min(f1), max(f1) from minmaxtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select min(f1), max(f1) from minmaxtest; +</sql-statement> +<sql-statement> +-- DISTINCT doesn't do anything useful here, but it shouldn't fail +explain (costs off) + select distinct min(f1), max(f1) from minmaxtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- DISTINCT doesn't do anything useful here, but it shouldn't fail + ^ +<sql-statement> +select distinct min(f1), max(f1) from minmaxtest; +</sql-statement> +<sql-statement> +drop table minmaxtest cascade; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: CASCADE is not implemented + drop table minmaxtest cascade; + ^ +<sql-statement> +-- check for correct detection of nested-aggregate errors +select max(min(unique1)) from tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +select (select max(min(unique1)) from int8_tbl) from tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- Test removal of redundant GROUP BY columns +-- +create temp table t1 (a int, b int, c int, d int, primary key (a, b)); +</sql-statement> +<sql-statement> +create temp table t2 (x int, y int, z int, primary key (x, y)); +</sql-statement> +<sql-statement> +create temp table t3 (a int, b int, c int, primary key(a, b) deferrable); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DEFERRABLE constraints not supported + create temp table t3 (a int, b int, c int, primary key(a, b) deferrable); + ^ +<sql-statement> +-- Non-primary-key columns can be removed from GROUP BY +explain (costs off) select * from t1 group by a,b,c,d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Non-primary-key columns can be removed from GROUP BY + ^ +<sql-statement> +-- No removal can happen if the complete PK is not present in GROUP BY +explain (costs off) select a,c from t1 group by a,c,d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- No removal can happen if the complete PK is not present in GROUP BY + ^ +<sql-statement> +-- Test removal across multiple relations +explain (costs off) select * +from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y +group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.y,t2.z; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test removal across multiple relations + ^ +<sql-statement> +-- Test case where t1 can be optimized but not t2 +explain (costs off) select t1.*,t2.x,t2.z +from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y +group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.z; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test case where t1 can be optimized but not t2 + ^ +<sql-statement> +-- Cannot optimize when PK is deferrable +explain (costs off) select * from t3 group by a,b,c; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Cannot optimize when PK is deferrable + ^ +<sql-statement> +create temp table t1c () inherits (t1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create temp table t1c () inherits (t1); + ^ +<sql-statement> +-- Ensure we don't remove any columns when t1 has a child table +explain (costs off) select * from t1 group by a,b,c,d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Ensure we don't remove any columns when t1 has a child table + ^ +<sql-statement> +-- Okay to remove columns if we're only querying the parent. +explain (costs off) select * from only t1 group by a,b,c,d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Okay to remove columns if we're only querying the parent. + ^ +<sql-statement> +create temp table p_t1 ( + a int, + b int, + c int, + d int, + primary key(a,b) +) partition by list(a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + create temp table p_t1 ( + ^ +<sql-statement> +create temp table p_t1_1 partition of p_t1 for values in(1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create temp table p_t1_1 partition of p_t1 for values in(1); + ^ +<sql-statement> +create temp table p_t1_2 partition of p_t1 for values in(2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create temp table p_t1_2 partition of p_t1 for values in(2); + ^ +<sql-statement> +-- Ensure we can remove non-PK columns for partitioned tables. +explain (costs off) select * from p_t1 group by a,b,c,d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Ensure we can remove non-PK columns for partitioned tables. + ^ +<sql-statement> +drop table t1 cascade; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: CASCADE is not implemented + drop table t1 cascade; + ^ +<sql-statement> +drop table t2; +</sql-statement> +<sql-statement> +drop table t3; +</sql-statement> +<sql-statement> +drop table p_t1; +</sql-statement> +<sql-statement> +-- +-- Test GROUP BY matching of join columns that are type-coerced due to USING +-- +create temp table t1(f1 int, f2 bigint); +</sql-statement> +(TFileError) (File exists) util/system/file.cpp:857: can't open "/tmp/tmpbbmu_5di/t1" with mode CreateNew (0x00000003) diff --git a/ydb/library/yql/tests/postgresql/cases/aggregates.out b/ydb/library/yql/tests/postgresql/cases/aggregates.out index fa46df67fe..6bf57a8814 100644 --- a/ydb/library/yql/tests/postgresql/cases/aggregates.out +++ b/ydb/library/yql/tests/postgresql/cases/aggregates.out @@ -3,3 +3,199 @@ -- -- avoid bit-exact output here because operations may not be bit-exact. SET extra_float_digits = 0; +-- population variance is defined for a single tuple, sample variance +-- is not +SELECT var_pop(1.0::float8), var_samp(2.0::float8); + var_pop | var_samp +---------+---------- + 0 | +(1 row) + +SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8); + stddev_pop | stddev_samp +------------+------------- + 0 | +(1 row) + +SELECT var_pop(1.0::float4), var_samp(2.0::float4); + var_pop | var_samp +---------+---------- + 0 | +(1 row) + +SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4); + stddev_pop | stddev_samp +------------+------------- + 0 | +(1 row) + +SELECT var_pop('inf'::numeric), var_samp('inf'::numeric); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT var_pop('nan'::numeric), var_samp('nan'::numeric); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('1'), ('infinity')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('1')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('infinity')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('infinity')) v(x); + sum | avg | var_pop +-----+-----+--------- + NaN | NaN | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); + sum | avg | var_pop +-----------+-----------+--------- + -Infinity | -Infinity | NaN +(1 row) + +-- test accuracy with a large input offset +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x); + avg | var_pop +-----------+--------- + 100000005 | 2.5 +(1 row) + +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (7000000000005), (7000000000007)) v(x); + avg | var_pop +---------------+--------- + 7000000000006 | 1 +(1 row) + +-- check single-tuple behavior +SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8); + covar_pop | covar_samp +-----------+------------ + 0 | +(1 row) + +-- test accum and combine functions directly +CREATE TABLE regr_test (x float8, y float8); +INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200); +SELECT float8_accum('{4,140,2900}'::float8[], 100); + float8_accum +-------------- + {5,240,6280} +(1 row) + +SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100); + float8_regr_accum +------------------------------ + {5,240,6280,1490,95080,8680} +(1 row) + +SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]); + float8_combine +---------------- + {3,60,200} +(1 row) + +SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]); + float8_combine +---------------- + {2,180,200} +(1 row) + +SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]); + float8_combine +---------------- + {5,240,6280} +(1 row) + +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{0,0,0,0,0,0}'::float8[]); + float8_regr_combine +--------------------------- + {3,60,200,750,20000,2000} +(1 row) + +SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); + float8_regr_combine +----------------------------- + {2,180,200,740,57800,-3400} +(1 row) + +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); + float8_regr_combine +------------------------------ + {5,240,6280,1490,95080,8680} +(1 row) + +DROP TABLE regr_test; +-- +-- test for bitwise integer aggregates +-- +CREATE TEMPORARY TABLE bitwise_test( + i2 INT2, + i4 INT4, + i8 INT8, + i INTEGER, + x INT2, + y BIT(4) +); +CREATE TEMPORARY TABLE bool_test( + b1 BOOL, + b2 BOOL, + b3 BOOL, + b4 BOOL); +-- the planner may choose a generic aggregate here if parallel query is +-- enabled, since that plan will be parallel safe and the "optimized" +-- plan, which has almost identical cost, will not be. we want to test +-- the optimized plan, so temporarily disable parallel query. +begin; +rollback; +-- try it on an inheritance tree +create table minmaxtest(f1 int); +create index minmaxtesti on minmaxtest(f1); +create index minmaxtest1i on minmaxtest1(f1); +create index minmaxtest2i on minmaxtest2(f1 desc); +insert into minmaxtest values(11), (12); +-- +-- Test removal of redundant GROUP BY columns +-- +create temp table t1 (a int, b int, c int, d int, primary key (a, b)); +create temp table t2 (x int, y int, z int, primary key (x, y)); +drop table t2; diff --git a/ydb/library/yql/tests/postgresql/cases/aggregates.sql b/ydb/library/yql/tests/postgresql/cases/aggregates.sql index fa46df67fe..b1c7aa2488 100644 --- a/ydb/library/yql/tests/postgresql/cases/aggregates.sql +++ b/ydb/library/yql/tests/postgresql/cases/aggregates.sql @@ -3,3 +3,79 @@ -- -- avoid bit-exact output here because operations may not be bit-exact. SET extra_float_digits = 0; +-- population variance is defined for a single tuple, sample variance +-- is not +SELECT var_pop(1.0::float8), var_samp(2.0::float8); +SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8); +SELECT var_pop(1.0::float4), var_samp(2.0::float4); +SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4); +SELECT var_pop('inf'::numeric), var_samp('inf'::numeric); +SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric); +SELECT var_pop('nan'::numeric), var_samp('nan'::numeric); +SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('1'), ('infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('1')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); +-- test accuracy with a large input offset +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x); +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (7000000000005), (7000000000007)) v(x); +-- check single-tuple behavior +SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8); +-- test accum and combine functions directly +CREATE TABLE regr_test (x float8, y float8); +INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200); +SELECT float8_accum('{4,140,2900}'::float8[], 100); +SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100); +SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]); +SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]); +SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]); +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{0,0,0,0,0,0}'::float8[]); +SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); +DROP TABLE regr_test; +-- +-- test for bitwise integer aggregates +-- +CREATE TEMPORARY TABLE bitwise_test( + i2 INT2, + i4 INT4, + i8 INT8, + i INTEGER, + x INT2, + y BIT(4) +); +CREATE TEMPORARY TABLE bool_test( + b1 BOOL, + b2 BOOL, + b3 BOOL, + b4 BOOL); +-- the planner may choose a generic aggregate here if parallel query is +-- enabled, since that plan will be parallel safe and the "optimized" +-- plan, which has almost identical cost, will not be. we want to test +-- the optimized plan, so temporarily disable parallel query. +begin; +rollback; +-- try it on an inheritance tree +create table minmaxtest(f1 int); +create index minmaxtesti on minmaxtest(f1); +create index minmaxtest1i on minmaxtest1(f1); +create index minmaxtest2i on minmaxtest2(f1 desc); +insert into minmaxtest values(11), (12); +-- +-- Test removal of redundant GROUP BY columns +-- +create temp table t1 (a int, b int, c int, d int, primary key (a, b)); +create temp table t2 (x int, y int, z int, primary key (x, y)); +drop table t2; diff --git a/ydb/library/yql/tests/postgresql/cases/alter_table.err b/ydb/library/yql/tests/postgresql/cases/alter_table.err index 12ee740cab..df2d3c759a 100644 --- a/ydb/library/yql/tests/postgresql/cases/alter_table.err +++ b/ydb/library/yql/tests/postgresql/cases/alter_table.err @@ -252,17 +252,301 @@ INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, <sql-statement> SELECT * FROM attmp; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F12C4229D90) -__libc_start_main+128 (0x7F12C4229E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +DROP TABLE attmp; +</sql-statement> +<sql-statement> +-- the wolf bug - schema mods caused inconsistent row descriptors +CREATE TABLE attmp ( + initial int4 +); +</sql-statement> +<sql-statement> +ALTER TABLE attmp ADD COLUMN a int4; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN a int4; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN b name; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN b name; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN c text; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN c text; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN d float8; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN d float8; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN e float4; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN e float4; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN f int2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN f int2; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN g polygon; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN g polygon; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN i char; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN i char; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN k int4; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN k int4; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN l tid; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN l tid; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN m xid; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN m xid; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN n oidvector; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN n oidvector; + ^ +<sql-statement> +--ALTER TABLE attmp ADD COLUMN o lock; +ALTER TABLE attmp ADD COLUMN p boolean; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + --ALTER TABLE attmp ADD COLUMN o lock; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN q point; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN q point; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN r lseg; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN r lseg; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN s path; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN s path; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN t box; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN t box; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN v timestamp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN v timestamp; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN w interval; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN w interval; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN x float8[]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN x float8[]; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN y float4[]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN y float4[]; + ^ +<sql-statement> +ALTER TABLE attmp ADD COLUMN z int2[]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE attmp ADD COLUMN z int2[]; + ^ +<sql-statement> +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +</sql-statement> +<sql-statement> +SELECT * FROM attmp; +</sql-statement> +<sql-statement> +CREATE INDEX attmp_idx ON attmp (a, (d + e), b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: index expression is not supported yet + CREATE INDEX attmp_idx ON attmp (a, (d + e), b); + ^ +<sql-statement> +ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:37: Error: ERROR: column number must be in range from 1 to 32767 + + ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; + ^ +<sql-statement> +ALTER INDEX attmp_idx ALTER COLUMN 1 SET STATISTICS 1000; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER INDEX attmp_idx ALTER COLUMN 1 SET STATISTICS 1000; + ^ +<sql-statement> +ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS 1000; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS 1000; + ^ +<sql-statement> +\d+ attmp_idx +</sql-statement> +Metacommand \d+ attmp_idx is not supported +<sql-statement> +ALTER INDEX attmp_idx ALTER COLUMN 3 SET STATISTICS 1000; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER INDEX attmp_idx ALTER COLUMN 3 SET STATISTICS 1000; + ^ +<sql-statement> +ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000; + ^ +<sql-statement> +ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1; + ^ +<sql-statement> +DROP TABLE attmp; +</sql-statement> +<sql-statement> +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + -- fails with incorrect object type + ^ +<sql-statement> +ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; + ^ +<sql-statement> +DROP VIEW at_v1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: View not found: 'at_v1' + DROP VIEW at_v1; + ^ +<sql-statement> +-- +-- rename - check on both non-temp and temp tables +-- +CREATE TABLE attmp (regtable int); +</sql-statement> +<sql-statement> +CREATE TEMP TABLE attmp (attmptable int); +</sql-statement> +(TFileError) (File exists) util/system/file.cpp:857: can't open "/tmp/tmpuixf4gua/attmp" with mode CreateNew (0x00000003) diff --git a/ydb/library/yql/tests/postgresql/cases/alter_table.out b/ydb/library/yql/tests/postgresql/cases/alter_table.out index 6d5b65872f..bc76e6c498 100644 --- a/ydb/library/yql/tests/postgresql/cases/alter_table.out +++ b/ydb/library/yql/tests/postgresql/cases/alter_table.out @@ -16,3 +16,25 @@ INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +DROP TABLE attmp; +-- the wolf bug - schema mods caused inconsistent row descriptors +CREATE TABLE attmp ( + initial int4 +); +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; +ERROR: column number must be in range from 1 to 32767 +LINE 1: ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; + ^ +DROP TABLE attmp; +-- +-- rename - check on both non-temp and temp tables +-- +CREATE TABLE attmp (regtable int); diff --git a/ydb/library/yql/tests/postgresql/cases/alter_table.sql b/ydb/library/yql/tests/postgresql/cases/alter_table.sql index 6d5b65872f..de42fcae9c 100644 --- a/ydb/library/yql/tests/postgresql/cases/alter_table.sql +++ b/ydb/library/yql/tests/postgresql/cases/alter_table.sql @@ -16,3 +16,22 @@ INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +DROP TABLE attmp; +-- the wolf bug - schema mods caused inconsistent row descriptors +CREATE TABLE attmp ( + initial int4 +); +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; +DROP TABLE attmp; +-- +-- rename - check on both non-temp and temp tables +-- +CREATE TABLE attmp (regtable int); diff --git a/ydb/library/yql/tests/postgresql/cases/arrays.err b/ydb/library/yql/tests/postgresql/cases/arrays.err index 020782c11d..e5ef06d1fc 100644 --- a/ydb/library/yql/tests/postgresql/cases/arrays.err +++ b/ydb/library/yql/tests/postgresql/cases/arrays.err @@ -111,17 +111,3255 @@ INSERT INTO arrtest (b[1:2]) VALUES(now()); -- error, type mismatch <sql-statement> SELECT * FROM arrtest; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FE693C29D90) -__libc_start_main+128 (0x7FE693C29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT arrtest.a[1], + arrtest.b[1][1][1], + arrtest.c[1], + arrtest.d[1][1], + arrtest.e[0] + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT arrtest.a[1], + ^ +<sql-statement> +SELECT a[1], b[1][1][1], c[1], d[1][1], e[0] + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT a[1], b[1][1][1], c[1], d[1][1], e[0] + ^ +<sql-statement> +SELECT a[1:3], + b[1:1][1:2][1:2], + c[1:2], + d[1:1][1:2] + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT a[1:3], + ^ +<sql-statement> +SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_ndims with given argument types: (int2) + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:28: Error: At function: PgCall + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:28: Error: Unable to find an overload for proc array_ndims with given argument types: (int4) + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:48: Error: At function: PgCall + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ + -stdin-:<main>:1:48: Error: Unable to find an overload for proc array_ndims with given argument types: (name) + SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + ^ +<sql-statement> +SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_dims with given argument types: (int2) + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:27: Error: At function: PgCall + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:27: Error: Unable to find an overload for proc array_dims with given argument types: (int4) + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:46: Error: At function: PgCall + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ + -stdin-:<main>:1:46: Error: Unable to find an overload for proc array_dims with given argument types: (name) + SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + ^ +<sql-statement> +-- returns nothing +SELECT * + FROM arrtest + WHERE a[1] < 5 and + c = '{"foobar"}'::_name; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:15: Error: alternative is not implemented yet : 360 + WHERE a[1] < 5 and + ^ +<sql-statement> +UPDATE arrtest + SET a[1:2] = '{16,25}' + WHERE NOT a = '{}'::_int2; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +UPDATE arrtest + SET b[1:1][1:1][1:2] = '{113, 117}', + b[1:1][1:2][2:2] = '{142, 147}' + WHERE array_dims(b) = '[1:1][1:2][1:2]'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +UPDATE arrtest + SET c[2:2] = '{"new_word"}' + WHERE array_dims(c) is not null; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT a,b,c FROM arrtest; +</sql-statement> +<sql-statement> +SELECT a[1:3], + b[1:1][1:2][1:2], + c[1:2], + d[1:1][2:2] + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT a[1:3], + ^ +<sql-statement> +SELECT b[1:1][2][2], + d[1:1][2] + FROM arrtest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT b[1:1][2][2], + ^ +<sql-statement> +INSERT INTO arrtest(a) VALUES('{1,null,3}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arrtest(a) VALUES('{1,null,3}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type smallint: "{1,null,3}" + + INSERT INTO arrtest(a) VALUES('{1,null,3}'); + ^ +<sql-statement> +SELECT a FROM arrtest; +</sql-statement> +<sql-statement> +UPDATE arrtest SET a[4] = NULL WHERE a[2] IS NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: alternative is not implemented yet : 360 + UPDATE arrtest SET a[4] = NULL WHERE a[2] IS NULL; + ^ +<sql-statement> +SELECT a FROM arrtest WHERE a[2] IS NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:34: Error: alternative is not implemented yet : 360 + SELECT a FROM arrtest WHERE a[2] IS NULL; + ^ +<sql-statement> +DELETE FROM arrtest WHERE a[2] IS NULL AND b IS NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:32: Error: alternative is not implemented yet : 360 + DELETE FROM arrtest WHERE a[2] IS NULL AND b IS NULL; + ^ +<sql-statement> +SELECT a,b,c FROM arrtest; +</sql-statement> +<sql-statement> +-- test mixed slice/scalar subscripting +select '{{1,2,3},{4,5,6},{7,8,9}}'::int[]; +</sql-statement> +<sql-statement> +select ('{{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; + ^ +<sql-statement> +select '[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[]; +</sql-statement> +<sql-statement> +select ('[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; + ^ +<sql-statement> +-- +-- check subscription corner cases +-- +-- More subscripts than MAXDIM (6) +SELECT ('{}'::int[])[1][2][3][4][5][6][7]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- + ^ +<sql-statement> +-- NULL index yields NULL when selecting +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL][1]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- NULL index yields NULL when selecting + ^ +<sql-statement> +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL:1][1]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL:1][1]; + ^ +<sql-statement> +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][1:NULL][1]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][1:NULL][1]; + ^ +<sql-statement> +-- NULL index in assignment is an error +UPDATE arrtest + SET c[NULL] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +UPDATE arrtest + SET c[NULL:1] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +UPDATE arrtest + SET c[1:NULL] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- Un-subscriptable type +SELECT (now())[1]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- Un-subscriptable type + ^ +<sql-statement> +-- test slices with empty lower and/or upper index +CREATE TEMP TABLE arrtest_s ( + a int2[], + b int2[][] +); +</sql-statement> +<sql-statement> +INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}'); +</sql-statement> +<sql-statement> +INSERT INTO arrtest_s VALUES ('[0:4]={1,2,3,4,5}', '[0:2][0:2]={{1,2,3}, {4,5,6}, {7,8,9}}'); +</sql-statement> +<sql-statement> +SELECT * FROM arrtest_s; +</sql-statement> +<sql-statement> +SELECT a[:3], b[:2][:2] FROM arrtest_s; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT a[:3], b[:2][:2] FROM arrtest_s; + ^ +<sql-statement> +SELECT a[2:], b[2:][2:] FROM arrtest_s; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT a[2:], b[2:][2:] FROM arrtest_s; + ^ +<sql-statement> +SELECT a[:], b[:] FROM arrtest_s; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT a[:], b[:] FROM arrtest_s; + ^ +<sql-statement> +-- updates +UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{11,12}, {14,15}}' + WHERE array_lower(a,1) = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM arrtest_s; +</sql-statement> +<sql-statement> +UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{25,26}, {28,29}}'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM arrtest_s; +</sql-statement> +<sql-statement> +UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM arrtest_s; +</sql-statement> +<sql-statement> +UPDATE arrtest_s SET a[:] = '{23, 24, 25}'; -- fail, too small +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +INSERT INTO arrtest_s VALUES(NULL, NULL); +</sql-statement> +<sql-statement> +UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; -- fail, no good with null +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- check with fixed-length-array type, such as point +SELECT f1[0:1] FROM POINT_TBL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- check with fixed-length-array type, such as point + ^ +<sql-statement> +SELECT f1[0:] FROM POINT_TBL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT f1[0:] FROM POINT_TBL; + ^ +<sql-statement> +SELECT f1[:1] FROM POINT_TBL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT f1[:1] FROM POINT_TBL; + ^ +<sql-statement> +SELECT f1[:] FROM POINT_TBL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT f1[:] FROM POINT_TBL; + ^ +<sql-statement> +-- subscript assignments to fixed-width result in NULL if previous value is NULL +UPDATE point_tbl SET f1[0] = 10 WHERE f1 IS NULL RETURNING *; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +INSERT INTO point_tbl(f1[0]) VALUES(0) RETURNING *; +</sql-statement> +-stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'returning' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- NULL assignments get ignored +UPDATE point_tbl SET f1[0] = NULL WHERE f1::text = '(10,10)'::point::text RETURNING *; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- but non-NULL subscript assignments work +UPDATE point_tbl SET f1[0] = -10, f1[1] = -10 WHERE f1::text = '(10,10)'::point::text RETURNING *; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- but not to expand the range +UPDATE point_tbl SET f1[3] = 10 WHERE f1::text = '(-10,-10)'::point::text RETURNING *; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- +-- test array extension +-- +CREATE TEMP TABLE arrtest1 (i int[], t text[]); +</sql-statement> +<sql-statement> +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +</sql-statement> +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[2] = 22, t[2] = 'twenty-two'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[5] = 5, t[5] = 'five'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[8] = 8, t[8] = 'eight'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[0] = 0, t[0] = 'zero'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[-3] = -3, t[-3] = 'minus-three'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[0:2] = array[10,11,12], t[0:2] = array['ten','eleven','twelve']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[8:10] = array[18,null,20], t[8:10] = array['p18',null,'p20']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[11:12] = array[null,22], t[11:12] = array[null,'p22']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[15:16] = array[null,26], t[15:16] = array[null,'p26']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[-5:-3] = array[-15,-14,-13], t[-5:-3] = array['m15','m14','m13']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[-7:-6] = array[-17,null], t[-7:-6] = array['m17',null]; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[-12:-10] = array[-22,null,-20], t[-12:-10] = array['m22',null,'m20']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +delete from arrtest1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +</sql-statement> +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +update arrtest1 set i[0:5] = array[0,1,2,null,4,5], t[0:5] = array['z','p1','p2',null,'p4','p5']; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from arrtest1; +</sql-statement> +<sql-statement> +-- +-- array expressions and operators +-- +-- table creation and INSERTs +CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]); +</sql-statement> +<sql-statement> +INSERT INTO arrtest2 VALUES( + ARRAY[[[113,142],[1,147]]], + ARRAY[1.1,1.2,1.3]::float8[], + ARRAY[1.1,1.2,1.3], + ARRAY[[['aaa','aab'],['aba','abb'],['aca','acb']],[['baa','bab'],['bba','bbb'],['bca','bcb']]], + ARRAY['19620326','19931223','19970117']::timestamp[] +); +</sql-statement> +<sql-statement> +-- some more test data +CREATE TEMP TABLE arrtest_f (f0 int, f1 text, f2 float8); +</sql-statement> +<sql-statement> +insert into arrtest_f values(1,'cat1',1.21); +</sql-statement> +<sql-statement> +insert into arrtest_f values(2,'cat1',1.24); +</sql-statement> +<sql-statement> +insert into arrtest_f values(3,'cat1',1.18); +</sql-statement> +<sql-statement> +insert into arrtest_f values(4,'cat1',1.26); +</sql-statement> +<sql-statement> +insert into arrtest_f values(5,'cat1',1.15); +</sql-statement> +<sql-statement> +insert into arrtest_f values(6,'cat2',1.15); +</sql-statement> +<sql-statement> +insert into arrtest_f values(7,'cat2',1.26); +</sql-statement> +<sql-statement> +insert into arrtest_f values(8,'cat2',1.32); +</sql-statement> +<sql-statement> +insert into arrtest_f values(9,'cat2',1.30); +</sql-statement> +<sql-statement> +CREATE TEMP TABLE arrtest_i (f0 int, f1 text, f2 int); +</sql-statement> +<sql-statement> +insert into arrtest_i values(1,'cat1',21); +</sql-statement> +<sql-statement> +insert into arrtest_i values(2,'cat1',24); +</sql-statement> +<sql-statement> +insert into arrtest_i values(3,'cat1',18); +</sql-statement> +<sql-statement> +insert into arrtest_i values(4,'cat1',26); +</sql-statement> +<sql-statement> +insert into arrtest_i values(5,'cat1',15); +</sql-statement> +<sql-statement> +insert into arrtest_i values(6,'cat2',15); +</sql-statement> +<sql-statement> +insert into arrtest_i values(7,'cat2',26); +</sql-statement> +<sql-statement> +insert into arrtest_i values(8,'cat2',32); +</sql-statement> +<sql-statement> +insert into arrtest_i values(9,'cat2',30); +</sql-statement> +<sql-statement> +-- expressions +SELECT t.f[1][3][1] AS "131", t.f[2][2][1] AS "221" FROM ( + SELECT ARRAY[[[111,112],[121,122],[131,132]],[[211,212],[221,122],[231,232]]] AS f +) AS t; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- expressions + ^ +<sql-statement> +SELECT ARRAY[[[[[['hello'],['world']]]]]]; +</sql-statement> +<sql-statement> +SELECT ARRAY[ARRAY['hello'],ARRAY['world']]; +</sql-statement> +<sql-statement> +SELECT ARRAY(select f2 from arrtest_f order by f2) AS "ARRAY"; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: SublinkExpr: unsupported link type: 6 + SELECT ARRAY(select f2 from arrtest_f order by f2) AS "ARRAY"; + ^ +<sql-statement> +-- with nulls +SELECT '{1,null,3}'::int[]; +</sql-statement> +<sql-statement> +SELECT ARRAY[1,NULL,3]; +</sql-statement> +<sql-statement> +-- functions +SELECT array_append(array[42], 6) AS "{42,6}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- functions + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT array_append(array[42], 6) AS "{42,6}"; + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc array_append with given argument types: (_int4,int4) + SELECT array_append(array[42], 6) AS "{42,6}"; + ^ +<sql-statement> +SELECT array_prepend(6, array[42]) AS "{6,42}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_prepend(6, array[42]) AS "{6,42}"; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_prepend(6, array[42]) AS "{6,42}"; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_prepend with given argument types: (int4,_int4) + SELECT array_prepend(6, array[42]) AS "{6,42}"; + ^ +<sql-statement> +SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_cat with given argument types: (_int4,_int4) + SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; + ^ +<sql-statement> +SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_cat with given argument types: (_int4,_int4) + SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; + ^ +<sql-statement> +SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_cat with given argument types: (_int4,_int4) + SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; + ^ +<sql-statement> +SELECT array_position(ARRAY[1,2,3,4,5], 4); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY[1,2,3,4,5], 4); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY[1,2,3,4,5], 4); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_int4,int4) + SELECT array_position(ARRAY[1,2,3,4,5], 4); + ^ +<sql-statement> +SELECT array_position(ARRAY[5,3,4,2,1], 4); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY[5,3,4,2,1], 4); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY[5,3,4,2,1], 4); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_int4,int4) + SELECT array_position(ARRAY[5,3,4,2,1], 4); + ^ +<sql-statement> +SELECT array_position(ARRAY[[1,2],[3,4]], 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY[[1,2],[3,4]], 3); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY[[1,2],[3,4]], 3); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_int4,int4) + SELECT array_position(ARRAY[[1,2],[3,4]], 3); + ^ +<sql-statement> +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_text,unknown) + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); + ^ +<sql-statement> +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'sat'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'sat'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'sat'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_text,unknown) + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'sat'); + ^ +<sql-statement> +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_text,unknown) + SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], NULL); + ^ +<sql-statement> +SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_text,unknown) + SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], NULL); + ^ +<sql-statement> +SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], 'sat'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], 'sat'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], 'sat'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_text,unknown) + SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], 'sat'); + ^ +<sql-statement> +SELECT array_positions(NULL, 10); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions(NULL, 10); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions(NULL, 10); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (unknown,int4) + SELECT array_positions(NULL, 10); + ^ +<sql-statement> +SELECT array_positions(NULL, NULL::int); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions(NULL, NULL::int); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions(NULL, NULL::int); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (unknown,int4) + SELECT array_positions(NULL, NULL::int); + ^ +<sql-statement> +SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], 4); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], 4); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], 4); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (_int4,int4) + SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], 4); + ^ +<sql-statement> +SELECT array_positions(ARRAY[[1,2],[3,4]], 4); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions(ARRAY[[1,2],[3,4]], 4); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions(ARRAY[[1,2],[3,4]], 4); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (_int4,int4) + SELECT array_positions(ARRAY[[1,2],[3,4]], 4); + ^ +<sql-statement> +SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (_int4,unknown) + SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], NULL); + ^ +<sql-statement> +SELECT array_positions(ARRAY[1,2,3,NULL,5,6,1,2,3,NULL,5,6], NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions(ARRAY[1,2,3,NULL,5,6,1,2,3,NULL,5,6], NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions(ARRAY[1,2,3,NULL,5,6,1,2,3,NULL,5,6], NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (_int4,unknown) + SELECT array_positions(ARRAY[1,2,3,NULL,5,6,1,2,3,NULL,5,6], NULL); + ^ +<sql-statement> +SELECT array_length(array_positions(ARRAY(SELECT 'AAAAAAAAAAAAAAAAAAAAAAAAA'::text || i % 10 + FROM generate_series(1,100) g(i)), + 'AAAAAAAAAAAAAAAAAAAAAAAAA5'), 1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:37: Error: SublinkExpr: unsupported link type: 6 + SELECT array_length(array_positions(ARRAY(SELECT 'AAAAAAAAAAAAAAAAAAAAAAAAA'::text || i % 10 + ^ +<sql-statement> +DO $$ +DECLARE + o int; + a int[] := ARRAY[1,2,3,2,3,1,2]; +BEGIN + o := array_position(a, 2); + WHILE o IS NOT NULL + LOOP + RAISE NOTICE '%', o; + o := array_position(a, 2, o + 1); + END LOOP; +END +$$ LANGUAGE plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 263 + DO $$ + ^ +<sql-statement> +SELECT array_position('[2:4]={1,2,3}'::int[], 1); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_position('[2:4]={1,2,3}'::int[], 1); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_position('[2:4]={1,2,3}'::int[], 1); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_position with given argument types: (_int4,int4) + SELECT array_position('[2:4]={1,2,3}'::int[], 1); + ^ +<sql-statement> +SELECT array_positions('[2:4]={1,2,3}'::int[], 1); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT array_positions('[2:4]={1,2,3}'::int[], 1); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT array_positions('[2:4]={1,2,3}'::int[], 1); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_positions with given argument types: (_int4,int4) + SELECT array_positions('[2:4]={1,2,3}'::int[], 1); + ^ +<sql-statement> +SELECT + array_position(ids, (1, 1)), + array_positions(ids, (1, 1)) + FROM +(VALUES + (ARRAY[(0, 0), (1, 1)]), + (ARRAY[(1, 1)]) +) AS f (ids); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:6: Error: alternative is not implemented yet : 138 + (ARRAY[(0, 0), (1, 1)]), + ^ +<sql-statement> +-- operators +SELECT a FROM arrtest WHERE b = ARRAY[[[113,142],[1,147]]]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + -- operators + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + -- operators + ^ + -stdin-:<main>:2:31: Error: At function: PgOp + SELECT a FROM arrtest WHERE b = ARRAY[[[113,142],[1,147]]]; + ^ + -stdin-:<main>:2:31: Error: Unable to find an overload for operator = with given argument type(s): (int4,_int4) + SELECT a FROM arrtest WHERE b = ARRAY[[[113,142],[1,147]]]; + ^ +<sql-statement> +SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; +</sql-statement> +<sql-statement> +SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; + ^ + -stdin-:<main>:1:19: Error: Unable to find an overload for operator || with given argument type(s): (_int4,int4) + SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; + ^ +<sql-statement> +SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; + ^ + -stdin-:<main>:1:10: Error: At function: PgOp + SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; + ^ + -stdin-:<main>:1:10: Error: Unable to find an overload for operator || with given argument type(s): (int4,_int4) + SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; + ^ +<sql-statement> +SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; + ^ + -stdin-:<main>:1:19: Error: Unable to find an overload for operator || with given argument type(s): (_int4,_int4) + SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; + ^ +<sql-statement> +SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; + ^ + -stdin-:<main>:1:35: Error: At function: PgOp + SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; + ^ + -stdin-:<main>:1:35: Error: Unable to find an overload for operator || with given argument type(s): (_text,_text) + SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; + ^ +<sql-statement> +SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; + ^ + -stdin-:<main>:1:27: Error: At function: PgOp + SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; + ^ + -stdin-:<main>:1:27: Error: Unable to find an overload for operator || with given argument type(s): (_int4,_int4) + SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; + ^ +<sql-statement> +SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; + ^ + -stdin-:<main>:1:33: Error: At function: PgOp + SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; + ^ + -stdin-:<main>:1:19: Error: Unable to find an overload for operator || with given argument type(s): (_int4,_int4) + SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; + ^ +<sql-statement> +SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; + ^ + -stdin-:<main>:1:24: Error: At function: PgOp + SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; + ^ + -stdin-:<main>:1:10: Error: At function: PgOp + SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; + ^ + -stdin-:<main>:1:10: Error: Unable to find an overload for operator || with given argument type(s): (int4,_int4) + SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; + ^ +<sql-statement> +SELECT ARRAY[1.1] || ARRAY[2,3,4]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT ARRAY[1.1] || ARRAY[2,3,4]; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + SELECT ARRAY[1.1] || ARRAY[2,3,4]; + ^ + -stdin-:<main>:1:19: Error: Unable to find an overload for operator || with given argument type(s): (_numeric,_int4) + SELECT ARRAY[1.1] || ARRAY[2,3,4]; + ^ +<sql-statement> +SELECT array_agg(x) || array_agg(x) FROM (VALUES (ROW(1,2)), (ROW(3,4))) v(x); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 138 + SELECT array_agg(x) || array_agg(x) FROM (VALUES (ROW(1,2)), (ROW(3,4))) v(x); + ^ +<sql-statement> +SELECT ROW(1,2) || array_agg(x) FROM (VALUES (ROW(3,4)), (ROW(5,6))) v(x); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 138 + SELECT ROW(1,2) || array_agg(x) FROM (VALUES (ROW(3,4)), (ROW(5,6))) v(x); + ^ +<sql-statement> +SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i = '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i @> '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t = '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t @> '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t && '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +SELECT * FROM array_op_test WHERE t <@ '{}' ORDER BY seqno; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.array_op_test + +<sql-statement> +-- array casts +SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}"; +</sql-statement> +<sql-statement> +SELECT pg_typeof(ARRAY[1,2,3]::text[]::int[]::float8[]) AS "double precision[]"; +</sql-statement> +<sql-statement> +SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] AS "{{a,bc},{def,hijk}}"; +</sql-statement> +<sql-statement> +SELECT pg_typeof(ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[]) AS "character varying[]"; +</sql-statement> +<sql-statement> +SELECT CAST(ARRAY[[[[[['a','bb','ccc']]]]]] as text[]) as "{{{{{{a,bb,ccc}}}}}}"; +</sql-statement> +<sql-statement> +SELECT NULL::text[]::int[] AS "NULL"; +</sql-statement> +<sql-statement> +-- scalar op any/all (array) +select 33 = any ('{1,2,3}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:11: Error: A_Expr_Kind unsupported value: 1 + select 33 = any ('{1,2,3}'); + ^ +<sql-statement> +select 33 = any ('{1,2,33}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 1 + select 33 = any ('{1,2,33}'); + ^ +<sql-statement> +select 33 = all ('{1,2,33}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 2 + select 33 = all ('{1,2,33}'); + ^ +<sql-statement> +select 33 >= all ('{1,2,33}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 2 + select 33 >= all ('{1,2,33}'); + ^ +<sql-statement> +-- boundary cases +select null::int >= all ('{1,2,33}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:18: Error: A_Expr_Kind unsupported value: 2 + select null::int >= all ('{1,2,33}'); + ^ +<sql-statement> +select null::int >= all ('{}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: A_Expr_Kind unsupported value: 2 + select null::int >= all ('{}'); + ^ +<sql-statement> +select null::int >= any ('{}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: A_Expr_Kind unsupported value: 1 + select null::int >= any ('{}'); + ^ +<sql-statement> +-- cross-datatype +select 33.4 = any (array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:13: Error: A_Expr_Kind unsupported value: 1 + select 33.4 = any (array[1,2,3]); + ^ +<sql-statement> +select 33.4 > all (array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:13: Error: A_Expr_Kind unsupported value: 2 + select 33.4 > all (array[1,2,3]); + ^ +<sql-statement> +-- errors +select 33 * any ('{1,2,3}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:11: Error: A_Expr_Kind unsupported value: 1 + select 33 * any ('{1,2,3}'); + ^ +<sql-statement> +select 33 * any (44); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 1 + select 33 * any (44); + ^ +<sql-statement> +-- nulls +select 33 = any (null::int[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:11: Error: A_Expr_Kind unsupported value: 1 + select 33 = any (null::int[]); + ^ +<sql-statement> +select null::int = any ('{1,2,3}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: A_Expr_Kind unsupported value: 1 + select null::int = any ('{1,2,3}'); + ^ +<sql-statement> +select 33 = any ('{1,null,3}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 1 + select 33 = any ('{1,null,3}'); + ^ +<sql-statement> +select 33 = any ('{1,null,33}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 1 + select 33 = any ('{1,null,33}'); + ^ +<sql-statement> +select 33 = all (null::int[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 2 + select 33 = all (null::int[]); + ^ +<sql-statement> +select null::int = all ('{1,2,3}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: A_Expr_Kind unsupported value: 2 + select null::int = all ('{1,2,3}'); + ^ +<sql-statement> +select 33 = all ('{1,null,3}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 2 + select 33 = all ('{1,null,3}'); + ^ +<sql-statement> +select 33 = all ('{33,null,33}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: A_Expr_Kind unsupported value: 2 + select 33 = all ('{33,null,33}'); + ^ +<sql-statement> +-- nulls later in the bitmap +SELECT -1 != ALL(ARRAY(SELECT NULLIF(g.i, 900) FROM generate_series(1,1000) g(i))); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:11: Error: A_Expr_Kind unsupported value: 2 + SELECT -1 != ALL(ARRAY(SELECT NULLIF(g.i, 900) FROM generate_series(1,1000) g(i))); + ^ +<sql-statement> +-- test indexes on arrays +create temp table arr_tbl (f1 int[] unique); +</sql-statement> +<sql-statement> +insert into arr_tbl values ('{1,2,3}'); +</sql-statement> +<sql-statement> +insert into arr_tbl values ('{1,2}'); +</sql-statement> +<sql-statement> +-- failure expected: +insert into arr_tbl values ('{1,2,3}'); +</sql-statement> +<sql-statement> +insert into arr_tbl values ('{2,3,4}'); +</sql-statement> +<sql-statement> +insert into arr_tbl values ('{1,5,3}'); +</sql-statement> +<sql-statement> +insert into arr_tbl values ('{1,2,10}'); +</sql-statement> +<sql-statement> +set enable_seqscan to off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_seqscan + set enable_seqscan to off; + ^ +<sql-statement> +set enable_bitmapscan to off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_bitmapscan + set enable_bitmapscan to off; + ^ +<sql-statement> +select * from arr_tbl where f1 > '{1,2,3}' and f1 <= '{1,5,3}'; +</sql-statement> +<sql-statement> +select * from arr_tbl where f1 >= '{1,2,3}' and f1 < '{1,5,3}'; +</sql-statement> +<sql-statement> +-- test ON CONFLICT DO UPDATE with arrays +create temp table arr_pk_tbl (pk int4 primary key, f1 int[]); +</sql-statement> +<sql-statement> +insert into arr_pk_tbl values (1, '{1,2,3}'); +</sql-statement> +<sql-statement> +insert into arr_pk_tbl values (1, '{3,4,5}') on conflict (pk) + do update set f1[1] = excluded.f1[1], f1[3] = excluded.f1[3] + returning pk, f1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + insert into arr_pk_tbl values (1, '{3,4,5}') on conflict (pk) + ^ +<sql-statement> +insert into arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk) + do update set f1[1] = excluded.f1[1], + f1[2] = excluded.f1[2], + f1[3] = excluded.f1[3] + returning pk, f1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + insert into arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk) + ^ +<sql-statement> +-- note: if above selects don't produce the expected tuple order, +-- then you didn't get an indexscan plan, and something is busted. +reset enable_seqscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + -- note: if above selects don't produce the expected tuple order, + ^ +<sql-statement> +reset enable_bitmapscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_bitmapscan; + ^ +<sql-statement> +-- test [not] (like|ilike) (any|all) (...) +select 'foo' like any (array['%a', '%o']); -- t +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:14: Error: A_Expr_Kind unsupported value: 1 + select 'foo' like any (array['%a', '%o']); -- t + ^ +<sql-statement> +select 'foo' like any (array['%a', '%b']); -- f +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 1 + select 'foo' like any (array['%a', '%b']); -- f + ^ +<sql-statement> +select 'foo' like all (array['f%', '%o']); -- t +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 2 + select 'foo' like all (array['f%', '%o']); -- t + ^ +<sql-statement> +select 'foo' like all (array['f%', '%b']); -- f +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 2 + select 'foo' like all (array['f%', '%b']); -- f + ^ +<sql-statement> +select 'foo' not like any (array['%a', '%b']); -- t +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 1 + select 'foo' not like any (array['%a', '%b']); -- t + ^ +<sql-statement> +select 'foo' not like all (array['%a', '%o']); -- f +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 2 + select 'foo' not like all (array['%a', '%o']); -- f + ^ +<sql-statement> +select 'foo' ilike any (array['%A', '%O']); -- t +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 1 + select 'foo' ilike any (array['%A', '%O']); -- t + ^ +<sql-statement> +select 'foo' ilike all (array['F%', '%O']); -- t +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:14: Error: A_Expr_Kind unsupported value: 2 + select 'foo' ilike all (array['F%', '%O']); -- t + ^ +<sql-statement> +-- +-- General array parser tests +-- +-- none of the following should be accepted +select '{{1,{2}},{2,3}}'::text[]; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- + ^ + -stdin-:<main>:1:1: Fatal: ERROR: malformed array literal: "{{1,{2}},{2,3}}" +DETAIL: Unexpected "{" character. + + -- + ^ +<sql-statement> +select '{{},{}}'::text[]; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{{},{}}'::text[]; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: malformed array literal: "{{},{}}" +DETAIL: Unexpected "}" character. + + select '{{},{}}'::text[]; + ^ +<sql-statement> +select E'{{1,2},\\{2,3}}'::text[]; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select E'{{1,2},\\{2,3}}'::text[]; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: malformed array literal: "{{1,2},\{2,3}}" +DETAIL: Unexpected "\" character. + + select E'{{1,2},\\{2,3}}'::text[]; + ^ +<sql-statement> +select '{{"1 2" x},{3}}'::text[]; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{{"1 2" x},{3}}'::text[]; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: malformed array literal: "{{"1 2" x},{3}}" +DETAIL: Unexpected array element. + + select '{{"1 2" x},{3}}'::text[]; + ^ +<sql-statement> +select '{}}'::text[]; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{}}'::text[]; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: malformed array literal: "{}}" +DETAIL: Junk after closing right brace. + + select '{}}'::text[]; + ^ +<sql-statement> +select '{ }}'::text[]; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{ }}'::text[]; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: malformed array literal: "{ }}" +DETAIL: Junk after closing right brace. + + select '{ }}'::text[]; + ^ +<sql-statement> +select array[]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array[]; + ^ + -stdin-:<main>:1:8: Error: At function: PgArray + select array[]; + ^ + -stdin-:<main>:1:8: Error: Expected at least 1 argument(s), but got 0 + select array[]; + ^ +<sql-statement> +-- none of the above should be accepted +-- all of the following should be accepted +select '{}'::text[]; +</sql-statement> +<sql-statement> +select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; +</sql-statement> +<sql-statement> +select '{0 second ,0 second}'::interval[]; +</sql-statement> +<sql-statement> +select '{ { "," } , { 3 } }'::text[]; +</sql-statement> +<sql-statement> +select ' { { " 0 second " , 0 second } }'::text[]; +</sql-statement> +<sql-statement> +select '{ + 0 second, + @ 1 hour @ 42 minutes @ 20 seconds + }'::interval[]; +</sql-statement> +<sql-statement> +select array[]::text[]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array[]::text[]; + ^ + -stdin-:<main>:1:17: Error: At function: PgCast + select array[]::text[]; + ^ + -stdin-:<main>:1:8: Error: At function: PgArray + select array[]::text[]; + ^ + -stdin-:<main>:1:8: Error: Expected at least 1 argument(s), but got 0 + select array[]::text[]; + ^ +<sql-statement> +select '[0:1]={1.1,2.2}'::float8[]; +</sql-statement> +<sql-statement> +-- all of the above should be accepted +-- tests for array aggregates +CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]); +</sql-statement> +<sql-statement> +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{1,2,3,4}','{{grey,red},{blue,blue}}','{1.6, 0.0}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type integer: "{1,2,3,4}" + + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ +<sql-statement> +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{1,2,3}','{{grey,red},{grey,blue}}','{1.6}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type integer: "{1,2,3}" + + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ +<sql-statement> +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; +</sql-statement> +<sql-statement> +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{3,3,2,4,5,6}','{{white,yellow},{pink,orange}}','{2.1,3.3,1.8,1.7,1.6}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type integer: "{3,3,2,4,5,6}" + + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ +<sql-statement> +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; +</sql-statement> +<sql-statement> +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{2}','{{black,red},{green,orange}}','{1.6,2.2,2.6,0.4}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type integer: "{2}" + + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ +<sql-statement> +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; +</sql-statement> +<sql-statement> +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{4,2,6,7,8,1}','{{red},{black},{purple},{blue},{blue}}',NULL); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type integer: "{4,2,6,7,8,1}" + + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ +<sql-statement> +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; +</sql-statement> +<sql-statement> +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type integer: "{}" + + INSERT INTO arraggtest (f1, f2, f3) VALUES + ^ +<sql-statement> +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; +</sql-statement> +<sql-statement> +-- A few simple tests for arrays of composite types +create type comptype as (f1 int, f2 text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + -- A few simple tests for arrays of composite types + ^ +<sql-statement> +create table comptable (c1 comptype, c2 comptype[]); +</sql-statement> +<sql-statement> +-- XXX would like to not have to specify row() construct types here ... +insert into comptable + values (row(1,'foo'), array[row(2,'bar')::comptype, row(3,'baz')::comptype]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 138 + -- XXX would like to not have to specify row() construct types here ... + ^ +<sql-statement> +-- check that implicitly named array type _comptype isn't a problem +create type _comptype as enum('fooey'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 315 + -- check that implicitly named array type _comptype isn't a problem + ^ +<sql-statement> +select * from comptable; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table comptable + + -stdin-:<main>: Error: Failed to parse row spec: No such type: comptype + +<sql-statement> +select c2[2].f2 from comptable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select c2[2].f2 from comptable; + ^ +<sql-statement> +drop type _comptype; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + drop type _comptype; + ^ +<sql-statement> +drop table comptable; +</sql-statement> +<sql-statement> +drop type comptype; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + drop type comptype; + ^ +<sql-statement> +create or replace function unnest1(anyarray) +returns setof anyelement as $$ +select $1[s] from generate_subscripts($1,1) g(s); +$$ language sql immutable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + create or replace function unnest1(anyarray) + ^ +<sql-statement> +create or replace function unnest2(anyarray) +returns setof anyelement as $$ +select $1[s1][s2] from generate_subscripts($1,1) g1(s1), + generate_subscripts($1,2) g2(s2); +$$ language sql immutable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + create or replace function unnest2(anyarray) + ^ +<sql-statement> +select * from unnest1(array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from unnest1(array[1,2,3]); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from unnest1(array[1,2,3]); + ^ + -stdin-:<main>:1:15: Error: No such proc: unnest1 + select * from unnest1(array[1,2,3]); + ^ +<sql-statement> +select * from unnest2(array[[1,2,3],[4,5,6]]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from unnest2(array[[1,2,3],[4,5,6]]); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from unnest2(array[[1,2,3],[4,5,6]]); + ^ + -stdin-:<main>:1:15: Error: No such proc: unnest2 + select * from unnest2(array[[1,2,3],[4,5,6]]); + ^ +<sql-statement> +drop function unnest1(anyarray); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function unnest1(anyarray); + ^ +<sql-statement> +drop function unnest2(anyarray); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function unnest2(anyarray); + ^ +<sql-statement> +select array_fill(null::integer, array[3,3],array[2,2]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(null::integer, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(null::integer, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4,_int4) + select array_fill(null::integer, array[3,3],array[2,2]); + ^ +<sql-statement> +select array_fill(null::integer, array[3,3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(null::integer, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(null::integer, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4) + select array_fill(null::integer, array[3,3]); + ^ +<sql-statement> +select array_fill(null::text, array[3,3],array[2,2]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(null::text, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(null::text, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (text,_int4,_int4) + select array_fill(null::text, array[3,3],array[2,2]); + ^ +<sql-statement> +select array_fill(null::text, array[3,3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(null::text, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(null::text, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (text,_int4) + select array_fill(null::text, array[3,3]); + ^ +<sql-statement> +select array_fill(7, array[3,3],array[2,2]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(7, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(7, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4,_int4) + select array_fill(7, array[3,3],array[2,2]); + ^ +<sql-statement> +select array_fill(7, array[3,3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(7, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(7, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4) + select array_fill(7, array[3,3]); + ^ +<sql-statement> +select array_fill('juhu'::text, array[3,3],array[2,2]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill('juhu'::text, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill('juhu'::text, array[3,3],array[2,2]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (text,_int4,_int4) + select array_fill('juhu'::text, array[3,3],array[2,2]); + ^ +<sql-statement> +select array_fill('juhu'::text, array[3,3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill('juhu'::text, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill('juhu'::text, array[3,3]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (text,_int4) + select array_fill('juhu'::text, array[3,3]); + ^ +<sql-statement> +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, array[0]) as a) ss; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select a, a = '{}' as is_eq, array_dims(a) + ^ + -stdin-:<main>:2:16: Error: At function: PgCall + from (select array_fill(42, array[0]) as a) ss; + ^ + -stdin-:<main>:2:16: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4) + from (select array_fill(42, array[0]) as a) ss; + ^ +<sql-statement> +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, '{}') as a) ss; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select a, a = '{}' as is_eq, array_dims(a) + ^ + -stdin-:<main>:2:16: Error: At function: PgCall + from (select array_fill(42, '{}') as a) ss; + ^ + -stdin-:<main>:2:16: Error: Unable to find an overload for proc array_fill with given argument types: (int4,unknown) + from (select array_fill(42, '{}') as a) ss; + ^ +<sql-statement> +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, '{}', '{}') as a) ss; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select a, a = '{}' as is_eq, array_dims(a) + ^ + -stdin-:<main>:2:16: Error: At function: PgCall + from (select array_fill(42, '{}', '{}') as a) ss; + ^ + -stdin-:<main>:2:16: Error: Unable to find an overload for proc array_fill with given argument types: (int4,unknown,unknown) + from (select array_fill(42, '{}', '{}') as a) ss; + ^ +<sql-statement> +-- raise exception +select array_fill(1, null, array[2,2]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- raise exception + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select array_fill(1, null, array[2,2]); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,unknown,_int4) + select array_fill(1, null, array[2,2]); + ^ +<sql-statement> +select array_fill(1, array[2,2], null); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(1, array[2,2], null); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(1, array[2,2], null); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4,unknown) + select array_fill(1, array[2,2], null); + ^ +<sql-statement> +select array_fill(1, array[2,2], '{}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(1, array[2,2], '{}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(1, array[2,2], '{}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4,unknown) + select array_fill(1, array[2,2], '{}'); + ^ +<sql-statement> +select array_fill(1, array[3,3], array[1,1,1]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(1, array[3,3], array[1,1,1]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(1, array[3,3], array[1,1,1]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4,_int4) + select array_fill(1, array[3,3], array[1,1,1]); + ^ +<sql-statement> +select array_fill(1, array[1,2,null]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(1, array[1,2,null]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(1, array[1,2,null]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4) + select array_fill(1, array[1,2,null]); + ^ +<sql-statement> +select array_fill(1, array[[1,2],[3,4]]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_fill(1, array[[1,2],[3,4]]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_fill(1, array[[1,2],[3,4]]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_fill with given argument types: (int4,_int4) + select array_fill(1, array[[1,2],[3,4]]); + ^ +<sql-statement> +select string_to_array('1|2|3', '|'); +</sql-statement> +<sql-statement> +select string_to_array('1|2|3|', '|'); +</sql-statement> +<sql-statement> +select string_to_array('1||2|3||', '||'); +</sql-statement> +<sql-statement> +select string_to_array('1|2|3', ''); +</sql-statement> +<sql-statement> +select string_to_array('', '|'); +</sql-statement> +<sql-statement> +select string_to_array('1|2|3', NULL); +</sql-statement> +<sql-statement> +select string_to_array(NULL, '|') IS NULL; +</sql-statement> +<sql-statement> +select string_to_array('abc', ''); +</sql-statement> +<sql-statement> +select string_to_array('abc', '', 'abc'); +</sql-statement> +<sql-statement> +select string_to_array('abc', ','); +</sql-statement> +<sql-statement> +select string_to_array('abc', ',', 'abc'); +</sql-statement> +<sql-statement> +select string_to_array('1,2,3,4,,6', ','); +</sql-statement> +<sql-statement> +select string_to_array('1,2,3,4,,6', ',', ''); +</sql-statement> +<sql-statement> +select string_to_array('1,2,3,4,*,6', ',', '*'); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1|2|3', '|') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1|2|3|', '|') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1||2|3||', '||') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1|2|3', '') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('', '|') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1|2|3', NULL) g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table(NULL, '|') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('abc', '') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('abc', '', 'abc') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('abc', ',') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('abc', ',', 'abc') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',', '') g(v); +</sql-statement> +<sql-statement> +select v, v is null as "is null" from string_to_table('1,2,3,4,*,6', ',', '*') g(v); +</sql-statement> +<sql-statement> +select array_to_string(NULL::int4[], ',') IS NULL; +</sql-statement> +<sql-statement> +select array_to_string('{}'::int4[], ','); +</sql-statement> +<sql-statement> +select array_to_string(array[1,2,3,4,NULL,6], ','); +</sql-statement> +<sql-statement> +select array_to_string(array[1,2,3,4,NULL,6], ',', '*'); +</sql-statement> +<sql-statement> +select array_to_string(array[1,2,3,4,NULL,6], NULL); +</sql-statement> +<sql-statement> +select array_to_string(array[1,2,3,4,NULL,6], ',', NULL); +</sql-statement> +<sql-statement> +select array_to_string(string_to_array('1|2|3', '|'), '|'); +</sql-statement> +<sql-statement> +select array_length(array[1,2,3], 1); +</sql-statement> +<sql-statement> +select array_length(array[[1,2,3], [4,5,6]], 0); +</sql-statement> +<sql-statement> +select array_length(array[[1,2,3], [4,5,6]], 1); +</sql-statement> +<sql-statement> +select array_length(array[[1,2,3], [4,5,6]], 2); +</sql-statement> +<sql-statement> +select array_length(array[[1,2,3], [4,5,6]], 3); +</sql-statement> +<sql-statement> +select cardinality(NULL::int[]); +</sql-statement> +<sql-statement> +select cardinality('{}'::int[]); +</sql-statement> +<sql-statement> +select cardinality(array[1,2,3]); +</sql-statement> +<sql-statement> +select cardinality('[2:4]={5,6,7}'::int[]); +</sql-statement> +<sql-statement> +select cardinality('{{1,2}}'::int[]); +</sql-statement> +<sql-statement> +select cardinality('{{1,2},{3,4},{5,6}}'::int[]); +</sql-statement> +<sql-statement> +select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]); +</sql-statement> +<sql-statement> +-- array_agg(anynonarray) +select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +select array_agg(ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: A_Expr_Kind unsupported value: 5 + select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; + ^ +<sql-statement> +select array_agg(unique1) from tenk1 where unique1 < -15; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- array_agg(anyarray) +select array_agg(ar) + from (values ('{1,2}'::int[]), ('{3,4}'::int[])) v(ar); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select array_agg(distinct ar order by ar desc) + from (select array[i / 2] from generate_series(1,10) a(i)) b(ar); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported agg_order + select array_agg(distinct ar order by ar desc) + ^ +<sql-statement> +select array_agg(ar) + from (select array_agg(array[i, i+1, i-1]) + from generate_series(1,2) a(i)) b(ar); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select array_agg(array[i+1.2, i+1.3, i+1.4]) from generate_series(1,3) g(i); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select array_agg(array['Hello', i::text]) from generate_series(9,11) g(i); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select array_agg(array[i, nullif(i, 3), i+1]) from generate_series(1,4) g(i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:27: Error: A_Expr_Kind unsupported value: 5 + select array_agg(array[i, nullif(i, 3), i+1]) from generate_series(1,4) g(i); + ^ +<sql-statement> +-- errors +select array_agg('{}'::int[]) from generate_series(1,2); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select array_agg(null::int[]) from generate_series(1,2); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select array_agg(ar) + from (values ('{1,2}'::int[]), ('{3}'::int[])) v(ar); +</sql-statement> +-stdin-:<main>: Fatal: Unable to find an overload for proc with oid 4052 with given argument types: (internal) + +<sql-statement> +select unnest(array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select unnest(array[1,2,3]); + ^ +<sql-statement> +select * from unnest(array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: ResWrite! + select * from unnest(array[1,2,3]); + ^ + -stdin-:<main>:1:1: Error: Expected persistable data, but got: List<Struct<'unnest':pganyelement>> + select * from unnest(array[1,2,3]); + ^ + -stdin-:<main>:1:1: Error: Persistable required. Atom, type, key, world, datasink, datasource, callable, resource, stream and lambda are not persistable + select * from unnest(array[1,2,3]); + ^ +<sql-statement> +select unnest(array[1,2,3,4.5]::float8[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select unnest(array[1,2,3,4.5]::float8[]); + ^ +<sql-statement> +select unnest(array[1,2,3,4.5]::numeric[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select unnest(array[1,2,3,4.5]::numeric[]); + ^ +<sql-statement> +select unnest(array[1,2,3,null,4,null,null,5,6]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select unnest(array[1,2,3,null,4,null,null,5,6]); + ^ +<sql-statement> +select unnest(array[1,2,3,null,4,null,null,5,6]::text[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select unnest(array[1,2,3,null,4,null,null,5,6]::text[]); + ^ +<sql-statement> +select abs(unnest(array[1,2,null,-3])); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:12: Error: Generator functions are not allowed in: SELECT + select abs(unnest(array[1,2,null,-3])); + ^ +<sql-statement> +select array_remove(array[1,2,2,3], 2); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove(array[1,2,2,3], 2); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove(array[1,2,2,3], 2); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (_int4,int4) + select array_remove(array[1,2,2,3], 2); + ^ +<sql-statement> +select array_remove(array[1,2,2,3], 5); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove(array[1,2,2,3], 5); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove(array[1,2,2,3], 5); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (_int4,int4) + select array_remove(array[1,2,2,3], 5); + ^ +<sql-statement> +select array_remove(array[1,NULL,NULL,3], NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove(array[1,NULL,NULL,3], NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove(array[1,NULL,NULL,3], NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (_int4,unknown) + select array_remove(array[1,NULL,NULL,3], NULL); + ^ +<sql-statement> +select array_remove(array['A','CC','D','C','RR'], 'RR'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove(array['A','CC','D','C','RR'], 'RR'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove(array['A','CC','D','C','RR'], 'RR'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (_text,unknown) + select array_remove(array['A','CC','D','C','RR'], 'RR'); + ^ +<sql-statement> +select array_remove(array[1.0, 2.1, 3.3], 1); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove(array[1.0, 2.1, 3.3], 1); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove(array[1.0, 2.1, 3.3], 1); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (_numeric,int4) + select array_remove(array[1.0, 2.1, 3.3], 1); + ^ +<sql-statement> +select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (unknown,int4) + select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed + ^ +<sql-statement> +select array_remove(array['X','X','X'], 'X') = '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_remove(array['X','X','X'], 'X') = '{}'; + ^ + -stdin-:<main>:1:46: Error: At function: PgOp + select array_remove(array['X','X','X'], 'X') = '{}'; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_remove(array['X','X','X'], 'X') = '{}'; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_remove with given argument types: (_text,unknown) + select array_remove(array['X','X','X'], 'X') = '{}'; + ^ +<sql-statement> +select array_replace(array[1,2,5,4],5,3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_replace(array[1,2,5,4],5,3); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_replace(array[1,2,5,4],5,3); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_replace with given argument types: (_int4,int4,int4) + select array_replace(array[1,2,5,4],5,3); + ^ +<sql-statement> +select array_replace(array[1,2,5,4],5,NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_replace(array[1,2,5,4],5,NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_replace(array[1,2,5,4],5,NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_replace with given argument types: (_int4,int4,unknown) + select array_replace(array[1,2,5,4],5,NULL); + ^ +<sql-statement> +select array_replace(array[1,2,NULL,4,NULL],NULL,5); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_replace(array[1,2,NULL,4,NULL],NULL,5); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_replace(array[1,2,NULL,4,NULL],NULL,5); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_replace with given argument types: (_int4,unknown,int4) + select array_replace(array[1,2,NULL,4,NULL],NULL,5); + ^ +<sql-statement> +select array_replace(array['A','B','DD','B'],'B','CC'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_replace(array['A','B','DD','B'],'B','CC'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_replace(array['A','B','DD','B'],'B','CC'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_replace with given argument types: (_text,unknown,unknown) + select array_replace(array['A','B','DD','B'],'B','CC'); + ^ +<sql-statement> +select array_replace(array[1,NULL,3],NULL,NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_replace(array[1,NULL,3],NULL,NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_replace(array[1,NULL,3],NULL,NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_replace with given argument types: (_int4,unknown,unknown) + select array_replace(array[1,NULL,3],NULL,NULL); + ^ +<sql-statement> +select array_replace(array['AB',NULL,'CDE'],NULL,'12'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select array_replace(array['AB',NULL,'CDE'],NULL,'12'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select array_replace(array['AB',NULL,'CDE'],NULL,'12'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc array_replace with given argument types: (_text,unknown,unknown) + select array_replace(array['AB',NULL,'CDE'],NULL,'12'); + ^ +<sql-statement> +-- array(select array-value ...) +select array(select array[i,i/2] from generate_series(1,5) i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: SublinkExpr: unsupported link type: 6 + select array(select array[i,i/2] from generate_series(1,5) i); + ^ +<sql-statement> +select array(select array['Hello', i::text] from generate_series(9,11) i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: SublinkExpr: unsupported link type: 6 + select array(select array['Hello', i::text] from generate_series(9,11) i); + ^ +<sql-statement> +-- Insert/update on a column that is array of composite +create temp table t1 (f1 int8_tbl[]); +</sql-statement> +<sql-statement> +insert into t1 (f1[5].q1) values(42); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table t1 + + -stdin-:<main>: Error: Failed to parse row spec: No such type: int8_tbl + +<sql-statement> +select * from t1; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table t1 + + -stdin-:<main>: Error: Failed to parse row spec: No such type: int8_tbl + +<sql-statement> +update t1 set f1[5].q2 = 43; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from t1; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table t1 + + -stdin-:<main>: Error: Failed to parse row spec: No such type: int8_tbl + +<sql-statement> +-- Check that arrays of composites are safely detoasted when needed +create temp table src (f1 text); +</sql-statement> +<sql-statement> +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +</sql-statement> +<sql-statement> +create type textandtext as (c1 text, c2 text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + create type textandtext as (c1 text, c2 text); + ^ +<sql-statement> +create temp table dest (f1 textandtext[]); +</sql-statement> +<sql-statement> +insert into dest select array[row(f1,f1)::textandtext] from src; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: alternative is not implemented yet : 138 + insert into dest select array[row(f1,f1)::textandtext] from src; + ^ +<sql-statement> +select length(md5((f1[1]).c2)) from dest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:15: Error: alternative is not implemented yet : 360 + select length(md5((f1[1]).c2)) from dest; + ^ +<sql-statement> +delete from src; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select length(md5((f1[1]).c2)) from dest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:15: Error: alternative is not implemented yet : 360 + select length(md5((f1[1]).c2)) from dest; + ^ +<sql-statement> +truncate table src; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + truncate table src; + ^ +<sql-statement> +drop table src; +</sql-statement> +<sql-statement> +select length(md5((f1[1]).c2)) from dest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:15: Error: alternative is not implemented yet : 360 + select length(md5((f1[1]).c2)) from dest; + ^ +<sql-statement> +drop table dest; +</sql-statement> +<sql-statement> +drop type textandtext; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + drop type textandtext; + ^ +<sql-statement> +-- Tests for polymorphic-array form of width_bucket() +-- this exercises the varwidth and float8 code paths +SELECT + op, + width_bucket(op::numeric, ARRAY[1, 3, 5, 10.0]::numeric[]) AS wb_n1, + width_bucket(op::numeric, ARRAY[0, 5.5, 9.99]::numeric[]) AS wb_n2, + width_bucket(op::numeric, ARRAY[-6, -5, 2.0]::numeric[]) AS wb_n3, + width_bucket(op::float8, ARRAY[1, 3, 5, 10.0]::float8[]) AS wb_f1, + width_bucket(op::float8, ARRAY[0, 5.5, 9.99]::float8[]) AS wb_f2, + width_bucket(op::float8, ARRAY[-6, -5, 2.0]::float8[]) AS wb_f3 +FROM (VALUES + (-5.2), + (-0.0000000001), + (0.000000000001), + (1), + (1.99999999999999), + (2), + (2.00000000000001), + (3), + (4), + (4.5), + (5), + (5.5), + (6), + (7), + (8), + (9), + (9.99999999999999), + (10), + (10.0000000000001) +) v(op); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:5:5: Error: At function: PgCall + width_bucket(op::numeric, ARRAY[1, 3, 5, 10.0]::numeric[]) AS wb_n1, + ^ + -stdin-:<main>:5:5: Error: Unable to find an overload for proc width_bucket with given argument types: (numeric,_numeric) + width_bucket(op::numeric, ARRAY[1, 3, 5, 10.0]::numeric[]) AS wb_n1, + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:6:5: Error: At function: PgCall + width_bucket(op::numeric, ARRAY[0, 5.5, 9.99]::numeric[]) AS wb_n2, + ^ + -stdin-:<main>:6:5: Error: Unable to find an overload for proc width_bucket with given argument types: (numeric,_numeric) + width_bucket(op::numeric, ARRAY[0, 5.5, 9.99]::numeric[]) AS wb_n2, + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:7:5: Error: At function: PgCall + width_bucket(op::numeric, ARRAY[-6, -5, 2.0]::numeric[]) AS wb_n3, + ^ + -stdin-:<main>:7:5: Error: Unable to find an overload for proc width_bucket with given argument types: (numeric,_numeric) + width_bucket(op::numeric, ARRAY[-6, -5, 2.0]::numeric[]) AS wb_n3, + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:8:5: Error: At function: PgCall + width_bucket(op::float8, ARRAY[1, 3, 5, 10.0]::float8[]) AS wb_f1, + ^ + -stdin-:<main>:8:5: Error: Unable to find an overload for proc width_bucket with given argument types: (float8,_float8) + width_bucket(op::float8, ARRAY[1, 3, 5, 10.0]::float8[]) AS wb_f1, + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:9:5: Error: At function: PgCall + width_bucket(op::float8, ARRAY[0, 5.5, 9.99]::float8[]) AS wb_f2, + ^ + -stdin-:<main>:9:5: Error: Unable to find an overload for proc width_bucket with given argument types: (float8,_float8) + width_bucket(op::float8, ARRAY[0, 5.5, 9.99]::float8[]) AS wb_f2, + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- Tests for polymorphic-array form of width_bucket() + ^ + -stdin-:<main>:10:5: Error: At function: PgCall + width_bucket(op::float8, ARRAY[-6, -5, 2.0]::float8[]) AS wb_f3 + ^ + -stdin-:<main>:10:5: Error: Unable to find an overload for proc width_bucket with given argument types: (float8,_float8) + width_bucket(op::float8, ARRAY[-6, -5, 2.0]::float8[]) AS wb_f3 + ^ +<sql-statement> +-- ensure float8 path handles NaN properly +SELECT + op, + width_bucket(op, ARRAY[1, 3, 9, 'NaN', 'NaN']::float8[]) AS wb +FROM (VALUES + (-5.2::float8), + (4::float8), + (77::float8), + ('NaN'::float8) +) v(op); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- ensure float8 path handles NaN properly + ^ + -stdin-:<main>:4:5: Error: At function: PgCall + width_bucket(op, ARRAY[1, 3, 9, 'NaN', 'NaN']::float8[]) AS wb + ^ + -stdin-:<main>:4:5: Error: Unable to find an overload for proc width_bucket with given argument types: (float8,_float8) + width_bucket(op, ARRAY[1, 3, 9, 'NaN', 'NaN']::float8[]) AS wb + ^ +<sql-statement> +-- these exercise the generic fixed-width code path +SELECT + op, + width_bucket(op, ARRAY[1, 3, 5, 10]) AS wb_1 +FROM generate_series(0,11) as op; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- these exercise the generic fixed-width code path + ^ + -stdin-:<main>:4:5: Error: At function: PgCall + width_bucket(op, ARRAY[1, 3, 5, 10]) AS wb_1 + ^ + -stdin-:<main>:4:5: Error: Unable to find an overload for proc width_bucket with given argument types: (int4,_int4) + width_bucket(op, ARRAY[1, 3, 5, 10]) AS wb_1 + ^ +<sql-statement> +SELECT width_bucket(now(), + array['yesterday', 'today', 'tomorrow']::timestamptz[]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT width_bucket(now(), + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT width_bucket(now(), + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc width_bucket with given argument types: (timestamptz,_timestamptz) + SELECT width_bucket(now(), + ^ +<sql-statement> +-- corner cases +SELECT width_bucket(5, ARRAY[3]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- corner cases + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT width_bucket(5, ARRAY[3]); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc width_bucket with given argument types: (int4,_int4) + SELECT width_bucket(5, ARRAY[3]); + ^ +<sql-statement> +SELECT width_bucket(5, '{}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT width_bucket(5, '{}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT width_bucket(5, '{}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc width_bucket with given argument types: (int4,unknown) + SELECT width_bucket(5, '{}'); + ^ +<sql-statement> +-- error cases +SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- error cases + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc width_bucket with given argument types: (text,_int4) + SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]); + ^ +<sql-statement> +SELECT width_bucket(5, ARRAY[3, 4, NULL]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT width_bucket(5, ARRAY[3, 4, NULL]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT width_bucket(5, ARRAY[3, 4, NULL]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc width_bucket with given argument types: (int4,_int4) + SELECT width_bucket(5, ARRAY[3, 4, NULL]); + ^ +<sql-statement> +SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc width_bucket with given argument types: (int4,_int4) + SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]); + ^ +<sql-statement> +-- trim_array +SELECT arr, trim_array(arr, 2) +FROM +(VALUES ('{1,2,3,4,5,6}'::bigint[]), + ('{1,2}'), + ('[10:16]={1,2,3,4,5,6,7}'), + ('[-15:-10]={1,2,3,4,5,6}'), + ('{{1,10},{2,20},{3,30},{4,40}}')) v(arr); +</sql-statement> +<sql-statement> +SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: number of elements to trim must be between 0 and 3 + + SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail + ^ +<sql-statement> +SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: number of elements to trim must be between 0 and 3 + + SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail + ^ +<sql-statement> +SELECT trim_array(ARRAY[]::int[], 1); -- fail +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT trim_array(ARRAY[]::int[], 1); -- fail + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT trim_array(ARRAY[]::int[], 1); -- fail + ^ + -stdin-:<main>:1:28: Error: At function: PgCast + SELECT trim_array(ARRAY[]::int[], 1); -- fail + ^ + -stdin-:<main>:1:19: Error: At function: PgArray + SELECT trim_array(ARRAY[]::int[], 1); -- fail + ^ + -stdin-:<main>:1:19: Error: Expected at least 1 argument(s), but got 0 + SELECT trim_array(ARRAY[]::int[], 1); -- fail + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/arrays.out b/ydb/library/yql/tests/postgresql/cases/arrays.out index 2133c8660a..4d465e1936 100644 --- a/ydb/library/yql/tests/postgresql/cases/arrays.out +++ b/ydb/library/yql/tests/postgresql/cases/arrays.out @@ -10,3 +10,536 @@ CREATE TABLE arrtest ( f char(5)[], g varchar(5)[] ); +-- test mixed slice/scalar subscripting +select '{{1,2,3},{4,5,6},{7,8,9}}'::int[]; + int4 +--------------------------- + {{1,2,3},{4,5,6},{7,8,9}} +(1 row) + +select '[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[]; + int4 +-------------------------------------- + [0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}} +(1 row) + +-- test slices with empty lower and/or upper index +CREATE TEMP TABLE arrtest_s ( + a int2[], + b int2[][] +); +INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}'); +INSERT INTO arrtest_s VALUES ('[0:4]={1,2,3,4,5}', '[0:2][0:2]={{1,2,3}, {4,5,6}, {7,8,9}}'); +INSERT INTO arrtest_s VALUES(NULL, NULL); +-- +-- test array extension +-- +CREATE TEMP TABLE arrtest1 (i int[], t text[]); +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +-- +-- array expressions and operators +-- +-- table creation and INSERTs +CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]); +INSERT INTO arrtest2 VALUES( + ARRAY[[[113,142],[1,147]]], + ARRAY[1.1,1.2,1.3]::float8[], + ARRAY[1.1,1.2,1.3], + ARRAY[[['aaa','aab'],['aba','abb'],['aca','acb']],[['baa','bab'],['bba','bbb'],['bca','bcb']]], + ARRAY['19620326','19931223','19970117']::timestamp[] +); +-- some more test data +CREATE TEMP TABLE arrtest_f (f0 int, f1 text, f2 float8); +insert into arrtest_f values(1,'cat1',1.21); +insert into arrtest_f values(2,'cat1',1.24); +insert into arrtest_f values(3,'cat1',1.18); +insert into arrtest_f values(4,'cat1',1.26); +insert into arrtest_f values(5,'cat1',1.15); +insert into arrtest_f values(6,'cat2',1.15); +insert into arrtest_f values(7,'cat2',1.26); +insert into arrtest_f values(8,'cat2',1.32); +insert into arrtest_f values(9,'cat2',1.30); +CREATE TEMP TABLE arrtest_i (f0 int, f1 text, f2 int); +insert into arrtest_i values(1,'cat1',21); +insert into arrtest_i values(2,'cat1',24); +insert into arrtest_i values(3,'cat1',18); +insert into arrtest_i values(4,'cat1',26); +insert into arrtest_i values(5,'cat1',15); +insert into arrtest_i values(6,'cat2',15); +insert into arrtest_i values(7,'cat2',26); +insert into arrtest_i values(8,'cat2',32); +insert into arrtest_i values(9,'cat2',30); +SELECT ARRAY[[[[[['hello'],['world']]]]]]; + array +--------------------------- + {{{{{{hello},{world}}}}}} +(1 row) + +SELECT ARRAY[ARRAY['hello'],ARRAY['world']]; + array +------------------- + {{hello},{world}} +(1 row) + +-- with nulls +SELECT '{1,null,3}'::int[]; + int4 +------------ + {1,NULL,3} +(1 row) + +SELECT ARRAY[1,NULL,3]; + array +------------ + {1,NULL,3} +(1 row) + +SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; + FALSE +------- + f +(1 row) + +-- array casts +SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}"; + {1,2,3} +--------- + {1,2,3} +(1 row) + +SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] AS "{{a,bc},{def,hijk}}"; + {{a,bc},{def,hijk}} +--------------------- + {{a,bc},{def,hijk}} +(1 row) + +SELECT CAST(ARRAY[[[[[['a','bb','ccc']]]]]] as text[]) as "{{{{{{a,bb,ccc}}}}}}"; + {{{{{{a,bb,ccc}}}}}} +---------------------- + {{{{{{a,bb,ccc}}}}}} +(1 row) + +SELECT NULL::text[]::int[] AS "NULL"; + NULL +------ + +(1 row) + +-- test indexes on arrays +create temp table arr_tbl (f1 int[] unique); +insert into arr_tbl values ('{1,2,3}'); +insert into arr_tbl values ('{1,2}'); +insert into arr_tbl values ('{2,3,4}'); +insert into arr_tbl values ('{1,5,3}'); +insert into arr_tbl values ('{1,2,10}'); +-- test ON CONFLICT DO UPDATE with arrays +create temp table arr_pk_tbl (pk int4 primary key, f1 int[]); +insert into arr_pk_tbl values (1, '{1,2,3}'); +-- +-- General array parser tests +-- +-- none of the following should be accepted +select '{{1,{2}},{2,3}}'::text[]; +ERROR: malformed array literal: "{{1,{2}},{2,3}}" +LINE 1: select '{{1,{2}},{2,3}}'::text[]; + ^ +DETAIL: Unexpected "{" character. +select '{{},{}}'::text[]; +ERROR: malformed array literal: "{{},{}}" +LINE 1: select '{{},{}}'::text[]; + ^ +DETAIL: Unexpected "}" character. +select E'{{1,2},\\{2,3}}'::text[]; +ERROR: malformed array literal: "{{1,2},\{2,3}}" +LINE 1: select E'{{1,2},\\{2,3}}'::text[]; + ^ +DETAIL: Unexpected "\" character. +select '{{"1 2" x},{3}}'::text[]; +ERROR: malformed array literal: "{{"1 2" x},{3}}" +LINE 1: select '{{"1 2" x},{3}}'::text[]; + ^ +DETAIL: Unexpected array element. +select '{}}'::text[]; +ERROR: malformed array literal: "{}}" +LINE 1: select '{}}'::text[]; + ^ +DETAIL: Junk after closing right brace. +select '{ }}'::text[]; +ERROR: malformed array literal: "{ }}" +LINE 1: select '{ }}'::text[]; + ^ +DETAIL: Junk after closing right brace. +-- none of the above should be accepted +-- all of the following should be accepted +select '{}'::text[]; + text +------ + {} +(1 row) + +select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; + text +----------------------------------------------- + {{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}} +(1 row) + +select '{ { "," } , { 3 } }'::text[]; + text +------------- + {{","},{3}} +(1 row) + +select ' { { " 0 second " , 0 second } }'::text[]; + text +------------------------------- + {{" 0 second ","0 second"}} +(1 row) + +select '[0:1]={1.1,2.2}'::float8[]; + float8 +----------------- + [0:1]={1.1,2.2} +(1 row) + +-- all of the above should be accepted +-- tests for array aggregates +CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]); +create table comptable (c1 comptype, c2 comptype[]); +drop table comptable; +select string_to_array('1|2|3', '|'); + string_to_array +----------------- + {1,2,3} +(1 row) + +select string_to_array('1|2|3|', '|'); + string_to_array +----------------- + {1,2,3,""} +(1 row) + +select string_to_array('1||2|3||', '||'); + string_to_array +----------------- + {1,2|3,""} +(1 row) + +select string_to_array('1|2|3', ''); + string_to_array +----------------- + {1|2|3} +(1 row) + +select string_to_array('', '|'); + string_to_array +----------------- + {} +(1 row) + +select string_to_array('1|2|3', NULL); + string_to_array +----------------- + {1,|,2,|,3} +(1 row) + +select string_to_array(NULL, '|') IS NULL; + ?column? +---------- + t +(1 row) + +select string_to_array('abc', ''); + string_to_array +----------------- + {abc} +(1 row) + +select string_to_array('abc', '', 'abc'); + string_to_array +----------------- + {NULL} +(1 row) + +select string_to_array('abc', ','); + string_to_array +----------------- + {abc} +(1 row) + +select string_to_array('abc', ',', 'abc'); + string_to_array +----------------- + {NULL} +(1 row) + +select string_to_array('1,2,3,4,,6', ','); + string_to_array +----------------- + {1,2,3,4,"",6} +(1 row) + +select string_to_array('1,2,3,4,,6', ',', ''); + string_to_array +------------------ + {1,2,3,4,NULL,6} +(1 row) + +select string_to_array('1,2,3,4,*,6', ',', '*'); + string_to_array +------------------ + {1,2,3,4,NULL,6} +(1 row) + +select v, v is null as "is null" from string_to_table('1|2|3', '|') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f +(3 rows) + +select v, v is null as "is null" from string_to_table('1|2|3|', '|') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + | f +(4 rows) + +select v, v is null as "is null" from string_to_table('1||2|3||', '||') g(v); + v | is null +-----+--------- + 1 | f + 2|3 | f + | f +(3 rows) + +select v, v is null as "is null" from string_to_table('1|2|3', '') g(v); + v | is null +-------+--------- + 1|2|3 | f +(1 row) + +select v, v is null as "is null" from string_to_table('', '|') g(v); + v | is null +---+--------- +(0 rows) + +select v, v is null as "is null" from string_to_table('1|2|3', NULL) g(v); + v | is null +---+--------- + 1 | f + | | f + 2 | f + | | f + 3 | f +(5 rows) + +select v, v is null as "is null" from string_to_table(NULL, '|') g(v); + v | is null +---+--------- +(0 rows) + +select v, v is null as "is null" from string_to_table('abc', '') g(v); + v | is null +-----+--------- + abc | f +(1 row) + +select v, v is null as "is null" from string_to_table('abc', '', 'abc') g(v); + v | is null +---+--------- + | t +(1 row) + +select v, v is null as "is null" from string_to_table('abc', ',') g(v); + v | is null +-----+--------- + abc | f +(1 row) + +select v, v is null as "is null" from string_to_table('abc', ',', 'abc') g(v); + v | is null +---+--------- + | t +(1 row) + +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + 4 | f + | f + 6 | f +(6 rows) + +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',', '') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + 4 | f + | t + 6 | f +(6 rows) + +select v, v is null as "is null" from string_to_table('1,2,3,4,*,6', ',', '*') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + 4 | f + | t + 6 | f +(6 rows) + +select array_to_string(NULL::int4[], ',') IS NULL; + ?column? +---------- + t +(1 row) + +select array_to_string('{}'::int4[], ','); + array_to_string +----------------- + +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], ','); + array_to_string +----------------- + 1,2,3,4,6 +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], ',', '*'); + array_to_string +----------------- + 1,2,3,4,*,6 +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], NULL); + array_to_string +----------------- + +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], ',', NULL); + array_to_string +----------------- + 1,2,3,4,6 +(1 row) + +select array_to_string(string_to_array('1|2|3', '|'), '|'); + array_to_string +----------------- + 1|2|3 +(1 row) + +select array_length(array[1,2,3], 1); + array_length +-------------- + 3 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 0); + array_length +-------------- + +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 1); + array_length +-------------- + 2 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 2); + array_length +-------------- + 3 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 3); + array_length +-------------- + +(1 row) + +select cardinality(NULL::int[]); + cardinality +------------- + +(1 row) + +select cardinality('{}'::int[]); + cardinality +------------- + 0 +(1 row) + +select cardinality(array[1,2,3]); + cardinality +------------- + 3 +(1 row) + +select cardinality('[2:4]={5,6,7}'::int[]); + cardinality +------------- + 3 +(1 row) + +select cardinality('{{1,2}}'::int[]); + cardinality +------------- + 2 +(1 row) + +select cardinality('{{1,2},{3,4},{5,6}}'::int[]); + cardinality +------------- + 6 +(1 row) + +select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]); + cardinality +------------- + 8 +(1 row) + +-- Insert/update on a column that is array of composite +create temp table t1 (f1 int8_tbl[]); +-- Check that arrays of composites are safely detoasted when needed +create temp table src (f1 text); +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +create temp table dest (f1 textandtext[]); +drop table src; +drop table dest; +-- trim_array +SELECT arr, trim_array(arr, 2) +FROM +(VALUES ('{1,2,3,4,5,6}'::bigint[]), + ('{1,2}'), + ('[10:16]={1,2,3,4,5,6,7}'), + ('[-15:-10]={1,2,3,4,5,6}'), + ('{{1,10},{2,20},{3,30},{4,40}}')) v(arr); + arr | trim_array +-------------------------------+----------------- + {1,2,3,4,5,6} | {1,2,3,4} + {1,2} | {} + [10:16]={1,2,3,4,5,6,7} | {1,2,3,4,5} + [-15:-10]={1,2,3,4,5,6} | {1,2,3,4} + {{1,10},{2,20},{3,30},{4,40}} | {{1,10},{2,20}} +(5 rows) + +SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail +ERROR: number of elements to trim must be between 0 and 3 +SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail +ERROR: number of elements to trim must be between 0 and 3 diff --git a/ydb/library/yql/tests/postgresql/cases/arrays.sql b/ydb/library/yql/tests/postgresql/cases/arrays.sql index 2133c8660a..6ea0b28eb9 100644 --- a/ydb/library/yql/tests/postgresql/cases/arrays.sql +++ b/ydb/library/yql/tests/postgresql/cases/arrays.sql @@ -10,3 +10,162 @@ CREATE TABLE arrtest ( f char(5)[], g varchar(5)[] ); +-- test mixed slice/scalar subscripting +select '{{1,2,3},{4,5,6},{7,8,9}}'::int[]; +select '[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[]; +-- test slices with empty lower and/or upper index +CREATE TEMP TABLE arrtest_s ( + a int2[], + b int2[][] +); +INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}'); +INSERT INTO arrtest_s VALUES ('[0:4]={1,2,3,4,5}', '[0:2][0:2]={{1,2,3}, {4,5,6}, {7,8,9}}'); +INSERT INTO arrtest_s VALUES(NULL, NULL); +-- +-- test array extension +-- +CREATE TEMP TABLE arrtest1 (i int[], t text[]); +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +-- +-- array expressions and operators +-- +-- table creation and INSERTs +CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]); +INSERT INTO arrtest2 VALUES( + ARRAY[[[113,142],[1,147]]], + ARRAY[1.1,1.2,1.3]::float8[], + ARRAY[1.1,1.2,1.3], + ARRAY[[['aaa','aab'],['aba','abb'],['aca','acb']],[['baa','bab'],['bba','bbb'],['bca','bcb']]], + ARRAY['19620326','19931223','19970117']::timestamp[] +); +-- some more test data +CREATE TEMP TABLE arrtest_f (f0 int, f1 text, f2 float8); +insert into arrtest_f values(1,'cat1',1.21); +insert into arrtest_f values(2,'cat1',1.24); +insert into arrtest_f values(3,'cat1',1.18); +insert into arrtest_f values(4,'cat1',1.26); +insert into arrtest_f values(5,'cat1',1.15); +insert into arrtest_f values(6,'cat2',1.15); +insert into arrtest_f values(7,'cat2',1.26); +insert into arrtest_f values(8,'cat2',1.32); +insert into arrtest_f values(9,'cat2',1.30); +CREATE TEMP TABLE arrtest_i (f0 int, f1 text, f2 int); +insert into arrtest_i values(1,'cat1',21); +insert into arrtest_i values(2,'cat1',24); +insert into arrtest_i values(3,'cat1',18); +insert into arrtest_i values(4,'cat1',26); +insert into arrtest_i values(5,'cat1',15); +insert into arrtest_i values(6,'cat2',15); +insert into arrtest_i values(7,'cat2',26); +insert into arrtest_i values(8,'cat2',32); +insert into arrtest_i values(9,'cat2',30); +SELECT ARRAY[[[[[['hello'],['world']]]]]]; +SELECT ARRAY[ARRAY['hello'],ARRAY['world']]; +-- with nulls +SELECT '{1,null,3}'::int[]; +SELECT ARRAY[1,NULL,3]; +SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; +-- array casts +SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}"; +SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] AS "{{a,bc},{def,hijk}}"; +SELECT CAST(ARRAY[[[[[['a','bb','ccc']]]]]] as text[]) as "{{{{{{a,bb,ccc}}}}}}"; +SELECT NULL::text[]::int[] AS "NULL"; +-- test indexes on arrays +create temp table arr_tbl (f1 int[] unique); +insert into arr_tbl values ('{1,2,3}'); +insert into arr_tbl values ('{1,2}'); +insert into arr_tbl values ('{2,3,4}'); +insert into arr_tbl values ('{1,5,3}'); +insert into arr_tbl values ('{1,2,10}'); +-- test ON CONFLICT DO UPDATE with arrays +create temp table arr_pk_tbl (pk int4 primary key, f1 int[]); +insert into arr_pk_tbl values (1, '{1,2,3}'); +-- +-- General array parser tests +-- +-- none of the following should be accepted +select '{{1,{2}},{2,3}}'::text[]; +select '{{},{}}'::text[]; +select E'{{1,2},\\{2,3}}'::text[]; +select '{{"1 2" x},{3}}'::text[]; +select '{}}'::text[]; +select '{ }}'::text[]; +-- none of the above should be accepted +-- all of the following should be accepted +select '{}'::text[]; +select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; +select '{ { "," } , { 3 } }'::text[]; +select ' { { " 0 second " , 0 second } }'::text[]; +select '[0:1]={1.1,2.2}'::float8[]; +-- all of the above should be accepted +-- tests for array aggregates +CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]); +create table comptable (c1 comptype, c2 comptype[]); +drop table comptable; +select string_to_array('1|2|3', '|'); +select string_to_array('1|2|3|', '|'); +select string_to_array('1||2|3||', '||'); +select string_to_array('1|2|3', ''); +select string_to_array('', '|'); +select string_to_array('1|2|3', NULL); +select string_to_array(NULL, '|') IS NULL; +select string_to_array('abc', ''); +select string_to_array('abc', '', 'abc'); +select string_to_array('abc', ','); +select string_to_array('abc', ',', 'abc'); +select string_to_array('1,2,3,4,,6', ','); +select string_to_array('1,2,3,4,,6', ',', ''); +select string_to_array('1,2,3,4,*,6', ',', '*'); +select v, v is null as "is null" from string_to_table('1|2|3', '|') g(v); +select v, v is null as "is null" from string_to_table('1|2|3|', '|') g(v); +select v, v is null as "is null" from string_to_table('1||2|3||', '||') g(v); +select v, v is null as "is null" from string_to_table('1|2|3', '') g(v); +select v, v is null as "is null" from string_to_table('', '|') g(v); +select v, v is null as "is null" from string_to_table('1|2|3', NULL) g(v); +select v, v is null as "is null" from string_to_table(NULL, '|') g(v); +select v, v is null as "is null" from string_to_table('abc', '') g(v); +select v, v is null as "is null" from string_to_table('abc', '', 'abc') g(v); +select v, v is null as "is null" from string_to_table('abc', ',') g(v); +select v, v is null as "is null" from string_to_table('abc', ',', 'abc') g(v); +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',') g(v); +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',', '') g(v); +select v, v is null as "is null" from string_to_table('1,2,3,4,*,6', ',', '*') g(v); +select array_to_string(NULL::int4[], ',') IS NULL; +select array_to_string('{}'::int4[], ','); +select array_to_string(array[1,2,3,4,NULL,6], ','); +select array_to_string(array[1,2,3,4,NULL,6], ',', '*'); +select array_to_string(array[1,2,3,4,NULL,6], NULL); +select array_to_string(array[1,2,3,4,NULL,6], ',', NULL); +select array_to_string(string_to_array('1|2|3', '|'), '|'); +select array_length(array[1,2,3], 1); +select array_length(array[[1,2,3], [4,5,6]], 0); +select array_length(array[[1,2,3], [4,5,6]], 1); +select array_length(array[[1,2,3], [4,5,6]], 2); +select array_length(array[[1,2,3], [4,5,6]], 3); +select cardinality(NULL::int[]); +select cardinality('{}'::int[]); +select cardinality(array[1,2,3]); +select cardinality('[2:4]={5,6,7}'::int[]); +select cardinality('{{1,2}}'::int[]); +select cardinality('{{1,2},{3,4},{5,6}}'::int[]); +select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]); +-- Insert/update on a column that is array of composite +create temp table t1 (f1 int8_tbl[]); +-- Check that arrays of composites are safely detoasted when needed +create temp table src (f1 text); +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +create temp table dest (f1 textandtext[]); +drop table src; +drop table dest; +-- trim_array +SELECT arr, trim_array(arr, 2) +FROM +(VALUES ('{1,2,3,4,5,6}'::bigint[]), + ('{1,2}'), + ('[10:16]={1,2,3,4,5,6,7}'), + ('[-15:-10]={1,2,3,4,5,6}'), + ('{{1,10},{2,20},{3,30},{4,40}}')) v(arr); +SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail +SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail diff --git a/ydb/library/yql/tests/postgresql/cases/bit.err b/ydb/library/yql/tests/postgresql/cases/bit.err index b5874dec07..836e062b35 100644 --- a/ydb/library/yql/tests/postgresql/cases/bit.err +++ b/ydb/library/yql/tests/postgresql/cases/bit.err @@ -27,17 +27,466 @@ INSERT INTO BIT_TABLE VALUES (B'101011111010'); -- too long --INSERT INTO BIT_TABLE VALUES ('X555'); SELECT * FROM BIT_TABLE; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FDE59429D90) -__libc_start_main+128 (0x7FDE59429E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +CREATE TABLE VARBIT_TABLE(v BIT VARYING(11)); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_TABLE VALUES (B''); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_TABLE VALUES (B'0'); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_TABLE VALUES (B'010101'); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_TABLE VALUES (B'01010101010'); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long +</sql-statement> +<sql-statement> +--INSERT INTO VARBIT_TABLE VALUES ('X554'); +--INSERT INTO VARBIT_TABLE VALUES ('X555'); +SELECT * FROM VARBIT_TABLE; +</sql-statement> +<sql-statement> +-- Concatenation +SELECT v, b, (v || b) AS concat + FROM BIT_TABLE, VARBIT_TABLE + ORDER BY 3; +</sql-statement> +<sql-statement> +-- Length +SELECT b, length(b) AS lb + FROM BIT_TABLE; +</sql-statement> +<sql-statement> +SELECT v, length(v) AS lv + FROM VARBIT_TABLE; +</sql-statement> +<sql-statement> +-- Substring +SELECT b, + SUBSTRING(b FROM 2 FOR 4) AS sub_2_4, + SUBSTRING(b FROM 7 FOR 13) AS sub_7_13, + SUBSTRING(b FROM 6) AS sub_6 + FROM BIT_TABLE; +</sql-statement> +<sql-statement> +SELECT v, + SUBSTRING(v FROM 2 FOR 4) AS sub_2_4, + SUBSTRING(v FROM 7 FOR 13) AS sub_7_13, + SUBSTRING(v FROM 6) AS sub_6 + FROM VARBIT_TABLE; +</sql-statement> +<sql-statement> +-- test overflow cases +SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101"; +</sql-statement> +<sql-statement> +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101"; +</sql-statement> +<sql-statement> +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: negative substring length not allowed + + SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; + ^ +<sql-statement> +SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101"; +</sql-statement> +<sql-statement> +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101"; +</sql-statement> +<sql-statement> +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: negative substring length not allowed + + SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; + ^ +<sql-statement> +--- Bit operations +DROP TABLE varbit_table; +</sql-statement> +<sql-statement> +CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16)); +</sql-statement> +<sql-statement> +COPY varbit_table FROM stdin; +X0F X10 +X1F X11 +X2F X12 +X3F X13 +X8F X04 +X000F X0010 +X0123 XFFFF +X2468 X2468 +XFA50 X05AF +X1234 XFFF5 +\. +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "X0F" + + X0F X10 + ^ +<sql-statement> +SELECT a, b, ~a AS "~ a", a & b AS "a & b", + a | b AS "a | b", a # b AS "a # b" FROM varbit_table; +</sql-statement> +<sql-statement> +SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b", + a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table; +</sql-statement> +<sql-statement> +SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table; +</sql-statement> +<sql-statement> +DROP TABLE varbit_table; +</sql-statement> +<sql-statement> +--- Bit operations +DROP TABLE bit_table; +</sql-statement> +<sql-statement> +CREATE TABLE bit_table (a BIT(16), b BIT(16)); +</sql-statement> +<sql-statement> +COPY bit_table FROM stdin; +X0F00 X1000 +X1F00 X1100 +X2F00 X1200 +X3F00 X1300 +X8F00 X0400 +X000F X0010 +X0123 XFFFF +X2468 X2468 +XFA50 X05AF +X1234 XFFF5 +\. +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "X0F00" + + X0F00 X1000 + ^ +<sql-statement> +SELECT a,b,~a AS "~ a",a & b AS "a & b", + a|b AS "a | b", a # b AS "a # b" FROM bit_table; +</sql-statement> +<sql-statement> +SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b", + a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table; +</sql-statement> +<sql-statement> +SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table; +</sql-statement> +<sql-statement> +DROP TABLE bit_table; +</sql-statement> +<sql-statement> +-- The following should fail +select B'001' & B'10'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- The following should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot AND bit strings of different sizes + + -- The following should fail + ^ +<sql-statement> +select B'0111' | B'011'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select B'0111' | B'011'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot OR bit strings of different sizes + + select B'0111' | B'011'; + ^ +<sql-statement> +select B'0010' # B'011101'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select B'0010' # B'011101'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot XOR bit strings of different sizes + + select B'0010' # B'011101'; + ^ +<sql-statement> +-- More position tests, checking all the boundary cases +SELECT POSITION(B'1010' IN B'0000101'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'1010' IN B'00001010'); -- 5 +</sql-statement> +<sql-statement> +SELECT POSITION(B'1010' IN B'00000101'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'1010' IN B'000001010'); -- 6 +</sql-statement> +<sql-statement> +SELECT POSITION(B'' IN B'00001010'); -- 1 +</sql-statement> +<sql-statement> +SELECT POSITION(B'0' IN B''); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'' IN B''); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3 +</sql-statement> +<sql-statement> +SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3 +</sql-statement> +<sql-statement> +SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3 +</sql-statement> +<sql-statement> +SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5 +</sql-statement> +<sql-statement> +SELECT POSITION(B'11101011' IN B'11101011'); -- 1 +</sql-statement> +<sql-statement> +SELECT POSITION(B'11101011' IN B'011101011'); -- 2 +</sql-statement> +<sql-statement> +SELECT POSITION(B'11101011' IN B'00011101011'); -- 4 +</sql-statement> +<sql-statement> +SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'11101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'011101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'00011101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17 +</sql-statement> +<sql-statement> +SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19 +</sql-statement> +<sql-statement> +SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1 +</sql-statement> +<sql-statement> +SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2 +</sql-statement> +<sql-statement> +SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0 +</sql-statement> +<sql-statement> +-- Shifting +CREATE TABLE BIT_SHIFT_TABLE(b BIT(16)); +</sql-statement> +<sql-statement> +INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000'); +</sql-statement> +<sql-statement> +INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +SELECT POSITION(B'1101' IN b), + POSITION(B'11011' IN b), + b + FROM BIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +SELECT b, b >> 1 AS bsr, b << 1 AS bsl + FROM BIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8 + FROM BIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl + FROM BIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8 + FROM BIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20)); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011'); +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +SELECT POSITION(B'1101' IN v), + POSITION(B'11011' IN v), + v + FROM VARBIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +SELECT v, v >> 1 AS vsr, v << 1 AS vsl + FROM VARBIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8 + FROM VARBIT_SHIFT_TABLE ; +</sql-statement> +<sql-statement> +DROP TABLE BIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +DROP TABLE VARBIT_SHIFT_TABLE; +</sql-statement> +<sql-statement> +-- Get/Set bit +SELECT get_bit(B'0101011000100', 10); +</sql-statement> +<sql-statement> +SELECT set_bit(B'0101011000100100', 15, 1); +</sql-statement> +<sql-statement> +SELECT set_bit(B'0101011000100100', 16, 1); -- fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT set_bit(B'0101011000100100', 16, 1); -- fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bit index 16 out of valid range (0..15) + + SELECT set_bit(B'0101011000100100', 16, 1); -- fail + ^ +<sql-statement> +-- Overlay +SELECT overlay(B'0101011100' placing '001' from 2 for 3); +</sql-statement> +<sql-statement> +SELECT overlay(B'0101011100' placing '101' from 6); +</sql-statement> +<sql-statement> +SELECT overlay(B'0101011100' placing '001' from 11); +</sql-statement> +<sql-statement> +SELECT overlay(B'0101011100' placing '001' from 20); +</sql-statement> +<sql-statement> +-- bit_count +SELECT bit_count(B'0101011100'::bit(10)); +</sql-statement> +<sql-statement> +SELECT bit_count(B'1111111111'::bit(10)); +</sql-statement> +<sql-statement> +-- This table is intentionally left around to exercise pg_dump/pg_upgrade +CREATE TABLE bit_defaults( + b1 bit(4) DEFAULT '1001', + b2 bit(4) DEFAULT B'0101', + b3 bit varying(5) DEFAULT '1001', + b4 bit varying(5) DEFAULT B'0101' +); +</sql-statement> +<sql-statement> +\d bit_defaults +</sql-statement> +Metacommand \d bit_defaults is not supported +<sql-statement> +INSERT INTO bit_defaults DEFAULT VALUES; +</sql-statement> +-stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'default_values' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +TABLE bit_defaults; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/bit.out b/ydb/library/yql/tests/postgresql/cases/bit.out index 12dc4f985f..d95c696897 100644 --- a/ydb/library/yql/tests/postgresql/cases/bit.out +++ b/ydb/library/yql/tests/postgresql/cases/bit.out @@ -8,3 +8,352 @@ CREATE TABLE BIT_TABLE(b BIT(11)); INSERT INTO BIT_TABLE VALUES (B'00000000000'); INSERT INTO BIT_TABLE VALUES (B'11011000000'); INSERT INTO BIT_TABLE VALUES (B'01010101010'); +CREATE TABLE VARBIT_TABLE(v BIT VARYING(11)); +INSERT INTO VARBIT_TABLE VALUES (B''); +INSERT INTO VARBIT_TABLE VALUES (B'0'); +INSERT INTO VARBIT_TABLE VALUES (B'010101'); +INSERT INTO VARBIT_TABLE VALUES (B'01010101010'); +-- test overflow cases +SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101"; + 1010101 +--------- + 1010101 +(1 row) + +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101"; + 01010101 +---------- + 01010101 +(1 row) + +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; +ERROR: negative substring length not allowed +SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101"; + 1010101 +--------- + 1010101 +(1 row) + +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101"; + 01010101 +---------- + 01010101 +(1 row) + +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; +ERROR: negative substring length not allowed +CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16)); +DROP TABLE varbit_table; +CREATE TABLE bit_table (a BIT(16), b BIT(16)); +DROP TABLE bit_table; +-- The following should fail +select B'001' & B'10'; +ERROR: cannot AND bit strings of different sizes +select B'0111' | B'011'; +ERROR: cannot OR bit strings of different sizes +select B'0010' # B'011101'; +ERROR: cannot XOR bit strings of different sizes +-- More position tests, checking all the boundary cases +SELECT POSITION(B'1010' IN B'0000101'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'1010' IN B'00001010'); -- 5 + position +---------- + 5 +(1 row) + +SELECT POSITION(B'1010' IN B'00000101'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'1010' IN B'000001010'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'' IN B'00001010'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'0' IN B''); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'' IN B''); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3 + position +---------- + 3 +(1 row) + +SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3 + position +---------- + 3 +(1 row) + +SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3 + position +---------- + 3 +(1 row) + +SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5 + position +---------- + 5 +(1 row) + +SELECT POSITION(B'11101011' IN B'11101011'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'11101011' IN B'011101011'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'11101011' IN B'00011101011'); -- 4 + position +---------- + 4 +(1 row) + +SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 + position +---------- + 4 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'111010110' IN B'11101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'011101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'00011101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 + position +---------- + 4 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14 + position +---------- + 14 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15 + position +---------- + 15 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17 + position +---------- + 17 +(1 row) + +SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19 + position +---------- + 19 +(1 row) + +SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0 + position +---------- + 0 +(1 row) + +-- Shifting +CREATE TABLE BIT_SHIFT_TABLE(b BIT(16)); +INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000'); +INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE; +CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20)); +INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011'); +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE; +DROP TABLE BIT_SHIFT_TABLE; +DROP TABLE VARBIT_SHIFT_TABLE; +-- Get/Set bit +SELECT get_bit(B'0101011000100', 10); + get_bit +--------- + 1 +(1 row) + +SELECT set_bit(B'0101011000100100', 15, 1); + set_bit +------------------ + 0101011000100101 +(1 row) + +SELECT set_bit(B'0101011000100100', 16, 1); -- fail +ERROR: bit index 16 out of valid range (0..15) +-- Overlay +SELECT overlay(B'0101011100' placing '001' from 2 for 3); + overlay +------------ + 0001011100 +(1 row) + +SELECT overlay(B'0101011100' placing '101' from 6); + overlay +------------ + 0101010100 +(1 row) + +SELECT overlay(B'0101011100' placing '001' from 11); + overlay +--------------- + 0101011100001 +(1 row) + +SELECT overlay(B'0101011100' placing '001' from 20); + overlay +--------------- + 0101011100001 +(1 row) + +-- bit_count +SELECT bit_count(B'0101011100'::bit(10)); + bit_count +----------- + 5 +(1 row) + +SELECT bit_count(B'1111111111'::bit(10)); + bit_count +----------- + 10 +(1 row) + +-- This table is intentionally left around to exercise pg_dump/pg_upgrade +CREATE TABLE bit_defaults( + b1 bit(4) DEFAULT '1001', + b2 bit(4) DEFAULT B'0101', + b3 bit varying(5) DEFAULT '1001', + b4 bit varying(5) DEFAULT B'0101' +); diff --git a/ydb/library/yql/tests/postgresql/cases/bit.sql b/ydb/library/yql/tests/postgresql/cases/bit.sql index 12dc4f985f..c46e4f96c8 100644 --- a/ydb/library/yql/tests/postgresql/cases/bit.sql +++ b/ydb/library/yql/tests/postgresql/cases/bit.sql @@ -8,3 +8,96 @@ CREATE TABLE BIT_TABLE(b BIT(11)); INSERT INTO BIT_TABLE VALUES (B'00000000000'); INSERT INTO BIT_TABLE VALUES (B'11011000000'); INSERT INTO BIT_TABLE VALUES (B'01010101010'); +CREATE TABLE VARBIT_TABLE(v BIT VARYING(11)); +INSERT INTO VARBIT_TABLE VALUES (B''); +INSERT INTO VARBIT_TABLE VALUES (B'0'); +INSERT INTO VARBIT_TABLE VALUES (B'010101'); +INSERT INTO VARBIT_TABLE VALUES (B'01010101010'); +-- test overflow cases +SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101"; +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101"; +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; +SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101"; +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101"; +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; +CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16)); +DROP TABLE varbit_table; +CREATE TABLE bit_table (a BIT(16), b BIT(16)); +DROP TABLE bit_table; +-- The following should fail +select B'001' & B'10'; +select B'0111' | B'011'; +select B'0010' # B'011101'; +-- More position tests, checking all the boundary cases +SELECT POSITION(B'1010' IN B'0000101'); -- 0 +SELECT POSITION(B'1010' IN B'00001010'); -- 5 +SELECT POSITION(B'1010' IN B'00000101'); -- 0 +SELECT POSITION(B'1010' IN B'000001010'); -- 6 +SELECT POSITION(B'' IN B'00001010'); -- 1 +SELECT POSITION(B'0' IN B''); -- 0 +SELECT POSITION(B'' IN B''); -- 0 +SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3 +SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3 +SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3 +SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5 +SELECT POSITION(B'11101011' IN B'11101011'); -- 1 +SELECT POSITION(B'11101011' IN B'011101011'); -- 2 +SELECT POSITION(B'11101011' IN B'00011101011'); -- 4 +SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6 +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 +SELECT POSITION(B'111010110' IN B'11101011'); -- 0 +SELECT POSITION(B'111010110' IN B'011101011'); -- 0 +SELECT POSITION(B'111010110' IN B'00011101011'); -- 0 +SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0 +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 +SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14 +SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15 +SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17 +SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19 +SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1 +SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2 +SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0 +-- Shifting +CREATE TABLE BIT_SHIFT_TABLE(b BIT(16)); +INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000'); +INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE; +CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20)); +INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011'); +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE; +DROP TABLE BIT_SHIFT_TABLE; +DROP TABLE VARBIT_SHIFT_TABLE; +-- Get/Set bit +SELECT get_bit(B'0101011000100', 10); +SELECT set_bit(B'0101011000100100', 15, 1); +SELECT set_bit(B'0101011000100100', 16, 1); -- fail +-- Overlay +SELECT overlay(B'0101011100' placing '001' from 2 for 3); +SELECT overlay(B'0101011100' placing '101' from 6); +SELECT overlay(B'0101011100' placing '001' from 11); +SELECT overlay(B'0101011100' placing '001' from 20); +-- bit_count +SELECT bit_count(B'0101011100'::bit(10)); +SELECT bit_count(B'1111111111'::bit(10)); +-- This table is intentionally left around to exercise pg_dump/pg_upgrade +CREATE TABLE bit_defaults( + b1 bit(4) DEFAULT '1001', + b2 bit(4) DEFAULT B'0101', + b3 bit varying(5) DEFAULT '1001', + b4 bit varying(5) DEFAULT B'0101' +); diff --git a/ydb/library/yql/tests/postgresql/cases/boolean.err b/ydb/library/yql/tests/postgresql/cases/boolean.err index 6738da8d5a..a87bde6cad 100644 --- a/ydb/library/yql/tests/postgresql/cases/boolean.err +++ b/ydb/library/yql/tests/postgresql/cases/boolean.err @@ -497,17 +497,56 @@ Metacommand \pset null '(null)' is not supported -- of the value are true SELECT istrue AND isnul AND istrue FROM booltbl4; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F870C429D90) -__libc_start_main+128 (0x7F870C429E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT istrue AND istrue AND isnul FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isnul AND istrue AND istrue FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isfalse AND isnul AND istrue FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT istrue AND isfalse AND isnul FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isnul AND istrue AND isfalse FROM booltbl4; +</sql-statement> +<sql-statement> +-- OR expression need to return null if there's any nulls and none +-- of the value is true +SELECT isfalse OR isnul OR isfalse FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isfalse OR isfalse OR isnul FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isnul OR isfalse OR isfalse FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isfalse OR isnul OR istrue FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT istrue OR isfalse OR isnul FROM booltbl4; +</sql-statement> +<sql-statement> +SELECT isnul OR istrue OR isfalse FROM booltbl4; +</sql-statement> +<sql-statement> +-- +-- Clean up +-- Many tables are retained by the regression test, but these do not seem +-- particularly useful so just get rid of them for now. +-- - thomas 1997-11-30 +-- +DROP TABLE BOOLTBL1; +</sql-statement> +<sql-statement> +DROP TABLE BOOLTBL2; +</sql-statement> +<sql-statement> +DROP TABLE BOOLTBL3; +</sql-statement> +<sql-statement> +DROP TABLE BOOLTBL4; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/boolean.out b/ydb/library/yql/tests/postgresql/cases/boolean.out index 50c6859e93..a95d897d37 100644 --- a/ydb/library/yql/tests/postgresql/cases/boolean.out +++ b/ydb/library/yql/tests/postgresql/cases/boolean.out @@ -305,3 +305,12 @@ INSERT INTO BOOLTBL3 (d, b, o) VALUES ('null', null, 3); CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool); INSERT INTO booltbl4 VALUES (false, true, null); \pset null '(null)' +-- +-- Clean up +-- Many tables are retained by the regression test, but these do not seem +-- particularly useful so just get rid of them for now. +-- - thomas 1997-11-30 +-- +DROP TABLE BOOLTBL1; +DROP TABLE BOOLTBL2; +DROP TABLE BOOLTBL3; diff --git a/ydb/library/yql/tests/postgresql/cases/boolean.sql b/ydb/library/yql/tests/postgresql/cases/boolean.sql index efe99cf80e..3be5e93776 100644 --- a/ydb/library/yql/tests/postgresql/cases/boolean.sql +++ b/ydb/library/yql/tests/postgresql/cases/boolean.sql @@ -92,3 +92,12 @@ INSERT INTO BOOLTBL3 (d, b, o) VALUES ('null', null, 3); CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool); INSERT INTO booltbl4 VALUES (false, true, null); \pset null '(null)' +-- +-- Clean up +-- Many tables are retained by the regression test, but these do not seem +-- particularly useful so just get rid of them for now. +-- - thomas 1997-11-30 +-- +DROP TABLE BOOLTBL1; +DROP TABLE BOOLTBL2; +DROP TABLE BOOLTBL3; diff --git a/ydb/library/yql/tests/postgresql/cases/case.err b/ydb/library/yql/tests/postgresql/cases/case.err index 77ebf09e85..0dd0b69f60 100644 --- a/ydb/library/yql/tests/postgresql/cases/case.err +++ b/ydb/library/yql/tests/postgresql/cases/case.err @@ -59,17 +59,421 @@ SELECT '<NULL>' AS "One", WHEN 1 > 2 THEN 3 END AS "Simple default"; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F062DE29D90) -__libc_start_main+128 (0x7F062DE29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + ELSE 4 + END AS "Simple ELSE"; +</sql-statement> +<sql-statement> +SELECT '4' AS "One", + CASE + WHEN 1 > 2 THEN 3 + ELSE 4 + END AS "ELSE default"; +</sql-statement> +<sql-statement> +SELECT '6' AS "One", + CASE + WHEN 1 > 2 THEN 3 + WHEN 4 < 5 THEN 6 + ELSE 7 + END AS "Two WHEN with default"; +</sql-statement> +<sql-statement> +SELECT '7' AS "None", + CASE WHEN random() < 0 THEN 1 + END AS "NULL on no matches"; +</sql-statement> +<sql-statement> +-- Constant-expression folding shouldn't evaluate unreachable subexpressions +SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END; +</sql-statement> +<sql-statement> +SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END; +</sql-statement> +<sql-statement> +-- However we do not currently suppress folding of potentially +-- reachable subexpressions +SELECT CASE WHEN i > 100 THEN 1/0 ELSE 0 END FROM case_tbl; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.case_tbl + +<sql-statement> +-- Test for cases involving untyped literals in test expression +SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END; +</sql-statement> +<sql-statement> +-- +-- Examples of targets involving tables +-- +SELECT + CASE + WHEN i >= 3 THEN i + END AS ">= 3 or Null" + FROM CASE_TBL; +</sql-statement> +<sql-statement> +SELECT + CASE WHEN i >= 3 THEN (i + i) + ELSE i + END AS "Simplest Math" + FROM CASE_TBL; +</sql-statement> +<sql-statement> +SELECT i AS "Value", + CASE WHEN (i < 0) THEN 'small' + WHEN (i = 0) THEN 'zero' + WHEN (i = 1) THEN 'one' + WHEN (i = 2) THEN 'two' + ELSE 'big' + END AS "Category" + FROM CASE_TBL; +</sql-statement> +<sql-statement> +SELECT + CASE WHEN ((i < 0) or (i < 0)) THEN 'small' + WHEN ((i = 0) or (i = 0)) THEN 'zero' + WHEN ((i = 1) or (i = 1)) THEN 'one' + WHEN ((i = 2) or (i = 2)) THEN 'two' + ELSE 'big' + END AS "Category" + FROM CASE_TBL; +</sql-statement> +<sql-statement> +-- +-- Examples of qualifications involving tables +-- +-- +-- NULLIF() and COALESCE() +-- Shorthand forms for typical CASE constructs +-- defined in the SQL standard. +-- +SELECT * FROM CASE_TBL WHERE COALESCE(f,i) = 4; +</sql-statement> +<sql-statement> +SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:30: Error: A_Expr_Kind unsupported value: 5 + SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2; + ^ +<sql-statement> +SELECT COALESCE(a.f, b.i, b.j) + FROM CASE_TBL a, CASE2_TBL b; +</sql-statement> +<sql-statement> +SELECT * + FROM CASE_TBL a, CASE2_TBL b + WHERE COALESCE(a.f, b.i, b.j) = 2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT * + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + SELECT * + ^ +<sql-statement> +SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)", + NULLIF(b.i, 4) AS "NULLIF(b.i,4)" + FROM CASE_TBL a, CASE2_TBL b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: A_Expr_Kind unsupported value: 5 + SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)", + ^ +<sql-statement> +SELECT * + FROM CASE_TBL a, CASE2_TBL b + WHERE COALESCE(f,b.i) = 2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT * + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + SELECT * + ^ +<sql-statement> +-- Tests for constant subexpression simplification +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, 2) = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Tests for constant subexpression simplification + ^ +<sql-statement> +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, 1) IS NOT NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, null) = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +-- +-- Examples of updates involving tables +-- +UPDATE CASE_TBL + SET i = CASE WHEN i >= 3 THEN (- i) + ELSE (2 * i) END; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM CASE_TBL; +</sql-statement> +<sql-statement> +UPDATE CASE_TBL + SET i = CASE WHEN i >= 2 THEN (2 * i) + ELSE (3 * i) END; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM CASE_TBL; +</sql-statement> +<sql-statement> +UPDATE CASE_TBL + SET i = CASE WHEN b.i >= 2 THEN (2 * j) + ELSE (3 * j) END + FROM CASE2_TBL b + WHERE j = -CASE_TBL.i; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM CASE_TBL; +</sql-statement> +<sql-statement> +-- +-- Nested CASE expressions +-- +-- This test exercises a bug caused by aliasing econtext->caseValue_isNull +-- with the isNull argument of the inner CASE's CaseExpr evaluation. After +-- evaluating the vol(null) expression in the inner CASE's second WHEN-clause, +-- the isNull flag for the case test value incorrectly became true, causing +-- the third WHEN-clause not to match. The volatile function calls are needed +-- to prevent constant-folding in the planner, which would hide the bug. +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +</sql-statement> +<sql-statement> +CREATE FUNCTION vol(text) returns text as + 'begin return $1; end' language plpgsql volatile; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION vol(text) returns text as + ^ +<sql-statement> +SELECT CASE + (CASE vol('bar') + WHEN 'foo' THEN 'it was foo!' + WHEN vol(null) THEN 'null input' + WHEN 'bar' THEN 'it was bar!' END + ) + WHEN 'it was foo!' THEN 'foo recognized' + WHEN 'it was bar!' THEN 'bar recognized' + ELSE 'unrecognized' END; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT CASE + ^ + -stdin-:<main>:1:8: Error: At function: If, At function: Or, At function: Coalesce, At function: FromPg, At function: PgOp + SELECT CASE + ^ + -stdin-:<main>:2:4: Error: At function: If, At function: Or + (CASE vol('bar') + ^ + -stdin-:<main>:2:4: Error: At function: Coalesce, At function: FromPg, At function: PgOp + (CASE vol('bar') + ^ + -stdin-:<main>:2:9: Error: At function: PgCall + (CASE vol('bar') + ^ + -stdin-:<main>:2:9: Error: No such proc: vol + (CASE vol('bar') + ^ + -stdin-:<main>:2:4: Error: At function: Coalesce, At function: FromPg, At function: PgOp + (CASE vol('bar') + ^ + -stdin-:<main>:4:10: Error: At function: PgCall + WHEN vol(null) THEN 'null input' + ^ + -stdin-:<main>:4:10: Error: No such proc: vol + WHEN vol(null) THEN 'null input' + ^ +<sql-statement> +-- In this case, we can't inline the SQL function without confusing things. +CREATE DOMAIN foodomain AS text; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + -- In this case, we can't inline the SQL function without confusing things. + ^ +<sql-statement> +CREATE FUNCTION volfoo(text) returns foodomain as + 'begin return $1::foodomain; end' language plpgsql volatile; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION volfoo(text) returns foodomain as + ^ +<sql-statement> +CREATE FUNCTION inline_eq(foodomain, foodomain) returns boolean as + 'SELECT CASE $2::text WHEN $1::text THEN true ELSE false END' language sql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION inline_eq(foodomain, foodomain) returns boolean as + ^ +<sql-statement> +CREATE OPERATOR = (procedure = inline_eq, + leftarg = foodomain, rightarg = foodomain); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 255 + CREATE OPERATOR = (procedure = inline_eq, + ^ +<sql-statement> +SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:39: Error: Unknown type: foodomain + SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END; + ^ +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +-- Test multiple evaluation of a CASE arg that is a read/write object (#14472) +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +</sql-statement> +<sql-statement> +CREATE DOMAIN arrdomain AS int[]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN arrdomain AS int[]; + ^ +<sql-statement> +CREATE FUNCTION make_ad(int,int) returns arrdomain as + 'declare x arrdomain; + begin + x := array[$1,$2]; + return x; + end' language plpgsql volatile; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION make_ad(int,int) returns arrdomain as + ^ +<sql-statement> +CREATE FUNCTION ad_eq(arrdomain, arrdomain) returns boolean as + 'begin return array_eq($1, $2); end' language plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION ad_eq(arrdomain, arrdomain) returns boolean as + ^ +<sql-statement> +CREATE OPERATOR = (procedure = ad_eq, + leftarg = arrdomain, rightarg = arrdomain); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 255 + CREATE OPERATOR = (procedure = ad_eq, + ^ +<sql-statement> +SELECT CASE make_ad(1,2) + WHEN array[2,4]::arrdomain THEN 'wrong' + WHEN array[2,5]::arrdomain THEN 'still wrong' + WHEN array[1,2]::arrdomain THEN 'right' + END; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:20: Error: Unknown type: arrdomain + WHEN array[2,4]::arrdomain THEN 'wrong' + ^ +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +-- Test interaction of CASE with ArrayCoerceExpr (bug #15471) +BEGIN; +</sql-statement> +<sql-statement> +CREATE TYPE casetestenum AS ENUM ('e', 'f', 'g'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 315 + CREATE TYPE casetestenum AS ENUM ('e', 'f', 'g'); + ^ +<sql-statement> +SELECT + CASE 'foo'::text + WHEN 'foo' THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::casetestenum)::text[] + ELSE ARRAY['x', 'y'] + END; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:67: Error: Unknown type: casetestenum + WHEN 'foo' THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::casetestenum)::text[] + ^ +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +-- +-- Clean up +-- +DROP TABLE CASE_TBL; +</sql-statement> +<sql-statement> +DROP TABLE CASE2_TBL; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/case.out b/ydb/library/yql/tests/postgresql/cases/case.out index 8a8de88ebe..c1bf7dc9c6 100644 --- a/ydb/library/yql/tests/postgresql/cases/case.out +++ b/ydb/library/yql/tests/postgresql/cases/case.out @@ -32,3 +32,97 @@ SELECT '3' AS "One", 3 | 3 (1 row) +SELECT '<NULL>' AS "One", + CASE + WHEN 1 > 2 THEN 3 + END AS "Simple default"; + One | Simple default +--------+---------------- + <NULL> | +(1 row) + +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + ELSE 4 + END AS "Simple ELSE"; + One | Simple ELSE +-----+------------- + 3 | 3 +(1 row) + +SELECT '4' AS "One", + CASE + WHEN 1 > 2 THEN 3 + ELSE 4 + END AS "ELSE default"; + One | ELSE default +-----+-------------- + 4 | 4 +(1 row) + +SELECT '6' AS "One", + CASE + WHEN 1 > 2 THEN 3 + WHEN 4 < 5 THEN 6 + ELSE 7 + END AS "Two WHEN with default"; + One | Two WHEN with default +-----+----------------------- + 6 | 6 +(1 row) + +SELECT '7' AS "None", + CASE WHEN random() < 0 THEN 1 + END AS "NULL on no matches"; + None | NULL on no matches +------+-------------------- + 7 | +(1 row) + +-- Constant-expression folding shouldn't evaluate unreachable subexpressions +SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END; + case +------ + 1 +(1 row) + +SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END; + case +------ + 1 +(1 row) + +-- Test for cases involving untyped literals in test expression +SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END; + case +------ + 1 +(1 row) + +-- +-- Nested CASE expressions +-- +-- This test exercises a bug caused by aliasing econtext->caseValue_isNull +-- with the isNull argument of the inner CASE's CaseExpr evaluation. After +-- evaluating the vol(null) expression in the inner CASE's second WHEN-clause, +-- the isNull flag for the case test value incorrectly became true, causing +-- the third WHEN-clause not to match. The volatile function calls are needed +-- to prevent constant-folding in the planner, which would hide the bug. +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +ROLLBACK; +-- Test multiple evaluation of a CASE arg that is a read/write object (#14472) +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +ROLLBACK; +-- Test interaction of CASE with ArrayCoerceExpr (bug #15471) +BEGIN; +ROLLBACK; +-- +-- Clean up +-- +DROP TABLE CASE_TBL; +DROP TABLE CASE2_TBL; diff --git a/ydb/library/yql/tests/postgresql/cases/case.sql b/ydb/library/yql/tests/postgresql/cases/case.sql index 6c713de309..a052c3082a 100644 --- a/ydb/library/yql/tests/postgresql/cases/case.sql +++ b/ydb/library/yql/tests/postgresql/cases/case.sql @@ -27,3 +27,57 @@ SELECT '3' AS "One", CASE WHEN 1 < 2 THEN 3 END AS "Simple WHEN"; +SELECT '<NULL>' AS "One", + CASE + WHEN 1 > 2 THEN 3 + END AS "Simple default"; +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + ELSE 4 + END AS "Simple ELSE"; +SELECT '4' AS "One", + CASE + WHEN 1 > 2 THEN 3 + ELSE 4 + END AS "ELSE default"; +SELECT '6' AS "One", + CASE + WHEN 1 > 2 THEN 3 + WHEN 4 < 5 THEN 6 + ELSE 7 + END AS "Two WHEN with default"; +SELECT '7' AS "None", + CASE WHEN random() < 0 THEN 1 + END AS "NULL on no matches"; +-- Constant-expression folding shouldn't evaluate unreachable subexpressions +SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END; +SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END; +-- Test for cases involving untyped literals in test expression +SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END; +-- +-- Nested CASE expressions +-- +-- This test exercises a bug caused by aliasing econtext->caseValue_isNull +-- with the isNull argument of the inner CASE's CaseExpr evaluation. After +-- evaluating the vol(null) expression in the inner CASE's second WHEN-clause, +-- the isNull flag for the case test value incorrectly became true, causing +-- the third WHEN-clause not to match. The volatile function calls are needed +-- to prevent constant-folding in the planner, which would hide the bug. +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +ROLLBACK; +-- Test multiple evaluation of a CASE arg that is a read/write object (#14472) +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +ROLLBACK; +-- Test interaction of CASE with ArrayCoerceExpr (bug #15471) +BEGIN; +ROLLBACK; +-- +-- Clean up +-- +DROP TABLE CASE_TBL; +DROP TABLE CASE2_TBL; diff --git a/ydb/library/yql/tests/postgresql/cases/create_table.err b/ydb/library/yql/tests/postgresql/cases/create_table.err index 678b0ceadb..bfc9390ba1 100644 --- a/ydb/library/yql/tests/postgresql/cases/create_table.err +++ b/ydb/library/yql/tests/postgresql/cases/create_table.err @@ -585,12 +585,22 @@ CREATE TABLE remember_create_subid (c int); <sql-statement> SAVEPOINT q; </sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: TransactionStmt: kind is not supported: 4 + SAVEPOINT q; + ^ <sql-statement> DROP TABLE remember_create_subid; </sql-statement> <sql-statement> ROLLBACK TO q; </sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: TransactionStmt: kind is not supported: 6 + ROLLBACK TO q; + ^ <sql-statement> COMMIT; </sql-statement> @@ -615,12 +625,22 @@ ALTER TABLE remember_node_subid ALTER c TYPE bigint; <sql-statement> SAVEPOINT q; </sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: TransactionStmt: kind is not supported: 4 + SAVEPOINT q; + ^ <sql-statement> DROP TABLE remember_node_subid; </sql-statement> <sql-statement> ROLLBACK TO q; </sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: TransactionStmt: kind is not supported: 6 + ROLLBACK TO q; + ^ <sql-statement> COMMIT; </sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/create_table.out b/ydb/library/yql/tests/postgresql/cases/create_table.out index 20f58a07f9..bf79c3ca0e 100644 --- a/ydb/library/yql/tests/postgresql/cases/create_table.out +++ b/ydb/library/yql/tests/postgresql/cases/create_table.out @@ -178,6 +178,16 @@ LINE 1: CREATE TABLE withoid() WITH OIDS; -- but explicitly not adding oids is still supported CREATE TEMP TABLE withoutoid() WITHOUT OIDS; DROP TABLE withoutoid; +-- Verify that subtransaction rollback restores rd_createSubid. +BEGIN; +CREATE TABLE remember_create_subid (c int); +DROP TABLE remember_create_subid; +COMMIT; +-- Verify that subtransaction rollback restores rd_firstRelfilenodeSubid. +CREATE TABLE remember_node_subid (c int); +BEGIN; +DROP TABLE remember_node_subid; +COMMIT; -- syntax does not allow empty list of values for list partitions CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES IN (); ERROR: syntax error at or near ")" diff --git a/ydb/library/yql/tests/postgresql/cases/create_table.sql b/ydb/library/yql/tests/postgresql/cases/create_table.sql index 0e783812a3..90a9884c52 100644 --- a/ydb/library/yql/tests/postgresql/cases/create_table.sql +++ b/ydb/library/yql/tests/postgresql/cases/create_table.sql @@ -175,6 +175,16 @@ CREATE TABLE withoid() WITH OIDS; -- but explicitly not adding oids is still supported CREATE TEMP TABLE withoutoid() WITHOUT OIDS; DROP TABLE withoutoid; +-- Verify that subtransaction rollback restores rd_createSubid. +BEGIN; +CREATE TABLE remember_create_subid (c int); +DROP TABLE remember_create_subid; +COMMIT; +-- Verify that subtransaction rollback restores rd_firstRelfilenodeSubid. +CREATE TABLE remember_node_subid (c int); +BEGIN; +DROP TABLE remember_node_subid; +COMMIT; -- syntax does not allow empty list of values for list partitions CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES IN (); -- check if compatible with the specified parent diff --git a/ydb/library/yql/tests/postgresql/cases/date.err b/ydb/library/yql/tests/postgresql/cases/date.err index b36609644e..4a601044c9 100644 --- a/ydb/library/yql/tests/postgresql/cases/date.err +++ b/ydb/library/yql/tests/postgresql/cases/date.err @@ -58,17 +58,1270 @@ INSERT INTO DATE_TBL VALUES ('2040-04-10 BC'); <sql-statement> SELECT f1 FROM DATE_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FCE85229D90) -__libc_start_main+128 (0x7FCE85229E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT f1 FROM DATE_TBL WHERE f1 < '2000-01-01'; +</sql-statement> +<sql-statement> +SELECT f1 FROM DATE_TBL + WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01'; +</sql-statement> +<sql-statement> +-- +-- Check all the documented input formats +-- +SET datestyle TO iso; -- display results in ISO +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: datestyle + -- + ^ +<sql-statement> +SET datestyle TO ymd; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: datestyle + SET datestyle TO ymd; + ^ +<sql-statement> +SELECT date 'January 8, 1999'; +</sql-statement> +<sql-statement> +SELECT date '1999-01-08'; +</sql-statement> +<sql-statement> +SELECT date '1999-01-18'; +</sql-statement> +<sql-statement> +SELECT date '1/8/1999'; +</sql-statement> +<sql-statement> +SELECT date '1/18/1999'; +</sql-statement> +<sql-statement> +SELECT date '18/1/1999'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '18/1/1999'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "18/1/1999" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '18/1/1999'; + ^ +<sql-statement> +SELECT date '01/02/03'; +</sql-statement> +<sql-statement> +SELECT date '19990108'; +</sql-statement> +<sql-statement> +SELECT date '990108'; +</sql-statement> +<sql-statement> +SELECT date '1999.008'; +</sql-statement> +<sql-statement> +SELECT date 'J2451187'; +</sql-statement> +<sql-statement> +SELECT date 'January 8, 99 BC'; +</sql-statement> +<sql-statement> +SELECT date '99-Jan-08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-Jan-08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-Jan-08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-Jan-08'; + ^ +<sql-statement> +SELECT date '1999-Jan-08'; +</sql-statement> +<sql-statement> +SELECT date '08-Jan-99'; +</sql-statement> +<sql-statement> +SELECT date '08-Jan-1999'; +</sql-statement> +<sql-statement> +SELECT date 'Jan-08-99'; +</sql-statement> +<sql-statement> +SELECT date 'Jan-08-1999'; +</sql-statement> +<sql-statement> +SELECT date '99-08-Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-08-Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99-08-Jan" + + SELECT date '99-08-Jan'; + ^ +<sql-statement> +SELECT date '1999-08-Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '1999-08-Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "1999-08-Jan" + + SELECT date '1999-08-Jan'; + ^ +<sql-statement> +SELECT date '99 Jan 08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 Jan 08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99 Jan 08" + + SELECT date '99 Jan 08'; + ^ +<sql-statement> +SELECT date '1999 Jan 08'; +</sql-statement> +<sql-statement> +SELECT date '08 Jan 99'; +</sql-statement> +<sql-statement> +SELECT date '08 Jan 1999'; +</sql-statement> +<sql-statement> +SELECT date 'Jan 08 99'; +</sql-statement> +<sql-statement> +SELECT date 'Jan 08 1999'; +</sql-statement> +<sql-statement> +SELECT date '99 08 Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 08 Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99 08 Jan" + + SELECT date '99 08 Jan'; + ^ +<sql-statement> +SELECT date '1999 08 Jan'; +</sql-statement> +<sql-statement> +SELECT date '99-01-08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-01-08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-01-08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-01-08'; + ^ +<sql-statement> +SELECT date '1999-01-08'; +</sql-statement> +<sql-statement> +SELECT date '08-01-99'; +</sql-statement> +<sql-statement> +SELECT date '08-01-1999'; +</sql-statement> +<sql-statement> +SELECT date '01-08-99'; +</sql-statement> +<sql-statement> +SELECT date '01-08-1999'; +</sql-statement> +<sql-statement> +SELECT date '99-08-01'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-08-01'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-08-01" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-08-01'; + ^ +<sql-statement> +SELECT date '1999-08-01'; +</sql-statement> +<sql-statement> +SELECT date '99 01 08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 01 08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99 01 08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99 01 08'; + ^ +<sql-statement> +SELECT date '1999 01 08'; +</sql-statement> +<sql-statement> +SELECT date '08 01 99'; +</sql-statement> +<sql-statement> +SELECT date '08 01 1999'; +</sql-statement> +<sql-statement> +SELECT date '01 08 99'; +</sql-statement> +<sql-statement> +SELECT date '01 08 1999'; +</sql-statement> +<sql-statement> +SELECT date '99 08 01'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 08 01'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99 08 01" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99 08 01'; + ^ +<sql-statement> +SELECT date '1999 08 01'; +</sql-statement> +<sql-statement> +SET datestyle TO dmy; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: datestyle + SET datestyle TO dmy; + ^ +<sql-statement> +SELECT date 'January 8, 1999'; +</sql-statement> +<sql-statement> +SELECT date '1999-01-08'; +</sql-statement> +<sql-statement> +SELECT date '1999-01-18'; +</sql-statement> +<sql-statement> +SELECT date '1/8/1999'; +</sql-statement> +<sql-statement> +SELECT date '1/18/1999'; +</sql-statement> +<sql-statement> +SELECT date '18/1/1999'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '18/1/1999'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "18/1/1999" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '18/1/1999'; + ^ +<sql-statement> +SELECT date '01/02/03'; +</sql-statement> +<sql-statement> +SELECT date '19990108'; +</sql-statement> +<sql-statement> +SELECT date '990108'; +</sql-statement> +<sql-statement> +SELECT date '1999.008'; +</sql-statement> +<sql-statement> +SELECT date 'J2451187'; +</sql-statement> +<sql-statement> +SELECT date 'January 8, 99 BC'; +</sql-statement> +<sql-statement> +SELECT date '99-Jan-08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-Jan-08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-Jan-08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-Jan-08'; + ^ +<sql-statement> +SELECT date '1999-Jan-08'; +</sql-statement> +<sql-statement> +SELECT date '08-Jan-99'; +</sql-statement> +<sql-statement> +SELECT date '08-Jan-1999'; +</sql-statement> +<sql-statement> +SELECT date 'Jan-08-99'; +</sql-statement> +<sql-statement> +SELECT date 'Jan-08-1999'; +</sql-statement> +<sql-statement> +SELECT date '99-08-Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-08-Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99-08-Jan" + + SELECT date '99-08-Jan'; + ^ +<sql-statement> +SELECT date '1999-08-Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '1999-08-Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "1999-08-Jan" + + SELECT date '1999-08-Jan'; + ^ +<sql-statement> +SELECT date '99 Jan 08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 Jan 08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99 Jan 08" + + SELECT date '99 Jan 08'; + ^ +<sql-statement> +SELECT date '1999 Jan 08'; +</sql-statement> +<sql-statement> +SELECT date '08 Jan 99'; +</sql-statement> +<sql-statement> +SELECT date '08 Jan 1999'; +</sql-statement> +<sql-statement> +SELECT date 'Jan 08 99'; +</sql-statement> +<sql-statement> +SELECT date 'Jan 08 1999'; +</sql-statement> +<sql-statement> +SELECT date '99 08 Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 08 Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99 08 Jan" + + SELECT date '99 08 Jan'; + ^ +<sql-statement> +SELECT date '1999 08 Jan'; +</sql-statement> +<sql-statement> +SELECT date '99-01-08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-01-08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-01-08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-01-08'; + ^ +<sql-statement> +SELECT date '1999-01-08'; +</sql-statement> +<sql-statement> +SELECT date '08-01-99'; +</sql-statement> +<sql-statement> +SELECT date '08-01-1999'; +</sql-statement> +<sql-statement> +SELECT date '01-08-99'; +</sql-statement> +<sql-statement> +SELECT date '01-08-1999'; +</sql-statement> +<sql-statement> +SELECT date '99-08-01'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-08-01'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-08-01" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-08-01'; + ^ +<sql-statement> +SELECT date '1999-08-01'; +</sql-statement> +<sql-statement> +SELECT date '99 01 08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 01 08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99 01 08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99 01 08'; + ^ +<sql-statement> +SELECT date '1999 01 08'; +</sql-statement> +<sql-statement> +SELECT date '08 01 99'; +</sql-statement> +<sql-statement> +SELECT date '08 01 1999'; +</sql-statement> +<sql-statement> +SELECT date '01 08 99'; +</sql-statement> +<sql-statement> +SELECT date '01 08 1999'; +</sql-statement> +<sql-statement> +SELECT date '99 08 01'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 08 01'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99 08 01" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99 08 01'; + ^ +<sql-statement> +SELECT date '1999 08 01'; +</sql-statement> +<sql-statement> +SET datestyle TO mdy; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: datestyle + SET datestyle TO mdy; + ^ +<sql-statement> +SELECT date 'January 8, 1999'; +</sql-statement> +<sql-statement> +SELECT date '1999-01-08'; +</sql-statement> +<sql-statement> +SELECT date '1999-01-18'; +</sql-statement> +<sql-statement> +SELECT date '1/8/1999'; +</sql-statement> +<sql-statement> +SELECT date '1/18/1999'; +</sql-statement> +<sql-statement> +SELECT date '18/1/1999'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '18/1/1999'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "18/1/1999" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '18/1/1999'; + ^ +<sql-statement> +SELECT date '01/02/03'; +</sql-statement> +<sql-statement> +SELECT date '19990108'; +</sql-statement> +<sql-statement> +SELECT date '990108'; +</sql-statement> +<sql-statement> +SELECT date '1999.008'; +</sql-statement> +<sql-statement> +SELECT date 'J2451187'; +</sql-statement> +<sql-statement> +SELECT date 'January 8, 99 BC'; +</sql-statement> +<sql-statement> +SELECT date '99-Jan-08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-Jan-08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-Jan-08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-Jan-08'; + ^ +<sql-statement> +SELECT date '1999-Jan-08'; +</sql-statement> +<sql-statement> +SELECT date '08-Jan-99'; +</sql-statement> +<sql-statement> +SELECT date '08-Jan-1999'; +</sql-statement> +<sql-statement> +SELECT date 'Jan-08-99'; +</sql-statement> +<sql-statement> +SELECT date 'Jan-08-1999'; +</sql-statement> +<sql-statement> +SELECT date '99-08-Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-08-Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99-08-Jan" + + SELECT date '99-08-Jan'; + ^ +<sql-statement> +SELECT date '1999-08-Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '1999-08-Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "1999-08-Jan" + + SELECT date '1999-08-Jan'; + ^ +<sql-statement> +SELECT date '99 Jan 08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 Jan 08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99 Jan 08" + + SELECT date '99 Jan 08'; + ^ +<sql-statement> +SELECT date '1999 Jan 08'; +</sql-statement> +<sql-statement> +SELECT date '08 Jan 99'; +</sql-statement> +<sql-statement> +SELECT date '08 Jan 1999'; +</sql-statement> +<sql-statement> +SELECT date 'Jan 08 99'; +</sql-statement> +<sql-statement> +SELECT date 'Jan 08 1999'; +</sql-statement> +<sql-statement> +SELECT date '99 08 Jan'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 08 Jan'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type date: "99 08 Jan" + + SELECT date '99 08 Jan'; + ^ +<sql-statement> +SELECT date '1999 08 Jan'; +</sql-statement> +<sql-statement> +SELECT date '99-01-08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-01-08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-01-08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-01-08'; + ^ +<sql-statement> +SELECT date '1999-01-08'; +</sql-statement> +<sql-statement> +SELECT date '08-01-99'; +</sql-statement> +<sql-statement> +SELECT date '08-01-1999'; +</sql-statement> +<sql-statement> +SELECT date '01-08-99'; +</sql-statement> +<sql-statement> +SELECT date '01-08-1999'; +</sql-statement> +<sql-statement> +SELECT date '99-08-01'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99-08-01'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99-08-01" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99-08-01'; + ^ +<sql-statement> +SELECT date '1999-08-01'; +</sql-statement> +<sql-statement> +SELECT date '99 01 08'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 01 08'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99 01 08" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99 01 08'; + ^ +<sql-statement> +SELECT date '1999 01 08'; +</sql-statement> +<sql-statement> +SELECT date '08 01 99'; +</sql-statement> +<sql-statement> +SELECT date '08 01 1999'; +</sql-statement> +<sql-statement> +SELECT date '01 08 99'; +</sql-statement> +<sql-statement> +SELECT date '01 08 1999'; +</sql-statement> +<sql-statement> +SELECT date '99 08 01'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '99 08 01'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "99 08 01" +HINT: Perhaps you need a different "datestyle" setting. + + SELECT date '99 08 01'; + ^ +<sql-statement> +SELECT date '1999 08 01'; +</sql-statement> +<sql-statement> +-- Check upper and lower limits of date range +SELECT date '4714-11-24 BC'; +</sql-statement> +<sql-statement> +SELECT date '4714-11-23 BC'; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '4714-11-23 BC'; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date out of range: "4714-11-23 BC" + + SELECT date '4714-11-23 BC'; -- out of range + ^ +<sql-statement> +SELECT date '5874897-12-31'; +</sql-statement> +<sql-statement> +SELECT date '5874898-01-01'; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date '5874898-01-01'; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date out of range: "5874898-01-01" + + SELECT date '5874898-01-01'; -- out of range + ^ +<sql-statement> +RESET datestyle; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET datestyle; + ^ +<sql-statement> +-- +-- Simple math +-- Leave most of it for the horology tests +-- +SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL; +</sql-statement> +<sql-statement> +SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL; +</sql-statement> +<sql-statement> +SELECT date 'yesterday' - date 'today' AS "One day"; +</sql-statement> +<sql-statement> +SELECT date 'today' - date 'tomorrow' AS "One day"; +</sql-statement> +<sql-statement> +SELECT date 'yesterday' - date 'tomorrow' AS "Two days"; +</sql-statement> +<sql-statement> +SELECT date 'tomorrow' - date 'today' AS "One day"; +</sql-statement> +<sql-statement> +SELECT date 'today' - date 'yesterday' AS "One day"; +</sql-statement> +<sql-statement> +SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; +</sql-statement> +<sql-statement> +-- +-- test extract! +-- +SELECT f1 as "date", + date_part('year', f1) AS year, + date_part('month', f1) AS month, + date_part('day', f1) AS day, + date_part('quarter', f1) AS quarter, + date_part('decade', f1) AS decade, + date_part('century', f1) AS century, + date_part('millennium', f1) AS millennium, + date_part('isoyear', f1) AS isoyear, + date_part('week', f1) AS week, + date_part('dow', f1) AS dow, + date_part('isodow', f1) AS isodow, + date_part('doy', f1) AS doy, + date_part('julian', f1) AS julian, + date_part('epoch', f1) AS epoch + FROM date_tbl; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.date_tbl + +<sql-statement> +-- +-- epoch +-- +SELECT EXTRACT(EPOCH FROM DATE '1970-01-01'); -- 0 +</sql-statement> +<sql-statement> +-- +-- century +-- +SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true +</sql-statement> +<sql-statement> +-- +-- millennium +-- +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2 +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 +</sql-statement> +<sql-statement> +-- next test to be fixed on the turn of the next millennium;-) +SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 +</sql-statement> +<sql-statement> +-- +-- decade +-- +SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199 +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0 +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 +</sql-statement> +<sql-statement> +-- +-- all possible fields +-- +SELECT EXTRACT(MICROSECONDS FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "microseconds" not supported + + -- + ^ +<sql-statement> +SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "milliseconds" not supported + + SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "second" not supported + + SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "minute" not supported + + SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "hour" not supported + + SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(DAY FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(MONTH FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(YEAR FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(YEAR FROM DATE '2020-08-11 BC'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11 BC'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(QUARTER FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(WEEK FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(DOW FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(DOW FROM DATE '2020-08-16'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(ISODOW FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(ISODOW FROM DATE '2020-08-16'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(DOY FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "timezone" not supported + + SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "timezone_m" not supported + + SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "timezone_h" not supported + + SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); + ^ +<sql-statement> +SELECT EXTRACT(EPOCH FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(JULIAN FROM DATE '2020-08-11'); +</sql-statement> +<sql-statement> +-- +-- test trunc function! +-- +SELECT DATE_TRUNC('MILLENNIUM', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1001 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('MILLENNIUM', DATE '1970-03-20'); -- 1001-01-01 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('CENTURY', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1901 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('CENTURY', DATE '1970-03-20'); -- 1901 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('CENTURY', DATE '2004-08-10'); -- 2001-01-01 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('CENTURY', DATE '0002-02-04'); -- 0001-01-01 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('CENTURY', DATE '0055-08-10 BC'); -- 0100-01-01 BC +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01 +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('DECADE', DATE '0004-12-25'); -- 0001-01-01 BC +</sql-statement> +<sql-statement> +SELECT DATE_TRUNC('DECADE', DATE '0002-12-31 BC'); -- 0011-01-01 BC +</sql-statement> +<sql-statement> +-- +-- test infinity +-- +select 'infinity'::date, '-infinity'::date; +</sql-statement> +<sql-statement> +select 'infinity'::date > 'today'::date as t; +</sql-statement> +<sql-statement> +select '-infinity'::date < 'today'::date as t; +</sql-statement> +<sql-statement> +select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date); +</sql-statement> +<sql-statement> +-- +-- oscillating fields from non-finite date: +-- +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(DAY FROM DATE '-infinity'); -- NULL +</sql-statement> +<sql-statement> +-- all supported fields +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(MONTH FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(QUARTER FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(WEEK FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(DOW FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(ISODOW FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +SELECT EXTRACT(DOY FROM DATE 'infinity'); -- NULL +</sql-statement> +<sql-statement> +-- +-- monotonic fields from non-finite date: +-- +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity +</sql-statement> +<sql-statement> +-- all supported fields +SELECT EXTRACT(YEAR FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(JULIAN FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(ISOYEAR FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +</sql-statement> +<sql-statement> +-- +-- wrong fields from non-finite date: +-- +SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date units "microsec" not recognized + + -- + ^ +<sql-statement> +-- test constructors +select make_date(2013, 7, 15); +</sql-statement> +<sql-statement> +select make_date(-44, 3, 15); +</sql-statement> +<sql-statement> +select make_time(8, 20, 0.0); +</sql-statement> +<sql-statement> +-- should fail +select make_date(0, 7, 15); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date field value out of range: 0-07-15 + + -- should fail + ^ +<sql-statement> +select make_date(2013, 2, 30); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select make_date(2013, 2, 30); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date field value out of range: 2013-02-30 + + select make_date(2013, 2, 30); + ^ +<sql-statement> +select make_date(2013, 13, 1); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select make_date(2013, 13, 1); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date field value out of range: 2013-13-01 + + select make_date(2013, 13, 1); + ^ +<sql-statement> +select make_date(2013, 11, -1); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select make_date(2013, 11, -1); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date field value out of range: 2013-11--1 + + select make_date(2013, 11, -1); + ^ +<sql-statement> +select make_time(10, 55, 100.1); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select make_time(10, 55, 100.1); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time field value out of range: 10:55:100.1 + + select make_time(10, 55, 100.1); + ^ +<sql-statement> +select make_time(24, 0, 2.1); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select make_time(24, 0, 2.1); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time field value out of range: 24:00:2.1 + + select make_time(24, 0, 2.1); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/date.out b/ydb/library/yql/tests/postgresql/cases/date.out index e73c7f0de9..2c73145781 100644 --- a/ydb/library/yql/tests/postgresql/cases/date.out +++ b/ydb/library/yql/tests/postgresql/cases/date.out @@ -18,3 +18,1036 @@ INSERT INTO DATE_TBL VALUES ('2038-04-08'); INSERT INTO DATE_TBL VALUES ('2039-04-09'); INSERT INTO DATE_TBL VALUES ('2040-04-10'); INSERT INTO DATE_TBL VALUES ('2040-04-10 BC'); +SELECT date 'January 8, 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-18'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '18/1/1999'; +ERROR: date/time field value out of range: "18/1/1999" +LINE 1: SELECT date '18/1/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '19990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999.008'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'J2451187'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-Jan'; +ERROR: invalid input syntax for type date: "99-08-Jan" +LINE 1: SELECT date '99-08-Jan'; + ^ +SELECT date '1999-08-Jan'; +ERROR: invalid input syntax for type date: "1999-08-Jan" +LINE 1: SELECT date '1999-08-Jan'; + ^ +SELECT date '1999 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '1999 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999 08 01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date 'January 8, 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-18'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '19990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999.008'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'J2451187'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'January 8, 99 BC'; + date +--------------- + 0099-01-08 BC +(1 row) + +SELECT date '99-Jan-08'; +ERROR: date/time field value out of range: "99-Jan-08" +LINE 1: SELECT date '99-Jan-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-Jan'; +ERROR: invalid input syntax for type date: "99-08-Jan" +LINE 1: SELECT date '99-08-Jan'; + ^ +SELECT date '1999-08-Jan'; +ERROR: invalid input syntax for type date: "1999-08-Jan" +LINE 1: SELECT date '1999-08-Jan'; + ^ +SELECT date '1999 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 Jan'; +ERROR: invalid input syntax for type date: "99 08 Jan" +LINE 1: SELECT date '99 08 Jan'; + ^ +SELECT date '1999 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-01-08'; +ERROR: date/time field value out of range: "99-01-08" +LINE 1: SELECT date '99-01-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-01'; +ERROR: date/time field value out of range: "99-08-01" +LINE 1: SELECT date '99-08-01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99 01 08'; +ERROR: date/time field value out of range: "99 01 08" +LINE 1: SELECT date '99 01 08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 01'; +ERROR: date/time field value out of range: "99 08 01" +LINE 1: SELECT date '99 08 01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 08 01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date 'January 8, 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-18'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '1/8/1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1/18/1999'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '18/1/1999'; +ERROR: date/time field value out of range: "18/1/1999" +LINE 1: SELECT date '18/1/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01/02/03'; + date +------------ + 2003-01-02 +(1 row) + +SELECT date '19990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999.008'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'J2451187'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'January 8, 99 BC'; + date +--------------- + 0099-01-08 BC +(1 row) + +SELECT date '99-Jan-08'; +ERROR: date/time field value out of range: "99-Jan-08" +LINE 1: SELECT date '99-Jan-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-Jan'; +ERROR: invalid input syntax for type date: "99-08-Jan" +LINE 1: SELECT date '99-08-Jan'; + ^ +SELECT date '1999-08-Jan'; +ERROR: invalid input syntax for type date: "1999-08-Jan" +LINE 1: SELECT date '1999-08-Jan'; + ^ +SELECT date '99 Jan 08'; +ERROR: invalid input syntax for type date: "99 Jan 08" +LINE 1: SELECT date '99 Jan 08'; + ^ +SELECT date '1999 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 Jan'; +ERROR: invalid input syntax for type date: "99 08 Jan" +LINE 1: SELECT date '99 08 Jan'; + ^ +SELECT date '1999 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-01-08'; +ERROR: date/time field value out of range: "99-01-08" +LINE 1: SELECT date '99-01-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-01-99'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '08-01-1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '01-08-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '01-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-01'; +ERROR: date/time field value out of range: "99-08-01" +LINE 1: SELECT date '99-08-01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99 01 08'; +ERROR: date/time field value out of range: "99 01 08" +LINE 1: SELECT date '99 01 08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 01 99'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '08 01 1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '01 08 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '01 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 01'; +ERROR: date/time field value out of range: "99 08 01" +LINE 1: SELECT date '99 08 01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 08 01'; + date +------------ + 1999-08-01 +(1 row) + +-- Check upper and lower limits of date range +SELECT date '4714-11-24 BC'; + date +--------------- + 4714-11-24 BC +(1 row) + +SELECT date '4714-11-23 BC'; -- out of range +ERROR: date out of range: "4714-11-23 BC" +LINE 1: SELECT date '4714-11-23 BC'; + ^ +SELECT date '5874897-12-31'; + date +--------------- + 5874897-12-31 +(1 row) + +SELECT date '5874898-01-01'; -- out of range +ERROR: date out of range: "5874898-01-01" +LINE 1: SELECT date '5874898-01-01'; + ^ +SELECT date 'yesterday' - date 'today' AS "One day"; + One day +--------- + -1 +(1 row) + +SELECT date 'today' - date 'tomorrow' AS "One day"; + One day +--------- + -1 +(1 row) + +SELECT date 'yesterday' - date 'tomorrow' AS "Two days"; + Two days +---------- + -2 +(1 row) + +SELECT date 'tomorrow' - date 'today' AS "One day"; + One day +--------- + 1 +(1 row) + +SELECT date 'today' - date 'yesterday' AS "One day"; + One day +--------- + 1 +(1 row) + +SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; + Two days +---------- + 2 +(1 row) + +-- +-- century +-- +SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 + extract +--------- + -2 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19 + extract +--------- + 19 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 + extract +--------- + 20 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 + extract +--------- + 20 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 + extract +--------- + 21 +(1 row) + +SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true + true +------ + t +(1 row) + +-- +-- millennium +-- +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2 + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 + extract +--------- + 3 +(1 row) + +-- next test to be fixed on the turn of the next millennium;-) +SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 + extract +--------- + 3 +(1 row) + +-- +-- decade +-- +SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199 + extract +--------- + 199 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 + extract +--------- + -2 +(1 row) + +-- +-- all possible fields +-- +SELECT EXTRACT(MICROSECONDS FROM DATE '2020-08-11'); +ERROR: date units "microseconds" not supported +SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); +ERROR: date units "milliseconds" not supported +SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); +ERROR: date units "second" not supported +SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); +ERROR: date units "minute" not supported +SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); +ERROR: date units "hour" not supported +SELECT EXTRACT(DAY FROM DATE '2020-08-11'); + extract +--------- + 11 +(1 row) + +SELECT EXTRACT(MONTH FROM DATE '2020-08-11'); + extract +--------- + 8 +(1 row) + +SELECT EXTRACT(YEAR FROM DATE '2020-08-11'); + extract +--------- + 2020 +(1 row) + +SELECT EXTRACT(YEAR FROM DATE '2020-08-11 BC'); + extract +--------- + -2020 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '2020-08-11'); + extract +--------- + 202 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '2020-08-11'); + extract +--------- + 21 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '2020-08-11'); + extract +--------- + 3 +(1 row) + +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11'); + extract +--------- + 2020 +(1 row) + +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11 BC'); + extract +--------- + -2020 +(1 row) + +SELECT EXTRACT(QUARTER FROM DATE '2020-08-11'); + extract +--------- + 3 +(1 row) + +SELECT EXTRACT(WEEK FROM DATE '2020-08-11'); + extract +--------- + 33 +(1 row) + +SELECT EXTRACT(DOW FROM DATE '2020-08-11'); + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(ISODOW FROM DATE '2020-08-11'); + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(ISODOW FROM DATE '2020-08-16'); + extract +--------- + 7 +(1 row) + +SELECT EXTRACT(DOY FROM DATE '2020-08-11'); + extract +--------- + 224 +(1 row) + +SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); +ERROR: date units "timezone" not supported +SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); +ERROR: date units "timezone_m" not supported +SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); +ERROR: date units "timezone_h" not supported +SELECT EXTRACT(EPOCH FROM DATE '2020-08-11'); + extract +------------ + 1597104000 +(1 row) + +SELECT EXTRACT(JULIAN FROM DATE '2020-08-11'); + extract +--------- + 2459073 +(1 row) + +-- +-- test infinity +-- +select 'infinity'::date, '-infinity'::date; + date | date +----------+----------- + infinity | -infinity +(1 row) + +select 'infinity'::date > 'today'::date as t; + t +--- + t +(1 row) + +select '-infinity'::date < 'today'::date as t; + t +--- + t +(1 row) + +select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date); + isfinite | isfinite | isfinite +----------+----------+---------- + f | f | t +(1 row) + +-- +-- oscillating fields from non-finite date: +-- +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(DAY FROM DATE '-infinity'); -- NULL + extract +--------- + +(1 row) + +-- all supported fields +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(MONTH FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(QUARTER FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(WEEK FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(DOW FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(ISODOW FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(DOY FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +-- +-- monotonic fields from non-finite date: +-- +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity + extract +----------- + -Infinity +(1 row) + +-- all supported fields +SELECT EXTRACT(YEAR FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(JULIAN FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(ISOYEAR FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +-- +-- wrong fields from non-finite date: +-- +SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- error +ERROR: date units "microsec" not recognized +select make_time(8, 20, 0.0); + make_time +----------- + 08:20:00 +(1 row) + +-- should fail +select make_date(0, 7, 15); +ERROR: date field value out of range: 0-07-15 +select make_date(2013, 2, 30); +ERROR: date field value out of range: 2013-02-30 +select make_date(2013, 13, 1); +ERROR: date field value out of range: 2013-13-01 +select make_date(2013, 11, -1); +ERROR: date field value out of range: 2013-11--1 +select make_time(10, 55, 100.1); +ERROR: time field value out of range: 10:55:100.1 +select make_time(24, 0, 2.1); +ERROR: time field value out of range: 24:00:2.1 diff --git a/ydb/library/yql/tests/postgresql/cases/date.sql b/ydb/library/yql/tests/postgresql/cases/date.sql index e73c7f0de9..2f82d7f29d 100644 --- a/ydb/library/yql/tests/postgresql/cases/date.sql +++ b/ydb/library/yql/tests/postgresql/cases/date.sql @@ -18,3 +18,215 @@ INSERT INTO DATE_TBL VALUES ('2038-04-08'); INSERT INTO DATE_TBL VALUES ('2039-04-09'); INSERT INTO DATE_TBL VALUES ('2040-04-10'); INSERT INTO DATE_TBL VALUES ('2040-04-10 BC'); +SELECT date 'January 8, 1999'; +SELECT date '1999-01-08'; +SELECT date '1999-01-18'; +SELECT date '18/1/1999'; +SELECT date '19990108'; +SELECT date '990108'; +SELECT date '1999.008'; +SELECT date 'J2451187'; +SELECT date '1999-Jan-08'; +SELECT date '08-Jan-1999'; +SELECT date 'Jan-08-1999'; +SELECT date '99-08-Jan'; +SELECT date '1999-08-Jan'; +SELECT date '1999 Jan 08'; +SELECT date '08 Jan 1999'; +SELECT date 'Jan 08 1999'; +SELECT date '1999 08 Jan'; +SELECT date '1999-01-08'; +SELECT date '1999-08-01'; +SELECT date '1999 01 08'; +SELECT date '1999 08 01'; +SELECT date 'January 8, 1999'; +SELECT date '1999-01-08'; +SELECT date '1999-01-18'; +SELECT date '19990108'; +SELECT date '990108'; +SELECT date '1999.008'; +SELECT date 'J2451187'; +SELECT date 'January 8, 99 BC'; +SELECT date '99-Jan-08'; +SELECT date '1999-Jan-08'; +SELECT date '08-Jan-99'; +SELECT date '08-Jan-1999'; +SELECT date 'Jan-08-99'; +SELECT date 'Jan-08-1999'; +SELECT date '99-08-Jan'; +SELECT date '1999-08-Jan'; +SELECT date '1999 Jan 08'; +SELECT date '08 Jan 99'; +SELECT date '08 Jan 1999'; +SELECT date 'Jan 08 99'; +SELECT date 'Jan 08 1999'; +SELECT date '99 08 Jan'; +SELECT date '1999 08 Jan'; +SELECT date '99-01-08'; +SELECT date '1999-01-08'; +SELECT date '99-08-01'; +SELECT date '1999-08-01'; +SELECT date '99 01 08'; +SELECT date '1999 01 08'; +SELECT date '99 08 01'; +SELECT date '1999 08 01'; +SELECT date 'January 8, 1999'; +SELECT date '1999-01-08'; +SELECT date '1999-01-18'; +SELECT date '1/8/1999'; +SELECT date '1/18/1999'; +SELECT date '18/1/1999'; +SELECT date '01/02/03'; +SELECT date '19990108'; +SELECT date '990108'; +SELECT date '1999.008'; +SELECT date 'J2451187'; +SELECT date 'January 8, 99 BC'; +SELECT date '99-Jan-08'; +SELECT date '1999-Jan-08'; +SELECT date '08-Jan-99'; +SELECT date '08-Jan-1999'; +SELECT date 'Jan-08-99'; +SELECT date 'Jan-08-1999'; +SELECT date '99-08-Jan'; +SELECT date '1999-08-Jan'; +SELECT date '99 Jan 08'; +SELECT date '1999 Jan 08'; +SELECT date '08 Jan 99'; +SELECT date '08 Jan 1999'; +SELECT date 'Jan 08 99'; +SELECT date 'Jan 08 1999'; +SELECT date '99 08 Jan'; +SELECT date '1999 08 Jan'; +SELECT date '99-01-08'; +SELECT date '1999-01-08'; +SELECT date '08-01-99'; +SELECT date '08-01-1999'; +SELECT date '01-08-99'; +SELECT date '01-08-1999'; +SELECT date '99-08-01'; +SELECT date '1999-08-01'; +SELECT date '99 01 08'; +SELECT date '1999 01 08'; +SELECT date '08 01 99'; +SELECT date '08 01 1999'; +SELECT date '01 08 99'; +SELECT date '01 08 1999'; +SELECT date '99 08 01'; +SELECT date '1999 08 01'; +-- Check upper and lower limits of date range +SELECT date '4714-11-24 BC'; +SELECT date '4714-11-23 BC'; -- out of range +SELECT date '5874897-12-31'; +SELECT date '5874898-01-01'; -- out of range +SELECT date 'yesterday' - date 'today' AS "One day"; +SELECT date 'today' - date 'tomorrow' AS "One day"; +SELECT date 'yesterday' - date 'tomorrow' AS "Two days"; +SELECT date 'tomorrow' - date 'today' AS "One day"; +SELECT date 'today' - date 'yesterday' AS "One day"; +SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; +-- +-- century +-- +SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 +SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 +SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1 +SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19 +SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 +SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 +SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 +SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true +-- +-- millennium +-- +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 +SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1 +SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2 +SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 +SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 +-- next test to be fixed on the turn of the next millennium;-) +SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 +-- +-- decade +-- +SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199 +SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1 +SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 +SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 +SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 +-- +-- all possible fields +-- +SELECT EXTRACT(MICROSECONDS FROM DATE '2020-08-11'); +SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); +SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); +SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); +SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); +SELECT EXTRACT(DAY FROM DATE '2020-08-11'); +SELECT EXTRACT(MONTH FROM DATE '2020-08-11'); +SELECT EXTRACT(YEAR FROM DATE '2020-08-11'); +SELECT EXTRACT(YEAR FROM DATE '2020-08-11 BC'); +SELECT EXTRACT(DECADE FROM DATE '2020-08-11'); +SELECT EXTRACT(CENTURY FROM DATE '2020-08-11'); +SELECT EXTRACT(MILLENNIUM FROM DATE '2020-08-11'); +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11'); +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11 BC'); +SELECT EXTRACT(QUARTER FROM DATE '2020-08-11'); +SELECT EXTRACT(WEEK FROM DATE '2020-08-11'); +SELECT EXTRACT(DOW FROM DATE '2020-08-11'); +SELECT EXTRACT(ISODOW FROM DATE '2020-08-11'); +SELECT EXTRACT(ISODOW FROM DATE '2020-08-16'); +SELECT EXTRACT(DOY FROM DATE '2020-08-11'); +SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); +SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); +SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); +SELECT EXTRACT(EPOCH FROM DATE '2020-08-11'); +SELECT EXTRACT(JULIAN FROM DATE '2020-08-11'); +-- +-- test infinity +-- +select 'infinity'::date, '-infinity'::date; +select 'infinity'::date > 'today'::date as t; +select '-infinity'::date < 'today'::date as t; +select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date); +-- +-- oscillating fields from non-finite date: +-- +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(DAY FROM DATE '-infinity'); -- NULL +-- all supported fields +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(MONTH FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(QUARTER FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(WEEK FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(DOW FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(ISODOW FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(DOY FROM DATE 'infinity'); -- NULL +-- +-- monotonic fields from non-finite date: +-- +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity +-- all supported fields +SELECT EXTRACT(YEAR FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(JULIAN FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(ISOYEAR FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +-- +-- wrong fields from non-finite date: +-- +SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- error +select make_time(8, 20, 0.0); +-- should fail +select make_date(0, 7, 15); +select make_date(2013, 2, 30); +select make_date(2013, 13, 1); +select make_date(2013, 11, -1); +select make_time(10, 55, 100.1); +select make_time(24, 0, 2.1); diff --git a/ydb/library/yql/tests/postgresql/cases/delete.err b/ydb/library/yql/tests/postgresql/cases/delete.err index f8a2281d3e..27e843fed6 100644 --- a/ydb/library/yql/tests/postgresql/cases/delete.err +++ b/ydb/library/yql/tests/postgresql/cases/delete.err @@ -18,28 +18,28 @@ INSERT INTO delete_test (a) VALUES (100); -- allow an alias to be specified for DELETE's target table DELETE FROM delete_test AS dt WHERE dt.a > 75; </sql-statement> -VERIFY failed (2023-12-07T19:23:19.174482+0300): +VERIFY failed (2023-12-12T19:40:06.503020+0300): ydb/library/yql/ast/yql_ast.h:163 NewList(): requirement poolChildren[index] failed -BackTrace(void**, unsigned long)+29 (0x14033ECD) -FormatBackTrace(IOutputStream*)+32 (0x140343A0) -PrintBackTrace()+17 (0x140343F1) -NPrivate::InternalPanicImpl(int, char const*, char const*, int, int, int, TBasicStringBuf<char, std::__y1::char_traits<char> >, char const*, unsigned long)+995 (0x1407A6A3) -NPrivate::Panic(NPrivate::TStaticBuf const&, int, char const*, char const*, char const*, ...)+418 (0x1406D812) -NYql::TAstNode::NewList(NYql::TPosition, NYql::TAstNode**, unsigned int, TMemoryPool&)+329 (0x149F4389) -NYql::TAstNode* NSQLTranslationPG::TConverter::L<NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*>(NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*)+276 (0x15564054) -NSQLTranslationPG::TConverter::ParseDeleteStmt(DeleteStmt const*)+6165 (0x15559BE5) -NSQLTranslationPG::TConverter::ParseRawStmt(RawStmt const*)+1054 (0x1554AFBE) -NSQLTranslationPG::TConverter::ParseResult(List const*)+1256 (0x155494D8) -NSQLTranslationPG::TConverter::OnResult(List const*)+83 (0x155468F3) -NYql::PGParse(TBasicString<char, std::__y1::char_traits<char> > const&, NYql::IPGParseEvents&)+1043 (0x1B72E0F3) -NSQLTranslationPG::PGToYql(TBasicString<char, std::__y1::char_traits<char> > const&, NSQLTranslation::TTranslationSettings const&)+131 (0x15545223) -NSQLTranslation::SqlToYql(TBasicString<char, std::__y1::char_traits<char> > const&, NSQLTranslation::TTranslationSettings const&, TVector<NYql::TWarningRule, std::__y1::allocator<NYql::TWarningRule> >*, unsigned short*)+749 (0x155413DD) -NYql::TProgram::ParseSql(NSQLTranslation::TTranslationSettings const&)+676 (0x16BB7634) -Main(int, char**)+3099 (0x13EC055B) -main+273 (0x13EC2761) -??+0 (0x7F1696829D90) -__libc_start_main+128 (0x7F1696829E40) -??+0 (0x13E4C029) +BackTrace(void**, unsigned long)+29 (0x14087F6D) +FormatBackTrace(IOutputStream*)+32 (0x14088440) +PrintBackTrace()+17 (0x14088491) +NPrivate::InternalPanicImpl(int, char const*, char const*, int, int, int, TBasicStringBuf<char, std::__y1::char_traits<char> >, char const*, unsigned long)+995 (0x140CE743) +NPrivate::Panic(NPrivate::TStaticBuf const&, int, char const*, char const*, char const*, ...)+418 (0x140C18B2) +NYql::TAstNode::NewList(NYql::TPosition, NYql::TAstNode**, unsigned int, TMemoryPool&)+329 (0x14A48409) +NYql::TAstNode* NSQLTranslationPG::TConverter::L<NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*>(NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*)+276 (0x155B9CD4) +NSQLTranslationPG::TConverter::ParseDeleteStmt(DeleteStmt const*)+6165 (0x155AF055) +NSQLTranslationPG::TConverter::ParseRawStmt(RawStmt const*)+1054 (0x155A03EE) +NSQLTranslationPG::TConverter::ParseResult(List const*)+1256 (0x1559E908) +NSQLTranslationPG::TConverter::OnResult(List const*)+83 (0x1559BD23) +NYql::PGParse(TBasicString<char, std::__y1::char_traits<char> > const&, NYql::IPGParseEvents&)+1043 (0x1B7A3F33) +NSQLTranslationPG::PGToYql(TBasicString<char, std::__y1::char_traits<char> > const&, NSQLTranslation::TTranslationSettings const&)+131 (0x1559A653) +NSQLTranslation::SqlToYql(TBasicString<char, std::__y1::char_traits<char> > const&, NSQLTranslation::TTranslationSettings const&, TVector<NYql::TWarningRule, std::__y1::allocator<NYql::TWarningRule> >*, unsigned short*)+749 (0x1559680D) +NYql::TProgram::ParseSql(NSQLTranslation::TTranslationSettings const&)+676 (0x16C0D5A4) +Main(int, char**)+3099 (0x13F1462B) +main+273 (0x13F16831) +??+0 (0x7FD9F3629D90) +__libc_start_main+128 (0x7FD9F3629E40) +??+0 (0x13EA0029) pthread_kill at ./nptl/./nptl/pthread_kill.c:43:17 ?? at ??:0:0 diff --git a/ydb/library/yql/tests/postgresql/cases/float4.err b/ydb/library/yql/tests/postgresql/cases/float4.err index 47781da2fa..fe610a1f4c 100644 --- a/ydb/library/yql/tests/postgresql/cases/float4.err +++ b/ydb/library/yql/tests/postgresql/cases/float4.err @@ -501,17 +501,17 @@ SELECT float4send('5e-20'::float4); <sql-statement> SELECT float4send('67e14'::float4); </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F9FF2A29D90) -__libc_start_main+128 (0x7F9FF2A29E40) -??+0 (0x13E4C029) +BackTrace(void**, unsigned long)+29 (0x14087F6D) +TBackTrace::Capture()+30 (0x140884DE) +TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x14024628) +NYT::TNode::TTypeError::TTypeError()+25 (0x14530469) +NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x14531A3B) +NYT::TNode::AsString() const+30 (0x145305BE) +WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+872 (0x13F0FC28) +Main(int, char**)+5748 (0x13F15084) +main+273 (0x13F16831) +??+0 (0x7F467B629D90) +__libc_start_main+128 (0x7F467B629E40) +??+0 (0x13EA0029) (NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type list_node diff --git a/ydb/library/yql/tests/postgresql/cases/insert.err b/ydb/library/yql/tests/postgresql/cases/insert.err index 58f169fcdc..f1a338b139 100644 --- a/ydb/library/yql/tests/postgresql/cases/insert.err +++ b/ydb/library/yql/tests/postgresql/cases/insert.err @@ -115,17 +115,2604 @@ insert into inserttest values(30, 50, repeat('x', 10000)); <sql-statement> select col1, col2, char_length(col3) from inserttest; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F6115629D90) -__libc_start_main+128 (0x7F6115629E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +drop table inserttest; +</sql-statement> +<sql-statement> +-- +-- tuple larger than fillfactor +-- +CREATE TABLE large_tuple_test (a int, b text) WITH (fillfactor = 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table options not supported + -- + ^ +<sql-statement> +ALTER TABLE large_tuple_test ALTER COLUMN b SET STORAGE plain; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE large_tuple_test ALTER COLUMN b SET STORAGE plain; + ^ +<sql-statement> +-- create page w/ free space in range [nearlyEmptyFreeSpace, MaxHeapTupleSize) +INSERT INTO large_tuple_test (select 1, NULL); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.large_tuple_test + +<sql-statement> +-- should still fit on the page +INSERT INTO large_tuple_test (select 2, repeat('a', 1000)); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.large_tuple_test + +<sql-statement> +SELECT pg_size_pretty(pg_relation_size('large_tuple_test'::regclass, 'main')); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_size_pretty(pg_relation_size('large_tuple_test'::regclass, 'main')); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "large_tuple_test" does not exist + + SELECT pg_size_pretty(pg_relation_size('large_tuple_test'::regclass, 'main')); + ^ +<sql-statement> +-- add small record to the second page +INSERT INTO large_tuple_test (select 3, NULL); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.large_tuple_test + +<sql-statement> +-- now this tuple won't fit on the second page, but the insert should +-- still succeed by extending the relation +INSERT INTO large_tuple_test (select 4, repeat('a', 8126)); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.large_tuple_test + +<sql-statement> +DROP TABLE large_tuple_test; +</sql-statement> +<sql-statement> +-- +-- check indirection (field/array assignment), cf bug #14265 +-- +-- these tests are aware that transformInsertStmt has 3 separate code paths +-- +create type insert_test_type as (if1 int, if2 text[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + -- + ^ +<sql-statement> +create table inserttest (f1 int, f2 int[], + f3 insert_test_type, f4 insert_test_type[]); +</sql-statement> +<sql-statement> +insert into inserttest (f2[1], f2[2]) values (1,2); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f2[1], f2[2]) values (3,4), (5,6); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f2[1], f2[2]) select 7,8; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f2[1], f2[2]) values (1,default); -- not supported +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 148 + insert into inserttest (f2[1], f2[2]) values (1,default); -- not supported + ^ +<sql-statement> +insert into inserttest (f3.if1, f3.if2) values (1,array['foo']); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}'); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f3.if1, f3.if2) select 3, '{baz,quux}'; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f3.if1, f3.if2) values (1,default); -- not supported +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 148 + insert into inserttest (f3.if1, f3.if2) values (1,default); -- not supported + ^ +<sql-statement> +insert into inserttest (f3.if2[1], f3.if2[2]) values ('foo', 'bar'); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f3.if2[1], f3.if2[2]) select 'bear', 'beer'; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) values ('foo', 'bar'); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) select 'bear', 'beer'; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +select * from inserttest; +</sql-statement> +-stdin-:<main>: Error: Table metadata loading + + -stdin-:<main>: Error: Table inserttest + + -stdin-:<main>: Error: Failed to parse row spec: No such type: insert_test_type + +<sql-statement> +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +</sql-statement> +<sql-statement> +create rule irule1 as on insert to inserttest2 do also + insert into inserttest (f3.if2[1], f3.if2[2]) + values (new.f1,new.f2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 265 + create rule irule1 as on insert to inserttest2 do also + ^ +<sql-statement> +create rule irule2 as on insert to inserttest2 do also + insert into inserttest (f4[1].if1, f4[1].if2[2]) + values (1,'fool'),(new.f1,new.f2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 265 + create rule irule2 as on insert to inserttest2 do also + ^ +<sql-statement> +create rule irule3 as on insert to inserttest2 do also + insert into inserttest (f4[1].if1, f4[1].if2[2]) + select new.f1, new.f2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 265 + create rule irule3 as on insert to inserttest2 do also + ^ +<sql-statement> +\d+ inserttest2 +</sql-statement> +Metacommand \d+ inserttest2 is not supported +<sql-statement> +drop table inserttest2; +</sql-statement> +<sql-statement> +drop table inserttest; +</sql-statement> +<sql-statement> +drop type insert_test_type; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + drop type insert_test_type; + ^ +<sql-statement> +-- direct partition inserts should check partition bound constraint +create table range_parted ( + a text, + b int +) partition by range (a, (b+0)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- direct partition inserts should check partition bound constraint + ^ +<sql-statement> +-- no partitions, so fail +insert into range_parted values ('a', 11); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +create table part1 partition of range_parted for values from ('a', 1) to ('a', 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part1 partition of range_parted for values from ('a', 1) to ('a', 10); + ^ +<sql-statement> +create table part2 partition of range_parted for values from ('a', 10) to ('a', 20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part2 partition of range_parted for values from ('a', 10) to ('a', 20); + ^ +<sql-statement> +create table part3 partition of range_parted for values from ('b', 1) to ('b', 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part3 partition of range_parted for values from ('b', 1) to ('b', 10); + ^ +<sql-statement> +create table part4 partition of range_parted for values from ('b', 10) to ('b', 20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part4 partition of range_parted for values from ('b', 10) to ('b', 20); + ^ +<sql-statement> +-- fail +insert into part1 values ('a', 11); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part1 + +<sql-statement> +insert into part1 values ('b', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part1 + +<sql-statement> +-- ok +insert into part1 values ('a', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part1 + +<sql-statement> +-- fail +insert into part4 values ('b', 21); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part4 + +<sql-statement> +insert into part4 values ('a', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part4 + +<sql-statement> +-- ok +insert into part4 values ('b', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part4 + +<sql-statement> +-- fail (partition key a has a NOT NULL constraint) +insert into part1 values (null); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part1 + +<sql-statement> +-- fail (expression key (b+0) cannot be null either) +insert into part1 values (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part1 + +<sql-statement> +create table list_parted ( + a text, + b int +) partition by list (lower(a)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + create table list_parted ( + ^ +<sql-statement> +create table part_aa_bb partition of list_parted FOR VALUES IN ('aa', 'bb'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_aa_bb partition of list_parted FOR VALUES IN ('aa', 'bb'); + ^ +<sql-statement> +create table part_cc_dd partition of list_parted FOR VALUES IN ('cc', 'dd'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_cc_dd partition of list_parted FOR VALUES IN ('cc', 'dd'); + ^ +<sql-statement> +create table part_null partition of list_parted FOR VALUES IN (null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_null partition of list_parted FOR VALUES IN (null); + ^ +<sql-statement> +-- fail +insert into part_aa_bb values ('cc', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_aa_bb + +<sql-statement> +insert into part_aa_bb values ('AAa', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_aa_bb + +<sql-statement> +insert into part_aa_bb values (null); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_aa_bb + +<sql-statement> +-- ok +insert into part_cc_dd values ('cC', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_cc_dd + +<sql-statement> +insert into part_null values (null, 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_null + +<sql-statement> +-- check in case of multi-level partitioned table +create table part_ee_ff partition of list_parted for values in ('ee', 'ff') partition by range (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- check in case of multi-level partitioned table + ^ +<sql-statement> +create table part_ee_ff1 partition of part_ee_ff for values from (1) to (10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_ee_ff1 partition of part_ee_ff for values from (1) to (10); + ^ +<sql-statement> +create table part_ee_ff2 partition of part_ee_ff for values from (10) to (20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_ee_ff2 partition of part_ee_ff for values from (10) to (20); + ^ +<sql-statement> +-- test default partition +create table part_default partition of list_parted default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- test default partition + ^ +<sql-statement> +-- Negative test: a row, which would fit in other partition, does not fit +-- default partition, even when inserted directly +insert into part_default values ('aa', 2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +insert into part_default values (null, 2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +-- ok +insert into part_default values ('Zz', 2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +-- test if default partition works as expected for multi-level partitioned +-- table as well as when default partition itself is further partitioned +drop table part_default; +</sql-statement> +<sql-statement> +create table part_xx_yy partition of list_parted for values in ('xx', 'yy') partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_xx_yy partition of list_parted for values in ('xx', 'yy') partition by list (a); + ^ +<sql-statement> +create table part_xx_yy_p1 partition of part_xx_yy for values in ('xx'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_xx_yy_p1 partition of part_xx_yy for values in ('xx'); + ^ +<sql-statement> +create table part_xx_yy_defpart partition of part_xx_yy default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_xx_yy_defpart partition of part_xx_yy default; + ^ +<sql-statement> +create table part_default partition of list_parted default partition by range(b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_default partition of list_parted default partition by range(b); + ^ +<sql-statement> +create table part_default_p1 partition of part_default for values from (20) to (30); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_default_p1 partition of part_default for values from (20) to (30); + ^ +<sql-statement> +create table part_default_p2 partition of part_default for values from (30) to (40); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_default_p2 partition of part_default for values from (30) to (40); + ^ +<sql-statement> +-- fail +insert into part_ee_ff1 values ('EE', 11); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_ee_ff1 + +<sql-statement> +insert into part_default_p2 values ('gg', 43); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default_p2 + +<sql-statement> +-- fail (even the parent's, ie, part_ee_ff's partition constraint applies) +insert into part_ee_ff1 values ('cc', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_ee_ff1 + +<sql-statement> +insert into part_default values ('gg', 43); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +-- ok +insert into part_ee_ff1 values ('ff', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_ee_ff1 + +<sql-statement> +insert into part_ee_ff2 values ('ff', 11); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_ee_ff2 + +<sql-statement> +insert into part_default_p1 values ('cd', 25); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default_p1 + +<sql-statement> +insert into part_default_p2 values ('de', 35); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default_p2 + +<sql-statement> +insert into list_parted values ('ab', 21); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into list_parted values ('xx', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into list_parted values ('yy', 2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +select tableoid::regclass, * from list_parted; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- Check tuple routing for partitioned tables +-- fail +insert into range_parted values ('a', 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- ok +insert into range_parted values ('a', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +insert into range_parted values ('a', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- fail +insert into range_parted values ('a', 20); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- ok +insert into range_parted values ('b', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +insert into range_parted values ('b', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- fail (partition key (b+0) is null) +insert into range_parted values ('a'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- Check default partition +create table part_def partition of range_parted default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- Check default partition + ^ +<sql-statement> +-- fail +insert into part_def values ('b', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_def + +<sql-statement> +-- ok +insert into part_def values ('c', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_def + +<sql-statement> +insert into range_parted values (null, null); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +insert into range_parted values ('a', null); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +insert into range_parted values (null, 19); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +insert into range_parted values ('b', 20); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +select tableoid::regclass, * from range_parted; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- ok +insert into list_parted values (null, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into list_parted (a) values ('aA'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- fail (partition of part_ee_ff not found in both cases) +insert into list_parted values ('EE', 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into part_ee_ff values ('EE', 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_ee_ff + +<sql-statement> +-- ok +insert into list_parted values ('EE', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into part_ee_ff values ('EE', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_ee_ff + +<sql-statement> +select tableoid::regclass, * from list_parted; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- some more tests to exercise tuple-routing with multi-level partitioning +create table part_gg partition of list_parted for values in ('gg') partition by range (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- some more tests to exercise tuple-routing with multi-level partitioning + ^ +<sql-statement> +create table part_gg1 partition of part_gg for values from (minvalue) to (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_gg1 partition of part_gg for values from (minvalue) to (1); + ^ +<sql-statement> +create table part_gg2 partition of part_gg for values from (1) to (10) partition by range (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_gg2 partition of part_gg for values from (1) to (10) partition by range (b); + ^ +<sql-statement> +create table part_gg2_1 partition of part_gg2 for values from (1) to (5); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_gg2_1 partition of part_gg2 for values from (1) to (5); + ^ +<sql-statement> +create table part_gg2_2 partition of part_gg2 for values from (5) to (10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_gg2_2 partition of part_gg2 for values from (5) to (10); + ^ +<sql-statement> +create table part_ee_ff3 partition of part_ee_ff for values from (20) to (30) partition by range (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_ee_ff3 partition of part_ee_ff for values from (20) to (30) partition by range (b); + ^ +<sql-statement> +create table part_ee_ff3_1 partition of part_ee_ff3 for values from (20) to (25); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_ee_ff3_1 partition of part_ee_ff3 for values from (20) to (25); + ^ +<sql-statement> +create table part_ee_ff3_2 partition of part_ee_ff3 for values from (25) to (30); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_ee_ff3_2 partition of part_ee_ff3 for values from (25) to (30); + ^ +<sql-statement> +truncate list_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + truncate list_parted; + ^ +<sql-statement> +insert into list_parted values ('aa'), ('cc'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into list_parted select 'Ff', s.a from generate_series(1, 29) s(a); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into list_parted select 'gg', s.a from generate_series(1, 9) s(a); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +insert into list_parted (b) values (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +select tableoid::regclass::text, a, min(b) as min_b, max(b) as max_b from list_parted group by 1, 2 order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- direct partition inserts should check hash partition bound constraint +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. The hash function for int4 simply returns +-- the sum of the values passed to it and the one for text returns the length +-- of the non-empty string value passed to it or 0. +create or replace function part_hashint4_noop(value int4, seed int8) +returns int8 as $$ +select value + seed; +$$ language sql immutable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- direct partition inserts should check hash partition bound constraint + ^ +<sql-statement> +create operator class part_test_int4_ops +for type int4 +using hash as +operator 1 =, +function 2 part_hashint4_noop(int4, int8); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 298 + create operator class part_test_int4_ops + ^ +<sql-statement> +create or replace function part_hashtext_length(value text, seed int8) +RETURNS int8 AS $$ +select length(coalesce(value, ''))::int8 +$$ language sql immutable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + create or replace function part_hashtext_length(value text, seed int8) + ^ +<sql-statement> +create operator class part_test_text_ops +for type text +using hash as +operator 1 =, +function 2 part_hashtext_length(text, int8); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 298 + create operator class part_test_text_ops + ^ +<sql-statement> +create table hash_parted ( + a int +) partition by hash (a part_test_int4_ops); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + create table hash_parted ( + ^ +<sql-statement> +create table hpart0 partition of hash_parted for values with (modulus 4, remainder 0); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart0 partition of hash_parted for values with (modulus 4, remainder 0); + ^ +<sql-statement> +create table hpart1 partition of hash_parted for values with (modulus 4, remainder 1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart1 partition of hash_parted for values with (modulus 4, remainder 1); + ^ +<sql-statement> +create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); + ^ +<sql-statement> +create table hpart3 partition of hash_parted for values with (modulus 4, remainder 3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart3 partition of hash_parted for values with (modulus 4, remainder 3); + ^ +<sql-statement> +insert into hash_parted values(generate_series(1,10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:32: Error: Generator functions are not allowed in: VALUES + insert into hash_parted values(generate_series(1,10)); + ^ +<sql-statement> +-- direct insert of values divisible by 4 - ok; +insert into hpart0 values(12),(16); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hpart0 + +<sql-statement> +-- fail; +insert into hpart0 values(11); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hpart0 + +<sql-statement> +-- 11 % 4 -> 3 remainder i.e. valid data for hpart3 partition +insert into hpart3 values(11); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hpart3 + +<sql-statement> +-- view data +select tableoid::regclass as part, a, a%4 as "remainder = a % 4" +from hash_parted order by part; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hash_parted + +<sql-statement> +-- test \d+ output on a table which has both partitioned and unpartitioned +-- partitions +\d+ list_parted +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:1: Error: ERROR: syntax error at or near "\" + + \d+ list_parted + ^ +<sql-statement> +-- cleanup +drop table range_parted, list_parted; +</sql-statement> +<sql-statement> +drop table hash_parted; +</sql-statement> +<sql-statement> +-- test that a default partition added as the first partition accepts any value +-- including null +create table list_parted (a int) partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- test that a default partition added as the first partition accepts any value + ^ +<sql-statement> +create table part_default partition of list_parted default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_default partition of list_parted default; + ^ +<sql-statement> +\d+ part_default +</sql-statement> +Metacommand \d+ part_default is not supported +<sql-statement> +insert into part_default values (null); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +insert into part_default values (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +insert into part_default values (-1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.part_default + +<sql-statement> +select tableoid::regclass, a from list_parted; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- cleanup +drop table list_parted; +</sql-statement> +<sql-statement> +-- more tests for certain multi-level partitioning scenarios +create table mlparted (a int, b int) partition by range (a, b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- more tests for certain multi-level partitioning scenarios + ^ +<sql-statement> +create table mlparted1 (b int not null, a int not null) partition by range ((b+0)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + create table mlparted1 (b int not null, a int not null) partition by range ((b+0)); + ^ +<sql-statement> +create table mlparted11 (like mlparted1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: CreateStmt: alternative is not implemented yet : 389 + create table mlparted11 (like mlparted1); + ^ +<sql-statement> +alter table mlparted11 drop a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted11 drop a; + ^ +<sql-statement> +alter table mlparted11 add a int; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted11 add a int; + ^ +<sql-statement> +alter table mlparted11 drop a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted11 drop a; + ^ +<sql-statement> +alter table mlparted11 add a int not null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted11 add a int not null; + ^ +<sql-statement> +-- attnum for key attribute 'a' is different in mlparted, mlparted1, and mlparted11 +select attrelid::regclass, attname, attnum +from pg_attribute +where attname = 'a' + and (attrelid = 'mlparted'::regclass + or attrelid = 'mlparted1'::regclass + or attrelid = 'mlparted11'::regclass) +order by attrelid::regclass::text; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.pg_attribute + +<sql-statement> +alter table mlparted1 attach partition mlparted11 for values from (2) to (5); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted1 attach partition mlparted11 for values from (2) to (5); + ^ +<sql-statement> +alter table mlparted attach partition mlparted1 for values from (1, 2) to (1, 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted attach partition mlparted1 for values from (1, 2) to (1, 10); + ^ +<sql-statement> +-- check that "(1, 2)" is correctly routed to mlparted11. +insert into mlparted values (1, 2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +select tableoid::regclass, * from mlparted; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +-- check that proper message is shown after failure to route through mlparted1 +insert into mlparted (a, b) values (1, 5); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +truncate mlparted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + truncate mlparted; + ^ +<sql-statement> +alter table mlparted add constraint check_b check (b = 3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted add constraint check_b check (b = 3); + ^ +<sql-statement> +-- have a BR trigger modify the row such that the check_b is violated +create function mlparted11_trig_fn() +returns trigger AS +$$ +begin + NEW.b := 4; + return NEW; +end; +$$ +language plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- have a BR trigger modify the row such that the check_b is violated + ^ +<sql-statement> +create trigger mlparted11_trig before insert ON mlparted11 + for each row execute procedure mlparted11_trig_fn(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + create trigger mlparted11_trig before insert ON mlparted11 + ^ +<sql-statement> +-- check that the correct row is shown when constraint check_b fails after +-- "(1, 2)" is routed to mlparted11 (actually "(1, 4)" would be shown due +-- to the BR trigger mlparted11_trig_fn) +insert into mlparted values (1, 2); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +drop trigger mlparted11_trig on mlparted11; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + drop trigger mlparted11_trig on mlparted11; + ^ +<sql-statement> +drop function mlparted11_trig_fn(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function mlparted11_trig_fn(); + ^ +<sql-statement> +-- check that inserting into an internal partition successfully results in +-- checking its partition constraint before inserting into the leaf partition +-- selected by tuple-routing +insert into mlparted1 (a, b) values (2, 3); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted1 + +<sql-statement> +-- check routing error through a list partitioned table when the key is null +create table lparted_nonullpart (a int, b char) partition by list (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- check routing error through a list partitioned table when the key is null + ^ +<sql-statement> +create table lparted_nonullpart_a partition of lparted_nonullpart for values in ('a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table lparted_nonullpart_a partition of lparted_nonullpart for values in ('a'); + ^ +<sql-statement> +insert into lparted_nonullpart values (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.lparted_nonullpart + +<sql-statement> +drop table lparted_nonullpart; +</sql-statement> +<sql-statement> +-- check that RETURNING works correctly with tuple-routing +alter table mlparted drop constraint check_b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + -- check that RETURNING works correctly with tuple-routing + ^ +<sql-statement> +create table mlparted12 partition of mlparted1 for values from (5) to (10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted12 partition of mlparted1 for values from (5) to (10); + ^ +<sql-statement> +create table mlparted2 (b int not null, a int not null); +</sql-statement> +<sql-statement> +alter table mlparted attach partition mlparted2 for values from (1, 10) to (1, 20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted attach partition mlparted2 for values from (1, 10) to (1, 20); + ^ +<sql-statement> +create table mlparted3 partition of mlparted for values from (1, 20) to (1, 30); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted3 partition of mlparted for values from (1, 20) to (1, 30); + ^ +<sql-statement> +create table mlparted4 (like mlparted); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: CreateStmt: alternative is not implemented yet : 389 + create table mlparted4 (like mlparted); + ^ +<sql-statement> +alter table mlparted4 drop a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted4 drop a; + ^ +<sql-statement> +alter table mlparted4 add a int not null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted4 add a int not null; + ^ +<sql-statement> +alter table mlparted attach partition mlparted4 for values from (1, 30) to (1, 40); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted attach partition mlparted4 for values from (1, 30) to (1, 40); + ^ +<sql-statement> +with ins (a, b, c) as + (insert into mlparted (b, a) select s.a, 1 from generate_series(2, 39) s(a) returning tableoid::regclass, *) + select a, b, min(c), max(c) from ins group by a, b order by 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:6: Error: Expected Select statement as CTE query + with ins (a, b, c) as + ^ +<sql-statement> +alter table mlparted add c text; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted add c text; + ^ +<sql-statement> +create table mlparted5 (c text, a int not null, b int not null) partition by list (c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + create table mlparted5 (c text, a int not null, b int not null) partition by list (c); + ^ +<sql-statement> +create table mlparted5a (a int not null, c text, b int not null); +</sql-statement> +<sql-statement> +alter table mlparted5 attach partition mlparted5a for values in ('a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted5 attach partition mlparted5a for values in ('a'); + ^ +<sql-statement> +alter table mlparted attach partition mlparted5 for values from (1, 40) to (1, 50); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted attach partition mlparted5 for values from (1, 40) to (1, 50); + ^ +<sql-statement> +alter table mlparted add constraint check_b check (a = 1 and b < 45); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted add constraint check_b check (a = 1 and b < 45); + ^ +<sql-statement> +insert into mlparted values (1, 45, 'a'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +create function mlparted5abrtrig_func() returns trigger as $$ begin new.c = 'b'; return new; end; $$ language plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + create function mlparted5abrtrig_func() returns trigger as $$ begin new.c = 'b'; return new; end; $$ language plpgsql; + ^ +<sql-statement> +create trigger mlparted5abrtrig before insert on mlparted5a for each row execute procedure mlparted5abrtrig_func(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + create trigger mlparted5abrtrig before insert on mlparted5a for each row execute procedure mlparted5abrtrig_func(); + ^ +<sql-statement> +insert into mlparted5 (a, b, c) values (1, 40, 'a'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted5 + +<sql-statement> +drop table mlparted5; +</sql-statement> +<sql-statement> +alter table mlparted drop constraint check_b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted drop constraint check_b; + ^ +<sql-statement> +-- Check multi-level default partition +create table mlparted_def partition of mlparted default partition by range(a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- Check multi-level default partition + ^ +<sql-statement> +create table mlparted_def1 partition of mlparted_def for values from (40) to (50); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted_def1 partition of mlparted_def for values from (40) to (50); + ^ +<sql-statement> +create table mlparted_def2 partition of mlparted_def for values from (50) to (60); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted_def2 partition of mlparted_def for values from (50) to (60); + ^ +<sql-statement> +insert into mlparted values (40, 100); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted_def1 values (42, 100); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted_def1 + +<sql-statement> +insert into mlparted_def2 values (54, 50); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted_def2 + +<sql-statement> +-- fail +insert into mlparted values (70, 100); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted_def1 values (52, 50); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted_def1 + +<sql-statement> +insert into mlparted_def2 values (34, 50); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted_def2 + +<sql-statement> +-- ok +create table mlparted_defd partition of mlparted_def default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- ok + ^ +<sql-statement> +insert into mlparted values (70, 100); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +select tableoid::regclass, * from mlparted_def; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted_def + +<sql-statement> +-- Check multi-level tuple routing with attributes dropped from the +-- top-most parent. First remove the last attribute. +alter table mlparted add d int, add e int; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + -- Check multi-level tuple routing with attributes dropped from the + ^ +<sql-statement> +alter table mlparted drop e; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted drop e; + ^ +<sql-statement> +create table mlparted5 partition of mlparted + for values from (1, 40) to (1, 50) partition by range (c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted5 partition of mlparted + ^ +<sql-statement> +create table mlparted5_ab partition of mlparted5 + for values from ('a') to ('c') partition by list (c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted5_ab partition of mlparted5 + ^ +<sql-statement> +-- This partitioned table should remain with no partitions. +create table mlparted5_cd partition of mlparted5 + for values from ('c') to ('e') partition by list (c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- This partitioned table should remain with no partitions. + ^ +<sql-statement> +create table mlparted5_a partition of mlparted5_ab for values in ('a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mlparted5_a partition of mlparted5_ab for values in ('a'); + ^ +<sql-statement> +create table mlparted5_b (d int, b int, c text, a int); +</sql-statement> +<sql-statement> +alter table mlparted5_ab attach partition mlparted5_b for values in ('b'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted5_ab attach partition mlparted5_b for values in ('b'); + ^ +<sql-statement> +truncate mlparted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + truncate mlparted; + ^ +<sql-statement> +insert into mlparted values (1, 2, 'a', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 40, 'a', 1); -- goes to mlparted5_a +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 45, 'b', 1); -- goes to mlparted5_b +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 45, 'c', 1); -- goes to mlparted5_cd, fails +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 45, 'f', 1); -- goes to mlparted5, fails +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +select tableoid::regclass, * from mlparted order by a, b, c, d; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +alter table mlparted drop d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted drop d; + ^ +<sql-statement> +truncate mlparted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + truncate mlparted; + ^ +<sql-statement> +-- Remove the before last attribute. +alter table mlparted add e int, add d int; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + -- Remove the before last attribute. + ^ +<sql-statement> +alter table mlparted drop e; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted drop e; + ^ +<sql-statement> +insert into mlparted values (1, 2, 'a', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 40, 'a', 1); -- goes to mlparted5_a +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 45, 'b', 1); -- goes to mlparted5_b +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 45, 'c', 1); -- goes to mlparted5_cd, fails +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +insert into mlparted values (1, 45, 'f', 1); -- goes to mlparted5, fails +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +select tableoid::regclass, * from mlparted order by a, b, c, d; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mlparted + +<sql-statement> +alter table mlparted drop d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table mlparted drop d; + ^ +<sql-statement> +drop table mlparted5; +</sql-statement> +<sql-statement> +-- check that message shown after failure to find a partition shows the +-- appropriate key description (or none) in various situations +create table key_desc (a int, b int) partition by list ((a+0)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- check that message shown after failure to find a partition shows the + ^ +<sql-statement> +create table key_desc_1 partition of key_desc for values in (1) partition by range (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table key_desc_1 partition of key_desc for values in (1) partition by range (b); + ^ +<sql-statement> +create user regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 285 + create user regress_insert_other_user; + ^ +<sql-statement> +grant select (a) on key_desc_1 to regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + grant select (a) on key_desc_1 to regress_insert_other_user; + ^ +<sql-statement> +grant insert on key_desc to regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + grant insert on key_desc to regress_insert_other_user; + ^ +<sql-statement> +set role regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: role + set role regress_insert_other_user; + ^ +<sql-statement> +-- no key description is shown +insert into key_desc values (1, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.key_desc + +<sql-statement> +reset role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset role; + ^ +<sql-statement> +grant select (b) on key_desc_1 to regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + grant select (b) on key_desc_1 to regress_insert_other_user; + ^ +<sql-statement> +set role regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: role + set role regress_insert_other_user; + ^ +<sql-statement> +-- key description (b)=(1) is now shown +insert into key_desc values (1, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.key_desc + +<sql-statement> +-- key description is not shown if key contains expression +insert into key_desc values (2, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.key_desc + +<sql-statement> +reset role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset role; + ^ +<sql-statement> +revoke all on key_desc from regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + revoke all on key_desc from regress_insert_other_user; + ^ +<sql-statement> +revoke all on key_desc_1 from regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + revoke all on key_desc_1 from regress_insert_other_user; + ^ +<sql-statement> +drop role regress_insert_other_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 287 + drop role regress_insert_other_user; + ^ +<sql-statement> +drop table key_desc, key_desc_1; +</sql-statement> +<sql-statement> +-- test minvalue/maxvalue restrictions +create table mcrparted (a int, b int, c int) partition by range (a, abs(b), c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- test minvalue/maxvalue restrictions + ^ +<sql-statement> +create table mcrparted0 partition of mcrparted for values from (minvalue, 0, 0) to (1, maxvalue, maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted0 partition of mcrparted for values from (minvalue, 0, 0) to (1, maxvalue, maxvalue); + ^ +<sql-statement> +create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, minvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, minvalue); + ^ +<sql-statement> +create table mcrparted4 partition of mcrparted for values from (21, minvalue, 0) to (30, 20, minvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted4 partition of mcrparted for values from (21, minvalue, 0) to (30, 20, minvalue); + ^ +<sql-statement> +-- check multi-column range partitioning expression enforces the same +-- constraint as what tuple-routing would determine it to be +create table mcrparted0 partition of mcrparted for values from (minvalue, minvalue, minvalue) to (1, maxvalue, maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- check multi-column range partitioning expression enforces the same + ^ +<sql-statement> +create table mcrparted1 partition of mcrparted for values from (2, 1, minvalue) to (10, 5, 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted1 partition of mcrparted for values from (2, 1, minvalue) to (10, 5, 10); + ^ +<sql-statement> +create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, maxvalue); + ^ +<sql-statement> +create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10); + ^ +<sql-statement> +create table mcrparted4 partition of mcrparted for values from (21, minvalue, minvalue) to (30, 20, maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted4 partition of mcrparted for values from (21, minvalue, minvalue) to (30, 20, maxvalue); + ^ +<sql-statement> +create table mcrparted5 partition of mcrparted for values from (30, 21, 20) to (maxvalue, maxvalue, maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted5 partition of mcrparted for values from (30, 21, 20) to (maxvalue, maxvalue, maxvalue); + ^ +<sql-statement> +-- null not allowed in range partition +insert into mcrparted values (null, null, null); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +-- routed to mcrparted0 +insert into mcrparted values (0, 1, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted0 values (0, 1, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted0 + +<sql-statement> +-- routed to mcparted1 +insert into mcrparted values (9, 1000, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted1 values (9, 1000, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted1 + +<sql-statement> +insert into mcrparted values (10, 5, -1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted1 values (10, 5, -1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted1 + +<sql-statement> +insert into mcrparted values (2, 1, 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted1 values (2, 1, 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted1 + +<sql-statement> +-- routed to mcparted2 +insert into mcrparted values (10, 6, 1000); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted2 values (10, 6, 1000); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted2 + +<sql-statement> +insert into mcrparted values (10, 1000, 1000); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted2 values (10, 1000, 1000); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted2 + +<sql-statement> +-- no partition exists, nor does mcrparted3 accept it +insert into mcrparted values (11, 1, -1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted3 values (11, 1, -1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted3 + +<sql-statement> +-- routed to mcrparted5 +insert into mcrparted values (30, 21, 20); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +insert into mcrparted5 values (30, 21, 20); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted5 + +<sql-statement> +insert into mcrparted4 values (30, 21, 20); -- error +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted4 + +<sql-statement> +-- check rows +select tableoid::regclass::text, * from mcrparted order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +-- cleanup +drop table mcrparted; +</sql-statement> +<sql-statement> +-- check that a BR constraint can't make partition contain violating rows +create table brtrigpartcon (a int, b text) partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- check that a BR constraint can't make partition contain violating rows + ^ +<sql-statement> +create table brtrigpartcon1 partition of brtrigpartcon for values in (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table brtrigpartcon1 partition of brtrigpartcon for values in (1); + ^ +<sql-statement> +create or replace function brtrigpartcon1trigf() returns trigger as $$begin new.a := 2; return new; end$$ language plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + create or replace function brtrigpartcon1trigf() returns trigger as $$begin new.a := 2; return new; end$$ language plpgsql; + ^ +<sql-statement> +create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf(); + ^ +<sql-statement> +insert into brtrigpartcon values (1, 'hi there'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.brtrigpartcon + +<sql-statement> +insert into brtrigpartcon1 values (1, 'hi there'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.brtrigpartcon1 + +<sql-statement> +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +</sql-statement> +<sql-statement> +create role regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 285 + create role regress_coldesc_role; + ^ +<sql-statement> +grant insert on inserttest3 to regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + grant insert on inserttest3 to regress_coldesc_role; + ^ +<sql-statement> +grant insert on brtrigpartcon to regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + grant insert on brtrigpartcon to regress_coldesc_role; + ^ +<sql-statement> +revoke select on brtrigpartcon from regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + revoke select on brtrigpartcon from regress_coldesc_role; + ^ +<sql-statement> +set role regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: role + set role regress_coldesc_role; + ^ +<sql-statement> +with result as (insert into brtrigpartcon values (1, 'hi there') returning 1) + insert into inserttest3 (f3) select * from result; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported withClause + with result as (insert into brtrigpartcon values (1, 'hi there') returning 1) + ^ +<sql-statement> +reset role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset role; + ^ +<sql-statement> +-- cleanup +revoke all on inserttest3 from regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + -- cleanup + ^ +<sql-statement> +revoke all on brtrigpartcon from regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + revoke all on brtrigpartcon from regress_coldesc_role; + ^ +<sql-statement> +drop role regress_coldesc_role; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 287 + drop role regress_coldesc_role; + ^ +<sql-statement> +drop table inserttest3; +</sql-statement> +<sql-statement> +drop table brtrigpartcon; +</sql-statement> +<sql-statement> +drop function brtrigpartcon1trigf(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function brtrigpartcon1trigf(); + ^ +<sql-statement> +-- check that "do nothing" BR triggers work with tuple-routing +create table donothingbrtrig_test (a int, b text) partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- check that "do nothing" BR triggers work with tuple-routing + ^ +<sql-statement> +create table donothingbrtrig_test1 (b text, a int); +</sql-statement> +<sql-statement> +create table donothingbrtrig_test2 (c text, b text, a int); +</sql-statement> +<sql-statement> +alter table donothingbrtrig_test2 drop column c; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table donothingbrtrig_test2 drop column c; + ^ +<sql-statement> +create or replace function donothingbrtrig_func() returns trigger as $$begin raise notice 'b: %', new.b; return NULL; end$$ language plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + create or replace function donothingbrtrig_func() returns trigger as $$begin raise notice 'b: %', new.b; return NULL; end$$ language plpgsql; + ^ +<sql-statement> +create trigger donothingbrtrig1 before insert on donothingbrtrig_test1 for each row execute procedure donothingbrtrig_func(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + create trigger donothingbrtrig1 before insert on donothingbrtrig_test1 for each row execute procedure donothingbrtrig_func(); + ^ +<sql-statement> +create trigger donothingbrtrig2 before insert on donothingbrtrig_test2 for each row execute procedure donothingbrtrig_func(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + create trigger donothingbrtrig2 before insert on donothingbrtrig_test2 for each row execute procedure donothingbrtrig_func(); + ^ +<sql-statement> +alter table donothingbrtrig_test attach partition donothingbrtrig_test1 for values in (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table donothingbrtrig_test attach partition donothingbrtrig_test1 for values in (1); + ^ +<sql-statement> +alter table donothingbrtrig_test attach partition donothingbrtrig_test2 for values in (2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table donothingbrtrig_test attach partition donothingbrtrig_test2 for values in (2); + ^ +<sql-statement> +insert into donothingbrtrig_test values (1, 'foo'), (2, 'bar'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.donothingbrtrig_test + +<sql-statement> +copy donothingbrtrig_test from stdout; +1 baz +2 qux +\. +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "1" + + 1 baz + ^ +<sql-statement> +select tableoid::regclass, * from donothingbrtrig_test; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.donothingbrtrig_test + +<sql-statement> +-- cleanup +drop table donothingbrtrig_test; +</sql-statement> +<sql-statement> +drop function donothingbrtrig_func(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function donothingbrtrig_func(); + ^ +<sql-statement> +-- check multi-column range partitioning with minvalue/maxvalue constraints +create table mcrparted (a text, b int) partition by range(a, b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- check multi-column range partitioning with minvalue/maxvalue constraints + ^ +<sql-statement> +create table mcrparted1_lt_b partition of mcrparted for values from (minvalue, minvalue) to ('b', minvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted1_lt_b partition of mcrparted for values from (minvalue, minvalue) to ('b', minvalue); + ^ +<sql-statement> +create table mcrparted2_b partition of mcrparted for values from ('b', minvalue) to ('c', minvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted2_b partition of mcrparted for values from ('b', minvalue) to ('c', minvalue); + ^ +<sql-statement> +create table mcrparted3_c_to_common partition of mcrparted for values from ('c', minvalue) to ('common', minvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted3_c_to_common partition of mcrparted for values from ('c', minvalue) to ('common', minvalue); + ^ +<sql-statement> +create table mcrparted4_common_lt_0 partition of mcrparted for values from ('common', minvalue) to ('common', 0); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted4_common_lt_0 partition of mcrparted for values from ('common', minvalue) to ('common', 0); + ^ +<sql-statement> +create table mcrparted5_common_0_to_10 partition of mcrparted for values from ('common', 0) to ('common', 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted5_common_0_to_10 partition of mcrparted for values from ('common', 0) to ('common', 10); + ^ +<sql-statement> +create table mcrparted6_common_ge_10 partition of mcrparted for values from ('common', 10) to ('common', maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted6_common_ge_10 partition of mcrparted for values from ('common', 10) to ('common', maxvalue); + ^ +<sql-statement> +create table mcrparted7_gt_common_lt_d partition of mcrparted for values from ('common', maxvalue) to ('d', minvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted7_gt_common_lt_d partition of mcrparted for values from ('common', maxvalue) to ('d', minvalue); + ^ +<sql-statement> +create table mcrparted8_ge_d partition of mcrparted for values from ('d', minvalue) to (maxvalue, maxvalue); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table mcrparted8_ge_d partition of mcrparted for values from ('d', minvalue) to (maxvalue, maxvalue); + ^ +<sql-statement> +\d+ mcrparted +</sql-statement> +Metacommand \d+ mcrparted is not supported +<sql-statement> +\d+ mcrparted1_lt_b +</sql-statement> +Metacommand \d+ mcrparted1_lt_b is not supported +<sql-statement> +\d+ mcrparted2_b +</sql-statement> +Metacommand \d+ mcrparted2_b is not supported +<sql-statement> +\d+ mcrparted3_c_to_common +</sql-statement> +Metacommand \d+ mcrparted3_c_to_common is not supported +<sql-statement> +\d+ mcrparted4_common_lt_0 +</sql-statement> +Metacommand \d+ mcrparted4_common_lt_0 is not supported +<sql-statement> +\d+ mcrparted5_common_0_to_10 +</sql-statement> +Metacommand \d+ mcrparted5_common_0_to_10 is not supported +<sql-statement> +\d+ mcrparted6_common_ge_10 +</sql-statement> +Metacommand \d+ mcrparted6_common_ge_10 is not supported +<sql-statement> +\d+ mcrparted7_gt_common_lt_d +</sql-statement> +Metacommand \d+ mcrparted7_gt_common_lt_d is not supported +<sql-statement> +\d+ mcrparted8_ge_d +</sql-statement> +Metacommand \d+ mcrparted8_ge_d is not supported +<sql-statement> +insert into mcrparted values ('aaa', 0), ('b', 0), ('bz', 10), ('c', -10), + ('comm', -10), ('common', -10), ('common', 0), ('common', 10), + ('commons', 0), ('d', -10), ('e', 0); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +select tableoid::regclass, * from mcrparted order by a, b; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.mcrparted + +<sql-statement> +drop table mcrparted; +</sql-statement> +<sql-statement> +-- check that wholerow vars in the RETURNING list work with partitioned tables +create table returningwrtest (a int) partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- check that wholerow vars in the RETURNING list work with partitioned tables + ^ +<sql-statement> +create table returningwrtest1 partition of returningwrtest for values in (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table returningwrtest1 partition of returningwrtest for values in (1); + ^ +<sql-statement> +insert into returningwrtest values (1) returning returningwrtest; +</sql-statement> +-stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'returning' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- check also that the wholerow vars in RETURNING list are converted as needed +alter table returningwrtest add b text; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + -- check also that the wholerow vars in RETURNING list are converted as needed + ^ +<sql-statement> +create table returningwrtest2 (b text, c int, a int); +</sql-statement> +<sql-statement> +alter table returningwrtest2 drop c; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table returningwrtest2 drop c; + ^ +<sql-statement> +alter table returningwrtest attach partition returningwrtest2 for values in (2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table returningwrtest attach partition returningwrtest2 for values in (2); + ^ +<sql-statement> +insert into returningwrtest values (2, 'foo') returning returningwrtest; +</sql-statement> +-stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'returning' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +drop table returningwrtest; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/insert.out b/ydb/library/yql/tests/postgresql/cases/insert.out index 406f83de96..deceb2192b 100644 --- a/ydb/library/yql/tests/postgresql/cases/insert.out +++ b/ydb/library/yql/tests/postgresql/cases/insert.out @@ -6,3 +6,20 @@ create table inserttest (col1 int4, col2 int4 NOT NULL, col3 text default 'testi -- TOASTed value test -- insert into inserttest values(30, 50, repeat('x', 10000)); +drop table inserttest; +create table inserttest (f1 int, f2 int[], + f3 insert_test_type, f4 insert_test_type[]); +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +drop table inserttest2; +drop table inserttest; +create table mlparted2 (b int not null, a int not null); +create table mlparted5a (a int not null, c text, b int not null); +create table mlparted5_b (d int, b int, c text, a int); +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +drop table inserttest3; +create table donothingbrtrig_test1 (b text, a int); +create table donothingbrtrig_test2 (c text, b text, a int); +create table returningwrtest2 (b text, c int, a int); diff --git a/ydb/library/yql/tests/postgresql/cases/insert.sql b/ydb/library/yql/tests/postgresql/cases/insert.sql index 406f83de96..deceb2192b 100644 --- a/ydb/library/yql/tests/postgresql/cases/insert.sql +++ b/ydb/library/yql/tests/postgresql/cases/insert.sql @@ -6,3 +6,20 @@ create table inserttest (col1 int4, col2 int4 NOT NULL, col3 text default 'testi -- TOASTed value test -- insert into inserttest values(30, 50, repeat('x', 10000)); +drop table inserttest; +create table inserttest (f1 int, f2 int[], + f3 insert_test_type, f4 insert_test_type[]); +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +drop table inserttest2; +drop table inserttest; +create table mlparted2 (b int not null, a int not null); +create table mlparted5a (a int not null, c text, b int not null); +create table mlparted5_b (d int, b int, c text, a int); +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +drop table inserttest3; +create table donothingbrtrig_test1 (b text, a int); +create table donothingbrtrig_test2 (c text, b text, a int); +create table returningwrtest2 (b text, c int, a int); diff --git a/ydb/library/yql/tests/postgresql/cases/int8.err b/ydb/library/yql/tests/postgresql/cases/int8.err index 4d5c813a65..5b962d2928 100644 --- a/ydb/library/yql/tests/postgresql/cases/int8.err +++ b/ydb/library/yql/tests/postgresql/cases/int8.err @@ -108,17 +108,615 @@ INSERT INTO INT8_TBL(q1) VALUES (''); <sql-statement> SELECT * FROM INT8_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F273A829D90) -__libc_start_main+128 (0x7F273A829E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- int8/int8 cmp +SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789; +</sql-statement> +<sql-statement> +-- int8/int4 cmp +SELECT * FROM INT8_TBL WHERE q2 = 456; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 <> 456; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 < 456; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 > 456; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 <= 456; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 >= 456; +</sql-statement> +<sql-statement> +-- int4/int8 cmp +SELECT * FROM INT8_TBL WHERE 123 = q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE 123 <> q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE 123 < q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE 123 > q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE 123 <= q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE 123 >= q1; +</sql-statement> +<sql-statement> +-- int8/int2 cmp +SELECT * FROM INT8_TBL WHERE q2 = '456'::int2; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 < '456'::int2; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 > '456'::int2; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2; +</sql-statement> +<sql-statement> +-- int2/int8 cmp +SELECT * FROM INT8_TBL WHERE '123'::int2 = q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE '123'::int2 < q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE '123'::int2 > q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1; +</sql-statement> +<sql-statement> +SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1; +</sql-statement> +<sql-statement> +SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL + WHERE q1 < 1000 or (q2 > 0 and q2 < 1000); +</sql-statement> +<sql-statement> +SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1, float8(q1) FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q2, float8(q2) FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT 37 + q1 AS plus4 FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT 37 - q1 AS minus4 FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT 2 * q1 AS "twice int4" FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1 * 2 AS "twice int4" FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- int8 op int4 +SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- int4 op int8 +SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- int8 op int2 +SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- int2 op int8 +SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q2, abs(q2) FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT min(q1), min(q2) FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT max(q1), max(q2) FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- TO_CHAR() +-- +SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') + FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999') + FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR') + FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999') + FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, '0999999999999999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- check min/max values and overflow behavior +select '-9223372036854775808'::int8; +</sql-statement> +<sql-statement> +select '-9223372036854775809'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-9223372036854775809'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: value "-9223372036854775809" is out of range for type bigint + + select '-9223372036854775809'::int8; + ^ +<sql-statement> +select '9223372036854775807'::int8; +</sql-statement> +<sql-statement> +select '9223372036854775808'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775808'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: value "9223372036854775808" is out of range for type bigint + + select '9223372036854775808'::int8; + ^ +<sql-statement> +select -('-9223372036854775807'::int8); +</sql-statement> +<sql-statement> +select -('-9223372036854775808'::int8); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select -('-9223372036854775808'::int8); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select -('-9223372036854775808'::int8); + ^ +<sql-statement> +select '9223372036854775800'::int8 + '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 + '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 + '9223372036854775800'::int8; + ^ +<sql-statement> +select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; + ^ +<sql-statement> +select '9223372036854775800'::int8 - '-9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 - '-9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 - '-9223372036854775800'::int8; + ^ +<sql-statement> +select '-9223372036854775800'::int8 - '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-9223372036854775800'::int8 - '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '-9223372036854775800'::int8 - '9223372036854775800'::int8; + ^ +<sql-statement> +select '9223372036854775800'::int8 * '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 * '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 * '9223372036854775800'::int8; + ^ +<sql-statement> +select '9223372036854775800'::int8 / '0'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 / '0'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: division by zero + + select '9223372036854775800'::int8 / '0'::int8; + ^ +<sql-statement> +select '9223372036854775800'::int8 % '0'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 % '0'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: division by zero + + select '9223372036854775800'::int8 % '0'::int8; + ^ +<sql-statement> +select abs('-9223372036854775808'::int8); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select abs('-9223372036854775808'::int8); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select abs('-9223372036854775808'::int8); + ^ +<sql-statement> +select '9223372036854775800'::int8 + '100'::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 + '100'::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 + '100'::int4; + ^ +<sql-statement> +select '-9223372036854775800'::int8 - '100'::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-9223372036854775800'::int8 - '100'::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '-9223372036854775800'::int8 - '100'::int4; + ^ +<sql-statement> +select '9223372036854775800'::int8 * '100'::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 * '100'::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 * '100'::int4; + ^ +<sql-statement> +select '100'::int4 + '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '100'::int4 + '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '100'::int4 + '9223372036854775800'::int8; + ^ +<sql-statement> +select '-100'::int4 - '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-100'::int4 - '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '-100'::int4 - '9223372036854775800'::int8; + ^ +<sql-statement> +select '100'::int4 * '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '100'::int4 * '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '100'::int4 * '9223372036854775800'::int8; + ^ +<sql-statement> +select '9223372036854775800'::int8 + '100'::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 + '100'::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 + '100'::int2; + ^ +<sql-statement> +select '-9223372036854775800'::int8 - '100'::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-9223372036854775800'::int8 - '100'::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '-9223372036854775800'::int8 - '100'::int2; + ^ +<sql-statement> +select '9223372036854775800'::int8 * '100'::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '9223372036854775800'::int8 * '100'::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '9223372036854775800'::int8 * '100'::int2; + ^ +<sql-statement> +select '-9223372036854775808'::int8 / '0'::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-9223372036854775808'::int8 / '0'::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: division by zero + + select '-9223372036854775808'::int8 / '0'::int2; + ^ +<sql-statement> +select '100'::int2 + '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '100'::int2 + '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '100'::int2 + '9223372036854775800'::int8; + ^ +<sql-statement> +select '-100'::int2 - '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '-100'::int2 - '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '-100'::int2 - '9223372036854775800'::int8; + ^ +<sql-statement> +select '100'::int2 * '9223372036854775800'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '100'::int2 * '9223372036854775800'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + select '100'::int2 * '9223372036854775800'::int8; + ^ +<sql-statement> +select '100'::int2 / '0'::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '100'::int2 / '0'::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: division by zero + + select '100'::int2 / '0'::int8; + ^ +<sql-statement> +SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8); +</sql-statement> +<sql-statement> +SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT CAST('36854775807.0'::float4 AS int8); +</sql-statement> +<sql-statement> +SELECT CAST('922337203685477580700.0'::float8 AS int8); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT CAST('922337203685477580700.0'::float8 AS int8); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + SELECT CAST('922337203685477580700.0'::float8 AS int8); + ^ +<sql-statement> +SELECT CAST(q1 AS oid) FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.pg_class + +<sql-statement> +-- bit operations +SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL; +</sql-statement> +<sql-statement> +SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL; +</sql-statement> +<sql-statement> +-- generate_series +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8); +</sql-statement> +<sql-statement> +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: step size cannot equal zero + + SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0); + ^ +<sql-statement> +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2); +</sql-statement> +pgrun: /storage/d/arcc/mount/1/a0a05244-a249bf61-ec2999f5-6661a47b/contrib/libs/llvm12/lib/IR/LegacyPassManager.cpp:588: void llvm::PMTopLevelManager::setLastUser(ArrayRef<Pass *>, Pass *): Assertion `AnalysisPass && "Expected analysis pass to exist."' failed. +pthread_kill at ./nptl/./nptl/pthread_kill.c:43:17 +?? at ??:0:0 diff --git a/ydb/library/yql/tests/postgresql/cases/int8.out b/ydb/library/yql/tests/postgresql/cases/int8.out index 5450ee2b42..e956be1b06 100644 --- a/ydb/library/yql/tests/postgresql/cases/int8.out +++ b/ydb/library/yql/tests/postgresql/cases/int8.out @@ -37,3 +37,122 @@ INSERT INTO INT8_TBL(q1) VALUES (''); ERROR: invalid input syntax for type bigint: "" LINE 1: INSERT INTO INT8_TBL(q1) VALUES (''); ^ +SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789; + q1 | q2 +----+---- +(0 rows) + +SELECT * FROM INT8_TBL WHERE 123 > q1; + q1 | q2 +----+---- +(0 rows) + +SELECT * FROM INT8_TBL WHERE '123'::int2 > q1; + q1 | q2 +----+---- +(0 rows) + +-- check min/max values and overflow behavior +select '-9223372036854775808'::int8; + int8 +---------------------- + -9223372036854775808 +(1 row) + +select '-9223372036854775809'::int8; +ERROR: value "-9223372036854775809" is out of range for type bigint +LINE 1: select '-9223372036854775809'::int8; + ^ +select '9223372036854775807'::int8; + int8 +--------------------- + 9223372036854775807 +(1 row) + +select '9223372036854775808'::int8; +ERROR: value "9223372036854775808" is out of range for type bigint +LINE 1: select '9223372036854775808'::int8; + ^ +select -('-9223372036854775807'::int8); + ?column? +--------------------- + 9223372036854775807 +(1 row) + +select -('-9223372036854775808'::int8); +ERROR: bigint out of range +select '9223372036854775800'::int8 + '9223372036854775800'::int8; +ERROR: bigint out of range +select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 - '-9223372036854775800'::int8; +ERROR: bigint out of range +select '-9223372036854775800'::int8 - '9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 * '9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 / '0'::int8; +ERROR: division by zero +select '9223372036854775800'::int8 % '0'::int8; +ERROR: division by zero +select abs('-9223372036854775808'::int8); +ERROR: bigint out of range +select '9223372036854775800'::int8 + '100'::int4; +ERROR: bigint out of range +select '-9223372036854775800'::int8 - '100'::int4; +ERROR: bigint out of range +select '9223372036854775800'::int8 * '100'::int4; +ERROR: bigint out of range +select '100'::int4 + '9223372036854775800'::int8; +ERROR: bigint out of range +select '-100'::int4 - '9223372036854775800'::int8; +ERROR: bigint out of range +select '100'::int4 * '9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 + '100'::int2; +ERROR: bigint out of range +select '-9223372036854775800'::int8 - '100'::int2; +ERROR: bigint out of range +select '9223372036854775800'::int8 * '100'::int2; +ERROR: bigint out of range +select '-9223372036854775808'::int8 / '0'::int2; +ERROR: division by zero +select '100'::int2 + '9223372036854775800'::int8; +ERROR: bigint out of range +select '-100'::int2 - '9223372036854775800'::int8; +ERROR: bigint out of range +select '100'::int2 * '9223372036854775800'::int8; +ERROR: bigint out of range +select '100'::int2 / '0'::int8; +ERROR: division by zero +SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8); + int8 | int8 +------+------ + 42 | -37 +(1 row) + +SELECT CAST('36854775807.0'::float4 AS int8); + int8 +------------- + 36854775808 +(1 row) + +SELECT CAST('922337203685477580700.0'::float8 AS int8); +ERROR: bigint out of range +-- generate_series +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8); + generate_series +------------------ + 4567890123456789 + 4567890123456790 + 4567890123456791 + 4567890123456792 + 4567890123456793 + 4567890123456794 + 4567890123456795 + 4567890123456796 + 4567890123456797 + 4567890123456798 + 4567890123456799 +(11 rows) + diff --git a/ydb/library/yql/tests/postgresql/cases/int8.sql b/ydb/library/yql/tests/postgresql/cases/int8.sql index 8d2efcb2dd..c0705302b2 100644 --- a/ydb/library/yql/tests/postgresql/cases/int8.sql +++ b/ydb/library/yql/tests/postgresql/cases/int8.sql @@ -16,3 +16,40 @@ INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934'); INSERT INTO INT8_TBL(q1) VALUES ('- 123'); INSERT INTO INT8_TBL(q1) VALUES (' 345 5'); INSERT INTO INT8_TBL(q1) VALUES (''); +SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789; +SELECT * FROM INT8_TBL WHERE 123 > q1; +SELECT * FROM INT8_TBL WHERE '123'::int2 > q1; +-- check min/max values and overflow behavior +select '-9223372036854775808'::int8; +select '-9223372036854775809'::int8; +select '9223372036854775807'::int8; +select '9223372036854775808'::int8; +select -('-9223372036854775807'::int8); +select -('-9223372036854775808'::int8); +select '9223372036854775800'::int8 + '9223372036854775800'::int8; +select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; +select '9223372036854775800'::int8 - '-9223372036854775800'::int8; +select '-9223372036854775800'::int8 - '9223372036854775800'::int8; +select '9223372036854775800'::int8 * '9223372036854775800'::int8; +select '9223372036854775800'::int8 / '0'::int8; +select '9223372036854775800'::int8 % '0'::int8; +select abs('-9223372036854775808'::int8); +select '9223372036854775800'::int8 + '100'::int4; +select '-9223372036854775800'::int8 - '100'::int4; +select '9223372036854775800'::int8 * '100'::int4; +select '100'::int4 + '9223372036854775800'::int8; +select '-100'::int4 - '9223372036854775800'::int8; +select '100'::int4 * '9223372036854775800'::int8; +select '9223372036854775800'::int8 + '100'::int2; +select '-9223372036854775800'::int8 - '100'::int2; +select '9223372036854775800'::int8 * '100'::int2; +select '-9223372036854775808'::int8 / '0'::int2; +select '100'::int2 + '9223372036854775800'::int8; +select '-100'::int2 - '9223372036854775800'::int8; +select '100'::int2 * '9223372036854775800'::int8; +select '100'::int2 / '0'::int8; +SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8); +SELECT CAST('36854775807.0'::float4 AS int8); +SELECT CAST('922337203685477580700.0'::float8 AS int8); +-- generate_series +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8); diff --git a/ydb/library/yql/tests/postgresql/cases/join.err b/ydb/library/yql/tests/postgresql/cases/join.err index ffcc47b020..50d0e21eb6 100644 --- a/ydb/library/yql/tests/postgresql/cases/join.err +++ b/ydb/library/yql/tests/postgresql/cases/join.err @@ -101,17 +101,1583 @@ analyze onerow; SELECT * FROM J1_TBL AS tx; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FC1F0229D90) -__libc_start_main+128 (0x7FC1F0229E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT * + FROM J1_TBL tx; +</sql-statement> +<sql-statement> +SELECT * + FROM J1_TBL AS t1 (a, b, c); +</sql-statement> +<sql-statement> +SELECT * + FROM J1_TBL t1 (a, b, c); +</sql-statement> +<sql-statement> +SELECT * + FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e); +</sql-statement> +<sql-statement> +SELECT t1.a, t2.e + FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e) + WHERE t1.a = t2.d; +</sql-statement> +<sql-statement> +-- +-- CROSS JOIN +-- Qualifications are not allowed on cross joins, +-- which degenerate into a standard unqualified inner join. +-- +SELECT * + FROM J1_TBL CROSS JOIN J2_TBL; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + -- + ^ +<sql-statement> +-- ambiguous column +SELECT i, k, t + FROM J1_TBL CROSS JOIN J2_TBL; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- ambiguous column + ^ + -stdin-:<main>:2:8: Error: Column reference is ambiguous: i + SELECT i, k, t + ^ +<sql-statement> +-- resolve previous ambiguity by specifying the table name +SELECT t1.i, k, t + FROM J1_TBL t1 CROSS JOIN J2_TBL t2; +</sql-statement> +<sql-statement> +SELECT ii, tt, kk + FROM (J1_TBL CROSS JOIN J2_TBL) + AS tx (ii, jj, tt, ii2, kk); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported alias + SELECT ii, tt, kk + ^ +<sql-statement> +SELECT tx.ii, tx.jj, tx.kk + FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e)) + AS tx (ii, jj, tt, ii2, kk); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported alias + SELECT tx.ii, tx.jj, tx.kk + ^ +<sql-statement> +SELECT * + FROM J1_TBL CROSS JOIN J2_TBL a CROSS JOIN J2_TBL b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT * + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + SELECT * + ^ +<sql-statement> +-- +-- +-- Inner joins (equi-joins) +-- +-- +-- +-- Inner joins (equi-joins) with USING clause +-- The USING syntax changes the shape of the resulting table +-- by including a column in the USING clause only once in the result. +-- +-- Inner equi-join on specified column +SELECT * + FROM J1_TBL INNER JOIN J2_TBL USING (i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + -- + ^ +<sql-statement> +-- Same as above, slightly different syntax +SELECT * + FROM J1_TBL JOIN J2_TBL USING (i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + -- Same as above, slightly different syntax + ^ +<sql-statement> +SELECT * + FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a) + ORDER BY a, d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b) + ORDER BY b, t1.a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +-- test join using aliases +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + -- test join using aliases + ^ +<sql-statement> +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok + ^ +<sql-statement> +SELECT * FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported alias + SELECT * FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error + ^ +<sql-statement> +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok + ^ +<sql-statement> +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error + ^ +<sql-statement> +SELECT * FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint) +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported alias + SELECT * FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint) + ^ +<sql-statement> +SELECT * FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error + ^ +<sql-statement> +SELECT x.* FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT x.* FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + ^ +<sql-statement> +SELECT ROW(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT ROW(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + ^ +<sql-statement> +SELECT row_to_json(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT row_to_json(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + ^ +<sql-statement> +-- +-- NATURAL JOIN +-- Inner equi-join on all columns with the same name +-- +SELECT * + FROM J1_TBL NATURAL JOIN J2_TBL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + -- + ^ +<sql-statement> +SELECT * + FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * + ^ +<sql-statement> +-- mismatch number of columns +-- currently, Postgres will fill in with underlying names +SELECT * + FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + -- mismatch number of columns + ^ +<sql-statement> +-- +-- Inner joins (equi-joins) +-- +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + -- + ^ +<sql-statement> +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT * + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + SELECT * + ^ +<sql-statement> +-- +-- Non-equi-joins +-- +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- + ^ + -stdin-:<main>:1:1: Error: Duplicated member: i + -- + ^ +<sql-statement> +-- +-- Outer joins +-- Note that OUTER is a noise word +-- +SELECT * + FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i) + ORDER BY i, k, t; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + -- + ^ +<sql-statement> +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) + ORDER BY i, k, t; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL RIGHT JOIN J2_TBL USING (i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i) + ORDER BY i, k, t; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL FULL JOIN J2_TBL USING (i) + ORDER BY i, k, t; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * + ^ +<sql-statement> +-- +-- semijoin selectivity for <> +-- +explain (costs off) +select * from int4_tbl i4, tenk1 a +where exists(select * from tenk1 b + where a.twothousand = b.twothousand and a.fivethous <> b.fivethous) + and i4.f1 = a.tenthous; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +-- +-- More complicated constructs +-- +-- +-- Multiway full join +-- +CREATE TABLE t1 (name TEXT, n INTEGER); +</sql-statement> +<sql-statement> +CREATE TABLE t2 (name TEXT, n INTEGER); +</sql-statement> +<sql-statement> +CREATE TABLE t3 (name TEXT, n INTEGER); +</sql-statement> +<sql-statement> +INSERT INTO t1 VALUES ( 'bb', 11 ); +</sql-statement> +<sql-statement> +INSERT INTO t2 VALUES ( 'bb', 12 ); +</sql-statement> +<sql-statement> +INSERT INTO t2 VALUES ( 'cc', 22 ); +</sql-statement> +<sql-statement> +INSERT INTO t2 VALUES ( 'ee', 42 ); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES ( 'bb', 13 ); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES ( 'cc', 23 ); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES ( 'dd', 33 ); +</sql-statement> +<sql-statement> +SELECT * FROM t1 FULL JOIN t2 USING (name) FULL JOIN t3 USING (name); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM t1 FULL JOIN t2 USING (name) FULL JOIN t3 USING (name); + ^ +<sql-statement> +-- +-- Test interactions of join syntax and subqueries +-- +-- Basic cases (we expect planner to pull up the subquery here) +SELECT * FROM +(SELECT * FROM t2) as s2 +INNER JOIN +(SELECT * FROM t3) s3 +USING (name); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + -- + ^ +<sql-statement> +SELECT * FROM +(SELECT * FROM t2) as s2 +LEFT JOIN +(SELECT * FROM t3) s3 +USING (name); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM + ^ +<sql-statement> +SELECT * FROM +(SELECT * FROM t2) as s2 +FULL JOIN +(SELECT * FROM t3) s3 +USING (name); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + SELECT * FROM + ^ +<sql-statement> +-- Cases with non-nullable expressions in subquery results; +-- make sure these go to null as expected +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL INNER JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + -- Cases with non-nullable expressions in subquery results; + ^ +<sql-statement> +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL LEFT JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * FROM + ^ +<sql-statement> +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL FULL JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * FROM + ^ +<sql-statement> +SELECT * FROM +(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1 +NATURAL INNER JOIN +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL INNER JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * FROM + ^ +<sql-statement> +SELECT * FROM +(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1 +NATURAL FULL JOIN +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL FULL JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * FROM + ^ +<sql-statement> +SELECT * FROM +(SELECT name, n as s1_n FROM t1) as s1 +NATURAL FULL JOIN + (SELECT * FROM + (SELECT name, n as s2_n FROM t2) as s2 + NATURAL FULL JOIN + (SELECT name, n as s3_n FROM t3) as s3 + ) ss2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * FROM + ^ +<sql-statement> +SELECT * FROM +(SELECT name, n as s1_n FROM t1) as s1 +NATURAL FULL JOIN + (SELECT * FROM + (SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 + NATURAL FULL JOIN + (SELECT name, n as s3_n FROM t3) as s3 + ) ss2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported isNatural + SELECT * FROM + ^ +<sql-statement> +-- Constants as join keys can also be problematic +SELECT * FROM + (SELECT name, n as s1_n FROM t1) as s1 +FULL JOIN + (SELECT name, 2 as s2_n FROM t2) as s2 +ON (s1_n = s2_n); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- Constants as join keys can also be problematic + ^ + -stdin-:<main>:1:1: Error: Duplicated member: name + -- Constants as join keys can also be problematic + ^ +<sql-statement> +-- Test for propagation of nullability constraints into sub-joins +create temp table x (x1 int, x2 int); +</sql-statement> +<sql-statement> +insert into x values (1,11); +</sql-statement> +<sql-statement> +insert into x values (2,22); +</sql-statement> +<sql-statement> +insert into x values (3,null); +</sql-statement> +<sql-statement> +insert into x values (4,44); +</sql-statement> +<sql-statement> +insert into x values (5,null); +</sql-statement> +<sql-statement> +create temp table y (y1 int, y2 int); +</sql-statement> +<sql-statement> +insert into y values (1,111); +</sql-statement> +<sql-statement> +insert into y values (2,222); +</sql-statement> +<sql-statement> +insert into y values (3,333); +</sql-statement> +<sql-statement> +insert into y values (4,null); +</sql-statement> +<sql-statement> +select * from x; +</sql-statement> +<sql-statement> +select * from y; +</sql-statement> +<sql-statement> +select * from x left join y on (x1 = y1 and x2 is not null); +</sql-statement> +<sql-statement> +select * from x left join y on (x1 = y1 and y2 is not null); +</sql-statement> +<sql-statement> +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1); +</sql-statement> +<sql-statement> +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and x2 is not null); +</sql-statement> +<sql-statement> +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and y2 is not null); +</sql-statement> +<sql-statement> +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and xx2 is not null); +</sql-statement> +<sql-statement> +-- these should NOT give the same answers as above +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (x2 is not null); +</sql-statement> +<sql-statement> +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (y2 is not null); +</sql-statement> +<sql-statement> +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (xx2 is not null); +</sql-statement> +<sql-statement> +-- +-- regression test: check for bug with propagation of implied equality +-- to outside an IN +-- +select count(*) from tenk1 a where unique1 in + (select unique1 from tenk1 b join tenk1 c using (unique1) + where b.unique2 = 42); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:44: Error: JoinExpr: unsupported using + select count(*) from tenk1 a where unique1 in + ^ +<sql-statement> +-- +-- regression test: check for failure to generate a plan with multiple +-- degenerate IN clauses +-- +select count(*) from tenk1 x where + x.unique1 in (select a.f1 from int4_tbl a,float8_tbl b where a.f1=b.f1) and + x.unique1 = 0 and + x.unique1 in (select aa.f1 from int4_tbl aa,float8_tbl bb where aa.f1=bb.f1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- try that with GEQO too +begin; +</sql-statement> +<sql-statement> +set geqo = on; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: geqo + set geqo = on; + ^ +<sql-statement> +set geqo_threshold = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: geqo_threshold + set geqo_threshold = 2; + ^ +<sql-statement> +select count(*) from tenk1 x where + x.unique1 in (select a.f1 from int4_tbl a,float8_tbl b where a.f1=b.f1) and + x.unique1 = 0 and + x.unique1 in (select aa.f1 from int4_tbl aa,float8_tbl bb where aa.f1=bb.f1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +rollback; +</sql-statement> +<sql-statement> +-- +-- regression test: be sure we cope with proven-dummy append rels +-- +explain (costs off) +select aa, bb, unique1, unique1 + from tenk1 right join b on aa = unique1 + where bb < bb and bb is null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select aa, bb, unique1, unique1 + from tenk1 right join b on aa = unique1 + where bb < bb and bb is null; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- regression test: check handling of empty-FROM subquery underneath outer join +-- +explain (costs off) +select * from int8_tbl i1 left join (int8_tbl i2 join + (select 123 as x) ss on i2.q1 = x) on i1.q2 = i2.q2 +order by 1, 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select * from int8_tbl i1 left join (int8_tbl i2 join + (select 123 as x) ss on i2.q1 = x) on i1.q2 = i2.q2 +order by 1, 2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +-- +-- regression test: check a case where join_clause_is_movable_into() gives +-- an imprecise result, causing an assertion failure +-- +select count(*) +from + (select t3.tenthous as x1, coalesce(t1.stringu1, t2.stringu1) as x2 + from tenk1 t1 + left join tenk1 t2 on t1.unique1 = t2.unique1 + join tenk1 t3 on t1.unique2 = t3.unique2) ss, + tenk1 t4, + tenk1 t5 +where t4.thousand = t5.unique1 and ss.x1 = t4.tenthous and ss.x2 = t5.stringu1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- regression test: check a case where we formerly missed including an EC +-- enforcement clause because it was expected to be handled at scan level +-- +explain (costs off) +select a.f1, b.f1, t.thousand, t.tenthous from + tenk1 t, + (select sum(f1)+1 as f1 from int4_tbl i4a) a, + (select sum(f1) as f1 from int4_tbl i4b) b +where b.f1 = t.thousand and a.f1 = b.f1 and (a.f1+b.f1+999) = t.tenthous; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select a.f1, b.f1, t.thousand, t.tenthous from + tenk1 t, + (select sum(f1)+1 as f1 from int4_tbl i4a) a, + (select sum(f1) as f1 from int4_tbl i4b) b +where b.f1 = t.thousand and a.f1 = b.f1 and (a.f1+b.f1+999) = t.tenthous; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- check a case where we formerly got confused by conflicting sort orders +-- in redundant merge join path keys +-- +explain (costs off) +select * from + j1_tbl full join + (select * from j2_tbl order by j2_tbl.i desc, j2_tbl.k asc) j2_tbl + on j1_tbl.i = j2_tbl.i and j1_tbl.i = j2_tbl.k; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select * from + j1_tbl full join + (select * from j2_tbl order by j2_tbl.i desc, j2_tbl.k asc) j2_tbl + on j1_tbl.i = j2_tbl.i and j1_tbl.i = j2_tbl.k; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.j1_tbl + +<sql-statement> +-- +-- a different check for handling of redundant sort keys in merge joins +-- +explain (costs off) +select count(*) from + (select * from tenk1 x order by x.thousand, x.twothousand, x.fivethous) x + left join + (select * from tenk1 y order by y.unique2) y + on x.thousand = y.unique2 and x.twothousand = y.hundred and x.fivethous = y.unique2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select count(*) from + (select * from tenk1 x order by x.thousand, x.twothousand, x.fivethous) x + left join + (select * from tenk1 y order by y.unique2) y + on x.thousand = y.unique2 and x.twothousand = y.hundred and x.fivethous = y.unique2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- Clean up +-- +DROP TABLE t1; +</sql-statement> +<sql-statement> +DROP TABLE t2; +</sql-statement> +<sql-statement> +DROP TABLE t3; +</sql-statement> +<sql-statement> +DROP TABLE J1_TBL; +</sql-statement> +<sql-statement> +DROP TABLE J2_TBL; +</sql-statement> +<sql-statement> +-- Both DELETE and UPDATE allow the specification of additional tables +-- to "join" against to determine which rows should be modified. +CREATE TEMP TABLE t1 (a int, b int); +</sql-statement> +<sql-statement> +CREATE TEMP TABLE t2 (a int, b int); +</sql-statement> +<sql-statement> +CREATE TEMP TABLE t3 (x int, y int); +</sql-statement> +<sql-statement> +INSERT INTO t1 VALUES (5, 10); +</sql-statement> +<sql-statement> +INSERT INTO t1 VALUES (15, 20); +</sql-statement> +<sql-statement> +INSERT INTO t1 VALUES (100, 100); +</sql-statement> +<sql-statement> +INSERT INTO t1 VALUES (200, 1000); +</sql-statement> +<sql-statement> +INSERT INTO t2 VALUES (200, 2000); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES (5, 20); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES (6, 7); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES (7, 8); +</sql-statement> +<sql-statement> +INSERT INTO t3 VALUES (500, 100); +</sql-statement> +<sql-statement> +DELETE FROM t3 USING t1 table1 WHERE t3.x = table1.a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: using is not supported + DELETE FROM t3 USING t1 table1 WHERE t3.x = table1.a; + ^ +<sql-statement> +SELECT * FROM t3; +</sql-statement> +<sql-statement> +DELETE FROM t3 USING t1 JOIN t2 USING (a) WHERE t3.x > t1.a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: using is not supported + DELETE FROM t3 USING t1 JOIN t2 USING (a) WHERE t3.x > t1.a; + ^ +<sql-statement> +SELECT * FROM t3; +</sql-statement> +<sql-statement> +DELETE FROM t3 USING t3 t3_other WHERE t3.x = t3_other.x AND t3.y = t3_other.y; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: using is not supported + DELETE FROM t3 USING t3 t3_other WHERE t3.x = t3_other.x AND t3.y = t3_other.y; + ^ +<sql-statement> +SELECT * FROM t3; +</sql-statement> +<sql-statement> +-- Test join against inheritance tree +create temp table t2a () inherits (t2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + -- Test join against inheritance tree + ^ +<sql-statement> +insert into t2a values (200, 2001); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.t2a + +<sql-statement> +select * from t1 left join t2 on (t1.a = t2.a); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from t1 left join t2 on (t1.a = t2.a); + ^ + -stdin-:<main>:1:1: Error: Duplicated member: a + select * from t1 left join t2 on (t1.a = t2.a); + ^ +<sql-statement> +-- Test matching of column name with wrong alias +select t1.x from t1 join t3 on (t1.a = t3.x); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- Test matching of column name with wrong alias + ^ + -stdin-:<main>:2:8: Error: No such column: x + select t1.x from t1 join t3 on (t1.a = t3.x); + ^ +<sql-statement> +-- Test matching of locking clause with wrong alias +select t1.*, t2.*, unnamed_join.* from + t1 join t2 on (t1.a = t2.a), t3 as unnamed_join + for update of unnamed_join; +</sql-statement> +-stdin-:<main>: Warning: Parse Sql + + -stdin-:<main>:1:1: Warning: SelectStmt: lockingClause is ignored + -- Test matching of locking clause with wrong alias + ^ +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- Test matching of locking clause with wrong alias + ^ + -stdin-:<main>:1:1: Error: Duplicated member: a + -- Test matching of locking clause with wrong alias + ^ +<sql-statement> +select foo.*, unnamed_join.* from + t1 join t2 using (a) as foo, t3 as unnamed_join + for update of unnamed_join; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + select foo.*, unnamed_join.* from + ^ +<sql-statement> +select foo.*, unnamed_join.* from + t1 join t2 using (a) as foo, t3 as unnamed_join + for update of foo; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported using + select foo.*, unnamed_join.* from + ^ +<sql-statement> +select bar.*, unnamed_join.* from + (t1 join t2 using (a) as foo) as bar, t3 as unnamed_join + for update of foo; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported alias + select bar.*, unnamed_join.* from + ^ +<sql-statement> +select bar.*, unnamed_join.* from + (t1 join t2 using (a) as foo) as bar, t3 as unnamed_join + for update of bar; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: JoinExpr: unsupported alias + select bar.*, unnamed_join.* from + ^ +<sql-statement> +-- +-- regression test for 8.1 merge right join bug +-- +CREATE TEMP TABLE tt1 ( tt1_id int4, joincol int4 ); +</sql-statement> +<sql-statement> +INSERT INTO tt1 VALUES (1, 11); +</sql-statement> +<sql-statement> +INSERT INTO tt1 VALUES (2, NULL); +</sql-statement> +<sql-statement> +CREATE TEMP TABLE tt2 ( tt2_id int4, joincol int4 ); +</sql-statement> +<sql-statement> +INSERT INTO tt2 VALUES (21, 11); +</sql-statement> +<sql-statement> +INSERT INTO tt2 VALUES (22, 11); +</sql-statement> +<sql-statement> +set enable_hashjoin to off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_hashjoin + set enable_hashjoin to off; + ^ +<sql-statement> +set enable_nestloop to off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_nestloop + set enable_nestloop to off; + ^ +<sql-statement> +-- these should give the same results +select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- these should give the same results + ^ + -stdin-:<main>:1:1: Error: Duplicated member: joincol + -- these should give the same results + ^ +<sql-statement> +select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; + ^ + -stdin-:<main>:1:1: Error: Duplicated member: joincol + select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; + ^ +<sql-statement> +reset enable_hashjoin; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_hashjoin; + ^ +<sql-statement> +reset enable_nestloop; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_nestloop; + ^ +<sql-statement> +-- +-- regression test for bug #13908 (hash join with skew tuples & nbatch increase) +-- +set work_mem to '64kB'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: work_mem + -- + ^ +<sql-statement> +set enable_mergejoin to off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_mergejoin + set enable_mergejoin to off; + ^ +<sql-statement> +set enable_memoize to off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_memoize + set enable_memoize to off; + ^ +<sql-statement> +explain (costs off) +select count(*) from tenk1 a, tenk1 b + where a.hundred = b.thousand and (b.fivethous % 10) < 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select count(*) from tenk1 a, tenk1 b + where a.hundred = b.thousand and (b.fivethous % 10) < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +reset work_mem; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset work_mem; + ^ +<sql-statement> +reset enable_mergejoin; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_mergejoin; + ^ +<sql-statement> +reset enable_memoize; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_memoize; + ^ +<sql-statement> +-- +-- regression test for 8.2 bug with improper re-ordering of left joins +-- +create temp table tt3(f1 int, f2 text); +</sql-statement> +<sql-statement> +insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x; +</sql-statement> +<sql-statement> +create index tt3i on tt3(f1); +</sql-statement> +<sql-statement> +analyze tt3; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 275 + analyze tt3; + ^ +<sql-statement> +create temp table tt4(f1 int); +</sql-statement> +<sql-statement> +insert into tt4 values (0),(1),(9999); +</sql-statement> +<sql-statement> +analyze tt4; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 275 + analyze tt4; + ^ +<sql-statement> +SELECT a.f1 +FROM tt4 a +LEFT JOIN ( + SELECT b.f1 + FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1) + WHERE c.f1 IS NULL +) AS d ON (a.f1 = d.f1) +WHERE d.f1 IS NULL; +</sql-statement> +<sql-statement> +-- +-- regression test for proper handling of outer joins within antijoins +-- +create temp table tt4x(c1 int, c2 int, c3 int); +</sql-statement> +<sql-statement> +explain (costs off) +select * from tt4x t1 +where not exists ( + select 1 from tt4x t2 + left join tt4x t3 on t2.c3 = t3.c1 + left join ( select t5.c1 as c1 + from tt4x t4 left join tt4x t5 on t4.c2 = t5.c1 + ) a1 on t3.c2 = a1.c1 + where t1.c1 = t2.c2 +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +-- +-- regression test for problems of the sort depicted in bug #3494 +-- +create temp table tt5(f1 int, f2 int); +</sql-statement> +<sql-statement> +create temp table tt6(f1 int, f2 int); +</sql-statement> +<sql-statement> +insert into tt5 values(1, 10); +</sql-statement> +<sql-statement> +insert into tt5 values(1, 11); +</sql-statement> +<sql-statement> +insert into tt6 values(1, 9); +</sql-statement> +<sql-statement> +insert into tt6 values(1, 2); +</sql-statement> +<sql-statement> +insert into tt6 values(2, 9); +</sql-statement> +<sql-statement> +select * from tt5,tt6 where tt5.f1 = tt6.f1 and tt5.f1 = tt5.f2 - tt6.f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from tt5,tt6 where tt5.f1 = tt6.f1 and tt5.f1 = tt5.f2 - tt6.f2; + ^ + -stdin-:<main>:1:1: Error: Duplicated member: f1 + select * from tt5,tt6 where tt5.f1 = tt6.f1 and tt5.f1 = tt5.f2 - tt6.f2; + ^ +<sql-statement> +-- +-- regression test for problems of the sort depicted in bug #3588 +-- +create temp table xx (pkxx int); +</sql-statement> +<sql-statement> +create temp table yy (pkyy int, pkxx int); +</sql-statement> +<sql-statement> +insert into xx values (1); +</sql-statement> +<sql-statement> +insert into xx values (2); +</sql-statement> +<sql-statement> +insert into xx values (3); +</sql-statement> +<sql-statement> +insert into yy values (101, 1); +</sql-statement> +<sql-statement> +insert into yy values (201, 2); +</sql-statement> +<sql-statement> +insert into yy values (301, NULL); +</sql-statement> +<sql-statement> +select yy.pkyy as yy_pkyy, yy.pkxx as yy_pkxx, yya.pkyy as yya_pkyy, + xxa.pkxx as xxa_pkxx, xxb.pkxx as xxb_pkxx +from yy + left join (SELECT * FROM yy where pkyy = 101) as yya ON yy.pkyy = yya.pkyy + left join xx xxa on yya.pkxx = xxa.pkxx + left join xx xxb on coalesce (xxa.pkxx, 1) = xxb.pkxx; +</sql-statement> +<sql-statement> +-- +-- regression test for improper pushing of constants across outer-join clauses +-- (as seen in early 8.2.x releases) +-- +create temp table zt1 (f1 int primary key); +</sql-statement> +<sql-statement> +create temp table zt2 (f2 int primary key); +</sql-statement> +<sql-statement> +create temp table zt3 (f3 int primary key); +</sql-statement> +<sql-statement> +insert into zt1 values(53); +</sql-statement> +<sql-statement> +insert into zt2 values(53); +</sql-statement> +<sql-statement> +select * from + zt2 left join zt3 on (f2 = f3) + left join zt1 on (f3 = f1) +where f2 = 53; +</sql-statement> +<sql-statement> +create temp view zv1 as select *,'dummy'::text AS junk from zt1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + create temp view zv1 as select *,'dummy'::text AS junk from zt1; + ^ +<sql-statement> +select * from + zt2 left join zt3 on (f2 = f3) + left join zv1 on (f3 = f1) +where f2 = 53; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.zv1 + +<sql-statement> +-- +-- regression test for improper extraction of OR indexqual conditions +-- (as seen in early 8.3.x releases) +-- +select a.unique2, a.ten, b.tenthous, b.unique2, b.hundred +from tenk1 a left join tenk1 b on a.unique2 = b.tenthous +where a.unique1 = 42 and + ((b.unique2 is null and a.ten = 2) or b.hundred = 3); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- test proper positioning of one-time quals in EXISTS (8.4devel bug) +-- +prepare foo(bool) as + select count(*) from tenk1 a left join tenk1 b + on (a.unique2 = b.unique1 and exists + (select 1 from tenk1 c where c.thousand = b.unique2 and $1)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 301 + -- + ^ +<sql-statement> +execute foo(true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + execute foo(true); + ^ +<sql-statement> +execute foo(false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + execute foo(false); + ^ +<sql-statement> +-- +-- test for sane behavior with noncanonical merge clauses, per bug #4926 +-- +begin; +</sql-statement> +<sql-statement> +set enable_mergejoin = 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_mergejoin + set enable_mergejoin = 1; + ^ +<sql-statement> +set enable_hashjoin = 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_hashjoin + set enable_hashjoin = 0; + ^ +<sql-statement> +set enable_nestloop = 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_nestloop + set enable_nestloop = 0; + ^ +<sql-statement> +create temp table a (i integer); +</sql-statement> +<sql-statement> +create temp table b (x integer, y integer); +</sql-statement> +<sql-statement> +select * from a left join b on i = x and i = y and x = i; +</sql-statement> +<sql-statement> +rollback; +</sql-statement> +<sql-statement> +-- +-- test handling of merge clauses using record_ops +-- +begin; +</sql-statement> +<sql-statement> +create type mycomptype as (id int, v bigint); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + create type mycomptype as (id int, v bigint); + ^ +<sql-statement> +create temp table tidv (idv mycomptype); +</sql-statement> +<sql-statement> +create index on tidv (idv); +</sql-statement> +<sql-statement> +explain (costs off) +select a.idv, b.idv from tidv a, tidv b where a.idv = b.idv; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +set enable_mergejoin = 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_mergejoin + set enable_mergejoin = 0; + ^ +<sql-statement> +set enable_hashjoin = 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_hashjoin + set enable_hashjoin = 0; + ^ +<sql-statement> +explain (costs off) +select a.idv, b.idv from tidv a, tidv b where a.idv = b.idv; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +rollback; +</sql-statement> +<sql-statement> +-- +-- test NULL behavior of whole-row Vars, per bug #5025 +-- +select t1.q2, count(t2.*) +from int8_tbl t1 left join int8_tbl t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +select t1.q2, count(t2.*) +from int8_tbl t1 left join (select * from int8_tbl) t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +select t1.q2, count(t2.*) +from int8_tbl t1 left join (select * from int8_tbl offset 0) t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +select t1.q2, count(t2.*) +from int8_tbl t1 left join + (select q1, case when q2=1 then 1 else q2 end as q2 from int8_tbl) t2 + on (t1.q2 = t2.q1) +group by t1.q2 order by 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int8_tbl + +<sql-statement> +-- +-- test incorrect failure to NULL pulled-up subexpressions +-- +begin; +</sql-statement> +<sql-statement> +create temp table a ( + code char not null, + constraint a_pk primary key (code) +); +</sql-statement> +(TFileError) (File exists) util/system/file.cpp:857: can't open "/tmp/tmpglg8to66/a" with mode CreateNew (0x00000003) diff --git a/ydb/library/yql/tests/postgresql/cases/join.out b/ydb/library/yql/tests/postgresql/cases/join.out index e22646412a..6bfa3fad9c 100644 --- a/ydb/library/yql/tests/postgresql/cases/join.out +++ b/ydb/library/yql/tests/postgresql/cases/join.out @@ -33,3 +33,126 @@ INSERT INTO J2_TBL VALUES (NULL, NULL); INSERT INTO J2_TBL VALUES (NULL, 0); -- useful in some tests below create temp table onerow(); +-- +-- More complicated constructs +-- +-- +-- Multiway full join +-- +CREATE TABLE t1 (name TEXT, n INTEGER); +CREATE TABLE t2 (name TEXT, n INTEGER); +CREATE TABLE t3 (name TEXT, n INTEGER); +INSERT INTO t1 VALUES ( 'bb', 11 ); +INSERT INTO t2 VALUES ( 'bb', 12 ); +INSERT INTO t2 VALUES ( 'cc', 22 ); +INSERT INTO t2 VALUES ( 'ee', 42 ); +INSERT INTO t3 VALUES ( 'bb', 13 ); +INSERT INTO t3 VALUES ( 'cc', 23 ); +INSERT INTO t3 VALUES ( 'dd', 33 ); +-- Test for propagation of nullability constraints into sub-joins +create temp table x (x1 int, x2 int); +insert into x values (1,11); +insert into x values (2,22); +insert into x values (3,null); +insert into x values (4,44); +insert into x values (5,null); +create temp table y (y1 int, y2 int); +insert into y values (1,111); +insert into y values (2,222); +insert into y values (3,333); +insert into y values (4,null); +-- try that with GEQO too +begin; +rollback; +-- +-- Clean up +-- +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE J1_TBL; +DROP TABLE J2_TBL; +-- Both DELETE and UPDATE allow the specification of additional tables +-- to "join" against to determine which rows should be modified. +CREATE TEMP TABLE t1 (a int, b int); +CREATE TEMP TABLE t2 (a int, b int); +CREATE TEMP TABLE t3 (x int, y int); +INSERT INTO t1 VALUES (5, 10); +INSERT INTO t1 VALUES (15, 20); +INSERT INTO t1 VALUES (100, 100); +INSERT INTO t1 VALUES (200, 1000); +INSERT INTO t2 VALUES (200, 2000); +INSERT INTO t3 VALUES (5, 20); +INSERT INTO t3 VALUES (6, 7); +INSERT INTO t3 VALUES (7, 8); +INSERT INTO t3 VALUES (500, 100); +-- +-- regression test for 8.1 merge right join bug +-- +CREATE TEMP TABLE tt1 ( tt1_id int4, joincol int4 ); +INSERT INTO tt1 VALUES (1, 11); +INSERT INTO tt1 VALUES (2, NULL); +CREATE TEMP TABLE tt2 ( tt2_id int4, joincol int4 ); +INSERT INTO tt2 VALUES (21, 11); +INSERT INTO tt2 VALUES (22, 11); +-- +-- regression test for 8.2 bug with improper re-ordering of left joins +-- +create temp table tt3(f1 int, f2 text); +insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x; +create index tt3i on tt3(f1); +create temp table tt4(f1 int); +insert into tt4 values (0),(1),(9999); +-- +-- regression test for proper handling of outer joins within antijoins +-- +create temp table tt4x(c1 int, c2 int, c3 int); +-- +-- regression test for problems of the sort depicted in bug #3494 +-- +create temp table tt5(f1 int, f2 int); +create temp table tt6(f1 int, f2 int); +insert into tt5 values(1, 10); +insert into tt5 values(1, 11); +insert into tt6 values(1, 9); +insert into tt6 values(1, 2); +insert into tt6 values(2, 9); +-- +-- regression test for problems of the sort depicted in bug #3588 +-- +create temp table xx (pkxx int); +create temp table yy (pkyy int, pkxx int); +insert into xx values (1); +insert into xx values (2); +insert into xx values (3); +insert into yy values (101, 1); +insert into yy values (201, 2); +insert into yy values (301, NULL); +-- +-- regression test for improper pushing of constants across outer-join clauses +-- (as seen in early 8.2.x releases) +-- +create temp table zt1 (f1 int primary key); +create temp table zt2 (f2 int primary key); +create temp table zt3 (f3 int primary key); +insert into zt1 values(53); +insert into zt2 values(53); +-- +-- test for sane behavior with noncanonical merge clauses, per bug #4926 +-- +begin; +create temp table a (i integer); +create temp table b (x integer, y integer); +select * from a left join b on i = x and i = y and x = i; + i | x | y +---+---+--- +(0 rows) + +rollback; +-- +-- test handling of merge clauses using record_ops +-- +begin; +create temp table tidv (idv mycomptype); +create index on tidv (idv); +rollback; diff --git a/ydb/library/yql/tests/postgresql/cases/join.sql b/ydb/library/yql/tests/postgresql/cases/join.sql index e22646412a..b820eba54f 100644 --- a/ydb/library/yql/tests/postgresql/cases/join.sql +++ b/ydb/library/yql/tests/postgresql/cases/join.sql @@ -33,3 +33,122 @@ INSERT INTO J2_TBL VALUES (NULL, NULL); INSERT INTO J2_TBL VALUES (NULL, 0); -- useful in some tests below create temp table onerow(); +-- +-- More complicated constructs +-- +-- +-- Multiway full join +-- +CREATE TABLE t1 (name TEXT, n INTEGER); +CREATE TABLE t2 (name TEXT, n INTEGER); +CREATE TABLE t3 (name TEXT, n INTEGER); +INSERT INTO t1 VALUES ( 'bb', 11 ); +INSERT INTO t2 VALUES ( 'bb', 12 ); +INSERT INTO t2 VALUES ( 'cc', 22 ); +INSERT INTO t2 VALUES ( 'ee', 42 ); +INSERT INTO t3 VALUES ( 'bb', 13 ); +INSERT INTO t3 VALUES ( 'cc', 23 ); +INSERT INTO t3 VALUES ( 'dd', 33 ); +-- Test for propagation of nullability constraints into sub-joins +create temp table x (x1 int, x2 int); +insert into x values (1,11); +insert into x values (2,22); +insert into x values (3,null); +insert into x values (4,44); +insert into x values (5,null); +create temp table y (y1 int, y2 int); +insert into y values (1,111); +insert into y values (2,222); +insert into y values (3,333); +insert into y values (4,null); +-- try that with GEQO too +begin; +rollback; +-- +-- Clean up +-- +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE J1_TBL; +DROP TABLE J2_TBL; +-- Both DELETE and UPDATE allow the specification of additional tables +-- to "join" against to determine which rows should be modified. +CREATE TEMP TABLE t1 (a int, b int); +CREATE TEMP TABLE t2 (a int, b int); +CREATE TEMP TABLE t3 (x int, y int); +INSERT INTO t1 VALUES (5, 10); +INSERT INTO t1 VALUES (15, 20); +INSERT INTO t1 VALUES (100, 100); +INSERT INTO t1 VALUES (200, 1000); +INSERT INTO t2 VALUES (200, 2000); +INSERT INTO t3 VALUES (5, 20); +INSERT INTO t3 VALUES (6, 7); +INSERT INTO t3 VALUES (7, 8); +INSERT INTO t3 VALUES (500, 100); +-- +-- regression test for 8.1 merge right join bug +-- +CREATE TEMP TABLE tt1 ( tt1_id int4, joincol int4 ); +INSERT INTO tt1 VALUES (1, 11); +INSERT INTO tt1 VALUES (2, NULL); +CREATE TEMP TABLE tt2 ( tt2_id int4, joincol int4 ); +INSERT INTO tt2 VALUES (21, 11); +INSERT INTO tt2 VALUES (22, 11); +-- +-- regression test for 8.2 bug with improper re-ordering of left joins +-- +create temp table tt3(f1 int, f2 text); +insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x; +create index tt3i on tt3(f1); +create temp table tt4(f1 int); +insert into tt4 values (0),(1),(9999); +-- +-- regression test for proper handling of outer joins within antijoins +-- +create temp table tt4x(c1 int, c2 int, c3 int); +-- +-- regression test for problems of the sort depicted in bug #3494 +-- +create temp table tt5(f1 int, f2 int); +create temp table tt6(f1 int, f2 int); +insert into tt5 values(1, 10); +insert into tt5 values(1, 11); +insert into tt6 values(1, 9); +insert into tt6 values(1, 2); +insert into tt6 values(2, 9); +-- +-- regression test for problems of the sort depicted in bug #3588 +-- +create temp table xx (pkxx int); +create temp table yy (pkyy int, pkxx int); +insert into xx values (1); +insert into xx values (2); +insert into xx values (3); +insert into yy values (101, 1); +insert into yy values (201, 2); +insert into yy values (301, NULL); +-- +-- regression test for improper pushing of constants across outer-join clauses +-- (as seen in early 8.2.x releases) +-- +create temp table zt1 (f1 int primary key); +create temp table zt2 (f2 int primary key); +create temp table zt3 (f3 int primary key); +insert into zt1 values(53); +insert into zt2 values(53); +-- +-- test for sane behavior with noncanonical merge clauses, per bug #4926 +-- +begin; +create temp table a (i integer); +create temp table b (x integer, y integer); +select * from a left join b on i = x and i = y and x = i; +rollback; +-- +-- test handling of merge clauses using record_ops +-- +begin; +create temp table tidv (idv mycomptype); +create index on tidv (idv); +rollback; diff --git a/ydb/library/yql/tests/postgresql/cases/json.err b/ydb/library/yql/tests/postgresql/cases/json.err index f848ff03f3..cb47a7d115 100644 --- a/ydb/library/yql/tests/postgresql/cases/json.err +++ b/ydb/library/yql/tests/postgresql/cases/json.err @@ -1030,17 +1030,3274 @@ where json_type = 'array'; -- corner cases select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::text; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F33BF829D90) -__libc_start_main+128 (0x7F33BF829E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::int; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 1; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> -1; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 'z'; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> ''; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json -> 1; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json -> 3; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json -> 'z'; +</sql-statement> +<sql-statement> +select '{"a": "c", "b": null}'::json -> 'b'; +</sql-statement> +<sql-statement> +select '"foo"'::json -> 1; +</sql-statement> +<sql-statement> +select '"foo"'::json -> 'z'; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::text; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::int; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 1; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 'z'; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> ''; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 1; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 3; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 'z'; +</sql-statement> +<sql-statement> +select '{"a": "c", "b": null}'::json ->> 'b'; +</sql-statement> +<sql-statement> +select '"foo"'::json ->> 1; +</sql-statement> +<sql-statement> +select '"foo"'::json ->> 'z'; +</sql-statement> +<sql-statement> +-- array length +SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); +</sql-statement> +<sql-statement> +SELECT json_array_length('[]'); +</sql-statement> +<sql-statement> +SELECT json_array_length('{"f1":1,"f2":[5,6]}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT json_array_length('{"f1":1,"f2":[5,6]}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot get array length of a non-array + + SELECT json_array_length('{"f1":1,"f2":[5,6]}'); + ^ +<sql-statement> +SELECT json_array_length('4'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT json_array_length('4'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot get array length of a scalar + + SELECT json_array_length('4'); + ^ +<sql-statement> +-- each +select json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); + ^ +<sql-statement> +select * from json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +</sql-statement> +<sql-statement> +select json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); + ^ +<sql-statement> +select * from json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +</sql-statement> +<sql-statement> +-- extract_path, extract_path_as_text +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- extract_path, extract_path_as_text + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ + -stdin-:<main>:2:8: Error: No such proc: json_extract_path + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ +<sql-statement> +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ +<sql-statement> +select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path + select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ +<sql-statement> +select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path + select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ +<sql-statement> +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path_text + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ +<sql-statement> +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path_text + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ +<sql-statement> +select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path_text + select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ +<sql-statement> +select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path_text + select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ +<sql-statement> +-- extract_path nulls +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_false; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- extract_path nulls + ^ + -stdin-:<main>:2:87: Error: At function: ToPg, At function: Not, At function: Exists + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_false; + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_false; + ^ + -stdin-:<main>:2:8: Error: No such proc: json_extract_path + select json_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_false; + ^ +<sql-statement> +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; + ^ + -stdin-:<main>:1:92: Error: At function: ToPg, At function: Not, At function: Exists + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path_text + select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; + ^ +<sql-statement> +select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; + ^ + -stdin-:<main>:1:72: Error: At function: ToPg, At function: Not, At function: Exists + select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path + select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; + ^ +<sql-statement> +select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; + ^ + -stdin-:<main>:1:77: Error: At function: ToPg, At function: Not, At function: Exists + select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; + ^ + -stdin-:<main>:1:8: Error: No such proc: json_extract_path_text + select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; + ^ +<sql-statement> +-- extract_path operators +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f4','f6']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- extract_path operators + ^ + -stdin-:<main>:2:61: Error: At function: PgOp + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f4','f6']; + ^ + -stdin-:<main>:2:61: Error: No such operator: #> + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f4','f6']; + ^ +<sql-statement> +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #> + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2']; + ^ +<sql-statement> +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','0']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','0']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #> + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','0']; + ^ +<sql-statement> +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','1']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','1']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','1']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #> + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','1']; + ^ +<sql-statement> +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f4','f6']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f4','f6']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f4','f6']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #>> + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f4','f6']; + ^ +<sql-statement> +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #>> + select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2']; + ^ +<sql-statement> +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','0']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','0']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #>> + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','0']; + ^ +<sql-statement> +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','1']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','1']; + ^ + -stdin-:<main>:1:61: Error: At function: PgOp + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','1']; + ^ + -stdin-:<main>:1:61: Error: No such operator: #>> + select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','1']; + ^ +<sql-statement> +-- corner cases for same +select '{"a": {"b":{"c": "foo"}}}'::json #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- corner cases for same + ^ + -stdin-:<main>:2:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> '{}'; + ^ + -stdin-:<main>:2:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> '{}'; + ^ +<sql-statement> +select '[1,2,3]'::json #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[1,2,3]'::json #> '{}'; + ^ + -stdin-:<main>:1:24: Error: At function: PgOp + select '[1,2,3]'::json #> '{}'; + ^ + -stdin-:<main>:1:24: Error: No such operator: #> + select '[1,2,3]'::json #> '{}'; + ^ +<sql-statement> +select '"foo"'::json #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::json #> '{}'; + ^ + -stdin-:<main>:1:22: Error: At function: PgOp + select '"foo"'::json #> '{}'; + ^ + -stdin-:<main>:1:22: Error: No such operator: #> + select '"foo"'::json #> '{}'; + ^ +<sql-statement> +select '42'::json #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::json #> '{}'; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + select '42'::json #> '{}'; + ^ + -stdin-:<main>:1:19: Error: No such operator: #> + select '42'::json #> '{}'; + ^ +<sql-statement> +select 'null'::json #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select 'null'::json #> '{}'; + ^ + -stdin-:<main>:1:21: Error: At function: PgOp + select 'null'::json #> '{}'; + ^ + -stdin-:<main>:1:21: Error: No such operator: #> + select 'null'::json #> '{}'; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', null]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', null]; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', null]; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', null]; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', '']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', '']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', '']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', '']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c','d']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c','d']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c','d']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c','d']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','z','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','z','c']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','z','c']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','z','c']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','1','b']; + ^ + -stdin-:<main>:1:49: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','1','b']; + ^ + -stdin-:<main>:1:49: Error: No such operator: #> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','1','b']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','z','b']; + ^ + -stdin-:<main>:1:49: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','z','b']; + ^ + -stdin-:<main>:1:49: Error: No such operator: #> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json #> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::json #> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::json #> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '[{"b": "c"}, {"b": "cc"}]'::json #> array['1','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json #> array['z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::json #> array['z','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::json #> array['z','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '[{"b": "c"}, {"b": "cc"}]'::json #> array['z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": null}]'::json #> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": null}]'::json #> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '[{"b": "c"}, {"b": null}]'::json #> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #> + select '[{"b": "c"}, {"b": null}]'::json #> array['1','b']; + ^ +<sql-statement> +select '"foo"'::json #> array['z']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::json #> array['z']; + ^ + -stdin-:<main>:1:22: Error: At function: PgOp + select '"foo"'::json #> array['z']; + ^ + -stdin-:<main>:1:22: Error: No such operator: #> + select '"foo"'::json #> array['z']; + ^ +<sql-statement> +select '42'::json #> array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::json #> array['f2']; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + select '42'::json #> array['f2']; + ^ + -stdin-:<main>:1:19: Error: No such operator: #> + select '42'::json #> array['f2']; + ^ +<sql-statement> +select '42'::json #> array['0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::json #> array['0']; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + select '42'::json #> array['0']; + ^ + -stdin-:<main>:1:19: Error: No such operator: #> + select '42'::json #> array['0']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> '{}'; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> '{}'; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> '{}'; + ^ +<sql-statement> +select '[1,2,3]'::json #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[1,2,3]'::json #>> '{}'; + ^ + -stdin-:<main>:1:24: Error: At function: PgOp + select '[1,2,3]'::json #>> '{}'; + ^ + -stdin-:<main>:1:24: Error: No such operator: #>> + select '[1,2,3]'::json #>> '{}'; + ^ +<sql-statement> +select '"foo"'::json #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::json #>> '{}'; + ^ + -stdin-:<main>:1:22: Error: At function: PgOp + select '"foo"'::json #>> '{}'; + ^ + -stdin-:<main>:1:22: Error: No such operator: #>> + select '"foo"'::json #>> '{}'; + ^ +<sql-statement> +select '42'::json #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::json #>> '{}'; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + select '42'::json #>> '{}'; + ^ + -stdin-:<main>:1:19: Error: No such operator: #>> + select '42'::json #>> '{}'; + ^ +<sql-statement> +select 'null'::json #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select 'null'::json #>> '{}'; + ^ + -stdin-:<main>:1:21: Error: At function: PgOp + select 'null'::json #>> '{}'; + ^ + -stdin-:<main>:1:21: Error: No such operator: #>> + select 'null'::json #>> '{}'; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', null]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', null]; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', null]; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', null]; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', '']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', '']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', '']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', '']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c','d']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c','d']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c','d']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c','d']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','z','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','z','c']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','z','c']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','z','c']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','1','b']; + ^ + -stdin-:<main>:1:49: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','1','b']; + ^ + -stdin-:<main>:1:49: Error: No such operator: #>> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','1','b']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','z','b']; + ^ + -stdin-:<main>:1:49: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','z','b']; + ^ + -stdin-:<main>:1:49: Error: No such operator: #>> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['1','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['z','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['z','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": null}]'::json #>> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": null}]'::json #>> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: At function: PgOp + select '[{"b": "c"}, {"b": null}]'::json #>> array['1','b']; + ^ + -stdin-:<main>:1:42: Error: No such operator: #>> + select '[{"b": "c"}, {"b": null}]'::json #>> array['1','b']; + ^ +<sql-statement> +select '"foo"'::json #>> array['z']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::json #>> array['z']; + ^ + -stdin-:<main>:1:22: Error: At function: PgOp + select '"foo"'::json #>> array['z']; + ^ + -stdin-:<main>:1:22: Error: No such operator: #>> + select '"foo"'::json #>> array['z']; + ^ +<sql-statement> +select '42'::json #>> array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::json #>> array['f2']; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + select '42'::json #>> array['f2']; + ^ + -stdin-:<main>:1:19: Error: No such operator: #>> + select '42'::json #>> array['f2']; + ^ +<sql-statement> +select '42'::json #>> array['0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::json #>> array['0']; + ^ + -stdin-:<main>:1:19: Error: At function: PgOp + select '42'::json #>> array['0']; + ^ + -stdin-:<main>:1:19: Error: No such operator: #>> + select '42'::json #>> array['0']; + ^ +<sql-statement> +-- array_elements +select json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); + ^ +<sql-statement> +select * from json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +</sql-statement> +<sql-statement> +select json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); + ^ +<sql-statement> +select * from json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +</sql-statement> +<sql-statement> +-- populate_record +create type jpop as (a text, b int, c timestamp); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + -- populate_record + ^ +<sql-statement> +CREATE DOMAIN js_int_not_null AS int NOT NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN js_int_not_null AS int NOT NULL; + ^ +<sql-statement> +CREATE DOMAIN js_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN js_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); + ^ +<sql-statement> +CREATE DOMAIN js_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN js_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); + ^ +<sql-statement> +create type j_unordered_pair as (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + create type j_unordered_pair as (x int, y int); + ^ +<sql-statement> +create domain j_ordered_pair as j_unordered_pair check((value).x <= (value).y); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + create domain j_ordered_pair as j_unordered_pair check((value).x <= (value).y); + ^ +<sql-statement> +CREATE TYPE jsrec AS ( + i int, + ia _int4, + ia1 int[], + ia2 int[][], + ia3 int[][][], + ia1d js_int_array_1d, + ia2d js_int_array_2d, + t text, + ta text[], + c char(10), + ca char(10)[], + ts timestamp, + js json, + jsb jsonb, + jsa json[], + rec jpop, + reca jpop[] +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + CREATE TYPE jsrec AS ( + ^ +<sql-statement> +CREATE TYPE jsrec_i_not_null AS ( + i js_int_not_null +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + CREATE TYPE jsrec_i_not_null AS ( + ^ +<sql-statement> +select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jpop + select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:70: Error: alternative is not implemented yet : 138 + select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jpop + select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:70: Error: alternative is not implemented yet : 138 + select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(null::jpop,'{"a":[100,200,false],"x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jpop + select * from json_populate_record(null::jpop,'{"a":[100,200,false],"x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":[100,200,false],"x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:70: Error: alternative is not implemented yet : 138 + select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":[100,200,false],"x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"c":[100,200,false],"x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:70: Error: alternative is not implemented yet : 138 + select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"c":[100,200,false],"x":43.2}') q; + ^ +<sql-statement> +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:70: Error: alternative is not implemented yet : 138 + select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{}') q; + ^ +<sql-statement> +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"x": 43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec_i_not_null + SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"x": 43.2}') q; + ^ +<sql-statement> +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec_i_not_null + SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": null}') q; + ^ +<sql-statement> +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": 12345}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec_i_not_null + SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": 12345}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": null}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": 123}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1, 2], [3, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1, 2], [3, 4]]}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], 2]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], 2]}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], [2, 3]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], [2, 3]]}') q; + ^ +<sql-statement> +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": "{1,2,3}"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": "{1,2,3}"}') q; + ^ +<sql-statement> +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": null}') q; + ^ +<sql-statement> +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": 123}') q; + ^ +<sql-statement> +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [[1, 2, 3]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [[1, 2, 3]]}') q; + ^ +<sql-statement> +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": null}') q; + ^ +<sql-statement> +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": 123}') q; + ^ +<sql-statement> +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null]}') q; + ^ +<sql-statement> +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [null, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [null, 4]]}') q; + ^ +<sql-statement> +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[], []]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[], []]}') q; + ^ +<sql-statement> +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [3]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [3]]}') q; + ^ +<sql-statement> +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], 3, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], 3, 4]}') q; + ^ +<sql-statement> +SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; + ^ +<sql-statement> +SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; + ^ +<sql-statement> +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [[1, 2], [null, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [[1, 2], [null, 4]]}') q; + ^ +<sql-statement> +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; + ^ +<sql-statement> +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; + ^ +<sql-statement> +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; + ^ +<sql-statement> +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; + ^ +<sql-statement> +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": null}') q; + ^ +<sql-statement> +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": 123}') q; + ^ +<sql-statement> +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; + ^ +<sql-statement> +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec + SELECT c FROM json_populate_record(NULL::jsrec, '{"c": null}') q; + ^ +<sql-statement> +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaa"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec + SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaa"}') q; + ^ +<sql-statement> +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaa"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec + SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaa"}') q; + ^ +<sql-statement> +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaaaaa"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: Unknown type: jsrec + SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaaaaa"}') q; + ^ +<sql-statement> +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": null}') q; + ^ +<sql-statement> +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": 123}') q; + ^ +<sql-statement> +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; + ^ +<sql-statement> +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": null}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": true}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": true}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": 123.45}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": 123.45}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "123.45"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "123.45"}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "abc"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "abc"}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": [123, "123", null, {"key": "value"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": [123, "123", null, {"key": "value"}]}') q; + ^ +<sql-statement> +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsrec + SELECT js FROM json_populate_record(NULL::jsrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": null}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": true}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": true}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": 123.45}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": 123.45}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "123.45"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "123.45"}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "abc"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "abc"}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; + ^ +<sql-statement> +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; + ^ +<sql-statement> +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": null}') q; + ^ +<sql-statement> +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": 123}') q; + ^ +<sql-statement> +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; + ^ +<sql-statement> +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": 123}') q; + ^ +<sql-statement> +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": [1, 2]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": [1, 2]}') q; + ^ +<sql-statement> +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; + ^ +<sql-statement> +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": "(abc,42,01.02.2003)"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsrec + SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": "(abc,42,01.02.2003)"}') q; + ^ +<sql-statement> +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": 123}') q; + ^ +<sql-statement> +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [1, 2]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [1, 2]}') q; + ^ +<sql-statement> +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; + ^ +<sql-statement> +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; + ^ +<sql-statement> +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsrec + SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; + ^ +<sql-statement> +SELECT rec FROM json_populate_record( + row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + row('x',3,'2012-12-31 15:30:56')::jpop,NULL)::jsrec, + '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' +) q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:49: Error: alternative is not implemented yet : 138 + row('x',3,'2012-12-31 15:30:56')::jpop,NULL)::jsrec, + ^ +<sql-statement> +-- anonymous record type +SELECT json_populate_record(null::record, '{"x": 0, "y": 1}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- anonymous record type + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT json_populate_record(null::record, '{"x": 0, "y": 1}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc json_populate_record with given argument types: (record,unknown) + SELECT json_populate_record(null::record, '{"x": 0, "y": 1}'); + ^ +<sql-statement> +SELECT json_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 138 + SELECT json_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); + ^ +<sql-statement> +SELECT * FROM + json_populate_record(null::record, '{"x": 776}') AS (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + SELECT * FROM + ^ +<sql-statement> +-- composite domain +SELECT json_populate_record(null::j_ordered_pair, '{"x": 0, "y": 1}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:35: Error: Unknown type: j_ordered_pair + SELECT json_populate_record(null::j_ordered_pair, '{"x": 0, "y": 1}'); + ^ +<sql-statement> +SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 0}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:39: Error: alternative is not implemented yet : 138 + SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 0}'); + ^ +<sql-statement> +SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 1, "y": 0}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:39: Error: alternative is not implemented yet : 138 + SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 1, "y": 0}'); + ^ +<sql-statement> +-- populate_recordset +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:45: Error: Unknown type: jpop + select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 138 + select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jpop + select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 138 + select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 138 + select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 138 + select * from json_populate_recordset(row('def',99,null)::jpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +create type jpop2 as (a int, b json, c int, d int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + create type jpop2 as (a int, b json, c int, d int); + ^ +<sql-statement> +select * from json_populate_recordset(null::jpop2, '[{"a":2,"c":3,"b":{"z":4},"d":6}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jpop2 + select * from json_populate_recordset(null::jpop2, '[{"a":2,"c":3,"b":{"z":4},"d":6}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jpop + select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 138 + select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 138 + select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +-- anonymous record type +SELECT json_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); + ^ +<sql-statement> +SELECT json_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); + ^ +<sql-statement> +SELECT i, json_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') +FROM (VALUES (1),(2)) v(i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: Generator functions are not allowed in: SELECT + SELECT i, json_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') + ^ +<sql-statement> +SELECT * FROM + json_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + SELECT * FROM + ^ +<sql-statement> +-- empty array is a corner case +SELECT json_populate_recordset(null::record, '[]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(null::record, '[]'); + ^ +<sql-statement> +SELECT json_populate_recordset(row(1,2), '[]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(row(1,2), '[]'); + ^ +<sql-statement> +SELECT * FROM json_populate_recordset(NULL::jpop,'[]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jpop + SELECT * FROM json_populate_recordset(NULL::jpop,'[]') q; + ^ +<sql-statement> +SELECT * FROM + json_populate_recordset(null::record, '[]') AS (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + SELECT * FROM + ^ +<sql-statement> +-- composite domain +SELECT json_populate_recordset(null::j_ordered_pair, '[{"x": 0, "y": 1}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(null::j_ordered_pair, '[{"x": 0, "y": 1}]'); + ^ +<sql-statement> +SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 0}, {"y": 3}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 0}, {"y": 3}]'); + ^ +<sql-statement> +SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 1, "y": 0}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 1, "y": 0}]'); + ^ +<sql-statement> +-- negative cases where the wrong record type is supplied +select * from json_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + -- negative cases where the wrong record type is supplied + ^ +<sql-statement> +select * from json_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); + ^ +<sql-statement> +select * from json_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); + ^ +<sql-statement> +select * from json_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); + ^ +<sql-statement> +-- test type info caching in json_populate_record() +CREATE TEMP TABLE jspoptest (js json); +</sql-statement> +<sql-statement> +INSERT INTO jspoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::json +FROM generate_series(1, 3); +</sql-statement> +<sql-statement> +SELECT (json_populate_record(NULL::jsrec, js)).* FROM jspoptest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT (json_populate_record(NULL::jsrec, js)).* FROM jspoptest; + ^ +<sql-statement> +DROP TYPE jsrec; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP TYPE jsrec; + ^ +<sql-statement> +DROP TYPE jsrec_i_not_null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP TYPE jsrec_i_not_null; + ^ +<sql-statement> +DROP DOMAIN js_int_not_null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN js_int_not_null; + ^ +<sql-statement> +DROP DOMAIN js_int_array_1d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN js_int_array_1d; + ^ +<sql-statement> +DROP DOMAIN js_int_array_2d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN js_int_array_2d; + ^ +<sql-statement> +DROP DOMAIN j_ordered_pair; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN j_ordered_pair; + ^ +<sql-statement> +DROP TYPE j_unordered_pair; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP TYPE j_unordered_pair; + ^ +<sql-statement> +--json_typeof() function +select value, json_typeof(value) + from (values (json '123.4'), + (json '-1'), + (json '"foo"'), + (json 'true'), + (json 'false'), + (json 'null'), + (json '[1, 2, 3]'), + (json '[]'), + (json '{"x":"foo", "y":123}'), + (json '{}'), + (NULL::json)) + as data(value); +</sql-statement> +<sql-statement> +-- json_build_array, json_build_object, json_object_agg +SELECT json_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- json_build_array, json_build_object, json_object_agg + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT json_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc json_build_array with given argument types: (unknown,int4,unknown,numeric,unknown,bool,unknown,unknown,unknown,json) + SELECT json_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ +<sql-statement> +SELECT json_build_array('a', NULL); -- ok +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_array('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_array('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_array with given argument types: (unknown,unknown) + SELECT json_build_array('a', NULL); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC NULL::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC NULL::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC '{}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC '{}'::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC '{a,b,c}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC '{a,b,c}'::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok + ^ +<sql-statement> +SELECT json_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + ^ +<sql-statement> +SELECT json_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (unknown,int4,unknown,numeric,unknown,bool,unknown,unknown,unknown,json) + SELECT json_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ +<sql-statement> +SELECT json_build_object( + 'a', json_build_object('b',false,'c',99), + 'd', json_build_object('e',array[9,8,7]::int[], + 'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r))); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.pg_class + +<sql-statement> +SELECT json_build_object('{a,b,c}'::text[]); -- error +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('{a,b,c}'::text[]); -- error + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('{a,b,c}'::text[]); -- error + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (_text) + SELECT json_build_object('{a,b,c}'::text[]); -- error + ^ +<sql-statement> +SELECT json_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (_text,_text) + SELECT json_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array + ^ +<sql-statement> +SELECT json_build_object('a', 'b', 'c'); -- error +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('a', 'b', 'c'); -- error + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('a', 'b', 'c'); -- error + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (unknown,unknown,unknown) + SELECT json_build_object('a', 'b', 'c'); -- error + ^ +<sql-statement> +SELECT json_build_object(NULL, 'a'); -- error, key cannot be NULL +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object(NULL, 'a'); -- error, key cannot be NULL + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object(NULL, 'a'); -- error, key cannot be NULL + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (unknown,unknown) + SELECT json_build_object(NULL, 'a'); -- error, key cannot be NULL + ^ +<sql-statement> +SELECT json_build_object('a', NULL); -- ok +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (unknown,unknown) + SELECT json_build_object('a', NULL); -- ok + ^ +<sql-statement> +SELECT json_build_object(VARIADIC NULL::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC NULL::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_object(VARIADIC '{}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC '{}'::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_object(VARIADIC '{a,b,c}'::text[]); -- error +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC '{a,b,c}'::text[]); -- error + ^ +<sql-statement> +SELECT json_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL + ^ +<sql-statement> +SELECT json_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok + ^ +<sql-statement> +SELECT json_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok + ^ +<sql-statement> +SELECT json_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT json_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + ^ +<sql-statement> +-- empty objects/arrays +SELECT json_build_array(); +</sql-statement> +<sql-statement> +SELECT json_build_object(); +</sql-statement> +<sql-statement> +-- make sure keys are quoted +SELECT json_build_object(1,2); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- make sure keys are quoted + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT json_build_object(1,2); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc json_build_object with given argument types: (int4,int4) + SELECT json_build_object(1,2); + ^ +<sql-statement> +-- keys must be scalar and not null +SELECT json_build_object(null,2); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- keys must be scalar and not null + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT json_build_object(null,2); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc json_build_object with given argument types: (unknown,int4) + SELECT json_build_object(null,2); + ^ +<sql-statement> +SELECT json_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT json_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; + ^ + -stdin-:<main>:1:26: Error: No such column: r + SELECT json_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; + ^ +<sql-statement> +SELECT json_build_object(json '{"a":1,"b":2}', 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object(json '{"a":1,"b":2}', 3); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object(json '{"a":1,"b":2}', 3); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (json,int4) + SELECT json_build_object(json '{"a":1,"b":2}', 3); + ^ +<sql-statement> +SELECT json_build_object('{1,2,3}'::int[], 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('{1,2,3}'::int[], 3); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('{1,2,3}'::int[], 3); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc json_build_object with given argument types: (_int4,int4) + SELECT json_build_object('{1,2,3}'::int[], 3); + ^ +<sql-statement> +CREATE TEMP TABLE foo (serial_num int, name text, type text); +</sql-statement> +<sql-statement> +INSERT INTO foo VALUES (847001,'t15','GE1043'); +</sql-statement> +<sql-statement> +INSERT INTO foo VALUES (847002,'t16','GE1043'); +</sql-statement> +<sql-statement> +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +</sql-statement> +<sql-statement> +SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) +FROM foo; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:37: Error: At function: PgAgg + SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:64: Error: At function: PgCall + SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:64: Error: Unable to find an overload for proc json_build_object with given argument types: (unknown,text,unknown,text) + SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) + ^ +<sql-statement> +SELECT json_object_agg(name, type) FROM foo; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtMapReduce! + SELECT json_object_agg(name, type) FROM foo; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: field name must not be null + + SELECT json_object_agg(name, type) FROM foo; + ^ +<sql-statement> +INSERT INTO foo VALUES (999999, NULL, 'bar'); +</sql-statement> +<sql-statement> +SELECT json_object_agg(name, type) FROM foo; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtMapReduce! + SELECT json_object_agg(name, type) FROM foo; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: field name must not be null + + SELECT json_object_agg(name, type) FROM foo; + ^ +<sql-statement> +-- json_object +-- empty object, one dimension +SELECT json_object('{}'); +</sql-statement> +<sql-statement> +-- empty object, two dimensions +SELECT json_object('{}', '{}'); +</sql-statement> +<sql-statement> +-- one dimension +SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); +</sql-statement> +<sql-statement> +-- same but with two dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +</sql-statement> +<sql-statement> +-- odd number error +SELECT json_object('{a,b,c}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- odd number error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: array must have even number of elements + + -- odd number error + ^ +<sql-statement> +-- one column error +SELECT json_object('{{a},{b}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- one column error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: array must have two columns + + -- one column error + ^ +<sql-statement> +-- too many columns error +SELECT json_object('{{a,b,c},{b,c,d}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- too many columns error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: array must have two columns + + -- too many columns error + ^ +<sql-statement> +-- too many dimensions error +SELECT json_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- too many dimensions error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: wrong number of array subscripts + + -- too many dimensions error + ^ +<sql-statement> +--two argument form of json_object +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); +</sql-statement> +<sql-statement> +-- too many dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- too many dimensions + ^ + -stdin-:<main>:1:1: Fatal: ERROR: wrong number of array subscripts + + -- too many dimensions + ^ +<sql-statement> +-- mismatched dimensions +select json_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- mismatched dimensions + ^ + -stdin-:<main>:1:1: Fatal: ERROR: mismatched array dimensions + + -- mismatched dimensions + ^ +<sql-statement> +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: mismatched array dimensions + + select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); + ^ +<sql-statement> +-- null key error +select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- null key error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: null value not allowed for object key + + -- null key error + ^ +<sql-statement> +-- empty key is allowed +select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); +</sql-statement> +<sql-statement> +-- json_to_record and json_to_recordset +select * from json_to_record('{"a":1,"b":"foo","c":"bar"}') + as x(a int, b text, d text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + -- json_to_record and json_to_recordset + ^ +<sql-statement> +select * from json_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + as x(a int, b text, c boolean); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + ^ +<sql-statement> +select * from json_to_recordset('[{"a":1,"b":{"d":"foo"},"c":true},{"a":2,"c":false,"b":{"d":"bar"}}]') + as x(a int, b json, c boolean); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_recordset('[{"a":1,"b":{"d":"foo"},"c":true},{"a":2,"c":false,"b":{"d":"bar"}}]') + ^ +<sql-statement> +select *, c is null as c_is_null +from json_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::json) + as t(a int, b json, c text, x int, ca char(5)[], ia int[][], r jpop); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select *, c is null as c_is_null + ^ +<sql-statement> +select *, c is null as c_is_null +from json_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::json) + as t(a int, b json, c text, x int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select *, c is null as c_is_null + ^ +<sql-statement> +select * from json_to_record('{"ia": null}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia": null}') as x(ia _int4); + ^ +<sql-statement> +select * from json_to_record('{"ia": 123}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia": 123}') as x(ia _int4); + ^ +<sql-statement> +select * from json_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); + ^ +<sql-statement> +select * from json_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); + ^ +<sql-statement> +select * from json_to_record('{"ia": [[1], 2]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia": [[1], 2]}') as x(ia _int4); + ^ +<sql-statement> +select * from json_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); + ^ +<sql-statement> +select * from json_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); + ^ +<sql-statement> +select * from json_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); + ^ +<sql-statement> +select * from json_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); + ^ +<sql-statement> +select * from json_to_record('{"out": {"key": 1}}') as x(out json); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"out": {"key": 1}}') as x(out json); + ^ +<sql-statement> +select * from json_to_record('{"out": [{"key": 1}]}') as x(out json); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"out": [{"key": 1}]}') as x(out json); + ^ +<sql-statement> +select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out json); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out json); + ^ +<sql-statement> +select * from json_to_record('{"out": {"key": 1}}') as x(out jsonb); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"out": {"key": 1}}') as x(out jsonb); + ^ +<sql-statement> +select * from json_to_record('{"out": [{"key": 1}]}') as x(out jsonb); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"out": [{"key": 1}]}') as x(out jsonb); + ^ +<sql-statement> +select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); + ^ +<sql-statement> +-- json_strip_nulls +select json_strip_nulls(null); +</sql-statement> +<sql-statement> +select json_strip_nulls('1'); +</sql-statement> +<sql-statement> +select json_strip_nulls('"a string"'); +</sql-statement> +<sql-statement> +select json_strip_nulls('null'); +</sql-statement> +<sql-statement> +select json_strip_nulls('[1,2,null,3,4]'); +</sql-statement> +<sql-statement> +select json_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); +</sql-statement> +<sql-statement> +select json_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); +</sql-statement> +<sql-statement> +-- an empty object is not null and should not be stripped +select json_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); +</sql-statement> +<sql-statement> +-- json to tsvector +select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- json to tsvector + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + -- json to tsvector + ^ +<sql-statement> +-- json to tsvector with config +select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- json to tsvector with config + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "simple" does not exist + + -- json to tsvector with config + ^ +<sql-statement> +-- json to tsvector with stop words +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- json to tsvector with stop words + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + -- json to tsvector with stop words + ^ +<sql-statement> +-- json to tsvector with numeric values +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- json to tsvector with numeric values + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + -- json to tsvector with numeric values + ^ +<sql-statement> +-- json_to_tsvector +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- json_to_tsvector + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + -- json_to_tsvector + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + ^ +<sql-statement> +-- to_tsvector corner cases +select to_tsvector('""'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- to_tsvector corner cases + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + -- to_tsvector corner cases + ^ +<sql-statement> +select to_tsvector('{}'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select to_tsvector('{}'::json); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select to_tsvector('{}'::json); + ^ +<sql-statement> +select to_tsvector('[]'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select to_tsvector('[]'::json); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select to_tsvector('[]'::json); + ^ +<sql-statement> +select to_tsvector('null'::json); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select to_tsvector('null'::json); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select to_tsvector('null'::json); + ^ +<sql-statement> +-- json_to_tsvector corner cases +select json_to_tsvector('""'::json, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- json_to_tsvector corner cases + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + -- json_to_tsvector corner cases + ^ +<sql-statement> +select json_to_tsvector('{}'::json, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('{}'::json, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select json_to_tsvector('{}'::json, '"all"'); + ^ +<sql-statement> +select json_to_tsvector('[]'::json, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('[]'::json, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select json_to_tsvector('[]'::json, '"all"'); + ^ +<sql-statement> +select json_to_tsvector('null'::json, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('null'::json, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select json_to_tsvector('null'::json, '"all"'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '""'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '""'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '""'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '{}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '{}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '{}'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '[]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '[]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '[]'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, 'null'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, 'null'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, 'null'); + ^ +<sql-statement> +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["all", null]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["all", null]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["all", null]'); + ^ +<sql-statement> +-- ts_headline for json +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- ts_headline for json + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:2:121: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:2:121: Error: No such proc: tsquery + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ +<sql-statement> +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:1:113: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:1:113: Error: No such proc: tsquery + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ^ +<sql-statement> +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:121: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:121: Error: No such proc: tsquery + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ +<sql-statement> +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:132: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:132: Error: No such proc: tsquery + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ +<sql-statement> +-- corner cases for ts_headline with json +select ts_headline('null'::json, tsquery('aaa & bbb')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- corner cases for ts_headline with json + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select ts_headline('null'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:2:34: Error: At function: PgCall + select ts_headline('null'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:2:34: Error: No such proc: tsquery + select ts_headline('null'::json, tsquery('aaa & bbb')); + ^ +<sql-statement> +select ts_headline('{}'::json, tsquery('aaa & bbb')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('{}'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('{}'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:32: Error: At function: PgCall + select ts_headline('{}'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:32: Error: No such proc: tsquery + select ts_headline('{}'::json, tsquery('aaa & bbb')); + ^ +<sql-statement> +select ts_headline('[]'::json, tsquery('aaa & bbb')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('[]'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('[]'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:32: Error: At function: PgCall + select ts_headline('[]'::json, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:32: Error: No such proc: tsquery + select ts_headline('[]'::json, tsquery('aaa & bbb')); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/json.out b/ydb/library/yql/tests/postgresql/cases/json.out index dad4159c41..aecd7a8f8c 100644 --- a/ydb/library/yql/tests/postgresql/cases/json.out +++ b/ydb/library/yql/tests/postgresql/cases/json.out @@ -293,3 +293,377 @@ INSERT INTO test_json VALUES ('scalar','"a scalar"'), ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> -1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json -> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json -> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::json -> 'b'; + ?column? +---------- + null +(1 row) + +select '"foo"'::json -> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::json -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::json ->> 'b'; + ?column? +---------- + +(1 row) + +select '"foo"'::json ->> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::json ->> 'z'; + ?column? +---------- + +(1 row) + +-- array length +SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); + json_array_length +------------------- + 5 +(1 row) + +SELECT json_array_length('[]'); + json_array_length +------------------- + 0 +(1 row) + +SELECT json_array_length('{"f1":1,"f2":[5,6]}'); +ERROR: cannot get array length of a non-array +SELECT json_array_length('4'); +ERROR: cannot get array length of a scalar +select * from json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+----------- + f1 | [1,2,3] + f2 | {"f3":1} + f4 | null + f5 | 99 + f6 | "stringy" +(5 rows) + +select * from json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+---------- + f1 | [1,2,3] + f2 | {"f3":1} + f4 | + f5 | 99 + f6 | stringy +(5 rows) + +select * from json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + value +----------------------- + 1 + true + [1,[2,3]] + null + {"f1":1,"f2":[7,8,9]} + false + "stringy" +(7 rows) + +select * from json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + value +----------------------- + 1 + true + [1,[2,3]] + + {"f1":1,"f2":[7,8,9]} + false + stringy +(7 rows) + +-- test type info caching in json_populate_record() +CREATE TEMP TABLE jspoptest (js json); +INSERT INTO jspoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::json +FROM generate_series(1, 3); +--json_typeof() function +select value, json_typeof(value) + from (values (json '123.4'), + (json '-1'), + (json '"foo"'), + (json 'true'), + (json 'false'), + (json 'null'), + (json '[1, 2, 3]'), + (json '[]'), + (json '{"x":"foo", "y":123}'), + (json '{}'), + (NULL::json)) + as data(value); + value | json_typeof +----------------------+------------- + 123.4 | number + -1 | number + "foo" | string + true | boolean + false | boolean + null | null + [1, 2, 3] | array + [] | array + {"x":"foo", "y":123} | object + {} | object + | +(11 rows) + +-- empty objects/arrays +SELECT json_build_array(); + json_build_array +------------------ + [] +(1 row) + +SELECT json_build_object(); + json_build_object +------------------- + {} +(1 row) + +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT json_object_agg(name, type) FROM foo; +ERROR: field name must not be null +-- json_object +-- empty object, one dimension +SELECT json_object('{}'); + json_object +------------- + {} +(1 row) + +-- empty object, two dimensions +SELECT json_object('{}', '{}'); + json_object +------------- + {} +(1 row) + +-- one dimension +SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); + json_object +------------------------------------------------------- + {"a" : "1", "b" : "2", "3" : null, "d e f" : "a b c"} +(1 row) + +-- same but with two dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + json_object +------------------------------------------------------- + {"a" : "1", "b" : "2", "3" : null, "d e f" : "a b c"} +(1 row) + +-- odd number error +SELECT json_object('{a,b,c}'); +ERROR: array must have even number of elements +-- one column error +SELECT json_object('{{a},{b}}'); +ERROR: array must have two columns +-- too many columns error +SELECT json_object('{{a,b,c},{b,c,d}}'); +ERROR: array must have two columns +-- too many dimensions error +SELECT json_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +ERROR: wrong number of array subscripts +--two argument form of json_object +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); + json_object +------------------------------------------------------ + {"a" : "1", "b" : "2", "c" : "3", "d e f" : "a b c"} +(1 row) + +-- too many dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +ERROR: wrong number of array subscripts +-- mismatched dimensions +select json_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +ERROR: mismatched array dimensions +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +ERROR: mismatched array dimensions +-- null key error +select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +ERROR: null value not allowed for object key +-- empty key is allowed +select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); + json_object +----------------------------------------------------- + {"a" : "1", "b" : "2", "" : "3", "d e f" : "a b c"} +(1 row) + +-- json_strip_nulls +select json_strip_nulls(null); + json_strip_nulls +------------------ + +(1 row) + +select json_strip_nulls('1'); + json_strip_nulls +------------------ + 1 +(1 row) + +select json_strip_nulls('"a string"'); + json_strip_nulls +------------------ + "a string" +(1 row) + +select json_strip_nulls('null'); + json_strip_nulls +------------------ + null +(1 row) + +select json_strip_nulls('[1,2,null,3,4]'); + json_strip_nulls +------------------ + [1,2,null,3,4] +(1 row) + +select json_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); + json_strip_nulls +------------------------------------ + {"a":1,"c":[2,null,3],"d":{"e":4}} +(1 row) + +select json_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); + json_strip_nulls +--------------------- + [1,{"a":1,"c":2},3] +(1 row) + +-- an empty object is not null and should not be stripped +select json_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); + json_strip_nulls +------------------ + {"a":{},"d":{}} +(1 row) + diff --git a/ydb/library/yql/tests/postgresql/cases/json.sql b/ydb/library/yql/tests/postgresql/cases/json.sql index 4f22975a19..4ffff12e0d 100644 --- a/ydb/library/yql/tests/postgresql/cases/json.sql +++ b/ydb/library/yql/tests/postgresql/cases/json.sql @@ -68,3 +68,106 @@ INSERT INTO test_json VALUES ('scalar','"a scalar"'), ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> -1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> ''; +select '[{"b": "c"}, {"b": "cc"}]'::json -> 1; +select '[{"b": "c"}, {"b": "cc"}]'::json -> 3; +select '[{"b": "c"}, {"b": "cc"}]'::json -> 'z'; +select '{"a": "c", "b": null}'::json -> 'b'; +select '"foo"'::json -> 1; +select '"foo"'::json -> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> ''; +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 1; +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 3; +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 'z'; +select '{"a": "c", "b": null}'::json ->> 'b'; +select '"foo"'::json ->> 1; +select '"foo"'::json ->> 'z'; +-- array length +SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); +SELECT json_array_length('[]'); +SELECT json_array_length('{"f1":1,"f2":[5,6]}'); +SELECT json_array_length('4'); +select * from json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +select * from json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +select * from json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +select * from json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +-- test type info caching in json_populate_record() +CREATE TEMP TABLE jspoptest (js json); +INSERT INTO jspoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::json +FROM generate_series(1, 3); +--json_typeof() function +select value, json_typeof(value) + from (values (json '123.4'), + (json '-1'), + (json '"foo"'), + (json 'true'), + (json 'false'), + (json 'null'), + (json '[1, 2, 3]'), + (json '[]'), + (json '{"x":"foo", "y":123}'), + (json '{}'), + (NULL::json)) + as data(value); +-- empty objects/arrays +SELECT json_build_array(); +SELECT json_build_object(); +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT json_object_agg(name, type) FROM foo; +-- json_object +-- empty object, one dimension +SELECT json_object('{}'); +-- empty object, two dimensions +SELECT json_object('{}', '{}'); +-- one dimension +SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); +-- same but with two dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +-- odd number error +SELECT json_object('{a,b,c}'); +-- one column error +SELECT json_object('{{a},{b}}'); +-- too many columns error +SELECT json_object('{{a,b,c},{b,c,d}}'); +-- too many dimensions error +SELECT json_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +--two argument form of json_object +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); +-- too many dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +-- mismatched dimensions +select json_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +-- null key error +select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +-- empty key is allowed +select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); +-- json_strip_nulls +select json_strip_nulls(null); +select json_strip_nulls('1'); +select json_strip_nulls('"a string"'); +select json_strip_nulls('null'); +select json_strip_nulls('[1,2,null,3,4]'); +select json_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); +select json_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); +-- an empty object is not null and should not be stripped +select json_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); diff --git a/ydb/library/yql/tests/postgresql/cases/jsonb.err b/ydb/library/yql/tests/postgresql/cases/jsonb.err index e786ce2ce2..d2cbf6610b 100644 --- a/ydb/library/yql/tests/postgresql/cases/jsonb.err +++ b/ydb/library/yql/tests/postgresql/cases/jsonb.err @@ -832,17 +832,6779 @@ SELECT (test_json->>3) IS NULL AS expect_true FROM test_jsonb WHERE json_type = -- corner cases select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F5FC2629D90) -__libc_start_main+128 (0x7F5FC2629E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z'; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> ''; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z'; +</sql-statement> +<sql-statement> +select '{"a": "c", "b": null}'::jsonb -> 'b'; +</sql-statement> +<sql-statement> +select '"foo"'::jsonb -> 1; +</sql-statement> +<sql-statement> +select '"foo"'::jsonb -> 'z'; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z'; +</sql-statement> +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> ''; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3; +</sql-statement> +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z'; +</sql-statement> +<sql-statement> +select '{"a": "c", "b": null}'::jsonb ->> 'b'; +</sql-statement> +<sql-statement> +select '"foo"'::jsonb ->> 1; +</sql-statement> +<sql-statement> +select '"foo"'::jsonb ->> 'z'; +</sql-statement> +<sql-statement> +-- equality and inequality +SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb; +</sql-statement> +<sql-statement> +-- containment +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "g":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"g":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"c"}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":"q"}'); +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "g":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"g":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"c"}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":"q"}'; +</sql-statement> +<sql-statement> +SELECT '[1,2]'::jsonb @> '[1,2,2]'::jsonb; +</sql-statement> +<sql-statement> +SELECT '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb; +</sql-statement> +<sql-statement> +SELECT '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb; +</sql-statement> +<sql-statement> +SELECT '[1,2,2]'::jsonb <@ '[1,2]'::jsonb; +</sql-statement> +<sql-statement> +SELECT '[1,2,2]'::jsonb <@ '[1,1,2]'::jsonb; +</sql-statement> +<sql-statement> +SELECT '[[1,2,2]]'::jsonb <@ '[[1,2]]'::jsonb; +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"a":"b", "c":null}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"a":"b", "g":null}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"g":null}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"a":"c"}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT jsonb_contained('{"a":"b", "c":"q"}', '{"a":"b", "b":1, "c":null}'); +</sql-statement> +<sql-statement> +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "c":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"c"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +SELECT '{"a":"b", "c":"q"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +</sql-statement> +<sql-statement> +-- Raw scalar may contain another raw scalar, array may contain a raw scalar +SELECT '[5]'::jsonb @> '[5]'; +</sql-statement> +<sql-statement> +SELECT '5'::jsonb @> '5'; +</sql-statement> +<sql-statement> +SELECT '[5]'::jsonb @> '5'; +</sql-statement> +<sql-statement> +-- But a raw scalar cannot contain an array +SELECT '5'::jsonb @> '[5]'; +</sql-statement> +<sql-statement> +-- In general, one thing should always contain itself. Test array containment: +SELECT '["9", ["7", "3"], 1]'::jsonb @> '["9", ["7", "3"], 1]'::jsonb; +</sql-statement> +<sql-statement> +SELECT '["9", ["7", "3"], ["1"]]'::jsonb @> '["9", ["7", "3"], ["1"]]'::jsonb; +</sql-statement> +<sql-statement> +-- array containment string matching confusion bug +SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::jsonb @> '{"tags":["qu"]}'; +</sql-statement> +<sql-statement> +-- array length +SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); +</sql-statement> +<sql-statement> +SELECT jsonb_array_length('[]'); +</sql-statement> +<sql-statement> +SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot get array length of a non-array + + SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); + ^ +<sql-statement> +SELECT jsonb_array_length('4'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT jsonb_array_length('4'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot get array length of a scalar + + SELECT jsonb_array_length('4'); + ^ +<sql-statement> +-- each +SELECT jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); + ^ +<sql-statement> +SELECT jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + ^ +<sql-statement> +SELECT * FROM jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +</sql-statement> +<sql-statement> +SELECT * FROM jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +</sql-statement> +<sql-statement> +SELECT jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); + ^ +<sql-statement> +SELECT jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + ^ +<sql-statement> +SELECT * FROM jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +</sql-statement> +<sql-statement> +SELECT * FROM jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +</sql-statement> +<sql-statement> +-- exists +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'a'); +</sql-statement> +<sql-statement> +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'b'); +</sql-statement> +<sql-statement> +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'c'); +</sql-statement> +<sql-statement> +SELECT jsonb_exists('{"a":"null", "b":"qq"}', 'a'); +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ? 'a'; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ? 'b'; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ? 'c'; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":"null", "b":"qq"}' ? 'a'; +</sql-statement> +<sql-statement> +-- array exists - array elements should behave as keys +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- However, a raw scalar is *contained* within the array +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['b','a']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','a']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','d']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', '{}'::text[]); +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['a','b']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['b','a']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','a']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','d']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?| '{}'::text[]; +</sql-statement> +<sql-statement> +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['a','b']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['b','a']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','a']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','d']); +</sql-statement> +<sql-statement> +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', '{}'::text[]); +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','b']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['b','a']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','a']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','d']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','a', 'b', 'b', 'b']; +</sql-statement> +<sql-statement> +SELECT jsonb '{"a":null, "b":"qq"}' ?& '{}'::text[]; +</sql-statement> +<sql-statement> +-- typeof +SELECT jsonb_typeof('{}') AS object; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('{"c":3,"p":"o"}') AS object; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('[]') AS array; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('["a", 1]') AS array; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('null') AS "null"; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('1') AS number; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('-1') AS number; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('1.0') AS number; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('1e2') AS number; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('-1.0') AS number; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('true') AS boolean; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('false') AS boolean; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('"hello"') AS string; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('"true"') AS string; +</sql-statement> +<sql-statement> +SELECT jsonb_typeof('"1.0"') AS string; +</sql-statement> +<sql-statement> +-- jsonb_build_array, jsonb_build_object, jsonb_object_agg +SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- jsonb_build_array, jsonb_build_object, jsonb_object_agg + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_build_array with given argument types: (unknown,int4,unknown,numeric,unknown,bool,unknown,unknown,unknown,json) + SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ +<sql-statement> +SELECT jsonb_build_array('a', NULL); -- ok +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_array('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_array('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_array with given argument types: (unknown,unknown) + SELECT jsonb_build_array('a', NULL); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC NULL::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC NULL::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC '{}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC '{}'::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC '{a,b,c}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC '{a,b,c}'::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (unknown,int4,unknown,numeric,unknown,bool,unknown,unknown,unknown,json) + SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + ^ +<sql-statement> +SELECT jsonb_build_object( + 'a', jsonb_build_object('b',false,'c',99), + 'd', jsonb_build_object('e',array[9,8,7]::int[], + 'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r))); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.pg_class + +<sql-statement> +SELECT jsonb_build_object('{a,b,c}'::text[]); -- error +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('{a,b,c}'::text[]); -- error + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('{a,b,c}'::text[]); -- error + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (_text) + SELECT jsonb_build_object('{a,b,c}'::text[]); -- error + ^ +<sql-statement> +SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (_text,_text) + SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array + ^ +<sql-statement> +SELECT jsonb_build_object('a', 'b', 'c'); -- error +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('a', 'b', 'c'); -- error + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('a', 'b', 'c'); -- error + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (unknown,unknown,unknown) + SELECT jsonb_build_object('a', 'b', 'c'); -- error + ^ +<sql-statement> +SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (unknown,unknown) + SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL + ^ +<sql-statement> +SELECT jsonb_build_object('a', NULL); -- ok +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('a', NULL); -- ok + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (unknown,unknown) + SELECT jsonb_build_object('a', NULL); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC NULL::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC NULL::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC '{}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC '{}'::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC '{a,b,c}'::text[]); -- error +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC '{a,b,c}'::text[]); -- error + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok + ^ +<sql-statement> +SELECT jsonb_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + SELECT jsonb_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + ^ +<sql-statement> +-- empty objects/arrays +SELECT jsonb_build_array(); +</sql-statement> +<sql-statement> +SELECT jsonb_build_object(); +</sql-statement> +<sql-statement> +-- make sure keys are quoted +SELECT jsonb_build_object(1,2); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- make sure keys are quoted + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT jsonb_build_object(1,2); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (int4,int4) + SELECT jsonb_build_object(1,2); + ^ +<sql-statement> +-- keys must be scalar and not null +SELECT jsonb_build_object(null,2); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- keys must be scalar and not null + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT jsonb_build_object(null,2); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (unknown,int4) + SELECT jsonb_build_object(null,2); + ^ +<sql-statement> +SELECT jsonb_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + SELECT jsonb_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; + ^ + -stdin-:<main>:1:27: Error: No such column: r + SELECT jsonb_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; + ^ +<sql-statement> +SELECT jsonb_build_object(json '{"a":1,"b":2}', 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object(json '{"a":1,"b":2}', 3); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object(json '{"a":1,"b":2}', 3); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (json,int4) + SELECT jsonb_build_object(json '{"a":1,"b":2}', 3); + ^ +<sql-statement> +SELECT jsonb_build_object('{1,2,3}'::int[], 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('{1,2,3}'::int[], 3); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('{1,2,3}'::int[], 3); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (_int4,int4) + SELECT jsonb_build_object('{1,2,3}'::int[], 3); + ^ +<sql-statement> +-- handling of NULL values +SELECT jsonb_object_agg(1, NULL::jsonb); +</sql-statement> +<sql-statement> +SELECT jsonb_object_agg(NULL, '{"a":1}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT jsonb_object_agg(NULL, '{"a":1}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: field name must not be null + + SELECT jsonb_object_agg(NULL, '{"a":1}'); + ^ +<sql-statement> +CREATE TEMP TABLE foo (serial_num int, name text, type text); +</sql-statement> +<sql-statement> +INSERT INTO foo VALUES (847001,'t15','GE1043'); +</sql-statement> +<sql-statement> +INSERT INTO foo VALUES (847002,'t16','GE1043'); +</sql-statement> +<sql-statement> +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +</sql-statement> +<sql-statement> +SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) +FROM foo; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:38: Error: At function: PgAgg + SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:66: Error: At function: PgCall + SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) + ^ + -stdin-:<main>:1:66: Error: Unable to find an overload for proc jsonb_build_object with given argument types: (unknown,text,unknown,text) + SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) + ^ +<sql-statement> +SELECT jsonb_object_agg(name, type) FROM foo; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtMapReduce! + SELECT jsonb_object_agg(name, type) FROM foo; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: field name must not be null + + SELECT jsonb_object_agg(name, type) FROM foo; + ^ +<sql-statement> +INSERT INTO foo VALUES (999999, NULL, 'bar'); +</sql-statement> +<sql-statement> +SELECT jsonb_object_agg(name, type) FROM foo; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtMapReduce! + SELECT jsonb_object_agg(name, type) FROM foo; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: field name must not be null + + SELECT jsonb_object_agg(name, type) FROM foo; + ^ +<sql-statement> +-- jsonb_object +-- empty object, one dimension +SELECT jsonb_object('{}'); +</sql-statement> +<sql-statement> +-- empty object, two dimensions +SELECT jsonb_object('{}', '{}'); +</sql-statement> +<sql-statement> +-- one dimension +SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); +</sql-statement> +<sql-statement> +-- same but with two dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +</sql-statement> +<sql-statement> +-- odd number error +SELECT jsonb_object('{a,b,c}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- odd number error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: array must have even number of elements + + -- odd number error + ^ +<sql-statement> +-- one column error +SELECT jsonb_object('{{a},{b}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- one column error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: array must have two columns + + -- one column error + ^ +<sql-statement> +-- too many columns error +SELECT jsonb_object('{{a,b,c},{b,c,d}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- too many columns error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: array must have two columns + + -- too many columns error + ^ +<sql-statement> +-- too many dimensions error +SELECT jsonb_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- too many dimensions error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: wrong number of array subscripts + + -- too many dimensions error + ^ +<sql-statement> +--two argument form of jsonb_object +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); +</sql-statement> +<sql-statement> +-- too many dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- too many dimensions + ^ + -stdin-:<main>:1:1: Fatal: ERROR: wrong number of array subscripts + + -- too many dimensions + ^ +<sql-statement> +-- mismatched dimensions +select jsonb_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- mismatched dimensions + ^ + -stdin-:<main>:1:1: Fatal: ERROR: mismatched array dimensions + + -- mismatched dimensions + ^ +<sql-statement> +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: mismatched array dimensions + + select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); + ^ +<sql-statement> +-- null key error +select jsonb_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- null key error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: null value not allowed for object key + + -- null key error + ^ +<sql-statement> +-- empty key is allowed +select jsonb_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); +</sql-statement> +<sql-statement> +-- extract_path, extract_path_as_text +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- extract_path, extract_path_as_text + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ + -stdin-:<main>:2:8: Error: No such proc: jsonb_extract_path + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ +<sql-statement> +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ +<sql-statement> +SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path + SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ +<sql-statement> +SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path + SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ +<sql-statement> +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path_text + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + ^ +<sql-statement> +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path_text + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + ^ +<sql-statement> +SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path_text + SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + ^ +<sql-statement> +SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path_text + SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + ^ +<sql-statement> +-- extract_path nulls +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- extract_path nulls + ^ + -stdin-:<main>:2:88: Error: At function: ToPg, At function: Not, At function: Exists + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false; + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false; + ^ + -stdin-:<main>:2:8: Error: No such proc: jsonb_extract_path + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false; + ^ +<sql-statement> +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; + ^ + -stdin-:<main>:1:93: Error: At function: ToPg, At function: Not, At function: Exists + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path_text + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; + ^ +<sql-statement> +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; + ^ + -stdin-:<main>:1:73: Error: At function: ToPg, At function: Not, At function: Exists + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path + SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; + ^ +<sql-statement> +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; + ^ + -stdin-:<main>:1:78: Error: At function: ToPg, At function: Not, At function: Exists + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; + ^ + -stdin-:<main>:1:8: Error: No such proc: jsonb_extract_path_text + SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; + ^ +<sql-statement> +-- extract_path operators +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f4','f6']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- extract_path operators + ^ + -stdin-:<main>:2:62: Error: At function: PgOp + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f4','f6']; + ^ + -stdin-:<main>:2:62: Error: No such operator: #> + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f4','f6']; + ^ +<sql-statement> +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #> + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2']; + ^ +<sql-statement> +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #> + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0']; + ^ +<sql-statement> +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #> + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1']; + ^ +<sql-statement> +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #>> + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6']; + ^ +<sql-statement> +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #>> + SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2']; + ^ +<sql-statement> +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #>> + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0']; + ^ +<sql-statement> +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1']; + ^ + -stdin-:<main>:1:62: Error: At function: PgOp + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1']; + ^ + -stdin-:<main>:1:62: Error: No such operator: #>> + SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1']; + ^ +<sql-statement> +-- corner cases for same +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- corner cases for same + ^ + -stdin-:<main>:2:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> '{}'; + ^ + -stdin-:<main>:2:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> '{}'; + ^ +<sql-statement> +select '[1,2,3]'::jsonb #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[1,2,3]'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:25: Error: At function: PgOp + select '[1,2,3]'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:25: Error: No such operator: #> + select '[1,2,3]'::jsonb #> '{}'; + ^ +<sql-statement> +select '"foo"'::jsonb #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:23: Error: At function: PgOp + select '"foo"'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:23: Error: No such operator: #> + select '"foo"'::jsonb #> '{}'; + ^ +<sql-statement> +select '42'::jsonb #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:20: Error: At function: PgOp + select '42'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:20: Error: No such operator: #> + select '42'::jsonb #> '{}'; + ^ +<sql-statement> +select 'null'::jsonb #> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select 'null'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:22: Error: At function: PgOp + select 'null'::jsonb #> '{}'; + ^ + -stdin-:<main>:1:22: Error: No such operator: #> + select 'null'::jsonb #> '{}'; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null]; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null]; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null]; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', '']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', '']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', '']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', '']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b']; + ^ + -stdin-:<main>:1:50: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b']; + ^ + -stdin-:<main>:1:50: Error: No such operator: #> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b']; + ^ + -stdin-:<main>:1:50: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b']; + ^ + -stdin-:<main>:1:50: Error: No such operator: #> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #> + select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b']; + ^ +<sql-statement> +select '"foo"'::jsonb #> array['z']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::jsonb #> array['z']; + ^ + -stdin-:<main>:1:23: Error: At function: PgOp + select '"foo"'::jsonb #> array['z']; + ^ + -stdin-:<main>:1:23: Error: No such operator: #> + select '"foo"'::jsonb #> array['z']; + ^ +<sql-statement> +select '42'::jsonb #> array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::jsonb #> array['f2']; + ^ + -stdin-:<main>:1:20: Error: At function: PgOp + select '42'::jsonb #> array['f2']; + ^ + -stdin-:<main>:1:20: Error: No such operator: #> + select '42'::jsonb #> array['f2']; + ^ +<sql-statement> +select '42'::jsonb #> array['0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::jsonb #> array['0']; + ^ + -stdin-:<main>:1:20: Error: At function: PgOp + select '42'::jsonb #> array['0']; + ^ + -stdin-:<main>:1:20: Error: No such operator: #> + select '42'::jsonb #> array['0']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}'; + ^ +<sql-statement> +select '[1,2,3]'::jsonb #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[1,2,3]'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:25: Error: At function: PgOp + select '[1,2,3]'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:25: Error: No such operator: #>> + select '[1,2,3]'::jsonb #>> '{}'; + ^ +<sql-statement> +select '"foo"'::jsonb #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:23: Error: At function: PgOp + select '"foo"'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:23: Error: No such operator: #>> + select '"foo"'::jsonb #>> '{}'; + ^ +<sql-statement> +select '42'::jsonb #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:20: Error: At function: PgOp + select '42'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:20: Error: No such operator: #>> + select '42'::jsonb #>> '{}'; + ^ +<sql-statement> +select 'null'::jsonb #>> '{}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select 'null'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:22: Error: At function: PgOp + select 'null'::jsonb #>> '{}'; + ^ + -stdin-:<main>:1:22: Error: No such operator: #>> + select 'null'::jsonb #>> '{}'; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null]; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null]; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null]; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', '']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', '']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', '']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', '']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d']; + ^ +<sql-statement> +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b']; + ^ + -stdin-:<main>:1:50: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b']; + ^ + -stdin-:<main>:1:50: Error: No such operator: #>> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b']; + ^ +<sql-statement> +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b']; + ^ + -stdin-:<main>:1:50: Error: At function: PgOp + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b']; + ^ + -stdin-:<main>:1:50: Error: No such operator: #>> + select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b']; + ^ +<sql-statement> +select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: At function: PgOp + select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b']; + ^ + -stdin-:<main>:1:43: Error: No such operator: #>> + select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b']; + ^ +<sql-statement> +select '"foo"'::jsonb #>> array['z']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '"foo"'::jsonb #>> array['z']; + ^ + -stdin-:<main>:1:23: Error: At function: PgOp + select '"foo"'::jsonb #>> array['z']; + ^ + -stdin-:<main>:1:23: Error: No such operator: #>> + select '"foo"'::jsonb #>> array['z']; + ^ +<sql-statement> +select '42'::jsonb #>> array['f2']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::jsonb #>> array['f2']; + ^ + -stdin-:<main>:1:20: Error: At function: PgOp + select '42'::jsonb #>> array['f2']; + ^ + -stdin-:<main>:1:20: Error: No such operator: #>> + select '42'::jsonb #>> array['f2']; + ^ +<sql-statement> +select '42'::jsonb #>> array['0']; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '42'::jsonb #>> array['0']; + ^ + -stdin-:<main>:1:20: Error: At function: PgOp + select '42'::jsonb #>> array['0']; + ^ + -stdin-:<main>:1:20: Error: No such operator: #>> + select '42'::jsonb #>> array['0']; + ^ +<sql-statement> +-- array_elements +SELECT jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]'); + ^ +<sql-statement> +SELECT * FROM jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]') q; +</sql-statement> +<sql-statement> +SELECT jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); + ^ +<sql-statement> +SELECT * FROM jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +</sql-statement> +<sql-statement> +-- populate_record +CREATE TYPE jbpop AS (a text, b int, c timestamp); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + -- populate_record + ^ +<sql-statement> +CREATE DOMAIN jsb_int_not_null AS int NOT NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN jsb_int_not_null AS int NOT NULL; + ^ +<sql-statement> +CREATE DOMAIN jsb_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN jsb_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); + ^ +<sql-statement> +CREATE DOMAIN jsb_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + CREATE DOMAIN jsb_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); + ^ +<sql-statement> +create type jb_unordered_pair as (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + create type jb_unordered_pair as (x int, y int); + ^ +<sql-statement> +create domain jb_ordered_pair as jb_unordered_pair check((value).x <= (value).y); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272 + create domain jb_ordered_pair as jb_unordered_pair check((value).x <= (value).y); + ^ +<sql-statement> +CREATE TYPE jsbrec AS ( + i int, + ia _int4, + ia1 int[], + ia2 int[][], + ia3 int[][][], + ia1d jsb_int_array_1d, + ia2d jsb_int_array_2d, + t text, + ta text[], + c char(10), + ca char(10)[], + ts timestamp, + js json, + jsb jsonb, + jsa json[], + rec jbpop, + reca jbpop[] +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + CREATE TYPE jsbrec AS ( + ^ +<sql-statement> +CREATE TYPE jsbrec_i_not_null AS ( + i jsb_int_not_null +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 314 + CREATE TYPE jsbrec_i_not_null AS ( + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:71: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:71: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":[100,200,false],"x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":[100,200,false],"x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":[100,200,false],"x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:71: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":[100,200,false],"x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"c":[100,200,false],"x":43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:71: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"c":[100,200,false],"x":43.2}') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop, '{}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:71: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop, '{}') q; + ^ +<sql-statement> +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"x": 43.2}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec_i_not_null + SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"x": 43.2}') q; + ^ +<sql-statement> +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec_i_not_null + SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": null}') q; + ^ +<sql-statement> +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": 12345}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec_i_not_null + SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": 12345}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": null}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": 123}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1, 2], [3, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1, 2], [3, 4]]}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], 2]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], 2]}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], [2, 3]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], [2, 3]]}') q; + ^ +<sql-statement> +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": "{1,2,3}"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": "{1,2,3}"}') q; + ^ +<sql-statement> +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": null}') q; + ^ +<sql-statement> +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": 123}') q; + ^ +<sql-statement> +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [[1, 2, 3]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [[1, 2, 3]]}') q; + ^ +<sql-statement> +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": null}') q; + ^ +<sql-statement> +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": 123}') q; + ^ +<sql-statement> +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null]}') q; + ^ +<sql-statement> +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [null, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [null, 4]]}') q; + ^ +<sql-statement> +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[], []]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[], []]}') q; + ^ +<sql-statement> +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [3]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [3]]}') q; + ^ +<sql-statement> +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], 3, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], 3, 4]}') q; + ^ +<sql-statement> +SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; + ^ +<sql-statement> +SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; + ^ +<sql-statement> +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [[1, 2], [null, 4]]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [[1, 2], [null, 4]]}') q; + ^ +<sql-statement> +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; + ^ +<sql-statement> +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; + ^ +<sql-statement> +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; + ^ +<sql-statement> +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; + ^ +<sql-statement> +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": null}') q; + ^ +<sql-statement> +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": 123}') q; + ^ +<sql-statement> +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; + ^ +<sql-statement> +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec + SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": null}') q; + ^ +<sql-statement> +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaa"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec + SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaa"}') q; + ^ +<sql-statement> +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaa"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec + SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaa"}') q; + ^ +<sql-statement> +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaaaaa"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:43: Error: Unknown type: jsbrec + SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaaaaa"}') q; + ^ +<sql-statement> +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": null}') q; + ^ +<sql-statement> +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": 123}') q; + ^ +<sql-statement> +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; + ^ +<sql-statement> +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": null}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": true}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": true}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": 123.45}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": 123.45}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "123.45"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "123.45"}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "abc"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "abc"}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": [123, "123", null, {"key": "value"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": [123, "123", null, {"key": "value"}]}') q; + ^ +<sql-statement> +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:44: Error: Unknown type: jsbrec + SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": null}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": true}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": true}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": 123.45}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": 123.45}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "123.45"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "123.45"}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "abc"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "abc"}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; + ^ +<sql-statement> +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; + ^ +<sql-statement> +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": null}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": null}') q; + ^ +<sql-statement> +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": 123}') q; + ^ +<sql-statement> +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": [1, "2", null, 4]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": [1, "2", null, 4]}') q; + ^ +<sql-statement> +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; + ^ +<sql-statement> +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": 123}') q; + ^ +<sql-statement> +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": [1, 2]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": [1, 2]}') q; + ^ +<sql-statement> +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; + ^ +<sql-statement> +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": "(abc,42,01.02.2003)"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Unknown type: jsbrec + SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": "(abc,42,01.02.2003)"}') q; + ^ +<sql-statement> +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": 123}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": 123}') q; + ^ +<sql-statement> +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [1, 2]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [1, 2]}') q; + ^ +<sql-statement> +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; + ^ +<sql-statement> +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; + ^ +<sql-statement> +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jsbrec + SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; + ^ +<sql-statement> +SELECT rec FROM jsonb_populate_record( + row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + row('x',3,'2012-12-31 15:30:56')::jbpop,NULL)::jsbrec, + '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' +) q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:50: Error: alternative is not implemented yet : 138 + row('x',3,'2012-12-31 15:30:56')::jbpop,NULL)::jsbrec, + ^ +<sql-statement> +-- anonymous record type +SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- anonymous record type + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_populate_record with given argument types: (record,unknown) + SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); + ^ +<sql-statement> +SELECT jsonb_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 138 + SELECT jsonb_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); + ^ +<sql-statement> +SELECT * FROM + jsonb_populate_record(null::record, '{"x": 776}') AS (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + SELECT * FROM + ^ +<sql-statement> +-- composite domain +SELECT jsonb_populate_record(null::jb_ordered_pair, '{"x": 0, "y": 1}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:36: Error: Unknown type: jb_ordered_pair + SELECT jsonb_populate_record(null::jb_ordered_pair, '{"x": 0, "y": 1}'); + ^ +<sql-statement> +SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 0}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:40: Error: alternative is not implemented yet : 138 + SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 0}'); + ^ +<sql-statement> +SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 1, "y": 0}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:40: Error: alternative is not implemented yet : 138 + SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 1, "y": 0}'); + ^ +<sql-statement> +-- populate_recordset +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:46: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:60: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:60: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:60: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:60: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:60: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:60: Error: alternative is not implemented yet : 138 + SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + ^ +<sql-statement> +-- anonymous record type +SELECT jsonb_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); + ^ +<sql-statement> +SELECT jsonb_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); + ^ +<sql-statement> +SELECT i, jsonb_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') +FROM (VALUES (1),(2)) v(i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:11: Error: Generator functions are not allowed in: SELECT + SELECT i, jsonb_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') + ^ +<sql-statement> +SELECT * FROM + jsonb_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + SELECT * FROM + ^ +<sql-statement> +-- empty array is a corner case +SELECT jsonb_populate_recordset(null::record, '[]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(null::record, '[]'); + ^ +<sql-statement> +SELECT jsonb_populate_recordset(row(1,2), '[]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(row(1,2), '[]'); + ^ +<sql-statement> +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[]') q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:46: Error: Unknown type: jbpop + SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[]') q; + ^ +<sql-statement> +SELECT * FROM + jsonb_populate_recordset(null::record, '[]') AS (x int, y int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + SELECT * FROM + ^ +<sql-statement> +-- composite domain +SELECT jsonb_populate_recordset(null::jb_ordered_pair, '[{"x": 0, "y": 1}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(null::jb_ordered_pair, '[{"x": 0, "y": 1}]'); + ^ +<sql-statement> +SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 0}, {"y": 3}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 0}, {"y": 3}]'); + ^ +<sql-statement> +SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 1, "y": 0}]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 1, "y": 0}]'); + ^ +<sql-statement> +-- negative cases where the wrong record type is supplied +select * from jsonb_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + -- negative cases where the wrong record type is supplied + ^ +<sql-statement> +select * from jsonb_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); + ^ +<sql-statement> +select * from jsonb_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); + ^ +<sql-statement> +select * from jsonb_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); + ^ +<sql-statement> +-- jsonb_to_record and jsonb_to_recordset +select * from jsonb_to_record('{"a":1,"b":"foo","c":"bar"}') + as x(a int, b text, d text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + -- jsonb_to_record and jsonb_to_recordset + ^ +<sql-statement> +select * from jsonb_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + as x(a int, b text, c boolean); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + ^ +<sql-statement> +select *, c is null as c_is_null +from jsonb_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::jsonb) + as t(a int, b jsonb, c text, x int, ca char(5)[], ia int[][], r jbpop); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select *, c is null as c_is_null + ^ +<sql-statement> +select *, c is null as c_is_null +from jsonb_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::jsonb) + as t(a int, b jsonb, c text, x int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select *, c is null as c_is_null + ^ +<sql-statement> +select * from jsonb_to_record('{"ia": null}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia": null}') as x(ia _int4); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia": 123}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia": 123}') as x(ia _int4); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia": [[1], 2]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia": [[1], 2]}') as x(ia _int4); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); + ^ +<sql-statement> +select * from jsonb_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); + ^ +<sql-statement> +select * from jsonb_to_record('{"out": {"key": 1}}') as x(out json); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"out": {"key": 1}}') as x(out json); + ^ +<sql-statement> +select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out json); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out json); + ^ +<sql-statement> +select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out json); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out json); + ^ +<sql-statement> +select * from jsonb_to_record('{"out": {"key": 1}}') as x(out jsonb); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"out": {"key": 1}}') as x(out jsonb); + ^ +<sql-statement> +select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out jsonb); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out jsonb); + ^ +<sql-statement> +select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RangeFunction: unsupported coldeflist + select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); + ^ +<sql-statement> +-- test type info caching in jsonb_populate_record() +CREATE TEMP TABLE jsbpoptest (js jsonb); +</sql-statement> +<sql-statement> +INSERT INTO jsbpoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::jsonb +FROM generate_series(1, 3); +</sql-statement> +<sql-statement> +SELECT (jsonb_populate_record(NULL::jsbrec, js)).* FROM jsbpoptest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT (jsonb_populate_record(NULL::jsbrec, js)).* FROM jsbpoptest; + ^ +<sql-statement> +DROP TYPE jsbrec; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP TYPE jsbrec; + ^ +<sql-statement> +DROP TYPE jsbrec_i_not_null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP TYPE jsbrec_i_not_null; + ^ +<sql-statement> +DROP DOMAIN jsb_int_not_null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN jsb_int_not_null; + ^ +<sql-statement> +DROP DOMAIN jsb_int_array_1d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN jsb_int_array_1d; + ^ +<sql-statement> +DROP DOMAIN jsb_int_array_2d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN jsb_int_array_2d; + ^ +<sql-statement> +DROP DOMAIN jb_ordered_pair; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP DOMAIN jb_ordered_pair; + ^ +<sql-statement> +DROP TYPE jb_unordered_pair; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 373 + DROP TYPE jb_unordered_pair; + ^ +<sql-statement> +-- indexing +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ? 'public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +CREATE INDEX jidx ON testjsonb USING gin (j); +</sql-statement> +<sql-statement> +SET enable_seqscan = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_seqscan + SET enable_seqscan = off; + ^ +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- exercise GIN_SEARCH_MODE_ALL +SELECT count(*) FROM testjsonb WHERE j @> '{}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ? 'public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF) + ^ +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF) + ^ +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- array exists - array elements should behave as keys (for GIN index scans too) +CREATE INDEX jidx_array ON testjsonb USING gin((j->'array')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: index expression is not supported yet + -- array exists - array elements should behave as keys (for GIN index scans too) + ^ +<sql-statement> +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- However, a raw scalar is *contained* within the array +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +RESET enable_seqscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET enable_seqscan; + ^ +<sql-statement> +SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow; + ^ +<sql-statement> +SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key; + ^ +<sql-statement> +-- sort/hash +SELECT count(distinct j) FROM testjsonb; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SET enable_hashagg = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_hashagg + SET enable_hashagg = off; + ^ +<sql-statement> +SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SET enable_hashagg = on; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_hashagg + SET enable_hashagg = on; + ^ +<sql-statement> +SET enable_sort = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_sort + SET enable_sort = off; + ^ +<sql-statement> +SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgSelect, At function: PgSetItem, At function: PgValuesList + SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j); + ^ + -stdin-:<main>:1:44: Error: At function: PgOp + SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j); + ^ + -stdin-:<main>:1:44: Error: Unable to find an overload for operator || with given argument type(s): (jsonb,text) + SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j); + ^ +<sql-statement> +SET enable_sort = on; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_sort + SET enable_sort = on; + ^ +<sql-statement> +RESET enable_hashagg; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET enable_hashagg; + ^ +<sql-statement> +RESET enable_sort; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET enable_sort; + ^ +<sql-statement> +DROP INDEX jidx; +</sql-statement> +-stdin-:<main>: Error: Pre type annotation + + -stdin-:<main>:1:1: Error: Unexpected tag: pgObject + DROP INDEX jidx; + ^ +<sql-statement> +DROP INDEX jidx_array; +</sql-statement> +-stdin-:<main>: Error: Pre type annotation + + -stdin-:<main>:1:1: Error: Unexpected tag: pgObject + DROP INDEX jidx_array; + ^ +<sql-statement> +-- btree +CREATE INDEX jidx ON testjsonb USING btree (j); +</sql-statement> +<sql-statement> +SET enable_seqscan = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_seqscan + SET enable_seqscan = off; + ^ +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j > '{"p":1}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j = '{"pos":98, "line":371, "node":"CBA", "indexed":true}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +--gin path opclass +DROP INDEX jidx; +</sql-statement> +-stdin-:<main>: Error: Pre type annotation + + -stdin-:<main>:1:1: Error: Unexpected tag: pgObject + --gin path opclass + ^ +<sql-statement> +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); +</sql-statement> +<sql-statement> +SET enable_seqscan = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_seqscan + SET enable_seqscan = off; + ^ +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +-- exercise GIN_SEARCH_MODE_ALL +SELECT count(*) FROM testjsonb WHERE j @> '{}'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF) + ^ +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.testjsonb + +<sql-statement> +RESET enable_seqscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET enable_seqscan; + ^ +<sql-statement> +DROP INDEX jidx; +</sql-statement> +-stdin-:<main>: Error: Pre type annotation + + -stdin-:<main>:1:1: Error: Unexpected tag: pgObject + DROP INDEX jidx; + ^ +<sql-statement> +-- nested tests +SELECT '{"ff":{"a":12,"b":16}}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"ff":{"a":12,"b":16},"qq":123}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"aa":["a","aaa"],"qq":{"a":12,"b":16,"c":["c1","c2"],"d":{"d1":"d1","d2":"d2","d1":"d3"}}}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2"],"d":{"d1":"d1","d2":"d2"}}}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2",["c3"],{"c4":4}],"d":{"d1":"d1","d2":"d2"}}}'::jsonb; +</sql-statement> +<sql-statement> +SELECT '{"ff":["a","aaa"]}'::jsonb; +</sql-statement> +<sql-statement> +SELECT + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'ff', + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'qq', + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'Y') IS NULL AS f, + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb ->> 'Y') IS NULL AS t, + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'x'; +</sql-statement> +<sql-statement> +-- nested containment +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1,2]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[2,1],"c":"b"}'::jsonb @> '{"a":[1,2]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":[1,2]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":[1,2]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; +</sql-statement> +<sql-statement> +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; +</sql-statement> +<sql-statement> +SELECT '["a","b"]'::jsonb @> '["a","b","c","b"]'; +</sql-statement> +<sql-statement> +SELECT '["a","b","c","b"]'::jsonb @> '["a","b"]'; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2]]'::jsonb @> '["a",[1,2]]'; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2]]'::jsonb @> '["b",[1,2]]'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[2]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[3]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"c":3}]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4}]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},3]}'; +</sql-statement> +<sql-statement> +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},1]}'; +</sql-statement> +<sql-statement> +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +</sql-statement> +<sql-statement> +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +</sql-statement> +<sql-statement> +insert into nestjsonb (j) values ('[[14,2,3]]'); +</sql-statement> +<sql-statement> +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +</sql-statement> +<sql-statement> +create index on nestjsonb using gin(j jsonb_path_ops); +</sql-statement> +<sql-statement> +set enable_seqscan = on; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_seqscan + set enable_seqscan = on; + ^ +<sql-statement> +set enable_bitmapscan = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_bitmapscan + set enable_bitmapscan = off; + ^ +<sql-statement> +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +</sql-statement> +<sql-statement> +select * from nestjsonb where j @> '{"c":3}'; +</sql-statement> +<sql-statement> +select * from nestjsonb where j @> '[[14]]'; +</sql-statement> +<sql-statement> +set enable_seqscan = off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_seqscan + set enable_seqscan = off; + ^ +<sql-statement> +set enable_bitmapscan = on; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_bitmapscan + set enable_bitmapscan = on; + ^ +<sql-statement> +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +</sql-statement> +<sql-statement> +select * from nestjsonb where j @> '{"c":3}'; +</sql-statement> +<sql-statement> +select * from nestjsonb where j @> '[[14]]'; +</sql-statement> +<sql-statement> +reset enable_seqscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_seqscan; + ^ +<sql-statement> +reset enable_bitmapscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + reset enable_bitmapscan; + ^ +<sql-statement> +-- nested object field / array index lookup +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'n'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'a'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'b'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'c'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd' -> '1'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'e'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 0; --expecting error +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 0; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 1; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 2; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3 -> 1; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 4; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> 5; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> -1; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> -5; +</sql-statement> +<sql-statement> +SELECT '["a","b","c",[1,2],null]'::jsonb -> -6; +</sql-statement> +<sql-statement> +--nested path extraction +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{0}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + --nested path extraction + ^ + -stdin-:<main>:2:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{0}'; + ^ + -stdin-:<main>:2:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{0}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}'; + ^ +<sql-statement> +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}'; + ^ + -stdin-:<main>:1:39: Error: At function: PgOp + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}'; + ^ + -stdin-:<main>:1:39: Error: No such operator: #> + SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}'; + ^ +<sql-statement> +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}'; + ^ + -stdin-:<main>:1:44: Error: At function: PgOp + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}'; + ^ + -stdin-:<main>:1:44: Error: No such operator: #> + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}'; + ^ +<sql-statement> +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}'; + ^ + -stdin-:<main>:1:44: Error: At function: PgOp + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}'; + ^ + -stdin-:<main>:1:44: Error: No such operator: #> + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}'; + ^ +<sql-statement> +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}'; + ^ + -stdin-:<main>:1:44: Error: At function: PgOp + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}'; + ^ + -stdin-:<main>:1:44: Error: No such operator: #> + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}'; + ^ +<sql-statement> +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}'; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}'; + ^ + -stdin-:<main>:1:44: Error: At function: PgOp + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}'; + ^ + -stdin-:<main>:1:44: Error: No such operator: #> + SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}'; + ^ +<sql-statement> +--nested exists +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'n'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'a'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'b'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'c'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'd'; +</sql-statement> +<sql-statement> +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'e'; +</sql-statement> +<sql-statement> +-- jsonb_strip_nulls +select jsonb_strip_nulls(null); +</sql-statement> +<sql-statement> +select jsonb_strip_nulls('1'); +</sql-statement> +<sql-statement> +select jsonb_strip_nulls('"a string"'); +</sql-statement> +<sql-statement> +select jsonb_strip_nulls('null'); +</sql-statement> +<sql-statement> +select jsonb_strip_nulls('[1,2,null,3,4]'); +</sql-statement> +<sql-statement> +select jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); +</sql-statement> +<sql-statement> +select jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); +</sql-statement> +<sql-statement> +-- an empty object is not null and should not be stripped +select jsonb_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); +</sql-statement> +<sql-statement> +select jsonb_pretty('{"a": "test", "b": [1, 2, 3], "c": "test3", "d":{"dd": "test4", "dd2":{"ddd": "test5"}}}'); +</sql-statement> +<sql-statement> +select jsonb_pretty('[{"f1":1,"f2":null},2,null,[[{"x":true},6,7],8],3]'); +</sql-statement> +<sql-statement> +select jsonb_pretty('{"a":["b", "c"], "d": {"e":"f"}}'); +</sql-statement> +<sql-statement> +select jsonb_concat('{"d": "test", "a": [1, 2]}', '{"g": "test2", "c": {"c1":1, "c2":2}}'); +</sql-statement> +<sql-statement> +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; +</sql-statement> +<sql-statement> +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aq":"l"}'; +</sql-statement> +<sql-statement> +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aa":"l"}'; +</sql-statement> +<sql-statement> +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{}'; +</sql-statement> +<sql-statement> +select '["a", "b"]'::jsonb || '["c"]'; +</sql-statement> +<sql-statement> +select '["a", "b"]'::jsonb || '["c", "d"]'; +</sql-statement> +<sql-statement> +select '["c"]' || '["a", "b"]'::jsonb; +</sql-statement> +<sql-statement> +select '["a", "b"]'::jsonb || '"c"'; +</sql-statement> +<sql-statement> +select '"c"' || '["a", "b"]'::jsonb; +</sql-statement> +<sql-statement> +select '[]'::jsonb || '["a"]'::jsonb; +</sql-statement> +<sql-statement> +select '[]'::jsonb || '"a"'::jsonb; +</sql-statement> +<sql-statement> +select '"b"'::jsonb || '"a"'::jsonb; +</sql-statement> +<sql-statement> +select '{}'::jsonb || '{"a":"b"}'::jsonb; +</sql-statement> +<sql-statement> +select '[]'::jsonb || '{"a":"b"}'::jsonb; +</sql-statement> +<sql-statement> +select '{"a":"b"}'::jsonb || '[]'::jsonb; +</sql-statement> +<sql-statement> +select '"a"'::jsonb || '{"a":1}'; +</sql-statement> +<sql-statement> +select '{"a":1}' || '"a"'::jsonb; +</sql-statement> +<sql-statement> +select '[3]'::jsonb || '{}'::jsonb; +</sql-statement> +<sql-statement> +select '3'::jsonb || '[]'::jsonb; +</sql-statement> +<sql-statement> +select '3'::jsonb || '4'::jsonb; +</sql-statement> +<sql-statement> +select '3'::jsonb || '{}'::jsonb; +</sql-statement> +<sql-statement> +select '["a", "b"]'::jsonb || '{"c":1}'; +</sql-statement> +<sql-statement> +select '{"c": 1}'::jsonb || '["a", "b"]'; +</sql-statement> +<sql-statement> +select '{}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; +</sql-statement> +<sql-statement> +select pg_column_size('{}'::jsonb || '{}'::jsonb) = pg_column_size('{}'::jsonb); +</sql-statement> +<sql-statement> +select pg_column_size('{"aa":1}'::jsonb || '{"b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +</sql-statement> +<sql-statement> +select pg_column_size('{"aa":1, "b":2}'::jsonb || '{}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +</sql-statement> +<sql-statement> +select pg_column_size('{}'::jsonb || '{"aa":1, "b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +</sql-statement> +<sql-statement> +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'a'); +</sql-statement> +<sql-statement> +select jsonb_delete('{"a":null , "b":2, "c":3}'::jsonb, 'a'); +</sql-statement> +<sql-statement> +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'b'); +</sql-statement> +<sql-statement> +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'c'); +</sql-statement> +<sql-statement> +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'd'); +</sql-statement> +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - 'a'; +</sql-statement> +<sql-statement> +select '{"a":null , "b":2, "c":3}'::jsonb - 'a'; +</sql-statement> +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - 'b'; +</sql-statement> +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - 'c'; +</sql-statement> +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - 'd'; +</sql-statement> +<sql-statement> +select pg_column_size('{"a":1 , "b":2, "c":3}'::jsonb - 'b') = pg_column_size('{"a":1, "b":2}'::jsonb); +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - 3; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - 2; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - 1; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - 0; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - -1; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - -2; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - -3; +</sql-statement> +<sql-statement> +select '["a","b","c"]'::jsonb - -4; +</sql-statement> +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[]; + ^ + -stdin-:<main>:1:40: Error: At function: PgOp + select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[]; + ^ + -stdin-:<main>:1:40: Error: Unable to find an overload for operator - with given argument type(s): (jsonb,_text) + select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[]; + ^ +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[]; + ^ + -stdin-:<main>:1:40: Error: At function: PgOp + select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[]; + ^ + -stdin-:<main>:1:40: Error: Unable to find an overload for operator - with given argument type(s): (jsonb,_text) + select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[]; + ^ +<sql-statement> +select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[]; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[]; + ^ + -stdin-:<main>:1:40: Error: At function: PgOp + select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[]; + ^ + -stdin-:<main>:1:40: Error: Unable to find an overload for operator - with given argument type(s): (jsonb,_text) + select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[]; + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); + ^ +<sql-statement> +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (jsonb,unknown,unknown) + select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}'); + ^ +<sql-statement> +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{n}'); +</sql-statement> +<sql-statement> +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{b,-1}'); +</sql-statement> +<sql-statement> +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{d,1,0}'); +</sql-statement> +<sql-statement> +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{n}'; +</sql-statement> +<sql-statement> +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1}'; +</sql-statement> +<sql-statement> +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript + ^ + -stdin-:<main>:1:1: Fatal: ERROR: path element at position 2 is not an integer: "-1e" + + select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript + ^ +<sql-statement> +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}'; +</sql-statement> +<sql-statement> +-- empty structure and error conditions for delete and replace +select '"a"'::jsonb - 'a'; -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- empty structure and error conditions for delete and replace + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot delete from scalar + + -- empty structure and error conditions for delete and replace + ^ +<sql-statement> +select '{}'::jsonb - 'a'; +</sql-statement> +<sql-statement> +select '[]'::jsonb - 'a'; +</sql-statement> +<sql-statement> +select '"a"'::jsonb - 1; -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '"a"'::jsonb - 1; -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot delete from scalar + + select '"a"'::jsonb - 1; -- error + ^ +<sql-statement> +select '{}'::jsonb - 1; -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{}'::jsonb - 1; -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot delete from object using integer index + + select '{}'::jsonb - 1; -- error + ^ +<sql-statement> +select '[]'::jsonb - 1; +</sql-statement> +<sql-statement> +select '"a"'::jsonb #- '{a}'; -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '"a"'::jsonb #- '{a}'; -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot delete path in scalar + + select '"a"'::jsonb #- '{a}'; -- error + ^ +<sql-statement> +select '{}'::jsonb #- '{a}'; +</sql-statement> +<sql-statement> +select '[]'::jsonb #- '{a}'; +</sql-statement> +<sql-statement> +select jsonb_set('"a"','{a}','"b"'); --error +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('"a"','{a}','"b"'); --error + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('"a"','{a}','"b"'); --error + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('"a"','{a}','"b"'); --error + ^ +<sql-statement> +select jsonb_set('{}','{a}','"b"', false); +</sql-statement> +<sql-statement> +select jsonb_set('[]','{1}','"b"', false); +</sql-statement> +<sql-statement> +select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0}','[2,3,4]', false); +</sql-statement> +<sql-statement> +-- jsonb_set adding instead of replacing +-- prepend to array +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,-33}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- jsonb_set adding instead of replacing + ^ + -stdin-:<main>:3:8: Error: At function: PgCall + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,-33}','{"foo":123}'); + ^ + -stdin-:<main>:3:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,-33}','{"foo":123}'); + ^ +<sql-statement> +-- append to array +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,33}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- append to array + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,33}','{"foo":123}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,33}','{"foo":123}'); + ^ +<sql-statement> +-- check nesting levels addition +select jsonb_set('{"a":1,"b":[4,5,[0,1,2],6,7],"c":{"d":4}}','{b,2,33}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- check nesting levels addition + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set('{"a":1,"b":[4,5,[0,1,2],6,7],"c":{"d":4}}','{b,2,33}','{"foo":123}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a":1,"b":[4,5,[0,1,2],6,7],"c":{"d":4}}','{b,2,33}','{"foo":123}'); + ^ +<sql-statement> +-- add new key +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{c,e}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- add new key + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{c,e}','{"foo":123}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{c,e}','{"foo":123}'); + ^ +<sql-statement> +-- adding doesn't do anything if elements before last aren't present +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,-33}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- adding doesn't do anything if elements before last aren't present + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,-33}','{"foo":123}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,-33}','{"foo":123}'); + ^ +<sql-statement> +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}'); + ^ +<sql-statement> +-- add to empty object +select jsonb_set('{}','{x}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- add to empty object + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set('{}','{x}','{"foo":123}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{}','{x}','{"foo":123}'); + ^ +<sql-statement> +--add to empty array +select jsonb_set('[]','{0}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + --add to empty array + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set('[]','{0}','{"foo":123}'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('[]','{0}','{"foo":123}'); + ^ +<sql-statement> +select jsonb_set('[]','{99}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('[]','{99}','{"foo":123}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('[]','{99}','{"foo":123}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('[]','{99}','{"foo":123}'); + ^ +<sql-statement> +select jsonb_set('[]','{-99}','{"foo":123}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('[]','{-99}','{"foo":123}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('[]','{-99}','{"foo":123}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('[]','{-99}','{"foo":123}'); + ^ +<sql-statement> +select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); + ^ +<sql-statement> +select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); + ^ +<sql-statement> +select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set with given argument types: (unknown,unknown,unknown) + select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); + ^ +<sql-statement> +-- jsonb_set_lax +\pset null NULL +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "\" + + \pset null NULL + ^ +<sql-statement> +-- pass though non nulls to jsonb_set +select jsonb_set_lax('{"a":1,"b":2}','{b}','5') ; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- pass though non nulls to jsonb_set + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set_lax('{"a":1,"b":2}','{b}','5') ; + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set_lax with given argument types: (unknown,unknown,unknown) + select jsonb_set_lax('{"a":1,"b":2}','{b}','5') ; + ^ +<sql-statement> +select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set_lax with given argument types: (unknown,unknown,unknown,bool) + select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ; + ^ +<sql-statement> +-- using the default treatment +select jsonb_set_lax('{"a":1,"b":2}','{b}',null); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- using the default treatment + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_set_lax('{"a":1,"b":2}','{b}',null); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_set_lax with given argument types: (unknown,unknown,unknown) + select jsonb_set_lax('{"a":1,"b":2}','{b}',null); + ^ +<sql-statement> +select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_set_lax with given argument types: (unknown,unknown,unknown,bool) + select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true); + ^ +<sql-statement> +-- errors +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, null); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- errors + ^ + -stdin-:<main>:1:1: Fatal: ERROR: null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception" + + -- errors + ^ +<sql-statement> +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception" + + select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); + ^ +<sql-statement> +-- explicit treatments +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'raise_exception') as raise_exception; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: alternative is not implemented yet : 118 + select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'raise_exception') as raise_exception; + ^ +<sql-statement> +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'return_target') as return_target; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'return_target') as return_target; + ^ +<sql-statement> +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'delete_key') as delete_key; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'delete_key') as delete_key; + ^ +<sql-statement> +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_json_null') as use_json_null; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_json_null') as use_json_null; + ^ +<sql-statement> +\pset null '' +</sql-statement> +Metacommand \pset null '' is not supported +<sql-statement> +-- jsonb_insert +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- jsonb_insert + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}'); + ^ +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]'); + ^ +<sql-statement> +-- edge cases +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- edge cases + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('[]', '{1}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('[]', '{1}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('[]', '{1}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('[]', '{1}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('[]', '{1}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"'); + ^ +<sql-statement> +-- jsonb_insert should be able to insert new value for objects, but not to replace +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- jsonb_insert should be able to insert new value for objects, but not to replace + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"', true); +</sql-statement> +<sql-statement> +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_insert with given argument types: (unknown,unknown,unknown) + select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"'); + ^ +<sql-statement> +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot replace existing key +HINT: Try using the function jsonb_set to replace key value. + + select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); + ^ +<sql-statement> +-- jsonb subscript +select ('123'::jsonb)['a']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- jsonb subscript + ^ +<sql-statement> +select ('123'::jsonb)[0]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('123'::jsonb)[0]; + ^ +<sql-statement> +select ('123'::jsonb)[NULL]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('123'::jsonb)[NULL]; + ^ +<sql-statement> +select ('{"a": 1}'::jsonb)['a']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1}'::jsonb)['a']; + ^ +<sql-statement> +select ('{"a": 1}'::jsonb)[0]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1}'::jsonb)[0]; + ^ +<sql-statement> +select ('{"a": 1}'::jsonb)['not_exist']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1}'::jsonb)['not_exist']; + ^ +<sql-statement> +select ('{"a": 1}'::jsonb)[NULL]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1}'::jsonb)[NULL]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)['a']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)['a']; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[0]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[0]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)['1']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)['1']; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[1.0]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[1.0]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[2]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[3]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[3]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[-2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[-2]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[1]['a']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[1]['a']; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[1][0]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[1][0]; + ^ +<sql-statement> +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['b']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['b']; + ^ +<sql-statement> +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']; + ^ +<sql-statement> +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d'][1]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d'][1]; + ^ +<sql-statement> +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']['a']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']['a']; + ^ +<sql-statement> +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']; + ^ +<sql-statement> +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']; + ^ +<sql-statement> +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']['a3']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']['a3']; + ^ +<sql-statement> +select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1']; + ^ +<sql-statement> +select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1'][2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1'][2]; + ^ +<sql-statement> +-- slices are not supported +select ('{"a": 1}'::jsonb)['a':'b']; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + -- slices are not supported + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[1:2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[1:2]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[:2]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[:2]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[1:]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[1:]; + ^ +<sql-statement> +select ('[1, "2", null]'::jsonb)[:]; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 360 + select ('[1, "2", null]'::jsonb)[:]; + ^ +<sql-statement> +create TEMP TABLE test_jsonb_subscript ( + id int, + test_json jsonb +); +</sql-statement> +<sql-statement> +insert into test_jsonb_subscript values +(1, '{}'), -- empty jsonb +(2, '{"key": "value"}'); -- jsonb with data +</sql-statement> +<sql-statement> +-- update empty jsonb +update test_jsonb_subscript set test_json['a'] = '1' where id = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- update jsonb with some data +update test_jsonb_subscript set test_json['a'] = '1' where id = 2; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- replace jsonb +update test_jsonb_subscript set test_json['a'] = '"test"'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- replace by object +update test_jsonb_subscript set test_json['a'] = '{"b": 1}'::jsonb; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- replace by array +update test_jsonb_subscript set test_json['a'] = '[1, 2, 3]'::jsonb; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- use jsonb subscription in where clause +select * from test_jsonb_subscript where test_json['key'] = '"value"'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:59: Error: alternative is not implemented yet : 360 + select * from test_jsonb_subscript where test_json['key'] = '"value"'; + ^ +<sql-statement> +select * from test_jsonb_subscript where test_json['key_doesnt_exists'] = '"value"'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:73: Error: alternative is not implemented yet : 360 + select * from test_jsonb_subscript where test_json['key_doesnt_exists'] = '"value"'; + ^ +<sql-statement> +select * from test_jsonb_subscript where test_json['key'] = '"wrong_value"'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:59: Error: alternative is not implemented yet : 360 + select * from test_jsonb_subscript where test_json['key'] = '"wrong_value"'; + ^ +<sql-statement> +-- NULL +update test_jsonb_subscript set test_json[NULL] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['another_key'] = NULL; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- NULL as jsonb source +insert into test_jsonb_subscript values (3, NULL); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a'] = '1' where id = 3; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json = NULL where id = 3; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json[0] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- Fill the gaps logic +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '[0]'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[5] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[-4] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[-8] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- keep consistent values position +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '[]'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[5] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- create the whole path +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a'][0]['b'][0]['c'] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a'][2]['b'][2]['c'][2] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- create the whole path with already existing keys +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{"b": 1}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a'][0] = '2'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- the start jsonb is an object, first subscript is treated as a key +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[0]['a'] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- the start jsonb is an array +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '[]'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[0]['a'] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json[2]['b'] = '2'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- overwriting an existing path +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a']['b'][1] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['a']['b'][10] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '[]'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[0][0][0] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json[0][0][1] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a']['b'][10] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['a'][10][10] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- an empty sub element +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{"a": {}}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a']['b']['c'][2] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{"a": []}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a'][1]['c'][2] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +select * from test_jsonb_subscript; +</sql-statement> +<sql-statement> +-- trying replace assuming a composite object, but it's an element or a value +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, '{"a": 1}'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json['a']['b'] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['a']['b']['c'] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['a'][0] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['a'][0]['c'] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json['a'][0][0] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- trying replace assuming a composite object, but it's a raw scalar +delete from test_jsonb_subscript; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +insert into test_jsonb_subscript values (1, 'null'); +</sql-statement> +<sql-statement> +update test_jsonb_subscript set test_json[0] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +update test_jsonb_subscript set test_json[0][0] = '1'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- jsonb to tsvector +select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- jsonb to tsvector + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + -- jsonb to tsvector + ^ +<sql-statement> +-- jsonb to tsvector with config +select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- jsonb to tsvector with config + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "simple" does not exist + + -- jsonb to tsvector with config + ^ +<sql-statement> +-- jsonb to tsvector with stop words +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- jsonb to tsvector with stop words + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + -- jsonb to tsvector with stop words + ^ +<sql-statement> +-- jsonb to tsvector with numeric values +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- jsonb to tsvector with numeric values + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + -- jsonb to tsvector with numeric values + ^ +<sql-statement> +-- jsonb_to_tsvector +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- jsonb_to_tsvector + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + -- jsonb_to_tsvector + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + ^ +<sql-statement> +-- to_tsvector corner cases +select to_tsvector('""'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- to_tsvector corner cases + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + -- to_tsvector corner cases + ^ +<sql-statement> +select to_tsvector('{}'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select to_tsvector('{}'::jsonb); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select to_tsvector('{}'::jsonb); + ^ +<sql-statement> +select to_tsvector('[]'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select to_tsvector('[]'::jsonb); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select to_tsvector('[]'::jsonb); + ^ +<sql-statement> +select to_tsvector('null'::jsonb); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select to_tsvector('null'::jsonb); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select to_tsvector('null'::jsonb); + ^ +<sql-statement> +-- jsonb_to_tsvector corner cases +select jsonb_to_tsvector('""'::jsonb, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- jsonb_to_tsvector corner cases + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + -- jsonb_to_tsvector corner cases + ^ +<sql-statement> +select jsonb_to_tsvector('{}'::jsonb, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('{}'::jsonb, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select jsonb_to_tsvector('{}'::jsonb, '"all"'); + ^ +<sql-statement> +select jsonb_to_tsvector('[]'::jsonb, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('[]'::jsonb, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select jsonb_to_tsvector('[]'::jsonb, '"all"'); + ^ +<sql-statement> +select jsonb_to_tsvector('null'::jsonb, '"all"'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('null'::jsonb, '"all"'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration isn't set + + select jsonb_to_tsvector('null'::jsonb, '"all"'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '""'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '""'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '""'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '{}'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '{}'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '{}'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '[]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '[]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '[]'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, 'null'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, 'null'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, 'null'); + ^ +<sql-statement> +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["all", null]'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["all", null]'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: text search configuration "english" does not exist + + select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["all", null]'); + ^ +<sql-statement> +-- ts_headline for jsonb +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- ts_headline for jsonb + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:2:122: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:2:122: Error: No such proc: tsquery + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ +<sql-statement> +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:1:114: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ + -stdin-:<main>:1:114: Error: No such proc: tsquery + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ^ +<sql-statement> +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:122: Error: At function: PgCall + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:122: Error: No such proc: tsquery + select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ +<sql-statement> +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:133: Error: At function: PgCall + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ + -stdin-:<main>:1:133: Error: No such proc: tsquery + select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ^ +<sql-statement> +-- corner cases for ts_headline with jsonb +select ts_headline('null'::jsonb, tsquery('aaa & bbb')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- corner cases for ts_headline with jsonb + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select ts_headline('null'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:2:35: Error: At function: PgCall + select ts_headline('null'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:2:35: Error: No such proc: tsquery + select ts_headline('null'::jsonb, tsquery('aaa & bbb')); + ^ +<sql-statement> +select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:33: Error: At function: PgCall + select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:33: Error: No such proc: tsquery + select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); + ^ +<sql-statement> +select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:33: Error: At function: PgCall + select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); + ^ + -stdin-:<main>:1:33: Error: No such proc: tsquery + select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); + ^ +<sql-statement> +-- casts +select 'true'::jsonb::bool; +</sql-statement> +<sql-statement> +select '[]'::jsonb::bool; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '[]'::jsonb::bool; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot cast jsonb array to type boolean + + select '[]'::jsonb::bool; + ^ +<sql-statement> +select '1.0'::jsonb::float; +</sql-statement> +<sql-statement> +select '[1.0]'::jsonb::float; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '[1.0]'::jsonb::float; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot cast jsonb array to type double precision + + select '[1.0]'::jsonb::float; + ^ +<sql-statement> +select '12345'::jsonb::int4; +</sql-statement> +<sql-statement> +select '"hello"'::jsonb::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '"hello"'::jsonb::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot cast jsonb string to type integer + + select '"hello"'::jsonb::int4; + ^ +<sql-statement> +select '12345'::jsonb::numeric; +</sql-statement> +<sql-statement> +select '{}'::jsonb::numeric; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select '{}'::jsonb::numeric; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot cast jsonb object to type numeric + + select '{}'::jsonb::numeric; + ^ +<sql-statement> +select '12345.05'::jsonb::numeric; +</sql-statement> +<sql-statement> +select '12345.05'::jsonb::float4; +</sql-statement> +<sql-statement> +select '12345.05'::jsonb::float8; +</sql-statement> +<sql-statement> +select '12345.05'::jsonb::int2; +</sql-statement> +<sql-statement> +select '12345.05'::jsonb::int4; +</sql-statement> +<sql-statement> +select '12345.05'::jsonb::int8; +</sql-statement> +<sql-statement> +select '12345.0000000000000000000000000000000000000000000005'::jsonb::numeric; +</sql-statement> +<sql-statement> +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float4; +</sql-statement> +<sql-statement> +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float8; +</sql-statement> +<sql-statement> +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int2; +</sql-statement> +<sql-statement> +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int4; +</sql-statement> +<sql-statement> +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int8; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/jsonb.out b/ydb/library/yql/tests/postgresql/cases/jsonb.out index 5efdd61737..26179b9018 100644 --- a/ydb/library/yql/tests/postgresql/cases/jsonb.out +++ b/ydb/library/yql/tests/postgresql/cases/jsonb.out @@ -294,3 +294,1813 @@ INSERT INTO test_jsonb VALUES ('scalar','"a scalar"'), ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::jsonb -> 'b'; + ?column? +---------- + null +(1 row) + +select '"foo"'::jsonb -> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::jsonb ->> 'b'; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb ->> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb ->> 'z'; + ?column? +---------- + +(1 row) + +-- equality and inequality +SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb; + ?column? +---------- + f +(1 row) + +SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb; + ?column? +---------- + f +(1 row) + +SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb; + ?column? +---------- + t +(1 row) + +-- containment +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); + jsonb_contains +---------------- + t +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":null}'); + jsonb_contains +---------------- + t +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "g":null}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"g":null}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"c"}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); + jsonb_contains +---------------- + t +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":"q"}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "g":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"g":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"c"}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":"q"}'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2]'::jsonb @> '[1,2,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,2]'::jsonb <@ '[1,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,2]'::jsonb <@ '[1,1,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[[1,2,2]]'::jsonb <@ '[[1,2]]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b", "c":null}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b", "g":null}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT jsonb_contained('{"g":null}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT jsonb_contained('{"a":"c"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b", "c":"q"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "c":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"c"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "c":"q"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +-- Raw scalar may contain another raw scalar, array may contain a raw scalar +SELECT '[5]'::jsonb @> '[5]'; + ?column? +---------- + t +(1 row) + +SELECT '5'::jsonb @> '5'; + ?column? +---------- + t +(1 row) + +SELECT '[5]'::jsonb @> '5'; + ?column? +---------- + t +(1 row) + +-- But a raw scalar cannot contain an array +SELECT '5'::jsonb @> '[5]'; + ?column? +---------- + f +(1 row) + +-- In general, one thing should always contain itself. Test array containment: +SELECT '["9", ["7", "3"], 1]'::jsonb @> '["9", ["7", "3"], 1]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '["9", ["7", "3"], ["1"]]'::jsonb @> '["9", ["7", "3"], ["1"]]'::jsonb; + ?column? +---------- + t +(1 row) + +-- array containment string matching confusion bug +SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::jsonb @> '{"tags":["qu"]}'; + ?column? +---------- + f +(1 row) + +-- array length +SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); + jsonb_array_length +-------------------- + 5 +(1 row) + +SELECT jsonb_array_length('[]'); + jsonb_array_length +-------------------- + 0 +(1 row) + +SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); +ERROR: cannot get array length of a non-array +SELECT jsonb_array_length('4'); +ERROR: cannot get array length of a scalar +SELECT * FROM jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+----------- + f1 | [1, 2, 3] + f2 | {"f3": 1} + f4 | null + f5 | 99 + f6 | "stringy" +(5 rows) + +SELECT * FROM jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + key | value +-----+------------------------------------ + 1 | "first" + a | {"1": "first", "b": "c", "c": "b"} + b | [1, 2] + c | "cc" + n | null +(5 rows) + +SELECT * FROM jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+----------- + f1 | [1, 2, 3] + f2 | {"f3": 1} + f4 | + f5 | 99 + f6 | stringy +(5 rows) + +SELECT * FROM jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + key | value +-----+------------------------------------ + 1 | first + a | {"1": "first", "b": "c", "c": "b"} + b | [1, 2] + c | cc + n | +(5 rows) + +-- exists +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'a'); + jsonb_exists +-------------- + t +(1 row) + +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'b'); + jsonb_exists +-------------- + t +(1 row) + +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'c'); + jsonb_exists +-------------- + f +(1 row) + +SELECT jsonb_exists('{"a":"null", "b":"qq"}', 'a'); + jsonb_exists +-------------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ? 'a'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ? 'b'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ? 'c'; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":"null", "b":"qq"}' ? 'a'; + ?column? +---------- + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']); + jsonb_exists_any +------------------ + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['b','a']); + jsonb_exists_any +------------------ + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','a']); + jsonb_exists_any +------------------ + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','d']); + jsonb_exists_any +------------------ + f +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', '{}'::text[]); + jsonb_exists_any +------------------ + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['a','b']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['b','a']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','a']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','d']; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| '{}'::text[]; + ?column? +---------- + f +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['a','b']); + jsonb_exists_all +------------------ + t +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['b','a']); + jsonb_exists_all +------------------ + t +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','a']); + jsonb_exists_all +------------------ + f +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','d']); + jsonb_exists_all +------------------ + f +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', '{}'::text[]); + jsonb_exists_all +------------------ + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','b']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['b','a']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','a']; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','d']; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','a', 'b', 'b', 'b']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& '{}'::text[]; + ?column? +---------- + t +(1 row) + +-- typeof +SELECT jsonb_typeof('{}') AS object; + object +-------- + object +(1 row) + +SELECT jsonb_typeof('{"c":3,"p":"o"}') AS object; + object +-------- + object +(1 row) + +SELECT jsonb_typeof('[]') AS array; + array +------- + array +(1 row) + +SELECT jsonb_typeof('["a", 1]') AS array; + array +------- + array +(1 row) + +SELECT jsonb_typeof('null') AS "null"; + null +------ + null +(1 row) + +SELECT jsonb_typeof('1') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('-1') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('1.0') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('1e2') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('-1.0') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('true') AS boolean; + boolean +--------- + boolean +(1 row) + +SELECT jsonb_typeof('false') AS boolean; + boolean +--------- + boolean +(1 row) + +SELECT jsonb_typeof('"hello"') AS string; + string +-------- + string +(1 row) + +SELECT jsonb_typeof('"true"') AS string; + string +-------- + string +(1 row) + +SELECT jsonb_typeof('"1.0"') AS string; + string +-------- + string +(1 row) + +-- empty objects/arrays +SELECT jsonb_build_array(); + jsonb_build_array +------------------- + [] +(1 row) + +SELECT jsonb_build_object(); + jsonb_build_object +-------------------- + {} +(1 row) + +-- handling of NULL values +SELECT jsonb_object_agg(1, NULL::jsonb); + jsonb_object_agg +------------------ + {"1": null} +(1 row) + +SELECT jsonb_object_agg(NULL, '{"a":1}'); +ERROR: field name must not be null +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT jsonb_object_agg(name, type) FROM foo; +ERROR: field name must not be null +-- jsonb_object +-- empty object, one dimension +SELECT jsonb_object('{}'); + jsonb_object +-------------- + {} +(1 row) + +-- empty object, two dimensions +SELECT jsonb_object('{}', '{}'); + jsonb_object +-------------- + {} +(1 row) + +-- one dimension +SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); + jsonb_object +--------------------------------------------------- + {"3": null, "a": "1", "b": "2", "d e f": "a b c"} +(1 row) + +-- same but with two dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + jsonb_object +--------------------------------------------------- + {"3": null, "a": "1", "b": "2", "d e f": "a b c"} +(1 row) + +-- odd number error +SELECT jsonb_object('{a,b,c}'); +ERROR: array must have even number of elements +-- one column error +SELECT jsonb_object('{{a},{b}}'); +ERROR: array must have two columns +-- too many columns error +SELECT jsonb_object('{{a,b,c},{b,c,d}}'); +ERROR: array must have two columns +-- too many dimensions error +SELECT jsonb_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +ERROR: wrong number of array subscripts +--two argument form of jsonb_object +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); + jsonb_object +-------------------------------------------------- + {"a": "1", "b": "2", "c": "3", "d e f": "a b c"} +(1 row) + +-- too many dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +ERROR: wrong number of array subscripts +-- mismatched dimensions +select jsonb_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +ERROR: mismatched array dimensions +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +ERROR: mismatched array dimensions +-- null key error +select jsonb_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +ERROR: null value not allowed for object key +-- empty key is allowed +select jsonb_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); + jsonb_object +------------------------------------------------- + {"": "3", "a": "1", "b": "2", "d e f": "a b c"} +(1 row) + +SELECT * FROM jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]') q; + value +---------------------------- + 1 + true + [1, [2, 3]] + null + {"f1": 1, "f2": [7, 8, 9]} + false +(6 rows) + +SELECT * FROM jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + value +---------------------------- + 1 + true + [1, [2, 3]] + + {"f1": 1, "f2": [7, 8, 9]} + false + stringy +(7 rows) + +-- test type info caching in jsonb_populate_record() +CREATE TEMP TABLE jsbpoptest (js jsonb); +INSERT INTO jsbpoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::jsonb +FROM generate_series(1, 3); +CREATE INDEX jidx ON testjsonb USING gin (j); +-- btree +CREATE INDEX jidx ON testjsonb USING btree (j); +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); +-- nested tests +SELECT '{"ff":{"a":12,"b":16}}'::jsonb; + jsonb +---------------------------- + {"ff": {"a": 12, "b": 16}} +(1 row) + +SELECT '{"ff":{"a":12,"b":16},"qq":123}'::jsonb; + jsonb +--------------------------------------- + {"ff": {"a": 12, "b": 16}, "qq": 123} +(1 row) + +SELECT '{"aa":["a","aaa"],"qq":{"a":12,"b":16,"c":["c1","c2"],"d":{"d1":"d1","d2":"d2","d1":"d3"}}}'::jsonb; + jsonb +-------------------------------------------------------------------------------------------------- + {"aa": ["a", "aaa"], "qq": {"a": 12, "b": 16, "c": ["c1", "c2"], "d": {"d1": "d3", "d2": "d2"}}} +(1 row) + +SELECT '{"ff":["a","aaa"]}'::jsonb; + jsonb +---------------------- + {"ff": ["a", "aaa"]} +(1 row) + +SELECT + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'ff', + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'qq', + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'Y') IS NULL AS f, + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb ->> 'Y') IS NULL AS t, + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'x'; + ?column? | ?column? | f | t | ?column? +--------------------+----------+---+---+---------- + {"a": 12, "b": 16} | 123 | f | t | [1, 2] +(1 row) + +-- nested containment +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[2,1],"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; + ?column? +---------- + f +(1 row) + +SELECT '["a","b"]'::jsonb @> '["a","b","c","b"]'; + ?column? +---------- + f +(1 row) + +SELECT '["a","b","c","b"]'::jsonb @> '["a","b"]'; + ?column? +---------- + t +(1 row) + +SELECT '["a","b","c",[1,2]]'::jsonb @> '["a",[1,2]]'; + ?column? +---------- + t +(1 row) + +SELECT '["a","b","c",[1,2]]'::jsonb @> '["b",[1,2]]'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[2]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[3]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"c":3}]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4}]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},3]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},1]}'; + ?column? +---------- + t +(1 row) + +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +insert into nestjsonb (j) values ('[[14,2,3]]'); +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +create index on nestjsonb using gin(j jsonb_path_ops); +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '{"c":3}'; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '[[14]]'; + j +----------------- + [[14, 2, 3]] + [1, [14, 2, 3]] +(2 rows) + +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '{"c":3}'; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '[[14]]'; + j +----------------- + [[14, 2, 3]] + [1, [14, 2, 3]] +(2 rows) + +-- nested object field / array index lookup +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'n'; + ?column? +---------- + null +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'a'; + ?column? +---------- + 1 +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'b'; + ?column? +---------- + [1, 2] +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'c'; + ?column? +---------- + {"1": 2} +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd'; + ?column? +--------------- + {"1": [2, 3]} +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd' -> '1'; + ?column? +---------- + [2, 3] +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'e'; + ?column? +---------- + +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 0; --expecting error + ?column? +---------- + +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 0; + ?column? +---------- + "a" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 1; + ?column? +---------- + "b" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 2; + ?column? +---------- + "c" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3; + ?column? +---------- + [1, 2] +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3 -> 1; + ?column? +---------- + 2 +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 4; + ?column? +---------- + null +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 5; + ?column? +---------- + +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> -1; + ?column? +---------- + null +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> -5; + ?column? +---------- + "a" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> -6; + ?column? +---------- + +(1 row) + +--nested exists +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'n'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'a'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'b'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'c'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'd'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'e'; + ?column? +---------- + f +(1 row) + +-- jsonb_strip_nulls +select jsonb_strip_nulls(null); + jsonb_strip_nulls +------------------- + +(1 row) + +select jsonb_strip_nulls('1'); + jsonb_strip_nulls +------------------- + 1 +(1 row) + +select jsonb_strip_nulls('"a string"'); + jsonb_strip_nulls +------------------- + "a string" +(1 row) + +select jsonb_strip_nulls('null'); + jsonb_strip_nulls +------------------- + null +(1 row) + +select jsonb_strip_nulls('[1,2,null,3,4]'); + jsonb_strip_nulls +-------------------- + [1, 2, null, 3, 4] +(1 row) + +select jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); + jsonb_strip_nulls +-------------------------------------------- + {"a": 1, "c": [2, null, 3], "d": {"e": 4}} +(1 row) + +select jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); + jsonb_strip_nulls +-------------------------- + [1, {"a": 1, "c": 2}, 3] +(1 row) + +-- an empty object is not null and should not be stripped +select jsonb_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); + jsonb_strip_nulls +-------------------- + {"a": {}, "d": {}} +(1 row) + +select jsonb_concat('{"d": "test", "a": [1, 2]}', '{"g": "test2", "c": {"c1":1, "c2":2}}'); + jsonb_concat +------------------------------------------------------------------- + {"a": [1, 2], "c": {"c1": 1, "c2": 2}, "d": "test", "g": "test2"} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; + ?column? +--------------------------------------------- + {"b": "g", "aa": 1, "cq": "l", "fg": false} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aq":"l"}'; + ?column? +--------------------------------------- + {"b": 2, "aa": 1, "aq": "l", "cq": 3} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aa":"l"}'; + ?column? +------------------------------ + {"b": 2, "aa": "l", "cq": 3} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{}'; + ?column? +---------------------------- + {"b": 2, "aa": 1, "cq": 3} +(1 row) + +select '["a", "b"]'::jsonb || '["c"]'; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '["a", "b"]'::jsonb || '["c", "d"]'; + ?column? +---------------------- + ["a", "b", "c", "d"] +(1 row) + +select '["c"]' || '["a", "b"]'::jsonb; + ?column? +----------------- + ["c", "a", "b"] +(1 row) + +select '["a", "b"]'::jsonb || '"c"'; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '"c"' || '["a", "b"]'::jsonb; + ?column? +----------------- + ["c", "a", "b"] +(1 row) + +select '[]'::jsonb || '["a"]'::jsonb; + ?column? +---------- + ["a"] +(1 row) + +select '[]'::jsonb || '"a"'::jsonb; + ?column? +---------- + ["a"] +(1 row) + +select '"b"'::jsonb || '"a"'::jsonb; + ?column? +------------ + ["b", "a"] +(1 row) + +select '{}'::jsonb || '{"a":"b"}'::jsonb; + ?column? +------------ + {"a": "b"} +(1 row) + +select '[]'::jsonb || '{"a":"b"}'::jsonb; + ?column? +-------------- + [{"a": "b"}] +(1 row) + +select '{"a":"b"}'::jsonb || '[]'::jsonb; + ?column? +-------------- + [{"a": "b"}] +(1 row) + +select '"a"'::jsonb || '{"a":1}'; + ?column? +----------------- + ["a", {"a": 1}] +(1 row) + +select '{"a":1}' || '"a"'::jsonb; + ?column? +----------------- + [{"a": 1}, "a"] +(1 row) + +select '[3]'::jsonb || '{}'::jsonb; + ?column? +---------- + [3, {}] +(1 row) + +select '3'::jsonb || '[]'::jsonb; + ?column? +---------- + [3] +(1 row) + +select '3'::jsonb || '4'::jsonb; + ?column? +---------- + [3, 4] +(1 row) + +select '3'::jsonb || '{}'::jsonb; + ?column? +---------- + [3, {}] +(1 row) + +select '["a", "b"]'::jsonb || '{"c":1}'; + ?column? +---------------------- + ["a", "b", {"c": 1}] +(1 row) + +select '{"c": 1}'::jsonb || '["a", "b"]'; + ?column? +---------------------- + [{"c": 1}, "a", "b"] +(1 row) + +select '{}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; + ?column? +------------------------------------ + {"b": "g", "cq": "l", "fg": false} +(1 row) + +select pg_column_size('{}'::jsonb || '{}'::jsonb) = pg_column_size('{}'::jsonb); + ?column? +---------- + t +(1 row) + +select pg_column_size('{"aa":1}'::jsonb || '{"b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select pg_column_size('{"aa":1, "b":2}'::jsonb || '{}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select pg_column_size('{}'::jsonb || '{"aa":1, "b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'a'); + jsonb_delete +------------------ + {"b": 2, "c": 3} +(1 row) + +select jsonb_delete('{"a":null , "b":2, "c":3}'::jsonb, 'a'); + jsonb_delete +------------------ + {"b": 2, "c": 3} +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'b'); + jsonb_delete +------------------ + {"a": 1, "c": 3} +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'c'); + jsonb_delete +------------------ + {"a": 1, "b": 2} +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'd'); + jsonb_delete +-------------------------- + {"a": 1, "b": 2, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'a'; + ?column? +------------------ + {"b": 2, "c": 3} +(1 row) + +select '{"a":null , "b":2, "c":3}'::jsonb - 'a'; + ?column? +------------------ + {"b": 2, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'b'; + ?column? +------------------ + {"a": 1, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'c'; + ?column? +------------------ + {"a": 1, "b": 2} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'd'; + ?column? +-------------------------- + {"a": 1, "b": 2, "c": 3} +(1 row) + +select pg_column_size('{"a":1 , "b":2, "c":3}'::jsonb - 'b') = pg_column_size('{"a":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select '["a","b","c"]'::jsonb - 3; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - 2; + ?column? +------------ + ["a", "b"] +(1 row) + +select '["a","b","c"]'::jsonb - 1; + ?column? +------------ + ["a", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - 0; + ?column? +------------ + ["b", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - -1; + ?column? +------------ + ["a", "b"] +(1 row) + +select '["a","b","c"]'::jsonb - -2; + ?column? +------------ + ["a", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - -3; + ?column? +------------ + ["b", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - -4; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{n}'); + jsonb_delete_path +---------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}} +(1 row) + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{b,-1}'); + jsonb_delete_path +------------------------------------------------------------------ + {"a": 1, "b": [1], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{d,1,0}'); + jsonb_delete_path +------------------------------------------------------------------ + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [3]}, "n": null} +(1 row) + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{n}'; + ?column? +---------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}} +(1 row) + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1}'; + ?column? +------------------------------------------------------------------ + {"a": 1, "b": [1], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript +ERROR: path element at position 2 is not an integer: "-1e" +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}'; + ?column? +------------------------------------------------------------------ + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [3]}, "n": null} +(1 row) + +-- empty structure and error conditions for delete and replace +select '"a"'::jsonb - 'a'; -- error +ERROR: cannot delete from scalar +select '{}'::jsonb - 'a'; + ?column? +---------- + {} +(1 row) + +select '[]'::jsonb - 'a'; + ?column? +---------- + [] +(1 row) + +select '"a"'::jsonb - 1; -- error +ERROR: cannot delete from scalar +select '{}'::jsonb - 1; -- error +ERROR: cannot delete from object using integer index +select '[]'::jsonb - 1; + ?column? +---------- + [] +(1 row) + +select '"a"'::jsonb #- '{a}'; -- error +ERROR: cannot delete path in scalar +select '{}'::jsonb #- '{a}'; + ?column? +---------- + {} +(1 row) + +select '[]'::jsonb #- '{a}'; + ?column? +---------- + [] +(1 row) + +select jsonb_set('{}','{a}','"b"', false); + jsonb_set +----------- + {} +(1 row) + +select jsonb_set('[]','{1}','"b"', false); + jsonb_set +----------- + [] +(1 row) + +select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0}','[2,3,4]', false); + jsonb_set +------------------------- + [[2, 3, 4], 2, null, 3] +(1 row) + +-- errors +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, null); +ERROR: null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception" +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); +ERROR: null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception" +\pset null '' +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, 1, "new_value", 2]} +(1 row) + +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"', true); + jsonb_insert +------------------------------------------------------------ + {"a": {"b": {"c": [0, 1, "test1", "new_value", "test2"]}}} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, "new_value", 1, 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, 1, 2, "new_value"]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, 1, 2, "new_value"]} +(1 row) + +select jsonb_insert('[]', '{1}', '"new_value"', true); + jsonb_insert +--------------- + ["new_value"] +(1 row) + +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"', true); + jsonb_insert +---------------------- + {"a": ["new_value"]} +(1 row) + +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"', true); + jsonb_insert +----------------------------------------- + {"a": {"b": "value", "c": "new_value"}} +(1 row) + +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); +ERROR: cannot replace existing key +HINT: Try using the function jsonb_set to replace key value. +create TEMP TABLE test_jsonb_subscript ( + id int, + test_json jsonb +); +insert into test_jsonb_subscript values +(1, '{}'), -- empty jsonb +(2, '{"key": "value"}'); -- jsonb with data +-- NULL as jsonb source +insert into test_jsonb_subscript values (3, NULL); +insert into test_jsonb_subscript values (1, '[0]'); +insert into test_jsonb_subscript values (1, '[]'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '{"b": 1}'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '[]'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '[]'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '{"a": {}}'); +insert into test_jsonb_subscript values (1, '{"a": []}'); +insert into test_jsonb_subscript values (1, '{"a": 1}'); +insert into test_jsonb_subscript values (1, 'null'); +-- casts +select 'true'::jsonb::bool; + bool +------ + t +(1 row) + +select '[]'::jsonb::bool; +ERROR: cannot cast jsonb array to type boolean +select '1.0'::jsonb::float; + float8 +-------- + 1 +(1 row) + +select '[1.0]'::jsonb::float; +ERROR: cannot cast jsonb array to type double precision +select '12345'::jsonb::int4; + int4 +------- + 12345 +(1 row) + +select '"hello"'::jsonb::int4; +ERROR: cannot cast jsonb string to type integer +select '12345'::jsonb::numeric; + numeric +--------- + 12345 +(1 row) + +select '{}'::jsonb::numeric; +ERROR: cannot cast jsonb object to type numeric +select '12345.05'::jsonb::numeric; + numeric +---------- + 12345.05 +(1 row) + +select '12345.05'::jsonb::float4; + float4 +---------- + 12345.05 +(1 row) + +select '12345.05'::jsonb::float8; + float8 +---------- + 12345.05 +(1 row) + +select '12345.05'::jsonb::int2; + int2 +------- + 12345 +(1 row) + +select '12345.05'::jsonb::int4; + int4 +------- + 12345 +(1 row) + +select '12345.05'::jsonb::int8; + int8 +------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::numeric; + numeric +------------------------------------------------------ + 12345.0000000000000000000000000000000000000000000005 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float4; + float4 +-------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float8; + float8 +-------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int2; + int2 +------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int4; + int4 +------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int8; + int8 +------- + 12345 +(1 row) + diff --git a/ydb/library/yql/tests/postgresql/cases/jsonb.sql b/ydb/library/yql/tests/postgresql/cases/jsonb.sql index b0ee569f64..845e2adbfc 100644 --- a/ydb/library/yql/tests/postgresql/cases/jsonb.sql +++ b/ydb/library/yql/tests/postgresql/cases/jsonb.sql @@ -74,3 +74,389 @@ INSERT INTO test_jsonb VALUES ('scalar','"a scalar"'), ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> ''; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z'; +select '{"a": "c", "b": null}'::jsonb -> 'b'; +select '"foo"'::jsonb -> 1; +select '"foo"'::jsonb -> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> ''; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z'; +select '{"a": "c", "b": null}'::jsonb ->> 'b'; +select '"foo"'::jsonb ->> 1; +select '"foo"'::jsonb ->> 'z'; +-- equality and inequality +SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb; +SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb; +SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb; +SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb; +-- containment +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":null}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "g":null}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"g":null}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"c"}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":"q"}'); +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":null}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "g":null}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"g":null}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"c"}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":"q"}'; +SELECT '[1,2]'::jsonb @> '[1,2,2]'::jsonb; +SELECT '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb; +SELECT '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb; +SELECT '[1,2,2]'::jsonb <@ '[1,2]'::jsonb; +SELECT '[1,2,2]'::jsonb <@ '[1,1,2]'::jsonb; +SELECT '[[1,2,2]]'::jsonb <@ '[[1,2]]'::jsonb; +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b", "c":null}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b", "g":null}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"g":null}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"c"}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b", "c":"q"}', '{"a":"b", "b":1, "c":null}'); +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b", "c":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b", "g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"c"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b", "c":"q"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +-- Raw scalar may contain another raw scalar, array may contain a raw scalar +SELECT '[5]'::jsonb @> '[5]'; +SELECT '5'::jsonb @> '5'; +SELECT '[5]'::jsonb @> '5'; +-- But a raw scalar cannot contain an array +SELECT '5'::jsonb @> '[5]'; +-- In general, one thing should always contain itself. Test array containment: +SELECT '["9", ["7", "3"], 1]'::jsonb @> '["9", ["7", "3"], 1]'::jsonb; +SELECT '["9", ["7", "3"], ["1"]]'::jsonb @> '["9", ["7", "3"], ["1"]]'::jsonb; +-- array containment string matching confusion bug +SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::jsonb @> '{"tags":["qu"]}'; +-- array length +SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); +SELECT jsonb_array_length('[]'); +SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); +SELECT jsonb_array_length('4'); +SELECT * FROM jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +SELECT * FROM jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +SELECT * FROM jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +SELECT * FROM jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +-- exists +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'a'); +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'b'); +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'c'); +SELECT jsonb_exists('{"a":"null", "b":"qq"}', 'a'); +SELECT jsonb '{"a":null, "b":"qq"}' ? 'a'; +SELECT jsonb '{"a":null, "b":"qq"}' ? 'b'; +SELECT jsonb '{"a":null, "b":"qq"}' ? 'c'; +SELECT jsonb '{"a":"null", "b":"qq"}' ? 'a'; +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['b','a']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','a']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','d']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', '{}'::text[]); +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['a','b']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['b','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','d']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| '{}'::text[]; +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['a','b']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['b','a']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','a']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','d']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', '{}'::text[]); +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','b']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['b','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','d']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','a', 'b', 'b', 'b']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& '{}'::text[]; +-- typeof +SELECT jsonb_typeof('{}') AS object; +SELECT jsonb_typeof('{"c":3,"p":"o"}') AS object; +SELECT jsonb_typeof('[]') AS array; +SELECT jsonb_typeof('["a", 1]') AS array; +SELECT jsonb_typeof('null') AS "null"; +SELECT jsonb_typeof('1') AS number; +SELECT jsonb_typeof('-1') AS number; +SELECT jsonb_typeof('1.0') AS number; +SELECT jsonb_typeof('1e2') AS number; +SELECT jsonb_typeof('-1.0') AS number; +SELECT jsonb_typeof('true') AS boolean; +SELECT jsonb_typeof('false') AS boolean; +SELECT jsonb_typeof('"hello"') AS string; +SELECT jsonb_typeof('"true"') AS string; +SELECT jsonb_typeof('"1.0"') AS string; +-- empty objects/arrays +SELECT jsonb_build_array(); +SELECT jsonb_build_object(); +-- handling of NULL values +SELECT jsonb_object_agg(1, NULL::jsonb); +SELECT jsonb_object_agg(NULL, '{"a":1}'); +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT jsonb_object_agg(name, type) FROM foo; +-- jsonb_object +-- empty object, one dimension +SELECT jsonb_object('{}'); +-- empty object, two dimensions +SELECT jsonb_object('{}', '{}'); +-- one dimension +SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); +-- same but with two dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +-- odd number error +SELECT jsonb_object('{a,b,c}'); +-- one column error +SELECT jsonb_object('{{a},{b}}'); +-- too many columns error +SELECT jsonb_object('{{a,b,c},{b,c,d}}'); +-- too many dimensions error +SELECT jsonb_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +--two argument form of jsonb_object +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); +-- too many dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +-- mismatched dimensions +select jsonb_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +-- null key error +select jsonb_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +-- empty key is allowed +select jsonb_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); +SELECT * FROM jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]') q; +SELECT * FROM jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +-- test type info caching in jsonb_populate_record() +CREATE TEMP TABLE jsbpoptest (js jsonb); +INSERT INTO jsbpoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::jsonb +FROM generate_series(1, 3); +CREATE INDEX jidx ON testjsonb USING gin (j); +-- btree +CREATE INDEX jidx ON testjsonb USING btree (j); +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); +-- nested tests +SELECT '{"ff":{"a":12,"b":16}}'::jsonb; +SELECT '{"ff":{"a":12,"b":16},"qq":123}'::jsonb; +SELECT '{"aa":["a","aaa"],"qq":{"a":12,"b":16,"c":["c1","c2"],"d":{"d1":"d1","d2":"d2","d1":"d3"}}}'::jsonb; +SELECT '{"ff":["a","aaa"]}'::jsonb; +SELECT + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'ff', + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'qq', + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'Y') IS NULL AS f, + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb ->> 'Y') IS NULL AS t, + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'x'; +-- nested containment +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":[2,1],"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; +SELECT '["a","b"]'::jsonb @> '["a","b","c","b"]'; +SELECT '["a","b","c","b"]'::jsonb @> '["a","b"]'; +SELECT '["a","b","c",[1,2]]'::jsonb @> '["a",[1,2]]'; +SELECT '["a","b","c",[1,2]]'::jsonb @> '["b",[1,2]]'; +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1]}'; +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[2]}'; +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[3]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"c":3}]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4}]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},3]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},1]}'; +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +insert into nestjsonb (j) values ('[[14,2,3]]'); +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +create index on nestjsonb using gin(j jsonb_path_ops); +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +select * from nestjsonb where j @> '{"c":3}'; +select * from nestjsonb where j @> '[[14]]'; +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +select * from nestjsonb where j @> '{"c":3}'; +select * from nestjsonb where j @> '[[14]]'; +-- nested object field / array index lookup +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'n'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'a'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'b'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'c'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd' -> '1'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'e'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 0; --expecting error +SELECT '["a","b","c",[1,2],null]'::jsonb -> 0; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 1; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 2; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3 -> 1; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 4; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 5; +SELECT '["a","b","c",[1,2],null]'::jsonb -> -1; +SELECT '["a","b","c",[1,2],null]'::jsonb -> -5; +SELECT '["a","b","c",[1,2],null]'::jsonb -> -6; +--nested exists +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'n'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'a'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'b'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'c'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'd'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'e'; +-- jsonb_strip_nulls +select jsonb_strip_nulls(null); +select jsonb_strip_nulls('1'); +select jsonb_strip_nulls('"a string"'); +select jsonb_strip_nulls('null'); +select jsonb_strip_nulls('[1,2,null,3,4]'); +select jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); +select jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); +-- an empty object is not null and should not be stripped +select jsonb_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); +select jsonb_concat('{"d": "test", "a": [1, 2]}', '{"g": "test2", "c": {"c1":1, "c2":2}}'); +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aq":"l"}'; +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aa":"l"}'; +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{}'; +select '["a", "b"]'::jsonb || '["c"]'; +select '["a", "b"]'::jsonb || '["c", "d"]'; +select '["c"]' || '["a", "b"]'::jsonb; +select '["a", "b"]'::jsonb || '"c"'; +select '"c"' || '["a", "b"]'::jsonb; +select '[]'::jsonb || '["a"]'::jsonb; +select '[]'::jsonb || '"a"'::jsonb; +select '"b"'::jsonb || '"a"'::jsonb; +select '{}'::jsonb || '{"a":"b"}'::jsonb; +select '[]'::jsonb || '{"a":"b"}'::jsonb; +select '{"a":"b"}'::jsonb || '[]'::jsonb; +select '"a"'::jsonb || '{"a":1}'; +select '{"a":1}' || '"a"'::jsonb; +select '[3]'::jsonb || '{}'::jsonb; +select '3'::jsonb || '[]'::jsonb; +select '3'::jsonb || '4'::jsonb; +select '3'::jsonb || '{}'::jsonb; +select '["a", "b"]'::jsonb || '{"c":1}'; +select '{"c": 1}'::jsonb || '["a", "b"]'; +select '{}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; +select pg_column_size('{}'::jsonb || '{}'::jsonb) = pg_column_size('{}'::jsonb); +select pg_column_size('{"aa":1}'::jsonb || '{"b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +select pg_column_size('{"aa":1, "b":2}'::jsonb || '{}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +select pg_column_size('{}'::jsonb || '{"aa":1, "b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'a'); +select jsonb_delete('{"a":null , "b":2, "c":3}'::jsonb, 'a'); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'b'); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'c'); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'd'); +select '{"a":1 , "b":2, "c":3}'::jsonb - 'a'; +select '{"a":null , "b":2, "c":3}'::jsonb - 'a'; +select '{"a":1 , "b":2, "c":3}'::jsonb - 'b'; +select '{"a":1 , "b":2, "c":3}'::jsonb - 'c'; +select '{"a":1 , "b":2, "c":3}'::jsonb - 'd'; +select pg_column_size('{"a":1 , "b":2, "c":3}'::jsonb - 'b') = pg_column_size('{"a":1, "b":2}'::jsonb); +select '["a","b","c"]'::jsonb - 3; +select '["a","b","c"]'::jsonb - 2; +select '["a","b","c"]'::jsonb - 1; +select '["a","b","c"]'::jsonb - 0; +select '["a","b","c"]'::jsonb - -1; +select '["a","b","c"]'::jsonb - -2; +select '["a","b","c"]'::jsonb - -3; +select '["a","b","c"]'::jsonb - -4; +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{n}'); +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{b,-1}'); +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{d,1,0}'); +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{n}'; +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1}'; +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}'; +-- empty structure and error conditions for delete and replace +select '"a"'::jsonb - 'a'; -- error +select '{}'::jsonb - 'a'; +select '[]'::jsonb - 'a'; +select '"a"'::jsonb - 1; -- error +select '{}'::jsonb - 1; -- error +select '[]'::jsonb - 1; +select '"a"'::jsonb #- '{a}'; -- error +select '{}'::jsonb #- '{a}'; +select '[]'::jsonb #- '{a}'; +select jsonb_set('{}','{a}','"b"', false); +select jsonb_set('[]','{1}','"b"', false); +select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0}','[2,3,4]', false); +-- errors +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, null); +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); +\pset null '' +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true); +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"', true); +select jsonb_insert('[]', '{1}', '"new_value"', true); +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"', true); +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"', true); +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); +create TEMP TABLE test_jsonb_subscript ( + id int, + test_json jsonb +); +insert into test_jsonb_subscript values +(1, '{}'), -- empty jsonb +(2, '{"key": "value"}'); -- jsonb with data +-- NULL as jsonb source +insert into test_jsonb_subscript values (3, NULL); +insert into test_jsonb_subscript values (1, '[0]'); +insert into test_jsonb_subscript values (1, '[]'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '{"b": 1}'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '[]'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '[]'); +insert into test_jsonb_subscript values (1, '{}'); +insert into test_jsonb_subscript values (1, '{"a": {}}'); +insert into test_jsonb_subscript values (1, '{"a": []}'); +insert into test_jsonb_subscript values (1, '{"a": 1}'); +insert into test_jsonb_subscript values (1, 'null'); +-- casts +select 'true'::jsonb::bool; +select '[]'::jsonb::bool; +select '1.0'::jsonb::float; +select '[1.0]'::jsonb::float; +select '12345'::jsonb::int4; +select '"hello"'::jsonb::int4; +select '12345'::jsonb::numeric; +select '{}'::jsonb::numeric; +select '12345.05'::jsonb::numeric; +select '12345.05'::jsonb::float4; +select '12345.05'::jsonb::float8; +select '12345.05'::jsonb::int2; +select '12345.05'::jsonb::int4; +select '12345.05'::jsonb::int8; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::numeric; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float4; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float8; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int2; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int4; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int8; diff --git a/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.err b/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.err index ac8e47f3f4..d1775f328f 100644 --- a/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.err +++ b/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.err @@ -16,17 +16,3242 @@ select jsonb '{"a": 12}' @? '$.a + 2'; <sql-statement> select jsonb '{"a": 12}' @? '$.b + 2'; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FDC84429D90) -__libc_start_main+128 (0x7FDC84429E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +select jsonb '{"a": {"a": 12}}' @? '$.a.a'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"a": 12}}' @? '$.*.a'; +</sql-statement> +<sql-statement> +select jsonb '{"b": {"a": 12}}' @? '$.*.a'; +</sql-statement> +<sql-statement> +select jsonb '{"b": {"a": 12}}' @? '$.*.b'; +</sql-statement> +<sql-statement> +select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b'; +</sql-statement> +<sql-statement> +select jsonb '{}' @? '$.*'; +</sql-statement> +<sql-statement> +select jsonb '{"a": 1}' @? '$.*'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}'; +</sql-statement> +<sql-statement> +select jsonb '[]' @? '$[*]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? '$[*]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? '$[1]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? 'strict $[1]'; +</sql-statement> +<sql-statement> +select jsonb_path_query('[1]', 'strict $[1]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', 'strict $[1]'); + ^ +<sql-statement> +select jsonb_path_query('[1]', 'strict $[1]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', 'strict $[1]', silent => true); + ^ +<sql-statement> +select jsonb '[1]' @? 'lax $[10000000000000000]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? 'strict $[10000000000000000]'; +</sql-statement> +<sql-statement> +select jsonb_path_query('[1]', 'lax $[10000000000000000]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', 'lax $[10000000000000000]'); + ^ +<sql-statement> +select jsonb_path_query('[1]', 'strict $[10000000000000000]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', 'strict $[10000000000000000]'); + ^ +<sql-statement> +select jsonb '[1]' @? '$[0]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? '$[0.3]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? '$[0.5]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? '$[0.9]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? '$[1.2]'; +</sql-statement> +<sql-statement> +select jsonb '[1]' @? 'strict $[1.2]'; +</sql-statement> +<sql-statement> +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])'; +</sql-statement> +<sql-statement> +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])'; +</sql-statement> +<sql-statement> +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])'; +</sql-statement> +<sql-statement> +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])'; +</sql-statement> +<sql-statement> +select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])'; +</sql-statement> +<sql-statement> +select jsonb '1' @? '$ ? ((@ == "1") is unknown)'; +</sql-statement> +<sql-statement> +select jsonb '1' @? '$ ? ((@ == 1) is unknown)'; +</sql-statement> +<sql-statement> +select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)'; +</sql-statement> +<sql-statement> +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => false); + ^ +<sql-statement> +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => true); + ^ +<sql-statement> +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => false); + ^ +<sql-statement> +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => true); + ^ +<sql-statement> +select jsonb_path_query('1', 'lax $.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'lax $.a'); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $.a'); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $.*'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $.*'); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $.a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $.a', silent => true); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $.*', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $.*', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[]', 'lax $.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'lax $.a'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $.a'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $.a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $.a', silent => true); + ^ +<sql-statement> +select jsonb_path_query('{}', 'lax $.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', 'lax $.a'); + ^ +<sql-statement> +select jsonb_path_query('{}', 'strict $.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', 'strict $.a'); + ^ +<sql-statement> +select jsonb_path_query('{}', 'strict $.a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', 'strict $.a', silent => true); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $[1]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $[1]'); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $[*]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $[*]'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $[1]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $[1]'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $["a"]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $["a"]'); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $[1]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $[1]', silent => true); + ^ +<sql-statement> +select jsonb_path_query('1', 'strict $[*]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'strict $[*]', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $[1]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $[1]', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $["a"]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $["a"]', silent => true); + ^ +<sql-statement> +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.a'); + ^ +<sql-statement> +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.b'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.b'); + ^ +<sql-statement> +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.*'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.*'); + ^ +<sql-statement> +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', 'lax $.*.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 12, "b": {"a": 13}}', 'lax $.*.a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].*'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].*'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[1].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[1].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[2].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[2].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0,1].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0,1].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10 / 0].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10 / 0].a'); + ^ +<sql-statement> +select jsonb_path_query('[12, {"a": 13}, {"b": 14}, "ccc", true]', '$[2.5 - 1 to $.size() - 2]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[12, {"a": 13}, {"b": 14}, "ccc", true]', '$[2.5 - 1 to $.size() - 2]'); + ^ +<sql-statement> +select jsonb_path_query('1', 'lax $[0]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'lax $[0]'); + ^ +<sql-statement> +select jsonb_path_query('1', 'lax $[*]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', 'lax $[*]'); + ^ +<sql-statement> +select jsonb_path_query('[1]', 'lax $[0]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', 'lax $[0]'); + ^ +<sql-statement> +select jsonb_path_query('[1]', 'lax $[*]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', 'lax $[*]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', 'lax $[*]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', 'lax $[*]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', 'strict $[*].a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', 'strict $[*].a'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', 'strict $[*].a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', 'strict $[*].a', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[]', '$[last]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', '$[last]'); + ^ +<sql-statement> +select jsonb_path_query('[]', '$[last ? (exists(last))]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', '$[last ? (exists(last))]'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $[last]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $[last]'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $[last]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $[last]', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[1]', '$[last]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1]', '$[last]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', '$[last]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', '$[last]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', '$[last - 1]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', '$[last - 1]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "number")]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "number")]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]', silent => true); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$'); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)'); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1'); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]'); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}'); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}'); + ^ +<sql-statement> +select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}'); + ^ +<sql-statement> +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}'); + ^ +<sql-statement> +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}'); + ^ +<sql-statement> +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}'); + ^ +<sql-statement> +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")'); + ^ +<sql-statement> +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}'); + ^ +<sql-statement> +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown,unknown) + select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}'); + ^ +<sql-statement> +select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)'); + ^ +<sql-statement> +select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)'); + ^ +<sql-statement> +select * from jsonb_path_query('{}', '$ ? (@ == @)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('{}', '$ ? (@ == @)'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('{}', '$ ? (@ == @)'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('{}', '$ ? (@ == @)'); + ^ +<sql-statement> +select * from jsonb_path_query('[]', 'strict $ ? (@ == @)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select * from jsonb_path_query('[]', 'strict $ ? (@ == @)'); + ^ + -stdin-:<main>:1:15: Error: At function: PgCall + select * from jsonb_path_query('[]', 'strict $ ? (@ == @)'); + ^ + -stdin-:<main>:1:15: Error: Unable to find an overload for proc jsonb_path_query with given argument types: (unknown,unknown) + select * from jsonb_path_query('[]', 'strict $ ? (@ == @)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2 to last}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2 to last}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{3 to last}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{3 to last}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{last}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{last}'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0 to last}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0 to last}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to last}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to last}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{2 to 3}.b ? (@ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{2 to 3}.b ? (@ > 0)'); + ^ +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)'; +</sql-statement> +<sql-statement> +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.y))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.y))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x ? (@ >= 2) ))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x ? (@ >= 2) ))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x + "3"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x + "3"))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? ((exists (@.x + "3")) is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? ((exists (@.x + "3")) is unknown)'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? (exists (@.x))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? (exists (@.x))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? ((exists (@.x)) is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? ((exists (@.x)) is unknown)'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? (exists (@[*].x))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? (exists (@[*].x))'); + ^ +<sql-statement> +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? ((exists (@[*].x)) is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? ((exists (@[*].x)) is unknown)'); + ^ +<sql-statement> +--test ternary logic +select + x, y, + jsonb_path_query( + '[true, false, null]', + '$[*] ? (@ == true && ($x == true && $y == true) || + @ == false && !($x == true && $y == true) || + @ == null && ($x == true && $y == true) is unknown)', + jsonb_build_object('x', x, 'y', y) + ) as "x && y" +from + (values (jsonb 'true'), ('false'), ('"null"')) x(x), + (values (jsonb 'true'), ('false'), ('"null"')) y(y); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:2: Error: Generator functions are not allowed in: SELECT + jsonb_path_query( + ^ +<sql-statement> +select + x, y, + jsonb_path_query( + '[true, false, null]', + '$[*] ? (@ == true && ($x == true || $y == true) || + @ == false && !($x == true || $y == true) || + @ == null && ($x == true || $y == true) is unknown)', + jsonb_build_object('x', x, 'y', y) + ) as "x || y" +from + (values (jsonb 'true'), ('false'), ('"null"')) x(x), + (values (jsonb 'true'), ('false'), ('"null"')) y(y); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:2: Error: Generator functions are not allowed in: SELECT + jsonb_path_query( + ^ +<sql-statement> +select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)'; +</sql-statement> +<sql-statement> +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == 1 + 1)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == 1 + 1)'); + ^ +<sql-statement> +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (1 + 1))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (1 + 1))'); + ^ +<sql-statement> +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == @.b + 1)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == @.b + 1)'); + ^ +<sql-statement> +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (@.b + 1))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (@.b + 1))'); + ^ +<sql-statement> +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)'; +</sql-statement> +<sql-statement> +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)'; +</sql-statement> +<sql-statement> +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)'; +</sql-statement> +<sql-statement> +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)'; +</sql-statement> +<sql-statement> +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)'; +</sql-statement> +<sql-statement> +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)'; +</sql-statement> +<sql-statement> +select jsonb '1' @? '$ ? ($ > 0)'; +</sql-statement> +<sql-statement> +-- arithmetic errors +select jsonb_path_query('[1,2,0,3]', '$[*] ? (2 / @ > 0)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,0,3]', '$[*] ? (2 / @ > 0)'); + ^ +<sql-statement> +select jsonb_path_query('[1,2,0,3]', '$[*] ? ((2 / @ > 0) is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,2,0,3]', '$[*] ? ((2 / @ > 0) is unknown)'); + ^ +<sql-statement> +select jsonb_path_query('0', '1 / $'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('0', '1 / $'); + ^ +<sql-statement> +select jsonb_path_query('0', '1 / $ + 2'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('0', '1 / $ + 2'); + ^ +<sql-statement> +select jsonb_path_query('0', '-(3 + 1 % $)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('0', '-(3 + 1 % $)'); + ^ +<sql-statement> +select jsonb_path_query('1', '$ + "2"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', '$ + "2"'); + ^ +<sql-statement> +select jsonb_path_query('[1, 2]', '3 * $'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1, 2]', '3 * $'); + ^ +<sql-statement> +select jsonb_path_query('"a"', '-$'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"a"', '-$'); + ^ +<sql-statement> +select jsonb_path_query('[1,"2",3]', '+$'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,"2",3]', '+$'); + ^ +<sql-statement> +select jsonb_path_query('1', '$ + "2"', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', '$ + "2"', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[1, 2]', '3 * $', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1, 2]', '3 * $', silent => true); + ^ +<sql-statement> +select jsonb_path_query('"a"', '-$', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"a"', '-$', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[1,"2",3]', '+$', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,"2",3]', '+$', silent => true); + ^ +<sql-statement> +select jsonb '["1",2,0,3]' @? '-$[*]'; +</sql-statement> +<sql-statement> +select jsonb '[1,"2",0,3]' @? '-$[*]'; +</sql-statement> +<sql-statement> +select jsonb '["1",2,0,3]' @? 'strict -$[*]'; +</sql-statement> +<sql-statement> +select jsonb '[1,"2",0,3]' @? 'strict -$[*]'; +</sql-statement> +<sql-statement> +-- unwrapping of operator arguments in lax mode +select jsonb_path_query('{"a": [2]}', 'lax $.a * 3'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": [2]}', 'lax $.a * 3'); + ^ +<sql-statement> +select jsonb_path_query('{"a": [2]}', 'lax $.a + 3'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": [2]}', 'lax $.a + 3'); + ^ +<sql-statement> +select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a'); + ^ +<sql-statement> +-- should fail +select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3'); + ^ +<sql-statement> +select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true); + ^ +<sql-statement> +-- extension: boolean expressions +select jsonb_path_query('2', '$ > 1'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('2', '$ > 1'); + ^ +<sql-statement> +select jsonb_path_query('2', '$ <= 1'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('2', '$ <= 1'); + ^ +<sql-statement> +select jsonb_path_query('2', '$ == "2"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('2', '$ == "2"'); + ^ +<sql-statement> +select jsonb '2' @? '$ == "2"'; +</sql-statement> +<sql-statement> +select jsonb '2' @@ '$ > 1'; +</sql-statement> +<sql-statement> +select jsonb '2' @@ '$ <= 1'; +</sql-statement> +<sql-statement> +select jsonb '2' @@ '$ == "2"'; +</sql-statement> +<sql-statement> +select jsonb '2' @@ '1'; +</sql-statement> +<sql-statement> +select jsonb '{}' @@ '$'; +</sql-statement> +<sql-statement> +select jsonb '[]' @@ '$'; +</sql-statement> +<sql-statement> +select jsonb '[1,2,3]' @@ '$[*]'; +</sql-statement> +<sql-statement> +select jsonb '[]' @@ '$[*]'; +</sql-statement> +<sql-statement> +select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_match with given argument types: (unknown,unknown,unknown) + select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}'); + ^ +<sql-statement> +select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_match with given argument types: (unknown,unknown,unknown) + select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}'); + ^ +<sql-statement> +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => false); + ^ +<sql-statement> +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => true); + ^ +<sql-statement> +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => false); + ^ +<sql-statement> +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[null,1,true,"a",[],{}]', '$.type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null,1,true,"a",[],{}]', '$.type()'); + ^ +<sql-statement> +select jsonb_path_query('[null,1,true,"a",[],{}]', 'lax $.type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null,1,true,"a",[],{}]', 'lax $.type()'); + ^ +<sql-statement> +select jsonb_path_query('[null,1,true,"a",[],{}]', '$[*].type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null,1,true,"a",[],{}]', '$[*].type()'); + ^ +<sql-statement> +select jsonb_path_query('null', 'null.type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', 'null.type()'); + ^ +<sql-statement> +select jsonb_path_query('null', 'true.type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', 'true.type()'); + ^ +<sql-statement> +select jsonb_path_query('null', '(123).type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', '(123).type()'); + ^ +<sql-statement> +select jsonb_path_query('null', '"123".type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', '"123".type()'); + ^ +<sql-statement> +select jsonb_path_query('{"a": 2}', '($.a - 5).abs() + 10'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 2}', '($.a - 5).abs() + 10'); + ^ +<sql-statement> +select jsonb_path_query('{"a": 2.5}', '-($.a * $.a).floor() % 4.3'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 2.5}', '-($.a * $.a).floor() % 4.3'); + ^ +<sql-statement> +select jsonb_path_query('[1, 2, 3]', '($[*] > 2) ? (@ == true)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1, 2, 3]', '($[*] > 2) ? (@ == true)'); + ^ +<sql-statement> +select jsonb_path_query('[1, 2, 3]', '($[*] > 3).type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1, 2, 3]', '($[*] > 3).type()'); + ^ +<sql-statement> +select jsonb_path_query('[1, 2, 3]', '($[*].a > 3).type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1, 2, 3]', '($[*].a > 3).type()'); + ^ +<sql-statement> +select jsonb_path_query('[1, 2, 3]', 'strict ($[*].a > 3).type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1, 2, 3]', 'strict ($[*].a > 3).type()'); + ^ +<sql-statement> +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()'); + ^ +<sql-statement> +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'lax $[*].size()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'lax $[*].size()'); + ^ +<sql-statement> +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].abs()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].abs()'); + ^ +<sql-statement> +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].floor()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].floor()'); + ^ +<sql-statement> +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling()'); + ^ +<sql-statement> +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs()'); + ^ +<sql-statement> +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs().type()'); + ^ +<sql-statement> +select jsonb_path_query('[{},1]', '$[*].keyvalue()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[{},1]', '$[*].keyvalue()'); + ^ +<sql-statement> +select jsonb_path_query('[{},1]', '$[*].keyvalue()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[{},1]', '$[*].keyvalue()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('{}', '$.keyvalue()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', '$.keyvalue()'); + ^ +<sql-statement> +select jsonb_path_query('{"a": 1, "b": [1, 2], "c": {"a": "bbb"}}', '$.keyvalue()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{"a": 1, "b": [1, 2], "c": {"a": "bbb"}}', '$.keyvalue()'); + ^ +<sql-statement> +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', '$[*].keyvalue()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', '$[*].keyvalue()'); + ^ +<sql-statement> +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue()'); + ^ +<sql-statement> +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'lax $.keyvalue()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'lax $.keyvalue()'); + ^ +<sql-statement> +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue().a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue().a'); + ^ +<sql-statement> +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()'; +</sql-statement> +<sql-statement> +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key'; +</sql-statement> +<sql-statement> +select jsonb_path_query('null', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('true', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('true', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('null', '$.double()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', '$.double()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('true', '$.double()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('true', '$.double()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('[]', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $.double()'); + ^ +<sql-statement> +select jsonb_path_query('{}', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $.double()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $.double()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('{}', '$.double()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', '$.double()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('1.23', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1.23', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"1.23"', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"1.23"', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"1.23aaa"', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"1.23aaa"', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('1e1000', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1e1000', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"nan"', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"nan"', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"NaN"', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"NaN"', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"inf"', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"inf"', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"-inf"', '$.double()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"-inf"', '$.double()'); + ^ +<sql-statement> +select jsonb_path_query('"inf"', '$.double()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"inf"', '$.double()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('"-inf"', '$.double()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"-inf"', '$.double()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('{}', '$.abs()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', '$.abs()'); + ^ +<sql-statement> +select jsonb_path_query('true', '$.floor()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('true', '$.floor()'); + ^ +<sql-statement> +select jsonb_path_query('"1.2"', '$.ceiling()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"1.2"', '$.ceiling()'); + ^ +<sql-statement> +select jsonb_path_query('{}', '$.abs()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', '$.abs()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('true', '$.floor()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('true', '$.floor()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('"1.2"', '$.ceiling()', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"1.2"', '$.ceiling()', silent => true); + ^ +<sql-statement> +select jsonb_path_query('["", "a", "abc", "abcabc"]', '$[*] ? (@ starts with "abc")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('["", "a", "abc", "abcabc"]', '$[*] ? (@ starts with "abc")'); + ^ +<sql-statement> +select jsonb_path_query('["", "a", "abc", "abcabc"]', 'strict $ ? (@[*] starts with "abc")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('["", "a", "abc", "abcabc"]', 'strict $ ? (@[*] starts with "abc")'); + ^ +<sql-statement> +select jsonb_path_query('["", "a", "abd", "abdabc"]', 'strict $ ? (@[*] starts with "abc")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('["", "a", "abd", "abdabc"]', 'strict $ ? (@[*] starts with "abc")'); + ^ +<sql-statement> +select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? (@[*] starts with "abc")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? (@[*] starts with "abc")'); + ^ +<sql-statement> +select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? ((@[*] starts with "abc") is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? ((@[*] starts with "abc") is unknown)'); + ^ +<sql-statement> +select jsonb_path_query('[[null, 1, "abc", "abcabc"]]', 'lax $ ? (@[*] starts with "abc")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[[null, 1, "abc", "abcabc"]]', 'lax $ ? (@[*] starts with "abc")'); + ^ +<sql-statement> +select jsonb_path_query('[[null, 1, "abd", "abdabc"]]', 'lax $ ? ((@[*] starts with "abc") is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[[null, 1, "abd", "abdabc"]]', 'lax $ ? ((@[*] starts with "abc") is unknown)'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "abd", "abdabc"]', 'lax $[*] ? ((@ starts with "abc") is unknown)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "abd", "abdabc"]', 'lax $[*] ? ((@ starts with "abc") is unknown)'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "i")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "i")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "m")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "m")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "s")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "s")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "q")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "q")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "q")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "q")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "q")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "q")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "iq")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "iq")'); + ^ +<sql-statement> +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "")'); + ^ +<sql-statement> +select jsonb_path_query('null', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('null', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('true', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('true', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('1', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('1', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('[]', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('[]', 'strict $.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('[]', 'strict $.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('{}', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('{}', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"bogus"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"bogus"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34"', '$.datetime("aaa")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34"', '$.datetime("aaa")'); + ^ +<sql-statement> +select jsonb_path_query('"aaaa"', '$.datetime("HH24")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"aaaa"', '$.datetime("HH24")'); + ^ +<sql-statement> +select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")'; +</sql-statement> +<sql-statement> +select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy").type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy").type()'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy").type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy").type()'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', ' $.datetime("dd-mm-yyyy HH24:MI").type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', ' $.datetime("dd-mm-yyyy HH24:MI").type()'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM").type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM").type()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56"', '$.datetime("HH24:MI:SS").type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56"', '$.datetime("HH24:MI:SS").type()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56 +05:20"', '$.datetime("HH24:MI:SS TZH:TZM").type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56 +05:20"', '$.datetime("HH24:MI:SS TZH:TZM").type()'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); + ^ +<sql-statement> +set time zone '+00'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + set time zone '+00'; + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); + ^ +<sql-statement> +set time zone '+10'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + set time zone '+10'; + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + ^ +<sql-statement> +select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); + ^ +<sql-statement> +select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); + ^ +<sql-statement> +set time zone default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 1 + set time zone default; + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10T12:34:56+3:10"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10T12:34:56+3:10"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56+3"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56+3"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56+3"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56+3"', '$.datetime()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56+3:10"', '$.datetime().type()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56+3:10"', '$.datetime().type()'); + ^ +<sql-statement> +select jsonb_path_query('"12:34:56+3:10"', '$.datetime()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"12:34:56+3:10"', '$.datetime()'); + ^ +<sql-statement> +set time zone '+00'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + set time zone '+00'; + ^ +<sql-statement> +-- date comparison +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +-- time comparison +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +-- timetz comparison +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +-- timestamp comparison +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +-- timestamptz comparison +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query_tz( + ^ +<sql-statement> +-- overflow during comparison +select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath); + ^ +<sql-statement> +set time zone default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 1 + set time zone default; + ^ +<sql-statement> +-- jsonpath operators +SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*]'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*]'); + ^ +<sql-statement> +SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*] ? (@.a > 10)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*] ? (@.a > 10)'); + ^ +<sql-statement> +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_array with given argument types: (unknown,unknown) + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); + ^ +<sql-statement> +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_array with given argument types: (unknown,unknown) + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a'); + ^ +<sql-statement> +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_array with given argument types: (unknown,unknown) + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + ^ +<sql-statement> +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_array with given argument types: (unknown,unknown) + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + ^ +<sql-statement> +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); + ^ +<sql-statement> +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_first with given argument types: (unknown,unknown) + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a', silent => true); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_first with given argument types: (unknown,unknown) + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a'); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_first with given argument types: (unknown,unknown) + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_query_first with given argument types: (unknown,unknown) + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); + ^ +<sql-statement> +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); + ^ +<sql-statement> +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)'; +</sql-statement> +<sql-statement> +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)'; +</sql-statement> +<sql-statement> +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_exists with given argument types: (unknown,unknown) + SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)'); + ^ +<sql-statement> +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 1, "max": 4}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 1, "max": 4}'); + ^ +<sql-statement> +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 3, "max": 4}'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 3, "max": 4}'); + ^ +<sql-statement> +SELECT jsonb_path_match('true', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('true', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('false', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('false', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('null', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('null', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('1', '$', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('1', '$', silent => true); + ^ +<sql-statement> +SELECT jsonb_path_match('1', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('1', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('"a"', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('"a"', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('{}', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('{}', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('[true]', '$', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('[true]', '$', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('{}', 'lax $.a', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('{}', 'lax $.a', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('{}', 'strict $.a', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('{}', 'strict $.a', silent => false); + ^ +<sql-statement> +SELECT jsonb_path_match('{}', 'strict $.a', silent => true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('{}', 'strict $.a', silent => true); + ^ +<sql-statement> +SELECT jsonb_path_match('[true, true]', '$[*]', silent => false); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT jsonb_path_match('[true, true]', '$[*]', silent => false); + ^ +<sql-statement> +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1'; +</sql-statement> +<sql-statement> +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2'; +</sql-statement> +<sql-statement> +SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc jsonb_path_match with given argument types: (unknown,unknown) + SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1'); + ^ +<sql-statement> +-- test string comparison (Unicode codepoint collation) +WITH str(j, num) AS + SELECT jsonb_build_object('s', s), num + FROM unnest('{"", "a", "ab", "abc", "abcd", "b", "A", "AB", "ABC", "ABc", "ABcD", "B"}'::text[]) WITH ORDINALITY AS a(s, num) +SELECT + s1.j, s2.j, + jsonb_path_query_first(s1.j, '$.s < $s', vars => s2.j) lt, + jsonb_path_query_first(s1.j, '$.s <= $s', vars => s2.j) le, + jsonb_path_query_first(s1.j, '$.s == $s', vars => s2.j) eq, + jsonb_path_query_first(s1.j, '$.s >= $s', vars => s2.j) ge, + jsonb_path_query_first(s1.j, '$.s > $s', vars => s2.j) gt +FROM str s1, str s2 +ORDER BY s1.num, s2.num; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:2: Error: ERROR: syntax error at or near "SELECT" + + SELECT jsonb_build_object('s', s), num + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.out b/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.out index cd22b75a63..6aa85b4c61 100644 --- a/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.out +++ b/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.out @@ -28,3 +28,501 @@ select jsonb '{"a": 12}' @? '$.a + 2'; t (1 row) +select jsonb '{"a": 12}' @? '$.b + 2'; + ?column? +---------- + +(1 row) + +select jsonb '{"a": {"a": 12}}' @? '$.a.a'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"a": 12}}' @? '$.*.a'; + ?column? +---------- + t +(1 row) + +select jsonb '{"b": {"a": 12}}' @? '$.*.a'; + ?column? +---------- + t +(1 row) + +select jsonb '{"b": {"a": 12}}' @? '$.*.b'; + ?column? +---------- + f +(1 row) + +select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b'; + ?column? +---------- + +(1 row) + +select jsonb '{}' @? '$.*'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": 1}' @? '$.*'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}'; + ?column? +---------- + f +(1 row) + +select jsonb '[]' @? '$[*]'; + ?column? +---------- + f +(1 row) + +select jsonb '[1]' @? '$[*]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[1]'; + ?column? +---------- + f +(1 row) + +select jsonb '[1]' @? 'strict $[1]'; + ?column? +---------- + +(1 row) + +select jsonb '[1]' @? 'lax $[10000000000000000]'; + ?column? +---------- + +(1 row) + +select jsonb '[1]' @? 'strict $[10000000000000000]'; + ?column? +---------- + +(1 row) + +select jsonb '[1]' @? '$[0]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[0.3]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[0.5]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[0.9]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[1.2]'; + ?column? +---------- + f +(1 row) + +select jsonb '[1]' @? 'strict $[1.2]'; + ?column? +---------- + +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + t +(1 row) + +select jsonb '1' @? '$ ? ((@ == "1") is unknown)'; + ?column? +---------- + t +(1 row) + +select jsonb '1' @? '$ ? ((@ == 1) is unknown)'; + ?column? +---------- + f +(1 row) + +select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)'; + ?column? +---------- + f +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)'; + ?column? +---------- + f +(1 row) + +select jsonb '1' @? '$ ? ($ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '["1",2,0,3]' @? '-$[*]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,"2",0,3]' @? '-$[*]'; + ?column? +---------- + t +(1 row) + +select jsonb '["1",2,0,3]' @? 'strict -$[*]'; + ?column? +---------- + +(1 row) + +select jsonb '[1,"2",0,3]' @? 'strict -$[*]'; + ?column? +---------- + +(1 row) + +select jsonb '2' @? '$ == "2"'; + ?column? +---------- + t +(1 row) + +select jsonb '2' @@ '$ > 1'; + ?column? +---------- + t +(1 row) + +select jsonb '2' @@ '$ <= 1'; + ?column? +---------- + f +(1 row) + +select jsonb '2' @@ '$ == "2"'; + ?column? +---------- + +(1 row) + +select jsonb '2' @@ '1'; + ?column? +---------- + +(1 row) + +select jsonb '{}' @@ '$'; + ?column? +---------- + +(1 row) + +select jsonb '[]' @@ '$'; + ?column? +---------- + +(1 row) + +select jsonb '[1,2,3]' @@ '$[*]'; + ?column? +---------- + +(1 row) + +select jsonb '[]' @@ '$[*]'; + ?column? +---------- + +(1 row) + +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key'; + ?column? +---------- + t +(1 row) + +select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)'; + ?column? +---------- + f +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2'; + ?column? +---------- + f +(1 row) + diff --git a/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.sql b/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.sql index 16d4ede54e..d73f76a956 100644 --- a/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.sql +++ b/ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.sql @@ -3,3 +3,86 @@ select jsonb '{"a": 12}' @? '1'; select jsonb '{"a": 12}' @? '$.a.b'; select jsonb '{"a": 12}' @? '$.b'; select jsonb '{"a": 12}' @? '$.a + 2'; +select jsonb '{"a": 12}' @? '$.b + 2'; +select jsonb '{"a": {"a": 12}}' @? '$.a.a'; +select jsonb '{"a": {"a": 12}}' @? '$.*.a'; +select jsonb '{"b": {"a": 12}}' @? '$.*.a'; +select jsonb '{"b": {"a": 12}}' @? '$.*.b'; +select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b'; +select jsonb '{}' @? '$.*'; +select jsonb '{"a": 1}' @? '$.*'; +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}'; +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}'; +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}'; +select jsonb '[]' @? '$[*]'; +select jsonb '[1]' @? '$[*]'; +select jsonb '[1]' @? '$[1]'; +select jsonb '[1]' @? 'strict $[1]'; +select jsonb '[1]' @? 'lax $[10000000000000000]'; +select jsonb '[1]' @? 'strict $[10000000000000000]'; +select jsonb '[1]' @? '$[0]'; +select jsonb '[1]' @? '$[0.3]'; +select jsonb '[1]' @? '$[0.5]'; +select jsonb '[1]' @? '$[0.9]'; +select jsonb '[1]' @? '$[1.2]'; +select jsonb '[1]' @? 'strict $[1.2]'; +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])'; +select jsonb '1' @? '$ ? ((@ == "1") is unknown)'; +select jsonb '1' @? '$ ? ((@ == 1) is unknown)'; +select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)'; +select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)'; +select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)'; +select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)'; +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)'; +select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)'; +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)'; +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)'; +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)'; +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)'; +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)'; +select jsonb '1' @? '$ ? ($ > 0)'; +select jsonb '["1",2,0,3]' @? '-$[*]'; +select jsonb '[1,"2",0,3]' @? '-$[*]'; +select jsonb '["1",2,0,3]' @? 'strict -$[*]'; +select jsonb '[1,"2",0,3]' @? 'strict -$[*]'; +select jsonb '2' @? '$ == "2"'; +select jsonb '2' @@ '$ > 1'; +select jsonb '2' @@ '$ <= 1'; +select jsonb '2' @@ '$ == "2"'; +select jsonb '2' @@ '1'; +select jsonb '{}' @@ '$'; +select jsonb '[]' @@ '$'; +select jsonb '[1,2,3]' @@ '$[*]'; +select jsonb '[]' @@ '$[*]'; +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()'; +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key'; +select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")'; +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)'; +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)'; +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1'; +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2'; diff --git a/ydb/library/yql/tests/postgresql/cases/numeric.err b/ydb/library/yql/tests/postgresql/cases/numeric.err index 93e6819837..13bbc72454 100644 --- a/ydb/library/yql/tests/postgresql/cases/numeric.err +++ b/ydb/library/yql/tests/postgresql/cases/numeric.err @@ -2295,17 +2295,1328 @@ SELECT power('-inf'::numeric, '-inf'); -- numeric AVG used to fail on some platforms SELECT AVG(val) FROM num_data; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FDB67429D90) -__libc_start_main+128 (0x7FDB67429E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT MAX(val) FROM num_data; +</sql-statement> +<sql-statement> +SELECT MIN(val) FROM num_data; +</sql-statement> +<sql-statement> +SELECT STDDEV(val) FROM num_data; +</sql-statement> +<sql-statement> +SELECT VARIANCE(val) FROM num_data; +</sql-statement> +<sql-statement> +-- Check for appropriate rounding and overflow +CREATE TABLE fract_only (id int, val numeric(4,4)); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (1, '0.0'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (2, '0.1'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (3, '1.0'); -- should fail +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (4, '-0.9999'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (5, '0.99994'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (7, '0.00001'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (8, '0.00017'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (9, 'NaN'); +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail +</sql-statement> +<sql-statement> +INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail +</sql-statement> +<sql-statement> +SELECT * FROM fract_only; +</sql-statement> +<sql-statement> +DROP TABLE fract_only; +</sql-statement> +<sql-statement> +-- Check conversion to integers +SELECT (-9223372036854775808.5)::int8; -- should fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- Check conversion to integers + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + -- Check conversion to integers + ^ +<sql-statement> +SELECT (-9223372036854775808.4)::int8; -- ok +</sql-statement> +<sql-statement> +SELECT 9223372036854775807.4::int8; -- ok +</sql-statement> +<sql-statement> +SELECT 9223372036854775807.5::int8; -- should fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 9223372036854775807.5::int8; -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: bigint out of range + + SELECT 9223372036854775807.5::int8; -- should fail + ^ +<sql-statement> +SELECT (-2147483648.5)::int4; -- should fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT (-2147483648.5)::int4; -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: integer out of range + + SELECT (-2147483648.5)::int4; -- should fail + ^ +<sql-statement> +SELECT (-2147483648.4)::int4; -- ok +</sql-statement> +<sql-statement> +SELECT 2147483647.4::int4; -- ok +</sql-statement> +<sql-statement> +SELECT 2147483647.5::int4; -- should fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 2147483647.5::int4; -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: integer out of range + + SELECT 2147483647.5::int4; -- should fail + ^ +<sql-statement> +SELECT (-32768.5)::int2; -- should fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT (-32768.5)::int2; -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: smallint out of range + + SELECT (-32768.5)::int2; -- should fail + ^ +<sql-statement> +SELECT (-32768.4)::int2; -- ok +</sql-statement> +<sql-statement> +SELECT 32767.4::int2; -- ok +</sql-statement> +<sql-statement> +SELECT 32767.5::int2; -- should fail +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 32767.5::int2; -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: smallint out of range + + SELECT 32767.5::int2; -- should fail + ^ +<sql-statement> +-- Check inf/nan conversion behavior +SELECT 'NaN'::float8::numeric; +</sql-statement> +<sql-statement> +SELECT 'Infinity'::float8::numeric; +</sql-statement> +<sql-statement> +SELECT '-Infinity'::float8::numeric; +</sql-statement> +<sql-statement> +SELECT 'NaN'::numeric::float8; +</sql-statement> +<sql-statement> +SELECT 'Infinity'::numeric::float8; +</sql-statement> +<sql-statement> +SELECT '-Infinity'::numeric::float8; +</sql-statement> +<sql-statement> +SELECT 'NaN'::float4::numeric; +</sql-statement> +<sql-statement> +SELECT 'Infinity'::float4::numeric; +</sql-statement> +<sql-statement> +SELECT '-Infinity'::float4::numeric; +</sql-statement> +<sql-statement> +SELECT 'NaN'::numeric::float4; +</sql-statement> +<sql-statement> +SELECT 'Infinity'::numeric::float4; +</sql-statement> +<sql-statement> +SELECT '-Infinity'::numeric::float4; +</sql-statement> +<sql-statement> +SELECT '42'::int2::numeric; +</sql-statement> +<sql-statement> +SELECT 'NaN'::numeric::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'NaN'::numeric::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert NaN to smallint + + SELECT 'NaN'::numeric::int2; + ^ +<sql-statement> +SELECT 'Infinity'::numeric::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'Infinity'::numeric::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert infinity to smallint + + SELECT 'Infinity'::numeric::int2; + ^ +<sql-statement> +SELECT '-Infinity'::numeric::int2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '-Infinity'::numeric::int2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert infinity to smallint + + SELECT '-Infinity'::numeric::int2; + ^ +<sql-statement> +SELECT 'NaN'::numeric::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'NaN'::numeric::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert NaN to integer + + SELECT 'NaN'::numeric::int4; + ^ +<sql-statement> +SELECT 'Infinity'::numeric::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'Infinity'::numeric::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert infinity to integer + + SELECT 'Infinity'::numeric::int4; + ^ +<sql-statement> +SELECT '-Infinity'::numeric::int4; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '-Infinity'::numeric::int4; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert infinity to integer + + SELECT '-Infinity'::numeric::int4; + ^ +<sql-statement> +SELECT 'NaN'::numeric::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'NaN'::numeric::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert NaN to bigint + + SELECT 'NaN'::numeric::int8; + ^ +<sql-statement> +SELECT 'Infinity'::numeric::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'Infinity'::numeric::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert infinity to bigint + + SELECT 'Infinity'::numeric::int8; + ^ +<sql-statement> +SELECT '-Infinity'::numeric::int8; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '-Infinity'::numeric::int8; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: cannot convert infinity to bigint + + SELECT '-Infinity'::numeric::int8; + ^ +<sql-statement> +-- Simple check that ceil(), floor(), and round() work correctly +CREATE TABLE ceil_floor_round (a numeric); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('-5.5'); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('-5.499999'); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('9.5'); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('9.4999999'); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('0.0'); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('0.0000001'); +</sql-statement> +<sql-statement> +INSERT INTO ceil_floor_round VALUES ('-0.000001'); +</sql-statement> +<sql-statement> +SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round; +</sql-statement> +<sql-statement> +DROP TABLE ceil_floor_round; +</sql-statement> +<sql-statement> +-- Check rounding, it should round ties away from zero. +SELECT i as pow, + round((-2.5 * 10 ^ i)::numeric, -i), + round((-1.5 * 10 ^ i)::numeric, -i), + round((-0.5 * 10 ^ i)::numeric, -i), + round((0.5 * 10 ^ i)::numeric, -i), + round((1.5 * 10 ^ i)::numeric, -i), + round((2.5 * 10 ^ i)::numeric, -i) +FROM generate_series(-5,5) AS t(i); +</sql-statement> +<sql-statement> +-- Testing for width_bucket(). For convenience, we test both the +-- numeric and float8 versions of the function in this file. +-- errors +SELECT width_bucket(5.0, 3.0, 4.0, 0); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- Testing for width_bucket(). For convenience, we test both the + ^ + -stdin-:<main>:1:1: Fatal: ERROR: count must be greater than zero + + -- Testing for width_bucket(). For convenience, we test both the + ^ +<sql-statement> +SELECT width_bucket(5.0, 3.0, 4.0, -5); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(5.0, 3.0, 4.0, -5); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: count must be greater than zero + + SELECT width_bucket(5.0, 3.0, 4.0, -5); + ^ +<sql-statement> +SELECT width_bucket(3.5, 3.0, 3.0, 888); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(3.5, 3.0, 3.0, 888); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower bound cannot equal upper bound + + SELECT width_bucket(3.5, 3.0, 3.0, 888); + ^ +<sql-statement> +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: count must be greater than zero + + SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); + ^ +<sql-statement> +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: count must be greater than zero + + SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); + ^ +<sql-statement> +SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower bound cannot equal upper bound + + SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); + ^ +<sql-statement> +SELECT width_bucket('NaN', 3.0, 4.0, 888); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket('NaN', 3.0, 4.0, 888); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: operand, lower bound, and upper bound cannot be NaN + + SELECT width_bucket('NaN', 3.0, 4.0, 888); + ^ +<sql-statement> +SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: operand, lower bound, and upper bound cannot be NaN + + SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); + ^ +<sql-statement> +SELECT width_bucket(2.0, 3.0, '-inf', 888); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(2.0, 3.0, '-inf', 888); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower and upper bounds must be finite + + SELECT width_bucket(2.0, 3.0, '-inf', 888); + ^ +<sql-statement> +SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower and upper bounds must be finite + + SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); + ^ +<sql-statement> +-- normal operation +CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8); +</sql-statement> +<sql-statement> +COPY width_bucket_test (operand_num) FROM stdin; +-5.2 +-0.0000000001 +0.000000000001 +1.99999999999999 +2.00000000000001 +4.5 +5.5 +9.99999999999999 +10 +10.0000000000001 +\. +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near "-" + + -5.2 + ^ +<sql-statement> +UPDATE width_bucket_test SET operand_f8 = operand_num::float8; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT + operand_num, + width_bucket(operand_num, 0, 10, 5) AS wb_1, + width_bucket(operand_f8, 0, 10, 5) AS wb_1f, + width_bucket(operand_num, 10, 0, 5) AS wb_2, + width_bucket(operand_f8, 10, 0, 5) AS wb_2f, + width_bucket(operand_num, 2, 8, 4) AS wb_3, + width_bucket(operand_f8, 2, 8, 4) AS wb_3f, + width_bucket(operand_num, 5.0, 5.5, 20) AS wb_4, + width_bucket(operand_f8, 5.0, 5.5, 20) AS wb_4f, + width_bucket(operand_num, -25, 25, 10) AS wb_5, + width_bucket(operand_f8, -25, 25, 10) AS wb_5f + FROM width_bucket_test; +</sql-statement> +<sql-statement> +-- Check positive and negative infinity: we require +-- finite bucket bounds, but allow an infinite operand +SELECT width_bucket(0.0::numeric, 'Infinity'::numeric, 5, 10); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- Check positive and negative infinity: we require + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower and upper bounds must be finite + + -- Check positive and negative infinity: we require + ^ +<sql-statement> +SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower and upper bounds must be finite + + SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error + ^ +<sql-statement> +SELECT width_bucket('Infinity'::numeric, 1, 10, 10), + width_bucket('-Infinity'::numeric, 1, 10, 10); +</sql-statement> +<sql-statement> +SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower and upper bounds must be finite + + SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error + ^ +<sql-statement> +SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: lower and upper bounds must be finite + + SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error + ^ +<sql-statement> +SELECT width_bucket('Infinity'::float8, 1, 10, 10), + width_bucket('-Infinity'::float8, 1, 10, 10); +</sql-statement> +<sql-statement> +DROP TABLE width_bucket_test; +</sql-statement> +<sql-statement> +-- Simple test for roundoff error when results should be exact +SELECT x, width_bucket(x::float8, 10, 100, 9) as flt, + width_bucket(x::numeric, 10, 100, 9) as num +FROM generate_series(0, 110, 10) x; +</sql-statement> +<sql-statement> +SELECT x, width_bucket(x::float8, 100, 10, 9) as flt, + width_bucket(x::numeric, 100, 10, 9) as num +FROM generate_series(0, 110, 10) x; +</sql-statement> +<sql-statement> +-- +-- TO_CHAR() +-- +SELECT to_char(val, '9G999G999G999G999G999') + FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999') + FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, '9999999999999999.999999999999999PR') + FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, '9999999999999999.999999999999999S') + FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, '999999SG9999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data; +</sql-statement> +<sql-statement> +SELECT to_char(val, '9.999EEEE') FROM num_data; +</sql-statement> +<sql-statement> +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, '9.999EEEE') as numeric, + to_char(val::float8, '9.999EEEE') as float8, + to_char(val::float4, '9.999EEEE') as float4 +FROM v; +</sql-statement> +<sql-statement> +WITH v(exp) AS + (VALUES(-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0), + (1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071)) +SELECT exp, + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric +FROM v; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + WITH v(exp) AS + ^ + -stdin-:<main>:5:3: Error: At function: PgCall + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric + ^ + -stdin-:<main>:5:29: Error: At function: PgCast + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric + ^ + -stdin-:<main>:5:21: Error: At function: PgOp + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric + ^ + -stdin-:<main>:5:21: Error: Unable to find an overload for operator || with given argument type(s): (unknown,int4) + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric + ^ +<sql-statement> +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, 'MI9999999999.99') as numeric, + to_char(val::float8, 'MI9999999999.99') as float8, + to_char(val::float4, 'MI9999999999.99') as float4 +FROM v; +</sql-statement> +<sql-statement> +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, 'MI99.99') as numeric, + to_char(val::float8, 'MI99.99') as float8, + to_char(val::float4, 'MI99.99') as float4 +FROM v; +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'FM999.9'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'FM999.'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'FM999'); +</sql-statement> +<sql-statement> +-- Check parsing of literal text in a format string +SELECT to_char('100'::numeric, 'foo999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f\oo999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f\\oo999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f\"oo999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f\\"oo999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f"ool"999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f"\ool"999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f"\\ool"999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f"ool\"999'); +</sql-statement> +<sql-statement> +SELECT to_char('100'::numeric, 'f"ool\\"999'); +</sql-statement> +<sql-statement> +-- TO_NUMBER() +-- +SET lc_numeric = 'C'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: lc_numeric + -- TO_NUMBER() + ^ +<sql-statement> +SELECT to_number('-34,338,492', '99G999G999'); +</sql-statement> +<sql-statement> +SELECT to_number('-34,338,492.654,878', '99G999G999D999G999'); +</sql-statement> +<sql-statement> +SELECT to_number('<564646.654564>', '999999.999999PR'); +</sql-statement> +<sql-statement> +SELECT to_number('0.00001-', '9.999999S'); +</sql-statement> +<sql-statement> +SELECT to_number('5.01-', 'FM9.999999S'); +</sql-statement> +<sql-statement> +SELECT to_number('5.01-', 'FM9.999999MI'); +</sql-statement> +<sql-statement> +SELECT to_number('5 4 4 4 4 8 . 7 8', '9 9 9 9 9 9 . 9 9'); +</sql-statement> +<sql-statement> +SELECT to_number('.01', 'FM9.99'); +</sql-statement> +<sql-statement> +SELECT to_number('.0', '99999999.99999999'); +</sql-statement> +<sql-statement> +SELECT to_number('0', '99.99'); +</sql-statement> +<sql-statement> +SELECT to_number('.-01', 'S99.99'); +</sql-statement> +<sql-statement> +SELECT to_number('.01-', '99.99S'); +</sql-statement> +<sql-statement> +SELECT to_number(' . 0 1-', ' 9 9 . 9 9 S'); +</sql-statement> +<sql-statement> +SELECT to_number('34,50','999,99'); +</sql-statement> +<sql-statement> +SELECT to_number('123,000','999G'); +</sql-statement> +<sql-statement> +SELECT to_number('123456','999G999'); +</sql-statement> +<sql-statement> +SELECT to_number('$1234.56','L9,999.99'); +</sql-statement> +<sql-statement> +SELECT to_number('$1234.56','L99,999.99'); +</sql-statement> +<sql-statement> +SELECT to_number('$1,234.56','L99,999.99'); +</sql-statement> +<sql-statement> +SELECT to_number('1234.56','L99,999.99'); +</sql-statement> +<sql-statement> +SELECT to_number('1,234.56','L99,999.99'); +</sql-statement> +<sql-statement> +SELECT to_number('42nd', '99th'); +</sql-statement> +<sql-statement> +RESET lc_numeric; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET lc_numeric; + ^ +<sql-statement> +-- +-- Input syntax +-- +CREATE TABLE num_input_test (n1 numeric); +</sql-statement> +<sql-statement> +-- good inputs +INSERT INTO num_input_test(n1) VALUES (' 123'); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' 3245874 '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' -93853'); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('555.50'); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('-555.50'); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('NaN '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' nan'); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' inf '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' +inf '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' -inf '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' Infinity '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' +inFinity '); +</sql-statement> +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' -INFINITY '); +</sql-statement> +<sql-statement> +-- bad inputs +INSERT INTO num_input_test(n1) VALUES (' '); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + -- bad inputs + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: " " + + -- bad inputs + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' 1234 %'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES (' 1234 %'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: " 1234 %" + + INSERT INTO num_input_test(n1) VALUES (' 1234 %'); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('xyz'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES ('xyz'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: "xyz" + + INSERT INTO num_input_test(n1) VALUES ('xyz'); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('- 1234'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES ('- 1234'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: "- 1234" + + INSERT INTO num_input_test(n1) VALUES ('- 1234'); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('5 . 0'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES ('5 . 0'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: "5 . 0" + + INSERT INTO num_input_test(n1) VALUES ('5 . 0'); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('5. 0 '); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES ('5. 0 '); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: "5. 0 " + + INSERT INTO num_input_test(n1) VALUES ('5. 0 '); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (''); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES (''); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: "" + + INSERT INTO num_input_test(n1) VALUES (''); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES (' N aN '); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES (' N aN '); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: " N aN " + + INSERT INTO num_input_test(n1) VALUES (' N aN '); + ^ +<sql-statement> +INSERT INTO num_input_test(n1) VALUES ('+ infinity'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtFill! + INSERT INTO num_input_test(n1) VALUES ('+ infinity'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric: "+ infinity" + + INSERT INTO num_input_test(n1) VALUES ('+ infinity'); + ^ +<sql-statement> +SELECT * FROM num_input_test; +</sql-statement> +<sql-statement> +-- +-- Test some corner cases for multiplication +-- +select 4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; +</sql-statement> +<sql-statement> +select 4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; +</sql-statement> +<sql-statement> +select 4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; +</sql-statement> +<sql-statement> +select 4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; +</sql-statement> +<sql-statement> +select trim_scale((0.1 - 2e-16383) * (0.1 - 3e-16383)); +</sql-statement> +<sql-statement> +-- +-- Test some corner cases for division +-- +select 999999999999999999999::numeric/1000000000000000000000; +</sql-statement> +<sql-statement> +select div(999999999999999999999::numeric,1000000000000000000000); +</sql-statement> +<sql-statement> +select mod(999999999999999999999::numeric,1000000000000000000000); +</sql-statement> +<sql-statement> +select div(-9999999999999999999999::numeric,1000000000000000000000); +</sql-statement> +<sql-statement> +select mod(-9999999999999999999999::numeric,1000000000000000000000); +</sql-statement> +<sql-statement> +select div(-9999999999999999999999::numeric,1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999::numeric,1000000000000000000000); +</sql-statement> +<sql-statement> +select mod (70.0,70) ; +</sql-statement> +<sql-statement> +select div (70.0,70) ; +</sql-statement> +<sql-statement> +select 70.0 / 70 ; +</sql-statement> +<sql-statement> +select 12345678901234567890 % 123; +</sql-statement> +<sql-statement> +select 12345678901234567890 / 123; +</sql-statement> +<sql-statement> +select div(12345678901234567890, 123); +</sql-statement> +<sql-statement> +select div(12345678901234567890, 123) * 123 + 12345678901234567890 % 123; +</sql-statement> +<sql-statement> +-- +-- Test some corner cases for square root +-- +select sqrt(1.000000000000003::numeric); +</sql-statement> +<sql-statement> +select sqrt(1.000000000000004::numeric); +</sql-statement> +<sql-statement> +select sqrt(96627521408608.56340355805::numeric); +</sql-statement> +<sql-statement> +select sqrt(96627521408608.56340355806::numeric); +</sql-statement> +<sql-statement> +select sqrt(515549506212297735.073688290367::numeric); +</sql-statement> +<sql-statement> +select sqrt(515549506212297735.073688290368::numeric); +</sql-statement> +<sql-statement> +select sqrt(8015491789940783531003294973900306::numeric); +</sql-statement> +<sql-statement> +select sqrt(8015491789940783531003294973900307::numeric); +</sql-statement> +<sql-statement> +-- +-- Test code path for raising to integer powers +-- +select 10.0 ^ -2147483648 as rounds_to_zero; +</sql-statement> +<sql-statement> +select 10.0 ^ -2147483647 as rounds_to_zero; +</sql-statement> +<sql-statement> +select 10.0 ^ 2147483647 as overflows; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select 10.0 ^ 2147483647 as overflows; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: value overflows numeric format + + select 10.0 ^ 2147483647 as overflows; + ^ +<sql-statement> +select 117743296169.0 ^ 1000000000 as overflows; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select 117743296169.0 ^ 1000000000 as overflows; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: value overflows numeric format + + select 117743296169.0 ^ 1000000000 as overflows; + ^ +<sql-statement> +-- cases that used to return inaccurate results +select 3.789 ^ 21; +</sql-statement> +<sql-statement> +select 3.789 ^ 35; +</sql-statement> +<sql-statement> +select 1.2 ^ 345; +</sql-statement> +<sql-statement> +select 0.12 ^ (-20); +</sql-statement> +<sql-statement> +select 1.000000000123 ^ (-2147483648); +</sql-statement> +<sql-statement> +select coalesce(nullif(0.9999999999 ^ 23300000000000, 0), 0) as rounds_to_zero; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:17: Error: A_Expr_Kind unsupported value: 5 + select coalesce(nullif(0.9999999999 ^ 23300000000000, 0), 0) as rounds_to_zero; + ^ +<sql-statement> +select round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000); +</sql-statement> +<sql-statement> +-- cases that used to error out +select 0.12 ^ (-25); +</sql-statement> +<sql-statement> +select 0.5678 ^ (-85); +</sql-statement> +<sql-statement> +select coalesce(nullif(0.9999999999 ^ 70000000000000, 0), 0) as underflows; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:17: Error: A_Expr_Kind unsupported value: 5 + select coalesce(nullif(0.9999999999 ^ 70000000000000, 0), 0) as underflows; + ^ +<sql-statement> +-- negative base to integer powers +select (-1.0) ^ 2147483646; +</sql-statement> +<sql-statement> +select (-1.0) ^ 2147483647; +</sql-statement> +<sql-statement> +select (-1.0) ^ 2147483648; +</sql-statement> +<sql-statement> +select (-1.0) ^ 1000000000000000; +</sql-statement> +<sql-statement> +select (-1.0) ^ 1000000000000001; +</sql-statement> +<sql-statement> +-- +-- Tests for raising to non-integer powers +-- +-- special cases +select 0.0 ^ 0.0; +</sql-statement> +<sql-statement> +select (-12.34) ^ 0.0; +</sql-statement> +<sql-statement> +select 12.34 ^ 0.0; +</sql-statement> +<sql-statement> +select 0.0 ^ 12.34; +</sql-statement> +<sql-statement> +-- NaNs +select 'NaN'::numeric ^ 'NaN'::numeric; +</sql-statement> +<sql-statement> +select 'NaN'::numeric ^ 0; +</sql-statement> +<sql-statement> +select 'NaN'::numeric ^ 1; +</sql-statement> +<sql-statement> +select 0 ^ 'NaN'::numeric; +</sql-statement> +<sql-statement> +select 1 ^ 'NaN'::numeric; +</sql-statement> +<sql-statement> +-- invalid inputs +select 0.0 ^ (-12.34); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- invalid inputs + ^ + -stdin-:<main>:1:1: Fatal: ERROR: zero raised to a negative power is undefined + + -- invalid inputs + ^ +<sql-statement> +select (-12.34) ^ 1.2; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select (-12.34) ^ 1.2; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: a negative number raised to a non-integer power yields a complex result + + select (-12.34) ^ 1.2; + ^ +<sql-statement> +-- cases that used to generate inaccurate results +select 32.1 ^ 9.8; +</sql-statement> +<sql-statement> +select 32.1 ^ (-9.8); +</sql-statement> +<sql-statement> +select 12.3 ^ 45.6; +</sql-statement> +<sql-statement> +select 12.3 ^ (-45.6); +</sql-statement> +<sql-statement> +-- big test +select 1.234 ^ 5678; +</sql-statement> +<sql-statement> +-- +-- Tests for EXP() +-- +-- special cases +select exp(0.0); +</sql-statement> +<sql-statement> +select exp(1.0); +</sql-statement> +<sql-statement> +select exp(1.0::numeric(71,70)); +</sql-statement> +<sql-statement> +select exp('nan'::numeric); +</sql-statement> +<sql-statement> +select exp('inf'::numeric); +</sql-statement> +<sql-statement> +select exp('-inf'::numeric); +</sql-statement> +<sql-statement> +select coalesce(nullif(exp(-5000::numeric), 0), 0) as rounds_to_zero; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:17: Error: A_Expr_Kind unsupported value: 5 + select coalesce(nullif(exp(-5000::numeric), 0), 0) as rounds_to_zero; + ^ +<sql-statement> +select coalesce(nullif(exp(-10000::numeric), 0), 0) as underflows; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:17: Error: A_Expr_Kind unsupported value: 5 + select coalesce(nullif(exp(-10000::numeric), 0), 0) as underflows; + ^ +<sql-statement> +-- cases that used to generate inaccurate results +select exp(32.999); +</sql-statement> +<sql-statement> +select exp(-32.999); +</sql-statement> +<sql-statement> +select exp(123.456); +</sql-statement> +<sql-statement> +select exp(-123.456); +</sql-statement> +<sql-statement> +-- big test +select exp(1234.5678); +</sql-statement> +<sql-statement> +-- +-- Tests for generate_series +-- +select * from generate_series(0.0::numeric, 4.0::numeric); +</sql-statement> +<sql-statement> +select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric); +</sql-statement> +<sql-statement> +select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric); +</sql-statement> +<sql-statement> +-- Trigger errors +select * from generate_series(-100::numeric, 100::numeric, 0::numeric); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- Trigger errors + ^ + -stdin-:<main>:1:1: Fatal: ERROR: step size cannot equal zero + + -- Trigger errors + ^ +<sql-statement> +select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric); +</sql-statement> +pgrun: /storage/d/arcc/mount/1/a0a05244-a249bf61-ec2999f5-6661a47b/contrib/libs/llvm12/lib/IR/LegacyPassManager.cpp:588: void llvm::PMTopLevelManager::setLastUser(ArrayRef<Pass *>, Pass *): Assertion `AnalysisPass && "Expected analysis pass to exist."' failed. +pthread_kill at ./nptl/./nptl/pthread_kill.c:43:17 +?? at ??:0:0 diff --git a/ydb/library/yql/tests/postgresql/cases/numeric.out b/ydb/library/yql/tests/postgresql/cases/numeric.out index 8ff77c3c01..a4abce3d26 100644 --- a/ydb/library/yql/tests/postgresql/cases/numeric.out +++ b/ydb/library/yql/tests/postgresql/cases/numeric.out @@ -726,3 +726,928 @@ SELECT power('-inf'::numeric, 'inf'); Infinity (1 row) +-- Check for appropriate rounding and overflow +CREATE TABLE fract_only (id int, val numeric(4,4)); +INSERT INTO fract_only VALUES (1, '0.0'); +INSERT INTO fract_only VALUES (2, '0.1'); +INSERT INTO fract_only VALUES (4, '-0.9999'); +INSERT INTO fract_only VALUES (5, '0.99994'); +INSERT INTO fract_only VALUES (7, '0.00001'); +INSERT INTO fract_only VALUES (8, '0.00017'); +INSERT INTO fract_only VALUES (9, 'NaN'); +DROP TABLE fract_only; +-- Check conversion to integers +SELECT (-9223372036854775808.5)::int8; -- should fail +ERROR: bigint out of range +SELECT (-9223372036854775808.4)::int8; -- ok + int8 +---------------------- + -9223372036854775808 +(1 row) + +SELECT 9223372036854775807.4::int8; -- ok + int8 +--------------------- + 9223372036854775807 +(1 row) + +SELECT 9223372036854775807.5::int8; -- should fail +ERROR: bigint out of range +SELECT (-2147483648.5)::int4; -- should fail +ERROR: integer out of range +SELECT (-2147483648.4)::int4; -- ok + int4 +------------- + -2147483648 +(1 row) + +SELECT 2147483647.4::int4; -- ok + int4 +------------ + 2147483647 +(1 row) + +SELECT 2147483647.5::int4; -- should fail +ERROR: integer out of range +SELECT (-32768.5)::int2; -- should fail +ERROR: smallint out of range +SELECT (-32768.4)::int2; -- ok + int2 +-------- + -32768 +(1 row) + +SELECT 32767.4::int2; -- ok + int2 +------- + 32767 +(1 row) + +SELECT 32767.5::int2; -- should fail +ERROR: smallint out of range +-- Check inf/nan conversion behavior +SELECT 'NaN'::float8::numeric; + numeric +--------- + NaN +(1 row) + +SELECT 'Infinity'::float8::numeric; + numeric +---------- + Infinity +(1 row) + +SELECT '-Infinity'::float8::numeric; + numeric +----------- + -Infinity +(1 row) + +SELECT 'NaN'::float4::numeric; + numeric +--------- + NaN +(1 row) + +SELECT 'Infinity'::float4::numeric; + numeric +---------- + Infinity +(1 row) + +SELECT '-Infinity'::float4::numeric; + numeric +----------- + -Infinity +(1 row) + +SELECT '42'::int2::numeric; + numeric +--------- + 42 +(1 row) + +SELECT 'NaN'::numeric::int2; +ERROR: cannot convert NaN to smallint +SELECT 'Infinity'::numeric::int2; +ERROR: cannot convert infinity to smallint +SELECT '-Infinity'::numeric::int2; +ERROR: cannot convert infinity to smallint +SELECT 'NaN'::numeric::int4; +ERROR: cannot convert NaN to integer +SELECT 'Infinity'::numeric::int4; +ERROR: cannot convert infinity to integer +SELECT '-Infinity'::numeric::int4; +ERROR: cannot convert infinity to integer +SELECT 'NaN'::numeric::int8; +ERROR: cannot convert NaN to bigint +SELECT 'Infinity'::numeric::int8; +ERROR: cannot convert infinity to bigint +SELECT '-Infinity'::numeric::int8; +ERROR: cannot convert infinity to bigint +-- Simple check that ceil(), floor(), and round() work correctly +CREATE TABLE ceil_floor_round (a numeric); +INSERT INTO ceil_floor_round VALUES ('-5.5'); +INSERT INTO ceil_floor_round VALUES ('-5.499999'); +INSERT INTO ceil_floor_round VALUES ('9.5'); +INSERT INTO ceil_floor_round VALUES ('9.4999999'); +INSERT INTO ceil_floor_round VALUES ('0.0'); +INSERT INTO ceil_floor_round VALUES ('0.0000001'); +INSERT INTO ceil_floor_round VALUES ('-0.000001'); +DROP TABLE ceil_floor_round; +-- Check rounding, it should round ties away from zero. +SELECT i as pow, + round((-2.5 * 10 ^ i)::numeric, -i), + round((-1.5 * 10 ^ i)::numeric, -i), + round((-0.5 * 10 ^ i)::numeric, -i), + round((0.5 * 10 ^ i)::numeric, -i), + round((1.5 * 10 ^ i)::numeric, -i), + round((2.5 * 10 ^ i)::numeric, -i) +FROM generate_series(-5,5) AS t(i); + pow | round | round | round | round | round | round +-----+----------+----------+----------+---------+---------+--------- + -5 | -0.00003 | -0.00002 | -0.00001 | 0.00001 | 0.00002 | 0.00003 + -4 | -0.0003 | -0.0002 | -0.0001 | 0.0001 | 0.0002 | 0.0003 + -3 | -0.003 | -0.002 | -0.001 | 0.001 | 0.002 | 0.003 + -2 | -0.03 | -0.02 | -0.01 | 0.01 | 0.02 | 0.03 + -1 | -0.3 | -0.2 | -0.1 | 0.1 | 0.2 | 0.3 + 0 | -3 | -2 | -1 | 1 | 2 | 3 + 1 | -30 | -20 | -10 | 10 | 20 | 30 + 2 | -300 | -200 | -100 | 100 | 200 | 300 + 3 | -3000 | -2000 | -1000 | 1000 | 2000 | 3000 + 4 | -30000 | -20000 | -10000 | 10000 | 20000 | 30000 + 5 | -300000 | -200000 | -100000 | 100000 | 200000 | 300000 +(11 rows) + +-- Testing for width_bucket(). For convenience, we test both the +-- numeric and float8 versions of the function in this file. +-- errors +SELECT width_bucket(5.0, 3.0, 4.0, 0); +ERROR: count must be greater than zero +SELECT width_bucket(5.0, 3.0, 4.0, -5); +ERROR: count must be greater than zero +SELECT width_bucket(3.5, 3.0, 3.0, 888); +ERROR: lower bound cannot equal upper bound +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); +ERROR: count must be greater than zero +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); +ERROR: count must be greater than zero +SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); +ERROR: lower bound cannot equal upper bound +SELECT width_bucket('NaN', 3.0, 4.0, 888); +ERROR: operand, lower bound, and upper bound cannot be NaN +SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); +ERROR: operand, lower bound, and upper bound cannot be NaN +SELECT width_bucket(2.0, 3.0, '-inf', 888); +ERROR: lower and upper bounds must be finite +SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); +ERROR: lower and upper bounds must be finite +-- normal operation +CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8); +-- Check positive and negative infinity: we require +-- finite bucket bounds, but allow an infinite operand +SELECT width_bucket(0.0::numeric, 'Infinity'::numeric, 5, 10); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket('Infinity'::numeric, 1, 10, 10), + width_bucket('-Infinity'::numeric, 1, 10, 10); + width_bucket | width_bucket +--------------+-------------- + 11 | 0 +(1 row) + +SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket('Infinity'::float8, 1, 10, 10), + width_bucket('-Infinity'::float8, 1, 10, 10); + width_bucket | width_bucket +--------------+-------------- + 11 | 0 +(1 row) + +DROP TABLE width_bucket_test; +-- Simple test for roundoff error when results should be exact +SELECT x, width_bucket(x::float8, 10, 100, 9) as flt, + width_bucket(x::numeric, 10, 100, 9) as num +FROM generate_series(0, 110, 10) x; + x | flt | num +-----+-----+----- + 0 | 0 | 0 + 10 | 1 | 1 + 20 | 2 | 2 + 30 | 3 | 3 + 40 | 4 | 4 + 50 | 5 | 5 + 60 | 6 | 6 + 70 | 7 | 7 + 80 | 8 | 8 + 90 | 9 | 9 + 100 | 10 | 10 + 110 | 10 | 10 +(12 rows) + +SELECT x, width_bucket(x::float8, 100, 10, 9) as flt, + width_bucket(x::numeric, 100, 10, 9) as num +FROM generate_series(0, 110, 10) x; + x | flt | num +-----+-----+----- + 0 | 10 | 10 + 10 | 10 | 10 + 20 | 9 | 9 + 30 | 8 | 8 + 40 | 7 | 7 + 50 | 6 | 6 + 60 | 5 | 5 + 70 | 4 | 4 + 80 | 3 | 3 + 90 | 2 | 2 + 100 | 1 | 1 + 110 | 0 | 0 +(12 rows) + +SELECT to_char('100'::numeric, 'FM999.9'); + to_char +--------- + 100. +(1 row) + +SELECT to_char('100'::numeric, 'FM999.'); + to_char +--------- + 100 +(1 row) + +SELECT to_char('100'::numeric, 'FM999'); + to_char +--------- + 100 +(1 row) + +-- Check parsing of literal text in a format string +SELECT to_char('100'::numeric, 'foo999'); + to_char +--------- + foo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\oo999'); + to_char +---------- + f\oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\\oo999'); + to_char +----------- + f\\oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\"oo999'); + to_char +---------- + f"oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\\"oo999'); + to_char +----------- + f\"oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"ool"999'); + to_char +---------- + fool 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"\ool"999'); + to_char +---------- + fool 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"\\ool"999'); + to_char +----------- + f\ool 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"ool\"999'); + to_char +---------- + fool"999 +(1 row) + +SELECT to_char('100'::numeric, 'f"ool\\"999'); + to_char +----------- + fool\ 100 +(1 row) + +SELECT to_number('-34,338,492', '99G999G999'); + to_number +----------- + -34338492 +(1 row) + +SELECT to_number('-34,338,492.654,878', '99G999G999D999G999'); + to_number +------------------ + -34338492.654878 +(1 row) + +SELECT to_number('<564646.654564>', '999999.999999PR'); + to_number +---------------- + -564646.654564 +(1 row) + +SELECT to_number('0.00001-', '9.999999S'); + to_number +----------- + -0.00001 +(1 row) + +SELECT to_number('5.01-', 'FM9.999999S'); + to_number +----------- + -5.01 +(1 row) + +SELECT to_number('5.01-', 'FM9.999999MI'); + to_number +----------- + -5.01 +(1 row) + +SELECT to_number('5 4 4 4 4 8 . 7 8', '9 9 9 9 9 9 . 9 9'); + to_number +----------- + 544448.78 +(1 row) + +SELECT to_number('.01', 'FM9.99'); + to_number +----------- + 0.01 +(1 row) + +SELECT to_number('.0', '99999999.99999999'); + to_number +----------- + 0.0 +(1 row) + +SELECT to_number('.-01', 'S99.99'); + to_number +----------- + -0.01 +(1 row) + +SELECT to_number('.01-', '99.99S'); + to_number +----------- + -0.01 +(1 row) + +SELECT to_number(' . 0 1-', ' 9 9 . 9 9 S'); + to_number +----------- + -0.01 +(1 row) + +SELECT to_number('34,50','999,99'); + to_number +----------- + 3450 +(1 row) + +SELECT to_number('123,000','999G'); + to_number +----------- + 123 +(1 row) + +SELECT to_number('123456','999G999'); + to_number +----------- + 123456 +(1 row) + +SELECT to_number('$1234.56','L9,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('$1234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('$1,234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('1234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('1,234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('42nd', '99th'); + to_number +----------- + 42 +(1 row) + +-- +-- Input syntax +-- +CREATE TABLE num_input_test (n1 numeric); +-- good inputs +INSERT INTO num_input_test(n1) VALUES (' 123'); +INSERT INTO num_input_test(n1) VALUES (' 3245874 '); +INSERT INTO num_input_test(n1) VALUES (' -93853'); +INSERT INTO num_input_test(n1) VALUES ('555.50'); +INSERT INTO num_input_test(n1) VALUES ('-555.50'); +INSERT INTO num_input_test(n1) VALUES ('NaN '); +INSERT INTO num_input_test(n1) VALUES (' nan'); +INSERT INTO num_input_test(n1) VALUES (' inf '); +INSERT INTO num_input_test(n1) VALUES (' +inf '); +INSERT INTO num_input_test(n1) VALUES (' -inf '); +INSERT INTO num_input_test(n1) VALUES (' Infinity '); +INSERT INTO num_input_test(n1) VALUES (' +inFinity '); +INSERT INTO num_input_test(n1) VALUES (' -INFINITY '); +-- bad inputs +INSERT INTO num_input_test(n1) VALUES (' '); +ERROR: invalid input syntax for type numeric: " " +LINE 1: INSERT INTO num_input_test(n1) VALUES (' '); + ^ +INSERT INTO num_input_test(n1) VALUES (' 1234 %'); +ERROR: invalid input syntax for type numeric: " 1234 %" +LINE 1: INSERT INTO num_input_test(n1) VALUES (' 1234 %'); + ^ +INSERT INTO num_input_test(n1) VALUES ('xyz'); +ERROR: invalid input syntax for type numeric: "xyz" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('xyz'); + ^ +INSERT INTO num_input_test(n1) VALUES ('- 1234'); +ERROR: invalid input syntax for type numeric: "- 1234" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('- 1234'); + ^ +INSERT INTO num_input_test(n1) VALUES ('5 . 0'); +ERROR: invalid input syntax for type numeric: "5 . 0" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('5 . 0'); + ^ +INSERT INTO num_input_test(n1) VALUES ('5. 0 '); +ERROR: invalid input syntax for type numeric: "5. 0 " +LINE 1: INSERT INTO num_input_test(n1) VALUES ('5. 0 '); + ^ +INSERT INTO num_input_test(n1) VALUES (''); +ERROR: invalid input syntax for type numeric: "" +LINE 1: INSERT INTO num_input_test(n1) VALUES (''); + ^ +INSERT INTO num_input_test(n1) VALUES (' N aN '); +ERROR: invalid input syntax for type numeric: " N aN " +LINE 1: INSERT INTO num_input_test(n1) VALUES (' N aN '); + ^ +INSERT INTO num_input_test(n1) VALUES ('+ infinity'); +ERROR: invalid input syntax for type numeric: "+ infinity" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('+ infinity'); + ^ +SELECT * FROM num_input_test; + n1 +----------- + 123 + 3245874 + -93853 + 555.50 + -555.50 + NaN + NaN + Infinity + Infinity + -Infinity + Infinity + Infinity + -Infinity +(13 rows) + +select trim_scale((0.1 - 2e-16383) * (0.1 - 3e-16383)); + trim_scale +------------ + 0.01 +(1 row) + +-- +-- Test some corner cases for division +-- +select 999999999999999999999::numeric/1000000000000000000000; + ?column? +------------------------ + 1.00000000000000000000 +(1 row) + +select mod(999999999999999999999::numeric,1000000000000000000000); + mod +----------------------- + 999999999999999999999 +(1 row) + +select div(-9999999999999999999999::numeric,1000000000000000000000); + div +----- + -9 +(1 row) + +select mod(-9999999999999999999999::numeric,1000000000000000000000); + mod +------------------------ + -999999999999999999999 +(1 row) + +select div(-9999999999999999999999::numeric,1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999::numeric,1000000000000000000000); + ?column? +------------------------- + -9999999999999999999999 +(1 row) + +select mod (70.0,70) ; + mod +----- + 0.0 +(1 row) + +select div (70.0,70) ; + div +----- + 1 +(1 row) + +select 70.0 / 70 ; + ?column? +------------------------ + 1.00000000000000000000 +(1 row) + +select 12345678901234567890 % 123; + ?column? +---------- + 78 +(1 row) + +select 12345678901234567890 / 123; + ?column? +-------------------- + 100371373180768845 +(1 row) + +select div(12345678901234567890, 123); + div +-------------------- + 100371373180768844 +(1 row) + +select div(12345678901234567890, 123) * 123 + 12345678901234567890 % 123; + ?column? +---------------------- + 12345678901234567890 +(1 row) + +-- +-- Test some corner cases for square root +-- +select sqrt(1.000000000000003::numeric); + sqrt +------------------- + 1.000000000000001 +(1 row) + +select sqrt(1.000000000000004::numeric); + sqrt +------------------- + 1.000000000000002 +(1 row) + +select sqrt(96627521408608.56340355805::numeric); + sqrt +--------------------- + 9829929.87811248648 +(1 row) + +select sqrt(96627521408608.56340355806::numeric); + sqrt +--------------------- + 9829929.87811248649 +(1 row) + +select sqrt(515549506212297735.073688290367::numeric); + sqrt +------------------------ + 718017761.766585921184 +(1 row) + +select sqrt(515549506212297735.073688290368::numeric); + sqrt +------------------------ + 718017761.766585921185 +(1 row) + +select sqrt(8015491789940783531003294973900306::numeric); + sqrt +------------------- + 89529278953540017 +(1 row) + +select sqrt(8015491789940783531003294973900307::numeric); + sqrt +------------------- + 89529278953540018 +(1 row) + +-- +-- Test code path for raising to integer powers +-- +select 10.0 ^ -2147483648 as rounds_to_zero; + rounds_to_zero +-------------------- + 0.0000000000000000 +(1 row) + +select 10.0 ^ -2147483647 as rounds_to_zero; + rounds_to_zero +-------------------- + 0.0000000000000000 +(1 row) + +select 10.0 ^ 2147483647 as overflows; +ERROR: value overflows numeric format +select 117743296169.0 ^ 1000000000 as overflows; +ERROR: value overflows numeric format +-- cases that used to return inaccurate results +select 3.789 ^ 21; + ?column? +-------------------------------- + 1409343026052.8716016316022141 +(1 row) + +select 3.789 ^ 35; + ?column? +---------------------------------------- + 177158169650516670809.3820586142670135 +(1 row) + +select 1.2 ^ 345; + ?column? +----------------------------------------------- + 2077446682327378559843444695.5827049735727869 +(1 row) + +select 0.12 ^ (-20); + ?column? +-------------------------------------- + 2608405330458882702.5529619561355838 +(1 row) + +select 1.000000000123 ^ (-2147483648); + ?column? +-------------------- + 0.7678656556403084 +(1 row) + +-- cases that used to error out +select 0.12 ^ (-25); + ?column? +------------------------------------------- + 104825960103961013959336.4983657883169110 +(1 row) + +select 0.5678 ^ (-85); + ?column? +---------------------------------------- + 782333637740774446257.7719390061997396 +(1 row) + +-- negative base to integer powers +select (-1.0) ^ 2147483646; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-1.0) ^ 2147483647; + ?column? +--------------------- + -1.0000000000000000 +(1 row) + +select (-1.0) ^ 2147483648; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-1.0) ^ 1000000000000000; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-1.0) ^ 1000000000000001; + ?column? +--------------------- + -1.0000000000000000 +(1 row) + +-- +-- Tests for raising to non-integer powers +-- +-- special cases +select 0.0 ^ 0.0; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-12.34) ^ 0.0; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select 12.34 ^ 0.0; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select 0.0 ^ 12.34; + ?column? +-------------------- + 0.0000000000000000 +(1 row) + +-- NaNs +select 'NaN'::numeric ^ 'NaN'::numeric; + ?column? +---------- + NaN +(1 row) + +select 'NaN'::numeric ^ 0; + ?column? +---------- + 1 +(1 row) + +select 'NaN'::numeric ^ 1; + ?column? +---------- + NaN +(1 row) + +select 0 ^ 'NaN'::numeric; + ?column? +---------- + NaN +(1 row) + +select 1 ^ 'NaN'::numeric; + ?column? +---------- + 1 +(1 row) + +-- invalid inputs +select 0.0 ^ (-12.34); +ERROR: zero raised to a negative power is undefined +select (-12.34) ^ 1.2; +ERROR: a negative number raised to a non-integer power yields a complex result +-- cases that used to generate inaccurate results +select 32.1 ^ 9.8; + ?column? +-------------------- + 580429286790711.10 +(1 row) + +select 32.1 ^ (-9.8); + ?column? +---------------------------------- + 0.000000000000001722862754788209 +(1 row) + +select 12.3 ^ 45.6; + ?column? +------------------------------------------------------ + 50081010321492803393171165777624533697036806969694.9 +(1 row) + +select 12.3 ^ (-45.6); + ?column? +--------------------------------------------------------------------- + 0.00000000000000000000000000000000000000000000000001996764828785491 +(1 row) + +-- +-- Tests for EXP() +-- +-- special cases +select exp(0.0); + exp +-------------------- + 1.0000000000000000 +(1 row) + +select exp(1.0); + exp +-------------------- + 2.7182818284590452 +(1 row) + +select exp(1.0::numeric(71,70)); + exp +-------------------------------------------------------------------------- + 2.7182818284590452353602874713526624977572470936999595749669676277240766 +(1 row) + +select exp('nan'::numeric); + exp +----- + NaN +(1 row) + +select exp('inf'::numeric); + exp +---------- + Infinity +(1 row) + +-- cases that used to generate inaccurate results +select exp(32.999); + exp +--------------------- + 214429043492155.053 +(1 row) + +select exp(-32.999); + exp +---------------------------------- + 0.000000000000004663547361468248 +(1 row) + +select exp(123.456); + exp +------------------------------------------------------------ + 413294435277809344957685441227343146614594393746575438.725 +(1 row) + +select exp(-123.456); + exp +------------------------------------------------------------------------- + 0.000000000000000000000000000000000000000000000000000002419582541264601 +(1 row) + +-- +-- Tests for generate_series +-- +select * from generate_series(0.0::numeric, 4.0::numeric); + generate_series +----------------- + 0.0 + 1.0 + 2.0 + 3.0 + 4.0 +(5 rows) + +select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric); + generate_series +----------------- + 0.1 + 1.4 + 2.7 + 4.0 +(4 rows) + +select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric); + generate_series +----------------- + 4.0 + 1.8 + -0.4 +(3 rows) + diff --git a/ydb/library/yql/tests/postgresql/cases/numeric.sql b/ydb/library/yql/tests/postgresql/cases/numeric.sql index fbc848306a..97886c17c4 100644 --- a/ydb/library/yql/tests/postgresql/cases/numeric.sql +++ b/ydb/library/yql/tests/postgresql/cases/numeric.sql @@ -580,3 +580,250 @@ SELECT power('-inf'::numeric, '3'); SELECT power('-inf'::numeric, '4.5'); SELECT power('-inf'::numeric, '0'); SELECT power('-inf'::numeric, 'inf'); +-- Check for appropriate rounding and overflow +CREATE TABLE fract_only (id int, val numeric(4,4)); +INSERT INTO fract_only VALUES (1, '0.0'); +INSERT INTO fract_only VALUES (2, '0.1'); +INSERT INTO fract_only VALUES (4, '-0.9999'); +INSERT INTO fract_only VALUES (5, '0.99994'); +INSERT INTO fract_only VALUES (7, '0.00001'); +INSERT INTO fract_only VALUES (8, '0.00017'); +INSERT INTO fract_only VALUES (9, 'NaN'); +DROP TABLE fract_only; +-- Check conversion to integers +SELECT (-9223372036854775808.5)::int8; -- should fail +SELECT (-9223372036854775808.4)::int8; -- ok +SELECT 9223372036854775807.4::int8; -- ok +SELECT 9223372036854775807.5::int8; -- should fail +SELECT (-2147483648.5)::int4; -- should fail +SELECT (-2147483648.4)::int4; -- ok +SELECT 2147483647.4::int4; -- ok +SELECT 2147483647.5::int4; -- should fail +SELECT (-32768.5)::int2; -- should fail +SELECT (-32768.4)::int2; -- ok +SELECT 32767.4::int2; -- ok +SELECT 32767.5::int2; -- should fail +-- Check inf/nan conversion behavior +SELECT 'NaN'::float8::numeric; +SELECT 'Infinity'::float8::numeric; +SELECT '-Infinity'::float8::numeric; +SELECT 'NaN'::float4::numeric; +SELECT 'Infinity'::float4::numeric; +SELECT '-Infinity'::float4::numeric; +SELECT '42'::int2::numeric; +SELECT 'NaN'::numeric::int2; +SELECT 'Infinity'::numeric::int2; +SELECT '-Infinity'::numeric::int2; +SELECT 'NaN'::numeric::int4; +SELECT 'Infinity'::numeric::int4; +SELECT '-Infinity'::numeric::int4; +SELECT 'NaN'::numeric::int8; +SELECT 'Infinity'::numeric::int8; +SELECT '-Infinity'::numeric::int8; +-- Simple check that ceil(), floor(), and round() work correctly +CREATE TABLE ceil_floor_round (a numeric); +INSERT INTO ceil_floor_round VALUES ('-5.5'); +INSERT INTO ceil_floor_round VALUES ('-5.499999'); +INSERT INTO ceil_floor_round VALUES ('9.5'); +INSERT INTO ceil_floor_round VALUES ('9.4999999'); +INSERT INTO ceil_floor_round VALUES ('0.0'); +INSERT INTO ceil_floor_round VALUES ('0.0000001'); +INSERT INTO ceil_floor_round VALUES ('-0.000001'); +DROP TABLE ceil_floor_round; +-- Check rounding, it should round ties away from zero. +SELECT i as pow, + round((-2.5 * 10 ^ i)::numeric, -i), + round((-1.5 * 10 ^ i)::numeric, -i), + round((-0.5 * 10 ^ i)::numeric, -i), + round((0.5 * 10 ^ i)::numeric, -i), + round((1.5 * 10 ^ i)::numeric, -i), + round((2.5 * 10 ^ i)::numeric, -i) +FROM generate_series(-5,5) AS t(i); +-- Testing for width_bucket(). For convenience, we test both the +-- numeric and float8 versions of the function in this file. +-- errors +SELECT width_bucket(5.0, 3.0, 4.0, 0); +SELECT width_bucket(5.0, 3.0, 4.0, -5); +SELECT width_bucket(3.5, 3.0, 3.0, 888); +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); +SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); +SELECT width_bucket('NaN', 3.0, 4.0, 888); +SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); +SELECT width_bucket(2.0, 3.0, '-inf', 888); +SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); +-- normal operation +CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8); +-- Check positive and negative infinity: we require +-- finite bucket bounds, but allow an infinite operand +SELECT width_bucket(0.0::numeric, 'Infinity'::numeric, 5, 10); -- error +SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error +SELECT width_bucket('Infinity'::numeric, 1, 10, 10), + width_bucket('-Infinity'::numeric, 1, 10, 10); +SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error +SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error +SELECT width_bucket('Infinity'::float8, 1, 10, 10), + width_bucket('-Infinity'::float8, 1, 10, 10); +DROP TABLE width_bucket_test; +-- Simple test for roundoff error when results should be exact +SELECT x, width_bucket(x::float8, 10, 100, 9) as flt, + width_bucket(x::numeric, 10, 100, 9) as num +FROM generate_series(0, 110, 10) x; +SELECT x, width_bucket(x::float8, 100, 10, 9) as flt, + width_bucket(x::numeric, 100, 10, 9) as num +FROM generate_series(0, 110, 10) x; +SELECT to_char('100'::numeric, 'FM999.9'); +SELECT to_char('100'::numeric, 'FM999.'); +SELECT to_char('100'::numeric, 'FM999'); +-- Check parsing of literal text in a format string +SELECT to_char('100'::numeric, 'foo999'); +SELECT to_char('100'::numeric, 'f\oo999'); +SELECT to_char('100'::numeric, 'f\\oo999'); +SELECT to_char('100'::numeric, 'f\"oo999'); +SELECT to_char('100'::numeric, 'f\\"oo999'); +SELECT to_char('100'::numeric, 'f"ool"999'); +SELECT to_char('100'::numeric, 'f"\ool"999'); +SELECT to_char('100'::numeric, 'f"\\ool"999'); +SELECT to_char('100'::numeric, 'f"ool\"999'); +SELECT to_char('100'::numeric, 'f"ool\\"999'); +SELECT to_number('-34,338,492', '99G999G999'); +SELECT to_number('-34,338,492.654,878', '99G999G999D999G999'); +SELECT to_number('<564646.654564>', '999999.999999PR'); +SELECT to_number('0.00001-', '9.999999S'); +SELECT to_number('5.01-', 'FM9.999999S'); +SELECT to_number('5.01-', 'FM9.999999MI'); +SELECT to_number('5 4 4 4 4 8 . 7 8', '9 9 9 9 9 9 . 9 9'); +SELECT to_number('.01', 'FM9.99'); +SELECT to_number('.0', '99999999.99999999'); +SELECT to_number('.-01', 'S99.99'); +SELECT to_number('.01-', '99.99S'); +SELECT to_number(' . 0 1-', ' 9 9 . 9 9 S'); +SELECT to_number('34,50','999,99'); +SELECT to_number('123,000','999G'); +SELECT to_number('123456','999G999'); +SELECT to_number('$1234.56','L9,999.99'); +SELECT to_number('$1234.56','L99,999.99'); +SELECT to_number('$1,234.56','L99,999.99'); +SELECT to_number('1234.56','L99,999.99'); +SELECT to_number('1,234.56','L99,999.99'); +SELECT to_number('42nd', '99th'); +-- +-- Input syntax +-- +CREATE TABLE num_input_test (n1 numeric); +-- good inputs +INSERT INTO num_input_test(n1) VALUES (' 123'); +INSERT INTO num_input_test(n1) VALUES (' 3245874 '); +INSERT INTO num_input_test(n1) VALUES (' -93853'); +INSERT INTO num_input_test(n1) VALUES ('555.50'); +INSERT INTO num_input_test(n1) VALUES ('-555.50'); +INSERT INTO num_input_test(n1) VALUES ('NaN '); +INSERT INTO num_input_test(n1) VALUES (' nan'); +INSERT INTO num_input_test(n1) VALUES (' inf '); +INSERT INTO num_input_test(n1) VALUES (' +inf '); +INSERT INTO num_input_test(n1) VALUES (' -inf '); +INSERT INTO num_input_test(n1) VALUES (' Infinity '); +INSERT INTO num_input_test(n1) VALUES (' +inFinity '); +INSERT INTO num_input_test(n1) VALUES (' -INFINITY '); +-- bad inputs +INSERT INTO num_input_test(n1) VALUES (' '); +INSERT INTO num_input_test(n1) VALUES (' 1234 %'); +INSERT INTO num_input_test(n1) VALUES ('xyz'); +INSERT INTO num_input_test(n1) VALUES ('- 1234'); +INSERT INTO num_input_test(n1) VALUES ('5 . 0'); +INSERT INTO num_input_test(n1) VALUES ('5. 0 '); +INSERT INTO num_input_test(n1) VALUES (''); +INSERT INTO num_input_test(n1) VALUES (' N aN '); +INSERT INTO num_input_test(n1) VALUES ('+ infinity'); +SELECT * FROM num_input_test; +select trim_scale((0.1 - 2e-16383) * (0.1 - 3e-16383)); +-- +-- Test some corner cases for division +-- +select 999999999999999999999::numeric/1000000000000000000000; +select mod(999999999999999999999::numeric,1000000000000000000000); +select div(-9999999999999999999999::numeric,1000000000000000000000); +select mod(-9999999999999999999999::numeric,1000000000000000000000); +select div(-9999999999999999999999::numeric,1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999::numeric,1000000000000000000000); +select mod (70.0,70) ; +select div (70.0,70) ; +select 70.0 / 70 ; +select 12345678901234567890 % 123; +select 12345678901234567890 / 123; +select div(12345678901234567890, 123); +select div(12345678901234567890, 123) * 123 + 12345678901234567890 % 123; +-- +-- Test some corner cases for square root +-- +select sqrt(1.000000000000003::numeric); +select sqrt(1.000000000000004::numeric); +select sqrt(96627521408608.56340355805::numeric); +select sqrt(96627521408608.56340355806::numeric); +select sqrt(515549506212297735.073688290367::numeric); +select sqrt(515549506212297735.073688290368::numeric); +select sqrt(8015491789940783531003294973900306::numeric); +select sqrt(8015491789940783531003294973900307::numeric); +-- +-- Test code path for raising to integer powers +-- +select 10.0 ^ -2147483648 as rounds_to_zero; +select 10.0 ^ -2147483647 as rounds_to_zero; +select 10.0 ^ 2147483647 as overflows; +select 117743296169.0 ^ 1000000000 as overflows; +-- cases that used to return inaccurate results +select 3.789 ^ 21; +select 3.789 ^ 35; +select 1.2 ^ 345; +select 0.12 ^ (-20); +select 1.000000000123 ^ (-2147483648); +-- cases that used to error out +select 0.12 ^ (-25); +select 0.5678 ^ (-85); +-- negative base to integer powers +select (-1.0) ^ 2147483646; +select (-1.0) ^ 2147483647; +select (-1.0) ^ 2147483648; +select (-1.0) ^ 1000000000000000; +select (-1.0) ^ 1000000000000001; +-- +-- Tests for raising to non-integer powers +-- +-- special cases +select 0.0 ^ 0.0; +select (-12.34) ^ 0.0; +select 12.34 ^ 0.0; +select 0.0 ^ 12.34; +-- NaNs +select 'NaN'::numeric ^ 'NaN'::numeric; +select 'NaN'::numeric ^ 0; +select 'NaN'::numeric ^ 1; +select 0 ^ 'NaN'::numeric; +select 1 ^ 'NaN'::numeric; +-- invalid inputs +select 0.0 ^ (-12.34); +select (-12.34) ^ 1.2; +-- cases that used to generate inaccurate results +select 32.1 ^ 9.8; +select 32.1 ^ (-9.8); +select 12.3 ^ 45.6; +select 12.3 ^ (-45.6); +-- +-- Tests for EXP() +-- +-- special cases +select exp(0.0); +select exp(1.0); +select exp(1.0::numeric(71,70)); +select exp('nan'::numeric); +select exp('inf'::numeric); +-- cases that used to generate inaccurate results +select exp(32.999); +select exp(-32.999); +select exp(123.456); +select exp(-123.456); +-- +-- Tests for generate_series +-- +select * from generate_series(0.0::numeric, 4.0::numeric); +select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric); +select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric); diff --git a/ydb/library/yql/tests/postgresql/cases/select.err b/ydb/library/yql/tests/postgresql/cases/select.err index 474f2b5d4f..2ee7c86f83 100644 --- a/ydb/library/yql/tests/postgresql/cases/select.err +++ b/ydb/library/yql/tests/postgresql/cases/select.err @@ -347,17 +347,412 @@ INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1); <sql-statement> SELECT * FROM foo ORDER BY f1; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F2C13A29D90) -__libc_start_main+128 (0x7F2C13A29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT * FROM foo ORDER BY f1 ASC; -- same thing +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 1 + SELECT * FROM foo ORDER BY f1 NULLS FIRST; + ^ +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 2 + SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + ^ +<sql-statement> +-- check if indexscans do the right things +CREATE INDEX fooi ON foo (f1); +</sql-statement> +<sql-statement> +SET enable_sort = false; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_sort + SET enable_sort = false; + ^ +<sql-statement> +SELECT * FROM foo ORDER BY f1; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 1 + SELECT * FROM foo ORDER BY f1 NULLS FIRST; + ^ +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 2 + SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + ^ +<sql-statement> +DROP INDEX fooi; +</sql-statement> +-stdin-:<main>: Error: Pre type annotation + + -stdin-:<main>:1:1: Error: Unexpected tag: pgObject + DROP INDEX fooi; + ^ +<sql-statement> +CREATE INDEX fooi ON foo (f1 DESC); +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 1 + SELECT * FROM foo ORDER BY f1 NULLS FIRST; + ^ +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 2 + SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + ^ +<sql-statement> +DROP INDEX fooi; +</sql-statement> +-stdin-:<main>: Error: Pre type annotation + + -stdin-:<main>:1:1: Error: Unexpected tag: pgObject + DROP INDEX fooi; + ^ +<sql-statement> +CREATE INDEX fooi ON foo (f1 DESC NULLS LAST); +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 1 + SELECT * FROM foo ORDER BY f1 NULLS FIRST; + ^ +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC; +</sql-statement> +<sql-statement> +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: sortby_nulls unsupported value: 2 + SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + ^ +<sql-statement> +-- +-- Test planning of some cases with partial indexes +-- +-- partial index is usable +explain (costs off) +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- + ^ +<sql-statement> +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +-- actually run the query with an analyze to use the partial index +explain (costs off, analyze on, timing off, summary off) +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- actually run the query with an analyze to use the partial index + ^ +<sql-statement> +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +-- partial index predicate implies clause, so no need for retest +explain (costs off) +select * from onek2 where unique2 = 11 and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- partial index predicate implies clause, so no need for retest + ^ +<sql-statement> +select * from onek2 where unique2 = 11 and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +-- but if it's an update target, must retest anyway +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- but if it's an update target, must retest anyway + ^ +<sql-statement> +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; +</sql-statement> +-stdin-:<main>: Warning: Parse Sql + + -stdin-:<main>:1:1: Warning: SelectStmt: lockingClause is ignored + select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; + ^ +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +-- partial index is not applicable +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'C'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- partial index is not applicable + ^ +<sql-statement> +select unique2 from onek2 where unique2 = 11 and stringu1 < 'C'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +-- partial index implies clause, but bitmap scan must recheck predicate anyway +SET enable_indexscan TO off; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: enable_indexscan + -- partial index implies clause, but bitmap scan must recheck predicate anyway + ^ +<sql-statement> +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +RESET enable_indexscan; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET enable_indexscan; + ^ +<sql-statement> +-- check multi-index cases too +explain (costs off) +select unique1, unique2 from onek2 + where (unique2 = 11 or unique1 = 0) and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- check multi-index cases too + ^ +<sql-statement> +select unique1, unique2 from onek2 + where (unique2 = 11 or unique1 = 0) and stringu1 < 'B'; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +explain (costs off) +select unique1, unique2 from onek2 + where (unique2 = 11 and stringu1 < 'B') or unique1 = 0; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select unique1, unique2 from onek2 + where (unique2 = 11 and stringu1 < 'B') or unique1 = 0; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.onek2 + +<sql-statement> +-- +-- Test some corner cases that have been known to confuse the planner +-- +-- ORDER BY on a constant doesn't really need any sorting +SELECT 1 AS x ORDER BY x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- + ^ + -stdin-:<main>:5:24: Error: Column reference can't be used without FROM + SELECT 1 AS x ORDER BY x; + ^ +<sql-statement> +-- But ORDER BY on a set-valued expression does +create function sillysrf(int) returns setof int as + 'values (1),(10),(2),($1)' language sql immutable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- But ORDER BY on a set-valued expression does + ^ +<sql-statement> +select sillysrf(42); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select sillysrf(42); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select sillysrf(42); + ^ + -stdin-:<main>:1:8: Error: No such proc: sillysrf + select sillysrf(42); + ^ +<sql-statement> +select sillysrf(-1) order by 1; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select sillysrf(-1) order by 1; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select sillysrf(-1) order by 1; + ^ + -stdin-:<main>:1:8: Error: No such proc: sillysrf + select sillysrf(-1) order by 1; + ^ +<sql-statement> +drop function sillysrf(int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function sillysrf(int); + ^ +<sql-statement> +-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict +-- (see bug #5084) +select * from (values (2),(null),(1)) v(k) where k = k order by k; +</sql-statement> +<sql-statement> +select * from (values (2),(null),(1)) v(k) where k = k; +</sql-statement> +<sql-statement> +-- Test partitioned tables with no partitions, which should be handled the +-- same as the non-inheritance case when expanding its RTE. +create table list_parted_tbl (a int,b int) partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- Test partitioned tables with no partitions, which should be handled the + ^ +<sql-statement> +create table list_parted_tbl1 partition of list_parted_tbl + for values in (1) partition by list(b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table list_parted_tbl1 partition of list_parted_tbl + ^ +<sql-statement> +explain (costs off) select * from list_parted_tbl; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) select * from list_parted_tbl; + ^ +<sql-statement> +drop table list_parted_tbl; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select.out b/ydb/library/yql/tests/postgresql/cases/select.out index 550b4ef9aa..e72956c224 100644 --- a/ydb/library/yql/tests/postgresql/cases/select.out +++ b/ydb/library/yql/tests/postgresql/cases/select.out @@ -14,3 +14,23 @@ CREATE TEMP TABLE nocols(); -- CREATE TEMP TABLE foo (f1 int); INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1); +-- check if indexscans do the right things +CREATE INDEX fooi ON foo (f1); +CREATE INDEX fooi ON foo (f1 DESC); +CREATE INDEX fooi ON foo (f1 DESC NULLS LAST); +-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict +-- (see bug #5084) +select * from (values (2),(null),(1)) v(k) where k = k order by k; + k +--- + 1 + 2 +(2 rows) + +select * from (values (2),(null),(1)) v(k) where k = k; + k +--- + 2 + 1 +(2 rows) + diff --git a/ydb/library/yql/tests/postgresql/cases/select.sql b/ydb/library/yql/tests/postgresql/cases/select.sql index 43f57c644e..7b20191c59 100644 --- a/ydb/library/yql/tests/postgresql/cases/select.sql +++ b/ydb/library/yql/tests/postgresql/cases/select.sql @@ -7,3 +7,11 @@ CREATE TEMP TABLE nocols(); -- CREATE TEMP TABLE foo (f1 int); INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1); +-- check if indexscans do the right things +CREATE INDEX fooi ON foo (f1); +CREATE INDEX fooi ON foo (f1 DESC); +CREATE INDEX fooi ON foo (f1 DESC NULLS LAST); +-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict +-- (see bug #5084) +select * from (values (2),(null),(1)) v(k) where k = k order by k; +select * from (values (2),(null),(1)) v(k) where k = k; diff --git a/ydb/library/yql/tests/postgresql/cases/select_having.err b/ydb/library/yql/tests/postgresql/cases/select_having.err index 3df7f178bb..3bfa5ff803 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_having.err +++ b/ydb/library/yql/tests/postgresql/cases/select_having.err @@ -49,17 +49,62 @@ SELECT lower(c), count(c) FROM test_having GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) ORDER BY lower(c); </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F3D13629D90) -__libc_start_main+128 (0x7F3D13629E40) -??+0 (0x13E4C029) +<sql-statement> +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; +</sql-statement> +<sql-statement> +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); +</sql-statement> +<sql-statement> +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); +</sql-statement> +<sql-statement> +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +</sql-statement> +-stdin-:<main>: Error: Type annotation -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: AsStruct + -- errors: ungrouped column references + ^ + -stdin-:<main>:2:8: Error: At function: Member + SELECT a FROM test_having HAVING min(a) < max(a); + ^ + -stdin-:<main>:2:8: Error: Member not found: _alias_test_having.a + SELECT a FROM test_having HAVING min(a) < max(a); + ^ +<sql-statement> +SELECT 1 AS one FROM test_having HAVING a > 1; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: OrderedFilter, At function: Coalesce, At function: FromPg + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:43: Error: At function: PgResolvedOp + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:41: Error: At function: Member + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:41: Error: Member not found: _alias_test_having.a + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ +<sql-statement> +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; +</sql-statement> +<sql-statement> +SELECT 1 AS one FROM test_having HAVING 1 < 2; +</sql-statement> +<sql-statement> +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; +</sql-statement> +<sql-statement> +DROP TABLE test_having; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select_having.err.1 b/ydb/library/yql/tests/postgresql/cases/select_having.err.1 index c4a57826d2..3bfa5ff803 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_having.err.1 +++ b/ydb/library/yql/tests/postgresql/cases/select_having.err.1 @@ -49,17 +49,62 @@ SELECT lower(c), count(c) FROM test_having GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) ORDER BY lower(c); </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FF013429D90) -__libc_start_main+128 (0x7FF013429E40) -??+0 (0x13E4C029) +<sql-statement> +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; +</sql-statement> +<sql-statement> +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); +</sql-statement> +<sql-statement> +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); +</sql-statement> +<sql-statement> +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +</sql-statement> +-stdin-:<main>: Error: Type annotation -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: AsStruct + -- errors: ungrouped column references + ^ + -stdin-:<main>:2:8: Error: At function: Member + SELECT a FROM test_having HAVING min(a) < max(a); + ^ + -stdin-:<main>:2:8: Error: Member not found: _alias_test_having.a + SELECT a FROM test_having HAVING min(a) < max(a); + ^ +<sql-statement> +SELECT 1 AS one FROM test_having HAVING a > 1; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: OrderedFilter, At function: Coalesce, At function: FromPg + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:43: Error: At function: PgResolvedOp + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:41: Error: At function: Member + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:41: Error: Member not found: _alias_test_having.a + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ +<sql-statement> +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; +</sql-statement> +<sql-statement> +SELECT 1 AS one FROM test_having HAVING 1 < 2; +</sql-statement> +<sql-statement> +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; +</sql-statement> +<sql-statement> +DROP TABLE test_having; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select_having.err.2 b/ydb/library/yql/tests/postgresql/cases/select_having.err.2 index bb348a5d97..3bfa5ff803 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_having.err.2 +++ b/ydb/library/yql/tests/postgresql/cases/select_having.err.2 @@ -49,17 +49,62 @@ SELECT lower(c), count(c) FROM test_having GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) ORDER BY lower(c); </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F8E11C29D90) -__libc_start_main+128 (0x7F8E11C29E40) -??+0 (0x13E4C029) +<sql-statement> +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; +</sql-statement> +<sql-statement> +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); +</sql-statement> +<sql-statement> +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); +</sql-statement> +<sql-statement> +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +</sql-statement> +-stdin-:<main>: Error: Type annotation -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: AsStruct + -- errors: ungrouped column references + ^ + -stdin-:<main>:2:8: Error: At function: Member + SELECT a FROM test_having HAVING min(a) < max(a); + ^ + -stdin-:<main>:2:8: Error: Member not found: _alias_test_having.a + SELECT a FROM test_having HAVING min(a) < max(a); + ^ +<sql-statement> +SELECT 1 AS one FROM test_having HAVING a > 1; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: OrderedFilter, At function: Coalesce, At function: FromPg + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:43: Error: At function: PgResolvedOp + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:41: Error: At function: Member + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ + -stdin-:<main>:1:41: Error: Member not found: _alias_test_having.a + SELECT 1 AS one FROM test_having HAVING a > 1; + ^ +<sql-statement> +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; +</sql-statement> +<sql-statement> +SELECT 1 AS one FROM test_having HAVING 1 < 2; +</sql-statement> +<sql-statement> +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; +</sql-statement> +<sql-statement> +DROP TABLE test_having; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select_having.out b/ydb/library/yql/tests/postgresql/cases/select_having.out index 9d39b485f2..b0a1d99dad 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_having.out +++ b/ydb/library/yql/tests/postgresql/cases/select_having.out @@ -13,3 +13,30 @@ INSERT INTO test_having VALUES (6, 4, 'cccc', 'g'); INSERT INTO test_having VALUES (7, 4, 'cccc', 'h'); INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I'); INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); + min | max +-----+----- +(0 rows) + +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; + one +----- +(0 rows) + +SELECT 1 AS one FROM test_having HAVING 1 < 2; + one +----- + 1 +(1 row) + +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; + one +----- + 1 +(1 row) + +DROP TABLE test_having; diff --git a/ydb/library/yql/tests/postgresql/cases/select_having.sql b/ydb/library/yql/tests/postgresql/cases/select_having.sql index 9d39b485f2..79003b7d3c 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_having.sql +++ b/ydb/library/yql/tests/postgresql/cases/select_having.sql @@ -13,3 +13,12 @@ INSERT INTO test_having VALUES (6, 4, 'cccc', 'g'); INSERT INTO test_having VALUES (7, 4, 'cccc', 'h'); INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I'); INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; +SELECT 1 AS one FROM test_having HAVING 1 < 2; +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; +DROP TABLE test_having; diff --git a/ydb/library/yql/tests/postgresql/cases/select_implicit.err b/ydb/library/yql/tests/postgresql/cases/select_implicit.err index 9ccba0eed2..6fbf9e3067 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_implicit.err +++ b/ydb/library/yql/tests/postgresql/cases/select_implicit.err @@ -43,17 +43,251 @@ INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); -- w/ existing GROUP BY target SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7EFCA5629D90) -__libc_start_main+128 (0x7EFCA5629E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: OrderedMap, At function: Sort + -- w/o existing GROUP BY target and w/o existing a different ORDER BY target + ^ + -stdin-:<main>:3:62: Error: At function: Member + SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ + -stdin-:<main>:3:62: Error: Member not found: _alias_test_missing_target.b + SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +<sql-statement> +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; +</sql-statement> +<sql-statement> +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; +</sql-statement> +<sql-statement> +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; +</sql-statement> +<sql-statement> +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; +</sql-statement> +<sql-statement> +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; +</sql-statement> +<sql-statement> +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group using reference number out of range + ^ + -stdin-:<main>:3:54: Error: GROUP BY: position 3 is not in select list + SELECT c, count(*) FROM test_missing_target GROUP BY 3; + ^ +-stdin-:<main>: Fatal: ydb/library/yql/ast/yql_expr.h:1748: no children + +<sql-statement> +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY and ORDER BY target under ambiguous condition + ^ + -stdin-:<main>:5:11: Error: Column reference is ambiguous: b + GROUP BY b ORDER BY b; + ^ +<sql-statement> +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- order w/ target under ambiguous condition + ^ + -stdin-:<main>:1:1: Error: Duplicated member: a + -- order w/ target under ambiguous condition + ^ +<sql-statement> +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; +</sql-statement> +<sql-statement> +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; +</sql-statement> +<sql-statement> +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 277 + -- group w/o existing GROUP BY target under ambiguous condition + ^ +<sql-statement> +SELECT * FROM test_missing_target2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.test_missing_target2 + +<sql-statement> +-- Functions and expressions +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: OrderedMap, At function: Sort + -- w/o existing GROUP BY target and w/o existing a different ORDER BY target + ^ + -stdin-:<main>:3:62: Error: At function: Member + SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ + -stdin-:<main>:3:62: Error: Member not found: _alias_test_missing_target.b + SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +<sql-statement> +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; +</sql-statement> +<sql-statement> +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); +</sql-statement> +<sql-statement> +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY and ORDER BY target under ambiguous condition + ^ + -stdin-:<main>:5:11: Error: Column reference is ambiguous: b + GROUP BY b/2 ORDER BY b/2; + ^ +<sql-statement> +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY target under ambiguous condition + ^ + -stdin-:<main>:3:14: Error: Column reference is ambiguous: b + SELECT count(b) FROM test_missing_target x, test_missing_target y + ^ +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 277 + -- group w/o existing GROUP BY target under ambiguous condition + ^ +<sql-statement> +SELECT * FROM test_missing_target3; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.test_missing_target3 + +<sql-statement> +-- Cleanup +DROP TABLE test_missing_target; +</sql-statement> +<sql-statement> +DROP TABLE test_missing_target2; +</sql-statement> +<sql-statement> +DROP TABLE test_missing_target3; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select_implicit.err.1 b/ydb/library/yql/tests/postgresql/cases/select_implicit.err.1 index 66987a1f17..6fbf9e3067 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_implicit.err.1 +++ b/ydb/library/yql/tests/postgresql/cases/select_implicit.err.1 @@ -43,17 +43,251 @@ INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); -- w/ existing GROUP BY target SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F6A16A29D90) -__libc_start_main+128 (0x7F6A16A29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: OrderedMap, At function: Sort + -- w/o existing GROUP BY target and w/o existing a different ORDER BY target + ^ + -stdin-:<main>:3:62: Error: At function: Member + SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ + -stdin-:<main>:3:62: Error: Member not found: _alias_test_missing_target.b + SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +<sql-statement> +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; +</sql-statement> +<sql-statement> +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; +</sql-statement> +<sql-statement> +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; +</sql-statement> +<sql-statement> +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; +</sql-statement> +<sql-statement> +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; +</sql-statement> +<sql-statement> +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group using reference number out of range + ^ + -stdin-:<main>:3:54: Error: GROUP BY: position 3 is not in select list + SELECT c, count(*) FROM test_missing_target GROUP BY 3; + ^ +-stdin-:<main>: Fatal: ydb/library/yql/ast/yql_expr.h:1748: no children + +<sql-statement> +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY and ORDER BY target under ambiguous condition + ^ + -stdin-:<main>:5:11: Error: Column reference is ambiguous: b + GROUP BY b ORDER BY b; + ^ +<sql-statement> +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- order w/ target under ambiguous condition + ^ + -stdin-:<main>:1:1: Error: Duplicated member: a + -- order w/ target under ambiguous condition + ^ +<sql-statement> +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; +</sql-statement> +<sql-statement> +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; +</sql-statement> +<sql-statement> +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 277 + -- group w/o existing GROUP BY target under ambiguous condition + ^ +<sql-statement> +SELECT * FROM test_missing_target2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.test_missing_target2 + +<sql-statement> +-- Functions and expressions +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: OrderedMap, At function: Sort + -- w/o existing GROUP BY target and w/o existing a different ORDER BY target + ^ + -stdin-:<main>:3:62: Error: At function: Member + SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ + -stdin-:<main>:3:62: Error: Member not found: _alias_test_missing_target.b + SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +<sql-statement> +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; +</sql-statement> +<sql-statement> +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); +</sql-statement> +<sql-statement> +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY and ORDER BY target under ambiguous condition + ^ + -stdin-:<main>:5:11: Error: Column reference is ambiguous: b + GROUP BY b/2 ORDER BY b/2; + ^ +<sql-statement> +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY target under ambiguous condition + ^ + -stdin-:<main>:3:14: Error: Column reference is ambiguous: b + SELECT count(b) FROM test_missing_target x, test_missing_target y + ^ +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 277 + -- group w/o existing GROUP BY target under ambiguous condition + ^ +<sql-statement> +SELECT * FROM test_missing_target3; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.test_missing_target3 + +<sql-statement> +-- Cleanup +DROP TABLE test_missing_target; +</sql-statement> +<sql-statement> +DROP TABLE test_missing_target2; +</sql-statement> +<sql-statement> +DROP TABLE test_missing_target3; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select_implicit.err.2 b/ydb/library/yql/tests/postgresql/cases/select_implicit.err.2 index d36a3f7bfa..6fbf9e3067 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_implicit.err.2 +++ b/ydb/library/yql/tests/postgresql/cases/select_implicit.err.2 @@ -43,17 +43,251 @@ INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); -- w/ existing GROUP BY target SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FC318C29D90) -__libc_start_main+128 (0x7FC318C29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: OrderedMap, At function: Sort + -- w/o existing GROUP BY target and w/o existing a different ORDER BY target + ^ + -stdin-:<main>:3:62: Error: At function: Member + SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ + -stdin-:<main>:3:62: Error: Member not found: _alias_test_missing_target.b + SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +<sql-statement> +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; +</sql-statement> +<sql-statement> +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; +</sql-statement> +<sql-statement> +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; +</sql-statement> +<sql-statement> +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; +</sql-statement> +<sql-statement> +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; +</sql-statement> +<sql-statement> +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group using reference number out of range + ^ + -stdin-:<main>:3:54: Error: GROUP BY: position 3 is not in select list + SELECT c, count(*) FROM test_missing_target GROUP BY 3; + ^ +-stdin-:<main>: Fatal: ydb/library/yql/ast/yql_expr.h:1748: no children + +<sql-statement> +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY and ORDER BY target under ambiguous condition + ^ + -stdin-:<main>:5:11: Error: Column reference is ambiguous: b + GROUP BY b ORDER BY b; + ^ +<sql-statement> +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- order w/ target under ambiguous condition + ^ + -stdin-:<main>:1:1: Error: Duplicated member: a + -- order w/ target under ambiguous condition + ^ +<sql-statement> +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; +</sql-statement> +<sql-statement> +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; +</sql-statement> +<sql-statement> +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 277 + -- group w/o existing GROUP BY target under ambiguous condition + ^ +<sql-statement> +SELECT * FROM test_missing_target2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.test_missing_target2 + +<sql-statement> +-- Functions and expressions +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: OrderedMap, At function: Sort + -- w/o existing GROUP BY target and w/o existing a different ORDER BY target + ^ + -stdin-:<main>:3:62: Error: At function: Member + SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ + -stdin-:<main>:3:62: Error: Member not found: _alias_test_missing_target.b + SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +<sql-statement> +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; +</sql-statement> +<sql-statement> +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); +</sql-statement> +<sql-statement> +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); +</sql-statement> +<sql-statement> +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY and ORDER BY target under ambiguous condition + ^ + -stdin-:<main>:5:11: Error: Column reference is ambiguous: b + GROUP BY b/2 ORDER BY b/2; + ^ +<sql-statement> +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +</sql-statement> +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- group w/o existing GROUP BY target under ambiguous condition + ^ + -stdin-:<main>:3:14: Error: Column reference is ambiguous: b + SELECT count(b) FROM test_missing_target x, test_missing_target y + ^ +<sql-statement> +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 277 + -- group w/o existing GROUP BY target under ambiguous condition + ^ +<sql-statement> +SELECT * FROM test_missing_target3; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.test_missing_target3 + +<sql-statement> +-- Cleanup +DROP TABLE test_missing_target; +</sql-statement> +<sql-statement> +DROP TABLE test_missing_target2; +</sql-statement> +<sql-statement> +DROP TABLE test_missing_target3; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/select_implicit.out b/ydb/library/yql/tests/postgresql/cases/select_implicit.out index d9faaa22d1..a6719709bf 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_implicit.out +++ b/ydb/library/yql/tests/postgresql/cases/select_implicit.out @@ -17,3 +17,12 @@ INSERT INTO test_missing_target VALUES (6, 4, 'cccc', 'g'); INSERT INTO test_missing_target VALUES (7, 4, 'cccc', 'h'); INSERT INTO test_missing_target VALUES (8, 4, 'CCCC', 'I'); INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; + count +------- + 10 +(1 row) + +-- Cleanup +DROP TABLE test_missing_target; diff --git a/ydb/library/yql/tests/postgresql/cases/select_implicit.sql b/ydb/library/yql/tests/postgresql/cases/select_implicit.sql index d9faaa22d1..746abb2902 100644 --- a/ydb/library/yql/tests/postgresql/cases/select_implicit.sql +++ b/ydb/library/yql/tests/postgresql/cases/select_implicit.sql @@ -17,3 +17,7 @@ INSERT INTO test_missing_target VALUES (6, 4, 'cccc', 'g'); INSERT INTO test_missing_target VALUES (7, 4, 'cccc', 'h'); INSERT INTO test_missing_target VALUES (8, 4, 'CCCC', 'I'); INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; +-- Cleanup +DROP TABLE test_missing_target; diff --git a/ydb/library/yql/tests/postgresql/cases/strings.err b/ydb/library/yql/tests/postgresql/cases/strings.err index 0d09f7dc7e..ea8ad0008f 100644 --- a/ydb/library/yql/tests/postgresql/cases/strings.err +++ b/ydb/library/yql/tests/postgresql/cases/strings.err @@ -268,17 +268,17 @@ SET bytea_output TO hex; <sql-statement> SELECT E'\\xDeAdBeEf'::bytea; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F5874229D90) -__libc_start_main+128 (0x7F5874229E40) -??+0 (0x13E4C029) +BackTrace(void**, unsigned long)+29 (0x14087F6D) +TBackTrace::Capture()+30 (0x140884DE) +TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x14024628) +NYT::TNode::TTypeError::TTypeError()+25 (0x14530469) +NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x14531A3B) +NYT::TNode::AsString() const+30 (0x145305BE) +WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+872 (0x13F0FC28) +Main(int, char**)+5748 (0x13F15084) +main+273 (0x13F16831) +??+0 (0x7F6ED1829D90) +__libc_start_main+128 (0x7F6ED1829E40) +??+0 (0x13EA0029) (NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type list_node diff --git a/ydb/library/yql/tests/postgresql/cases/text.err b/ydb/library/yql/tests/postgresql/cases/text.err index a6d8f4a456..bc09ac9361 100644 --- a/ydb/library/yql/tests/postgresql/cases/text.err +++ b/ydb/library/yql/tests/postgresql/cases/text.err @@ -19,17 +19,827 @@ INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); <sql-statement> SELECT * FROM TEXT_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F3739A29D90) -__libc_start_main+128 (0x7F3739A29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- As of 8.3 we have removed most implicit casts to text, so that for example +-- this no longer works: +select length(42); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- As of 8.3 we have removed most implicit casts to text, so that for example + ^ + -stdin-:<main>:3:8: Error: At function: PgCall + select length(42); + ^ + -stdin-:<main>:3:8: Error: Unable to find an overload for proc length with given argument types: (int4) + select length(42); + ^ +<sql-statement> +-- But as a special exception for usability's sake, we still allow implicit +-- casting to text in concatenations, so long as the other input is text or +-- an unknown literal. So these work: +select 'four: '::text || 2+2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- But as a special exception for usability's sake, we still allow implicit + ^ + -stdin-:<main>:4:23: Error: At function: PgOp + select 'four: '::text || 2+2; + ^ + -stdin-:<main>:4:23: Error: Unable to find an overload for operator || with given argument type(s): (text,int4) + select 'four: '::text || 2+2; + ^ +<sql-statement> +select 'four: ' || 2+2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select 'four: ' || 2+2; + ^ + -stdin-:<main>:1:17: Error: At function: PgOp + select 'four: ' || 2+2; + ^ + -stdin-:<main>:1:17: Error: Unable to find an overload for operator || with given argument type(s): (unknown,int4) + select 'four: ' || 2+2; + ^ +<sql-statement> +-- but not this: +select 3 || 4.0; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- but not this: + ^ + -stdin-:<main>:2:10: Error: At function: PgOp + select 3 || 4.0; + ^ + -stdin-:<main>:2:10: Error: Unable to find an overload for operator || with given argument type(s): (int4,numeric) + select 3 || 4.0; + ^ +<sql-statement> +/* + * various string functions + */ +select concat('one'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + /* + ^ + -stdin-:<main>:4:8: Error: At function: PgCall + select concat('one'); + ^ + -stdin-:<main>:4:8: Error: No such proc: concat + select concat('one'); + ^ +<sql-statement> +select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + ^ + -stdin-:<main>:1:8: Error: No such proc: concat + select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + ^ +<sql-statement> +select concat_ws('#','one'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select concat_ws('#','one'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select concat_ws('#','one'); + ^ + -stdin-:<main>:1:8: Error: No such proc: concat_ws + select concat_ws('#','one'); + ^ +<sql-statement> +select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + ^ + -stdin-:<main>:1:8: Error: No such proc: concat_ws + select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + ^ +<sql-statement> +select concat_ws(',',10,20,null,30); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select concat_ws(',',10,20,null,30); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select concat_ws(',',10,20,null,30); + ^ + -stdin-:<main>:1:8: Error: No such proc: concat_ws + select concat_ws(',',10,20,null,30); + ^ +<sql-statement> +select concat_ws('',10,20,null,30); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select concat_ws('',10,20,null,30); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select concat_ws('',10,20,null,30); + ^ + -stdin-:<main>:1:8: Error: No such proc: concat_ws + select concat_ws('',10,20,null,30); + ^ +<sql-statement> +select concat_ws(NULL,10,20,null,30) is null; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select concat_ws(NULL,10,20,null,30) is null; + ^ + -stdin-:<main>:1:38: Error: At function: ToPg, At function: Not, At function: Exists + select concat_ws(NULL,10,20,null,30) is null; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select concat_ws(NULL,10,20,null,30) is null; + ^ + -stdin-:<main>:1:8: Error: No such proc: concat_ws + select concat_ws(NULL,10,20,null,30) is null; + ^ +<sql-statement> +select reverse('abcde'); +</sql-statement> +<sql-statement> +select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; +</sql-statement> +<sql-statement> +select quote_literal(''); +</sql-statement> +<sql-statement> +select quote_literal('abc'''); +</sql-statement> +<sql-statement> +select quote_literal(e'\\'); +</sql-statement> +<sql-statement> +-- check variadic labeled argument +select concat(variadic array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: FuncCall: unsupported func_variadic + select concat(variadic array[1,2,3]); + ^ +<sql-statement> +select concat_ws(',', variadic array[1,2,3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select concat_ws(',', variadic array[1,2,3]); + ^ +<sql-statement> +select concat_ws(',', variadic NULL::int[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select concat_ws(',', variadic NULL::int[]); + ^ +<sql-statement> +select concat(variadic NULL::int[]) is NULL; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select concat(variadic NULL::int[]) is NULL; + ^ +<sql-statement> +select concat(variadic '{}'::int[]) = ''; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select concat(variadic '{}'::int[]) = ''; + ^ +<sql-statement> +--should fail +select concat_ws(',', variadic 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: FuncCall: unsupported func_variadic + select concat_ws(',', variadic 10); + ^ +<sql-statement> +/* + * format + */ +select format(NULL); +</sql-statement> +<sql-statement> +select format('Hello'); +</sql-statement> +<sql-statement> +select format('Hello %s', 'World'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('Hello %s', 'World'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('Hello %s', 'World'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('Hello %s', 'World'); + ^ +<sql-statement> +select format('Hello %%'); +</sql-statement> +<sql-statement> +select format('Hello %%%%'); +</sql-statement> +<sql-statement> +-- should fail +select format('Hello %s %s', 'World'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- should fail + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('Hello %s %s', 'World'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('Hello %s %s', 'World'); + ^ +<sql-statement> +select format('Hello %s'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + select format('Hello %s'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: too few arguments for format() + + select format('Hello %s'); + ^ +<sql-statement> +select format('Hello %x', 20); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('Hello %x', 20); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('Hello %x', 20); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4) + select format('Hello %x', 20); + ^ +<sql-statement> +-- check literal and sql identifiers +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- check literal and sql identifiers + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,int4,unknown) + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello'); + ^ +<sql-statement> +select format('%s%s%s','Hello', NULL,'World'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%s%s%s','Hello', NULL,'World'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%s%s%s','Hello', NULL,'World'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,unknown,unknown) + select format('%s%s%s','Hello', NULL,'World'); + ^ +<sql-statement> +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,int4,unknown) + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); + ^ +<sql-statement> +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,unknown,unknown) + select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); + ^ +<sql-statement> +-- should fail, sql identifier cannot be NULL +select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- should fail, sql identifier cannot be NULL + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,int4,unknown) + select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello'); + ^ +<sql-statement> +-- check positional placeholders +select format('%1$s %3$s', 1, 2, 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- check positional placeholders + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('%1$s %3$s', 1, 2, 3); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,int4,int4) + select format('%1$s %3$s', 1, 2, 3); + ^ +<sql-statement> +select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,int4,int4,int4,int4,int4,int4,int4,int4,int4,int4,int4) + select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + ^ +<sql-statement> +-- should fail +select format('%1$s %4$s', 1, 2, 3); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- should fail + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('%1$s %4$s', 1, 2, 3); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,int4,int4) + select format('%1$s %4$s', 1, 2, 3); + ^ +<sql-statement> +select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,int4,int4,int4,int4,int4,int4,int4,int4,int4,int4,int4) + select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + ^ +<sql-statement> +select format('%0$s', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%0$s', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%0$s', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('%0$s', 'Hello'); + ^ +<sql-statement> +select format('%*0$s', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%*0$s', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%*0$s', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('%*0$s', 'Hello'); + ^ +<sql-statement> +select format('%1$', 1); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%1$', 1); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%1$', 1); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4) + select format('%1$', 1); + ^ +<sql-statement> +select format('%1$1', 1); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('%1$1', 1); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('%1$1', 1); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4) + select format('%1$1', 1); + ^ +<sql-statement> +-- check mix of positional and ordered placeholders +select format('Hello %s %1$s %s', 'World', 'Hello again'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- check mix of positional and ordered placeholders + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('Hello %s %1$s %s', 'World', 'Hello again'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,unknown) + select format('Hello %s %1$s %s', 'World', 'Hello again'); + ^ +<sql-statement> +select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,unknown) + select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); + ^ +<sql-statement> +-- check variadic labeled arguments +select format('%s, %s', variadic array['Hello','World']); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: FuncCall: unsupported func_variadic + select format('%s, %s', variadic array['Hello','World']); + ^ +<sql-statement> +select format('%s, %s', variadic array[1, 2]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select format('%s, %s', variadic array[1, 2]); + ^ +<sql-statement> +select format('%s, %s', variadic array[true, false]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select format('%s, %s', variadic array[true, false]); + ^ +<sql-statement> +select format('%s, %s', variadic array[true, false]::text[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select format('%s, %s', variadic array[true, false]::text[]); + ^ +<sql-statement> +-- check variadic with positional placeholders +select format('%2$s, %1$s', variadic array['first', 'second']); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: FuncCall: unsupported func_variadic + select format('%2$s, %1$s', variadic array['first', 'second']); + ^ +<sql-statement> +select format('%2$s, %1$s', variadic array[1, 2]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: unsupported func_variadic + select format('%2$s, %1$s', variadic array[1, 2]); + ^ +<sql-statement> +-- variadic argument can be array type NULL, but should not be referenced +select format('Hello', variadic NULL::int[]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: FuncCall: unsupported func_variadic + select format('Hello', variadic NULL::int[]); + ^ +<sql-statement> +-- variadic argument allows simulating more than FUNC_MAX_ARGS parameters +select format(string_agg('%s',','), variadic array_agg(i)) +from generate_series(1,200) g(i); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: FuncCall: unsupported func_variadic + select format(string_agg('%s',','), variadic array_agg(i)) + ^ +<sql-statement> +-- check field widths and left, right alignment +select format('>>%10s<<', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- check field widths and left, right alignment + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + select format('>>%10s<<', 'Hello'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%10s<<', 'Hello'); + ^ +<sql-statement> +select format('>>%10s<<', NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%10s<<', NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%10s<<', NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%10s<<', NULL); + ^ +<sql-statement> +select format('>>%10s<<', ''); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%10s<<', ''); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%10s<<', ''); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%10s<<', ''); + ^ +<sql-statement> +select format('>>%-10s<<', ''); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%-10s<<', ''); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%-10s<<', ''); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%-10s<<', ''); + ^ +<sql-statement> +select format('>>%-10s<<', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%-10s<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%-10s<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%-10s<<', 'Hello'); + ^ +<sql-statement> +select format('>>%-10s<<', NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%-10s<<', NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%-10s<<', NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%-10s<<', NULL); + ^ +<sql-statement> +select format('>>%1$10s<<', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%1$10s<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%1$10s<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%1$10s<<', 'Hello'); + ^ +<sql-statement> +select format('>>%1$-10I<<', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%1$-10I<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%1$-10I<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%1$-10I<<', 'Hello'); + ^ +<sql-statement> +select format('>>%2$*1$L<<', 10, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%2$*1$L<<', 10, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%2$*1$L<<', 10, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,unknown) + select format('>>%2$*1$L<<', 10, 'Hello'); + ^ +<sql-statement> +select format('>>%2$*1$L<<', 10, NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%2$*1$L<<', 10, NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%2$*1$L<<', 10, NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,unknown) + select format('>>%2$*1$L<<', 10, NULL); + ^ +<sql-statement> +select format('>>%2$*1$L<<', -10, NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%2$*1$L<<', -10, NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%2$*1$L<<', -10, NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,unknown) + select format('>>%2$*1$L<<', -10, NULL); + ^ +<sql-statement> +select format('>>%*s<<', 10, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%*s<<', 10, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%*s<<', 10, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,unknown) + select format('>>%*s<<', 10, 'Hello'); + ^ +<sql-statement> +select format('>>%*1$s<<', 10, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%*1$s<<', 10, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%*1$s<<', 10, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,unknown) + select format('>>%*1$s<<', 10, 'Hello'); + ^ +<sql-statement> +select format('>>%-s<<', 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%-s<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%-s<<', 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%-s<<', 'Hello'); + ^ +<sql-statement> +select format('>>%10L<<', NULL); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%10L<<', NULL); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%10L<<', NULL); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown) + select format('>>%10L<<', NULL); + ^ +<sql-statement> +select format('>>%2$*1$L<<', NULL, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%2$*1$L<<', NULL, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%2$*1$L<<', NULL, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,unknown,unknown) + select format('>>%2$*1$L<<', NULL, 'Hello'); + ^ +<sql-statement> +select format('>>%2$*1$L<<', 0, 'Hello'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + select format('>>%2$*1$L<<', 0, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + select format('>>%2$*1$L<<', 0, 'Hello'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc format with given argument types: (unknown,int4,unknown) + select format('>>%2$*1$L<<', 0, 'Hello'); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/text.out b/ydb/library/yql/tests/postgresql/cases/text.out index b70d550d03..626f759176 100644 --- a/ydb/library/yql/tests/postgresql/cases/text.out +++ b/ydb/library/yql/tests/postgresql/cases/text.out @@ -16,3 +16,72 @@ SELECT text 'this is a text string' = text 'this is a text strin' AS false; CREATE TABLE TEXT_TBL (f1 text); INSERT INTO TEXT_TBL VALUES ('doh!'); INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); +select reverse('abcde'); + reverse +--------- + edcba +(1 row) + +select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; + i | left | right +----+------+------- + -5 | | + -4 | | + -3 | a | j + -2 | ah | oj + -1 | aho | hoj + 0 | | + 1 | a | j + 2 | ah | oj + 3 | aho | hoj + 4 | ahoj | ahoj + 5 | ahoj | ahoj +(11 rows) + +select quote_literal(''); + quote_literal +--------------- + '' +(1 row) + +select quote_literal('abc'''); + quote_literal +--------------- + 'abc''' +(1 row) + +select quote_literal(e'\\'); + quote_literal +--------------- + E'\\' +(1 row) + +/* + * format + */ +select format(NULL); + format +-------- + +(1 row) + +select format('Hello'); + format +-------- + Hello +(1 row) + +select format('Hello %%'); + format +--------- + Hello % +(1 row) + +select format('Hello %%%%'); + format +---------- + Hello %% +(1 row) + +select format('Hello %s'); +ERROR: too few arguments for format() diff --git a/ydb/library/yql/tests/postgresql/cases/text.sql b/ydb/library/yql/tests/postgresql/cases/text.sql index 596e424cb1..7887dd6482 100644 --- a/ydb/library/yql/tests/postgresql/cases/text.sql +++ b/ydb/library/yql/tests/postgresql/cases/text.sql @@ -6,3 +6,16 @@ SELECT text 'this is a text string' = text 'this is a text strin' AS false; CREATE TABLE TEXT_TBL (f1 text); INSERT INTO TEXT_TBL VALUES ('doh!'); INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); +select reverse('abcde'); +select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; +select quote_literal(''); +select quote_literal('abc'''); +select quote_literal(e'\\'); +/* + * format + */ +select format(NULL); +select format('Hello'); +select format('Hello %%'); +select format('Hello %%%%'); +select format('Hello %s'); diff --git a/ydb/library/yql/tests/postgresql/cases/time.err b/ydb/library/yql/tests/postgresql/cases/time.err index afee613e83..0497f99afe 100644 --- a/ydb/library/yql/tests/postgresql/cases/time.err +++ b/ydb/library/yql/tests/postgresql/cases/time.err @@ -42,17 +42,158 @@ INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York'); <sql-statement> SELECT f1 AS "Time" FROM TIME_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F9B17A29D90) -__libc_start_main+128 (0x7F9B17A29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT f1 AS "Three" FROM TIME_TBL WHERE f1 < '05:06:07'; +</sql-statement> +<sql-statement> +SELECT f1 AS "Five" FROM TIME_TBL WHERE f1 > '05:06:07'; +</sql-statement> +<sql-statement> +SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00'; +</sql-statement> +<sql-statement> +SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00'; +</sql-statement> +<sql-statement> +-- Check edge cases +SELECT '23:59:59.999999'::time; +</sql-statement> +<sql-statement> +SELECT '23:59:59.9999999'::time; -- rounds up +</sql-statement> +<sql-statement> +SELECT '23:59:60'::time; -- rounds up +</sql-statement> +<sql-statement> +SELECT '24:00:00'::time; -- allowed +</sql-statement> +<sql-statement> +SELECT '24:00:00.01'::time; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '24:00:00.01'::time; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "24:00:00.01" + + SELECT '24:00:00.01'::time; -- not allowed + ^ +<sql-statement> +SELECT '23:59:60.01'::time; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '23:59:60.01'::time; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "23:59:60.01" + + SELECT '23:59:60.01'::time; -- not allowed + ^ +<sql-statement> +SELECT '24:01:00'::time; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '24:01:00'::time; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "24:01:00" + + SELECT '24:01:00'::time; -- not allowed + ^ +<sql-statement> +SELECT '25:00:00'::time; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '25:00:00'::time; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date/time field value out of range: "25:00:00" + + SELECT '25:00:00'::time; -- not allowed + ^ +<sql-statement> +-- +-- TIME simple math +-- +-- We now make a distinction between time and intervals, +-- and adding two times together makes no sense at all. +-- Leave in one query to show that it is rejected, +-- and do the rest of the testing in horology.sql +-- where we do mixed-type arithmetic. - thomas 2000-12-02 +SELECT f1 + time '00:01' AS "Illegal" FROM TIME_TBL; +</sql-statement> +<sql-statement> +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: "time" units "day" not recognized + + SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error + ^ +<sql-statement> +SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: "time" units "fortnight" not recognized + + SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error + ^ +<sql-statement> +SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: "time" units "timezone" not recognized + + SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error + ^ +<sql-statement> +SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT date_part('second', TIME '2020-05-26 13:30:25.575401'); +</sql-statement> +<sql-statement> +SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/time.out b/ydb/library/yql/tests/postgresql/cases/time.out index 26e3161674..6c74e267ce 100644 --- a/ydb/library/yql/tests/postgresql/cases/time.out +++ b/ydb/library/yql/tests/postgresql/cases/time.out @@ -13,3 +13,120 @@ INSERT INTO TIME_TBL VALUES ('23:59'); INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM'); INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00'; + None +------ +(0 rows) + +-- Check edge cases +SELECT '23:59:59.999999'::time; + time +----------------- + 23:59:59.999999 +(1 row) + +SELECT '23:59:59.9999999'::time; -- rounds up + time +---------- + 24:00:00 +(1 row) + +SELECT '23:59:60'::time; -- rounds up + time +---------- + 24:00:00 +(1 row) + +SELECT '24:00:00'::time; -- allowed + time +---------- + 24:00:00 +(1 row) + +SELECT '24:00:00.01'::time; -- not allowed +ERROR: date/time field value out of range: "24:00:00.01" +LINE 1: SELECT '24:00:00.01'::time; + ^ +SELECT '23:59:60.01'::time; -- not allowed +ERROR: date/time field value out of range: "23:59:60.01" +LINE 1: SELECT '23:59:60.01'::time; + ^ +SELECT '24:01:00'::time; -- not allowed +ERROR: date/time field value out of range: "24:01:00" +LINE 1: SELECT '24:01:00'::time; + ^ +SELECT '25:00:00'::time; -- not allowed +ERROR: date/time field value out of range: "25:00:00" +LINE 1: SELECT '25:00:00'::time; + ^ +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401'); + extract +---------- + 25575401 +(1 row) + +SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401'); + extract +----------- + 25575.401 +(1 row) + +SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401'); + extract +----------- + 25.575401 +(1 row) + +SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401'); + extract +--------- + 30 +(1 row) + +SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401'); + extract +--------- + 13 +(1 row) + +SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error +ERROR: "time" units "day" not recognized +SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error +ERROR: "time" units "fortnight" not recognized +SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error +ERROR: "time" units "timezone" not recognized +SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401'); + extract +-------------- + 48625.575401 +(1 row) + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401'); + date_part +----------- + 25575401 +(1 row) + +SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401'); + date_part +----------- + 25575.401 +(1 row) + +SELECT date_part('second', TIME '2020-05-26 13:30:25.575401'); + date_part +----------- + 25.575401 +(1 row) + +SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); + date_part +-------------- + 48625.575401 +(1 row) + diff --git a/ydb/library/yql/tests/postgresql/cases/time.sql b/ydb/library/yql/tests/postgresql/cases/time.sql index 26e3161674..67c9fb0023 100644 --- a/ydb/library/yql/tests/postgresql/cases/time.sql +++ b/ydb/library/yql/tests/postgresql/cases/time.sql @@ -13,3 +13,31 @@ INSERT INTO TIME_TBL VALUES ('23:59'); INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM'); INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00'; +-- Check edge cases +SELECT '23:59:59.999999'::time; +SELECT '23:59:59.9999999'::time; -- rounds up +SELECT '23:59:60'::time; -- rounds up +SELECT '24:00:00'::time; -- allowed +SELECT '24:00:00.01'::time; -- not allowed +SELECT '23:59:60.01'::time; -- not allowed +SELECT '24:01:00'::time; -- not allowed +SELECT '25:00:00'::time; -- not allowed +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error +SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error +SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error +SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401'); +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401'); +SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401'); +SELECT date_part('second', TIME '2020-05-26 13:30:25.575401'); +SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); diff --git a/ydb/library/yql/tests/postgresql/cases/timestamp.err b/ydb/library/yql/tests/postgresql/cases/timestamp.err index 24c93e6ba6..8e5c43e7fd 100644 --- a/ydb/library/yql/tests/postgresql/cases/timestamp.err +++ b/ydb/library/yql/tests/postgresql/cases/timestamp.err @@ -330,17 +330,387 @@ INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 5097 BC'); <sql-statement> SELECT d1 FROM TIMESTAMP_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F5DA6429D90) -__libc_start_main+128 (0x7F5DA6429E40) -??+0 (0x13E4C029) +<sql-statement> +-- Check behavior at the boundaries of the timestamp range +SELECT '4714-11-24 00:00:00 BC'::timestamp; +</sql-statement> +<sql-statement> +SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamp out of range: "4714-11-23 23:59:59 BC" -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null + SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range + ^ +<sql-statement> +SELECT '294276-12-31 23:59:59'::timestamp; +</sql-statement> +<sql-statement> +SELECT '294277-01-01 00:00:00'::timestamp; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '294277-01-01 00:00:00'::timestamp; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamp out of range: "294277-01-01 00:00:00" + + SELECT '294277-01-01 00:00:00'::timestamp; -- out of range + ^ +<sql-statement> +-- Demonstrate functions and operators +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 > timestamp without time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 < timestamp without time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 = timestamp without time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 != timestamp without time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 <= timestamp without time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 >= timestamp without time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 - timestamp without time zone '1997-01-02' AS diff + FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; +</sql-statement> +<sql-statement> +SELECT date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc; +</sql-statement> +<sql-statement> +-- verify date_bin behaves the same as date_trunc for relevant intervals +-- case 1: AD dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2001-01-01') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); +</sql-statement> +<sql-statement> +-- case 2: BC dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2000-01-01 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); +</sql-statement> +<sql-statement> +-- case 3: AD dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2020-03-02') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); +</sql-statement> +<sql-statement> +-- case 4: BC dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '0055-06-17 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); +</sql-statement> +<sql-statement> +-- bin timestamps into arbitrary intervals +SELECT + interval, + ts, + origin, + date_bin(interval::interval, ts, origin) +FROM ( + VALUES + ('15 days'), + ('2 hours'), + ('1 hour 30 minutes'), + ('15 minutes'), + ('10 seconds'), + ('100 milliseconds'), + ('250 microseconds') +) intervals (interval), +(VALUES (timestamp '2020-02-11 15:44:17.71393')) ts (ts), +(VALUES (timestamp '2001-01-01')) origin (origin); +</sql-statement> +<sql-statement> +-- shift bins using the origin parameter: +SELECT date_bin('5 min'::interval, timestamp '2020-02-01 01:01:01', timestamp '2020-02-01 00:02:30'); +</sql-statement> +<sql-statement> +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- disallow intervals with months or years + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamps cannot be binned into intervals containing months or years + + -- disallow intervals with months or years + ^ +<sql-statement> +SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamps cannot be binned into intervals containing months or years + + SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); + ^ +<sql-statement> +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- disallow zero intervals + ^ + -stdin-:<main>:1:1: Fatal: ERROR: stride must be greater than zero + + -- disallow zero intervals + ^ +<sql-statement> +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- disallow negative intervals + ^ + -stdin-:<main>:1:1: Fatal: ERROR: stride must be greater than zero + + -- disallow negative intervals + ^ +<sql-statement> +-- Test casting within a BETWEEN qualifier +SELECT d1 - timestamp without time zone '1997-01-02' AS diff + FROM TIMESTAMP_TBL + WHERE d1 BETWEEN timestamp without time zone '1902-01-01' + AND timestamp without time zone '2038-01-01'; +</sql-statement> +<sql-statement> +-- DATE_PART (timestamp_part) +SELECT d1 as "timestamp", + date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, + date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, + date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as "timestamp", + date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, + date_part( 'usec', d1) AS usec + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as "timestamp", + date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, + date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow, + date_part( 'doy', d1) AS doy + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as "timestamp", + date_part( 'decade', d1) AS decade, + date_part( 'century', d1) AS century, + date_part( 'millennium', d1) AS millennium, + round(date_part( 'julian', d1)) AS julian, + date_part( 'epoch', d1) AS epoch + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +-- extract implementation is mostly the same as date_part, so only +-- test a few cases for additional coverage. +SELECT d1 as "timestamp", + extract(microseconds from d1) AS microseconds, + extract(milliseconds from d1) AS milliseconds, + extract(seconds from d1) AS seconds, + round(extract(julian from d1)) AS julian, + extract(epoch from d1) AS epoch + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00'::timestamp); +</sql-statement> +<sql-statement> +SELECT extract(epoch from '294270-01-01 00:00:00'::timestamp); +</sql-statement> +<sql-statement> +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00'::timestamp); +</sql-statement> +<sql-statement> +-- TO_CHAR() +SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'HH24--text--MI--text--SS') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'YYYYTH YYYYth Jth') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') + FROM TIMESTAMP_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamp), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); +</sql-statement> +<sql-statement> +-- Roman months, with upper and lower case. +SELECT i, + to_char(i * interval '1mon', 'rm'), + to_char(i * interval '1mon', 'RM') + FROM generate_series(-13, 13) i; +</sql-statement> +<sql-statement> +-- timestamp numeric fields constructor +SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887); +</sql-statement> +<sql-statement> +SELECT make_timestamp(-44, 3, 15, 12, 30, 15); +</sql-statement> +<sql-statement> +-- should fail +select make_timestamp(0, 7, 15, 12, 30, 15); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: date field value out of range: 0-07-15 + + -- should fail + ^ +<sql-statement> +-- generate_series for timestamp +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); +</sql-statement> +<sql-statement> +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 month'::interval) limit 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:8: Error: Generator functions are not allowed in: SELECT + select generate_series('2022-01-01 00:00'::timestamp, + ^ +<sql-statement> +-- errors +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '0 hour'::interval); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- errors + ^ + -stdin-:<main>:1:1: Fatal: ERROR: step size cannot equal zero + + -- errors + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/timestamp.out b/ydb/library/yql/tests/postgresql/cases/timestamp.out index 55f6b42ace..b25c498663 100644 --- a/ydb/library/yql/tests/postgresql/cases/timestamp.out +++ b/ydb/library/yql/tests/postgresql/cases/timestamp.out @@ -112,3 +112,205 @@ INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1999'); INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2000'); INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 2000'); INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2001'); +SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range +ERROR: timestamp out of range: "4714-11-23 23:59:59 BC" +LINE 1: SELECT '4714-11-23 23:59:59 BC'::timestamp; + ^ +SELECT '294277-01-01 00:00:00'::timestamp; -- out of range +ERROR: timestamp out of range: "294277-01-01 00:00:00" +LINE 1: SELECT '294277-01-01 00:00:00'::timestamp; + ^ +-- verify date_bin behaves the same as date_trunc for relevant intervals +-- case 1: AD dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2001-01-01') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- case 2: BC dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2000-01-01 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- case 3: AD dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2020-03-02') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- case 4: BC dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '0055-06-17 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +ERROR: timestamps cannot be binned into intervals containing months or years +SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +ERROR: timestamps cannot be binned into intervals containing months or years +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +ERROR: stride must be greater than zero +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +ERROR: stride must be greater than zero +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00'::timestamp); + date_part +--------------- + 9224097091200 +(1 row) + +SELECT extract(epoch from '294270-01-01 00:00:00'::timestamp); + extract +---------------------- + 9224097091200.000000 +(1 row) + +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00'::timestamp); + extract +-------------------- + 95617584000.000000 +(1 row) + +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamp), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); + to_char +-------------------------------------------------------------------- + 0 00 000 0000 00000 000000 0 00 000 0000 00000 000000 000 000000 + 7 78 780 7800 78000 780000 7 78 780 7800 78000 780000 780 780000 + 7 78 789 7890 78901 789010 7 78 789 7890 78901 789010 789 789010 + 7 78 789 7890 78901 789012 7 78 789 7890 78901 789012 789 789012 +(4 rows) + +-- Roman months, with upper and lower case. +SELECT i, + to_char(i * interval '1mon', 'rm'), + to_char(i * interval '1mon', 'RM') + FROM generate_series(-13, 13) i; + i | to_char | to_char +-----+---------+--------- + -13 | xii | XII + -12 | i | I + -11 | ii | II + -10 | iii | III + -9 | iv | IV + -8 | v | V + -7 | vi | VI + -6 | vii | VII + -5 | viii | VIII + -4 | ix | IX + -3 | x | X + -2 | xi | XI + -1 | xii | XII + 0 | | + 1 | i | I + 2 | ii | II + 3 | iii | III + 4 | iv | IV + 5 | v | V + 6 | vi | VI + 7 | vii | VII + 8 | viii | VIII + 9 | ix | IX + 10 | x | X + 11 | xi | XI + 12 | xii | XII + 13 | i | I +(27 rows) + +-- should fail +select make_timestamp(0, 7, 15, 12, 30, 15); +ERROR: date field value out of range: 0-07-15 diff --git a/ydb/library/yql/tests/postgresql/cases/timestamp.sql b/ydb/library/yql/tests/postgresql/cases/timestamp.sql index 97b743f46f..19eb504254 100644 --- a/ydb/library/yql/tests/postgresql/cases/timestamp.sql +++ b/ydb/library/yql/tests/postgresql/cases/timestamp.sql @@ -97,3 +97,96 @@ INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1999'); INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2000'); INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 2000'); INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2001'); +SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range +SELECT '294277-01-01 00:00:00'::timestamp; -- out of range +-- verify date_bin behaves the same as date_trunc for relevant intervals +-- case 1: AD dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2001-01-01') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); +-- case 2: BC dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2000-01-01 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); +-- case 3: AD dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2020-03-02') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); +-- case 4: BC dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '0055-06-17 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00'::timestamp); +SELECT extract(epoch from '294270-01-01 00:00:00'::timestamp); +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00'::timestamp); +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamp), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); +-- Roman months, with upper and lower case. +SELECT i, + to_char(i * interval '1mon', 'rm'), + to_char(i * interval '1mon', 'RM') + FROM generate_series(-13, 13) i; +-- should fail +select make_timestamp(0, 7, 15, 12, 30, 15); diff --git a/ydb/library/yql/tests/postgresql/cases/timestamptz.err b/ydb/library/yql/tests/postgresql/cases/timestamptz.err index cd9f7ed009..7ba6e87295 100644 --- a/ydb/library/yql/tests/postgresql/cases/timestamptz.err +++ b/ydb/library/yql/tests/postgresql/cases/timestamptz.err @@ -449,17 +449,699 @@ SELECT 'Wed Jul 11 10:51:14 PST+03:00 2001'::timestamptz; <sql-statement> SELECT d1 FROM TIMESTAMPTZ_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FEACC629D90) -__libc_start_main+128 (0x7FEACC629E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- Check behavior at the boundaries of the timestamp range +SELECT '4714-11-24 00:00:00+00 BC'::timestamptz; +</sql-statement> +<sql-statement> +SELECT '4714-11-23 16:00:00-08 BC'::timestamptz; +</sql-statement> +<sql-statement> +SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type timestamp with time zone: "Sun Nov 23 16:00:00 4714 PST BC" + + SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz; + ^ +<sql-statement> +SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamp out of range: "4714-11-23 23:59:59+00 BC" + + SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range + ^ +<sql-statement> +SELECT '294276-12-31 23:59:59+00'::timestamptz; +</sql-statement> +<sql-statement> +SELECT '294276-12-31 15:59:59-08'::timestamptz; +</sql-statement> +<sql-statement> +SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamp out of range: "294277-01-01 00:00:00+00" + + SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range + ^ +<sql-statement> +SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamp out of range: "294277-12-31 16:00:00-08" + + SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range + ^ +<sql-statement> +-- Demonstrate functions and operators +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 > timestamp with time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 < timestamp with time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 = timestamp with time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 != timestamp with time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 <= timestamp with time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 >= timestamp with time zone '1997-01-02'; +</sql-statement> +<sql-statement> +SELECT d1 - timestamp with time zone '1997-01-02' AS diff + FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; +</sql-statement> +<sql-statement> +SELECT date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc; +</sql-statement> +<sql-statement> +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Australia/Sydney" not recognized + + SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name + ^ +<sql-statement> +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'GMT') as gmt_trunc; -- fixed-offset abbreviation +</sql-statement> +<sql-statement> +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "VET" not recognized + + SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation + ^ +<sql-statement> +-- verify date_bin behaves the same as date_trunc for relevant intervals +SELECT + str, + interval, + date_trunc(str, ts, 'Australia/Sydney') = date_bin(interval::interval, ts, timestamp with time zone '2001-01-01+11') AS equal +FROM ( + VALUES + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamptz '2020-02-29 15:44:17.71393+00')) ts (ts); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- verify date_bin behaves the same as date_trunc for relevant intervals + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Australia/Sydney" not recognized + + -- verify date_bin behaves the same as date_trunc for relevant intervals + ^ +<sql-statement> +-- bin timestamps into arbitrary intervals +SELECT + interval, + ts, + origin, + date_bin(interval::interval, ts, origin) +FROM ( + VALUES + ('15 days'), + ('2 hours'), + ('1 hour 30 minutes'), + ('15 minutes'), + ('10 seconds'), + ('100 milliseconds'), + ('250 microseconds') +) intervals (interval), +(VALUES (timestamptz '2020-02-11 15:44:17.71393')) ts (ts), +(VALUES (timestamptz '2001-01-01')) origin (origin); +</sql-statement> +<sql-statement> +-- shift bins using the origin parameter: +SELECT date_bin('5 min'::interval, timestamptz '2020-02-01 01:01:01+00', timestamptz '2020-02-01 00:02:30+00'); +</sql-statement> +<sql-statement> +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- disallow intervals with months or years + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamps cannot be binned into intervals containing months or years + + -- disallow intervals with months or years + ^ +<sql-statement> +SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: timestamps cannot be binned into intervals containing months or years + + SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); + ^ +<sql-statement> +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- disallow zero intervals + ^ + -stdin-:<main>:1:1: Fatal: ERROR: stride must be greater than zero + + -- disallow zero intervals + ^ +<sql-statement> +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- disallow negative intervals + ^ + -stdin-:<main>:1:1: Fatal: ERROR: stride must be greater than zero + + -- disallow negative intervals + ^ +<sql-statement> +-- Test casting within a BETWEEN qualifier +SELECT d1 - timestamp with time zone '1997-01-02' AS diff + FROM TIMESTAMPTZ_TBL + WHERE d1 BETWEEN timestamp with time zone '1902-01-01' AND timestamp with time zone '2038-01-01'; +</sql-statement> +<sql-statement> +-- DATE_PART (timestamptz_part) +SELECT d1 as timestamptz, + date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, + date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, + date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as timestamptz, + date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, + date_part( 'usec', d1) AS usec + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as timestamptz, + date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, + date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow, + date_part( 'doy', d1) AS doy + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as timestamptz, + date_part( 'decade', d1) AS decade, + date_part( 'century', d1) AS century, + date_part( 'millennium', d1) AS millennium, + round(date_part( 'julian', d1)) AS julian, + date_part( 'epoch', d1) AS epoch + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT d1 as timestamptz, + date_part( 'timezone', d1) AS timezone, + date_part( 'timezone_hour', d1) AS timezone_hour, + date_part( 'timezone_minute', d1) AS timezone_minute + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +-- extract implementation is mostly the same as date_part, so only +-- test a few cases for additional coverage. +SELECT d1 as "timestamp", + extract(microseconds from d1) AS microseconds, + extract(milliseconds from d1) AS milliseconds, + extract(seconds from d1) AS seconds, + round(extract(julian from d1)) AS julian, + extract(epoch from d1) AS epoch + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00+00'::timestamptz); +</sql-statement> +<sql-statement> +SELECT extract(epoch from '294270-01-01 00:00:00+00'::timestamptz); +</sql-statement> +<sql-statement> +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00+00'::timestamptz); +</sql-statement> +<sql-statement> +-- TO_CHAR() +SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'HH24--text--MI--text--SS') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'YYYYTH YYYYth Jth') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') + FROM TIMESTAMPTZ_TBL; +</sql-statement> +<sql-statement> +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamptz), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); +</sql-statement> +<sql-statement> +-- Check OF, TZH, TZM with various zone offsets, particularly fractional hours +SET timezone = '00:00'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + -- Check OF, TZH, TZM with various zone offsets, particularly fractional hours + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '+02:00'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '+02:00'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '-13:00'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '-13:00'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '-00:30'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '-00:30'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '00:30'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '00:30'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '-04:30'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '-04:30'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '04:30'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '04:30'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '-04:15'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '-04:15'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +SET timezone = '04:15'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: timezone + SET timezone = '04:15'; + ^ +<sql-statement> +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +</sql-statement> +<sql-statement> +RESET timezone; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET timezone; + ^ +<sql-statement> +CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); +</sql-statement> +<sql-statement> +-- Test year field value with len > 4 +INSERT INTO TIMESTAMPTZ_TST VALUES(1, 'Sat Mar 12 23:58:48 1000 IST'); +</sql-statement> +<sql-statement> +INSERT INTO TIMESTAMPTZ_TST VALUES(2, 'Sat Mar 12 23:58:48 10000 IST'); +</sql-statement> +<sql-statement> +INSERT INTO TIMESTAMPTZ_TST VALUES(3, 'Sat Mar 12 23:58:48 100000 IST'); +</sql-statement> +<sql-statement> +INSERT INTO TIMESTAMPTZ_TST VALUES(3, '10000 Mar 12 23:58:48 IST'); +</sql-statement> +<sql-statement> +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '100000312 23:58:48 IST'); +</sql-statement> +<sql-statement> +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST'); +</sql-statement> +<sql-statement> +--Verify data +SELECT * FROM TIMESTAMPTZ_TST ORDER BY a; +</sql-statement> +<sql-statement> +--Cleanup +DROP TABLE TIMESTAMPTZ_TST; +</sql-statement> +<sql-statement> +-- test timestamptz constructors +set TimeZone to 'America/New_York'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: TimeZone + -- test timestamptz constructors + ^ +<sql-statement> +-- numeric timezone +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33); +</sql-statement> +<sql-statement> +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2'); +</sql-statement> +<sql-statement> +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '-2'); +</sql-statement> +<sql-statement> +WITH tzs (tz) AS (VALUES + ('+1'), ('+1:'), ('+1:0'), ('+100'), ('+1:00'), ('+01:00'), + ('+10'), ('+1000'), ('+10:'), ('+10:0'), ('+10:00'), ('+10:00:'), + ('+10:00:1'), ('+10:00:01'), + ('+10:00:10')) + SELECT make_timestamptz(2010, 2, 27, 3, 45, 00, tz), tz FROM tzs; +</sql-statement> +<sql-statement> +-- these should fail +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '2'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- these should fail + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type numeric time zone: "2" +HINT: Numeric time zones must have "-" or "+" as first character. + + -- these should fail + ^ +<sql-statement> +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: numeric time zone "+16" out of range + + SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); + ^ +<sql-statement> +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: numeric time zone "-16" out of range + + SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); + ^ +<sql-statement> +-- should be true +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:55.33+02'::timestamptz; +</sql-statement> +<sql-statement> +-- full timezone names +SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') = timestamptz '2014-12-10 00:00:00 Europe/Prague'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- full timezone names + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Europe/Prague" not recognized + + -- full timezone names + ^ +<sql-statement> +SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Europe/Prague" not recognized + + SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; + ^ +<sql-statement> +SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Asia/Manila" not recognized + + SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; + ^ +<sql-statement> +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Europe/Paris" not recognized + + SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; + ^ +<sql-statement> +SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "Nehwon/Lankhmar" not recognized + + SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); + ^ +<sql-statement> +-- abbreviations +SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EST'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- abbreviations + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "EST" not recognized + + -- abbreviations + ^ +<sql-statement> +SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: time zone "EDT" not recognized + + SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); + ^ +<sql-statement> +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); +</sql-statement> +<sql-statement> +RESET TimeZone; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET TimeZone; + ^ +<sql-statement> +-- generate_series for timestamptz +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); +</sql-statement> +<sql-statement> +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 month'::interval) limit 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:8: Error: Generator functions are not allowed in: SELECT + select generate_series('2022-01-01 00:00'::timestamptz, + ^ +<sql-statement> +-- errors +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '0 hour'::interval); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- errors + ^ + -stdin-:<main>:1:1: Fatal: ERROR: step size cannot equal zero + + -- errors + ^ +<sql-statement> +-- +-- Test behavior with a dynamic (time-varying) timezone abbreviation. +-- These tests rely on the knowledge that MSK (Europe/Moscow standard time) +-- moved forwards in Mar 2011 and backwards again in Oct 2014. +-- +SET TimeZone to 'UTC'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: TimeZone + -- + ^ +<sql-statement> +SELECT '2011-03-27 00:00:00 Europe/Moscow'::timestamptz; +</sql-statement> +pgrun: /storage/d/arcc/mount/1/a0a05244-a249bf61-ec2999f5-6661a47b/contrib/libs/llvm12/lib/IR/LegacyPassManager.cpp:588: void llvm::PMTopLevelManager::setLastUser(ArrayRef<Pass *>, Pass *): Assertion `AnalysisPass && "Expected analysis pass to exist."' failed. +pthread_kill at ./nptl/./nptl/pthread_kill.c:43:17 +?? at ??:0:0 diff --git a/ydb/library/yql/tests/postgresql/cases/timestamptz.out b/ydb/library/yql/tests/postgresql/cases/timestamptz.out index 11c8cc7ca4..60506c7b3d 100644 --- a/ydb/library/yql/tests/postgresql/cases/timestamptz.out +++ b/ydb/library/yql/tests/postgresql/cases/timestamptz.out @@ -115,3 +115,94 @@ INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1999'); INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2000'); INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 2000'); INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2001'); +SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range +ERROR: timestamp out of range: "4714-11-23 23:59:59+00 BC" +LINE 1: SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; + ^ +SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range +ERROR: timestamp out of range: "294277-01-01 00:00:00+00" +LINE 1: SELECT '294277-01-01 00:00:00+00'::timestamptz; + ^ +SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range +ERROR: timestamp out of range: "294277-12-31 16:00:00-08" +LINE 1: SELECT '294277-12-31 16:00:00-08'::timestamptz; + ^ +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +ERROR: timestamps cannot be binned into intervals containing months or years +SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +ERROR: timestamps cannot be binned into intervals containing months or years +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +ERROR: stride must be greater than zero +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +ERROR: stride must be greater than zero +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00+00'::timestamptz); + date_part +--------------- + 9224097091200 +(1 row) + +SELECT extract(epoch from '294270-01-01 00:00:00+00'::timestamptz); + extract +---------------------- + 9224097091200.000000 +(1 row) + +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00+00'::timestamptz); + extract +-------------------- + 95617584000.000000 +(1 row) + +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamptz), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); + to_char +-------------------------------------------------------------------- + 0 00 000 0000 00000 000000 0 00 000 0000 00000 000000 000 000000 + 7 78 780 7800 78000 780000 7 78 780 7800 78000 780000 780 780000 + 7 78 789 7890 78901 789010 7 78 789 7890 78901 789010 789 789010 + 7 78 789 7890 78901 789012 7 78 789 7890 78901 789012 789 789012 +(4 rows) + +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +-----+--------- + +00 | +00:00 +(1 row) + +CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); +-- Test year field value with len > 4 +INSERT INTO TIMESTAMPTZ_TST VALUES(1, 'Sat Mar 12 23:58:48 1000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(2, 'Sat Mar 12 23:58:48 10000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, 'Sat Mar 12 23:58:48 100000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, '10000 Mar 12 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '100000312 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST'); +--Cleanup +DROP TABLE TIMESTAMPTZ_TST; +-- these should fail +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '2'); +ERROR: invalid input syntax for type numeric time zone: "2" +HINT: Numeric time zones must have "-" or "+" as first character. +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); +ERROR: numeric time zone "+16" out of range +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); +ERROR: numeric time zone "-16" out of range +-- should be true +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:55.33+02'::timestamptz; + ?column? +---------- + t +(1 row) + +SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); +ERROR: time zone "Nehwon/Lankhmar" not recognized diff --git a/ydb/library/yql/tests/postgresql/cases/timestamptz.sql b/ydb/library/yql/tests/postgresql/cases/timestamptz.sql index 2014211551..8137ff607b 100644 --- a/ydb/library/yql/tests/postgresql/cases/timestamptz.sql +++ b/ydb/library/yql/tests/postgresql/cases/timestamptz.sql @@ -99,3 +99,43 @@ INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1999'); INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2000'); INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 2000'); INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2001'); +SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range +SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range +SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00+00'::timestamptz); +SELECT extract(epoch from '294270-01-01 00:00:00+00'::timestamptz); +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00+00'::timestamptz); +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamptz), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); +-- Test year field value with len > 4 +INSERT INTO TIMESTAMPTZ_TST VALUES(1, 'Sat Mar 12 23:58:48 1000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(2, 'Sat Mar 12 23:58:48 10000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, 'Sat Mar 12 23:58:48 100000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, '10000 Mar 12 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '100000312 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST'); +--Cleanup +DROP TABLE TIMESTAMPTZ_TST; +-- these should fail +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '2'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); +-- should be true +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:55.33+02'::timestamptz; +SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); diff --git a/ydb/library/yql/tests/postgresql/cases/timetz.err b/ydb/library/yql/tests/postgresql/cases/timetz.err index 94cf552934..aa4722fde0 100644 --- a/ydb/library/yql/tests/postgresql/cases/timetz.err +++ b/ydb/library/yql/tests/postgresql/cases/timetz.err @@ -55,17 +55,202 @@ INSERT INTO TIMETZ_TBL VALUES ('15:36:39 MSK m2'); <sql-statement> SELECT f1 AS "Time TZ" FROM TIMETZ_TBL; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F63BCA29D90) -__libc_start_main+128 (0x7F63BCA29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT f1 AS "Three" FROM TIMETZ_TBL WHERE f1 < '05:06:07-07'; +</sql-statement> +<sql-statement> +SELECT f1 AS "Seven" FROM TIMETZ_TBL WHERE f1 > '05:06:07-07'; +</sql-statement> +<sql-statement> +SELECT f1 AS "None" FROM TIMETZ_TBL WHERE f1 < '00:00-07'; +</sql-statement> +<sql-statement> +SELECT f1 AS "Ten" FROM TIMETZ_TBL WHERE f1 >= '00:00-07'; +</sql-statement> +<sql-statement> +-- Check edge cases +SELECT '23:59:59.999999 PDT'::timetz; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + -- Check edge cases + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "23:59:59.999999 PDT" + + -- Check edge cases + ^ +<sql-statement> +SELECT '23:59:59.9999999 PDT'::timetz; -- rounds up +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '23:59:59.9999999 PDT'::timetz; -- rounds up + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "23:59:59.9999999 PDT" + + SELECT '23:59:59.9999999 PDT'::timetz; -- rounds up + ^ +<sql-statement> +SELECT '23:59:60 PDT'::timetz; -- rounds up +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '23:59:60 PDT'::timetz; -- rounds up + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "23:59:60 PDT" + + SELECT '23:59:60 PDT'::timetz; -- rounds up + ^ +<sql-statement> +SELECT '24:00:00 PDT'::timetz; -- allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '24:00:00 PDT'::timetz; -- allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "24:00:00 PDT" + + SELECT '24:00:00 PDT'::timetz; -- allowed + ^ +<sql-statement> +SELECT '24:00:00.01 PDT'::timetz; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '24:00:00.01 PDT'::timetz; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "24:00:00.01 PDT" + + SELECT '24:00:00.01 PDT'::timetz; -- not allowed + ^ +<sql-statement> +SELECT '23:59:60.01 PDT'::timetz; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '23:59:60.01 PDT'::timetz; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "23:59:60.01 PDT" + + SELECT '23:59:60.01 PDT'::timetz; -- not allowed + ^ +<sql-statement> +SELECT '24:01:00 PDT'::timetz; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '24:01:00 PDT'::timetz; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "24:01:00 PDT" + + SELECT '24:01:00 PDT'::timetz; -- not allowed + ^ +<sql-statement> +SELECT '25:00:00 PDT'::timetz; -- not allowed +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT '25:00:00 PDT'::timetz; -- not allowed + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid input syntax for type time with time zone: "25:00:00 PDT" + + SELECT '25:00:00 PDT'::timetz; -- not allowed + ^ +<sql-statement> +-- +-- TIME simple math +-- +-- We now make a distinction between time and intervals, +-- and adding two times together makes no sense at all. +-- Leave in one query to show that it is rejected, +-- and do the rest of the testing in horology.sql +-- where we do mixed-type arithmetic. - thomas 2000-12-02 +SELECT f1 + time with time zone '00:01' AS "Illegal" FROM TIMETZ_TBL; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- + ^ + -stdin-:<main>:9:11: Error: At function: PgOp + SELECT f1 + time with time zone '00:01' AS "Illegal" FROM TIMETZ_TBL; + ^ + -stdin-:<main>:9:11: Error: Unable to find an overload for operator + with given argument type(s): (timetz,timetz) + SELECT f1 + time with time zone '00:01' AS "Illegal" FROM TIMETZ_TBL; + ^ +<sql-statement> +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(MILLISECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(SECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: "time with time zone" units "day" not recognized + + SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error + ^ +<sql-statement> +SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error + ^ + -stdin-:<main>:1:1: Fatal: ERROR: "time with time zone" units "fortnight" not recognized + + SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error + ^ +<sql-statement> +SELECT EXTRACT(TIMEZONE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(TIMEZONE_HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(TIMEZONE_MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +</sql-statement> +<sql-statement> +SELECT EXTRACT(EPOCH FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT date_part('millisecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT date_part('second', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> +<sql-statement> +SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/timetz.out b/ydb/library/yql/tests/postgresql/cases/timetz.out index be4b2dcee3..543762a033 100644 --- a/ydb/library/yql/tests/postgresql/cases/timetz.out +++ b/ydb/library/yql/tests/postgresql/cases/timetz.out @@ -14,3 +14,95 @@ INSERT INTO TIMETZ_TBL VALUES ('23:59 PDT'); INSERT INTO TIMETZ_TBL VALUES ('11:59:59.99 PM PDT'); INSERT INTO TIMETZ_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); INSERT INTO TIMETZ_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +SELECT f1 AS "None" FROM TIMETZ_TBL WHERE f1 < '00:00-07'; + None +------ +(0 rows) + +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +---------- + 25575401 +(1 row) + +SELECT EXTRACT(MILLISECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +----------- + 25575.401 +(1 row) + +SELECT EXTRACT(SECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +----------- + 25.575401 +(1 row) + +SELECT EXTRACT(MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +--------- + 30 +(1 row) + +SELECT EXTRACT(HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +--------- + 13 +(1 row) + +SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +ERROR: "time with time zone" units "day" not recognized +SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +ERROR: "time with time zone" units "fortnight" not recognized +SELECT EXTRACT(TIMEZONE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); + extract +--------- + -16200 +(1 row) + +SELECT EXTRACT(TIMEZONE_HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); + extract +--------- + -4 +(1 row) + +SELECT EXTRACT(TIMEZONE_MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); + extract +--------- + -30 +(1 row) + +SELECT EXTRACT(EPOCH FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +-------------- + 63025.575401 +(1 row) + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +----------- + 25575401 +(1 row) + +SELECT date_part('millisecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +----------- + 25575.401 +(1 row) + +SELECT date_part('second', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +----------- + 25.575401 +(1 row) + +SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +-------------- + 63025.575401 +(1 row) + diff --git a/ydb/library/yql/tests/postgresql/cases/timetz.sql b/ydb/library/yql/tests/postgresql/cases/timetz.sql index be4b2dcee3..b563d22863 100644 --- a/ydb/library/yql/tests/postgresql/cases/timetz.sql +++ b/ydb/library/yql/tests/postgresql/cases/timetz.sql @@ -14,3 +14,24 @@ INSERT INTO TIMETZ_TBL VALUES ('23:59 PDT'); INSERT INTO TIMETZ_TBL VALUES ('11:59:59.99 PM PDT'); INSERT INTO TIMETZ_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); INSERT INTO TIMETZ_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +SELECT f1 AS "None" FROM TIMETZ_TBL WHERE f1 < '00:00-07'; +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(MILLISECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(SECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +SELECT EXTRACT(TIMEZONE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +SELECT EXTRACT(TIMEZONE_HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +SELECT EXTRACT(TIMEZONE_MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +SELECT EXTRACT(EPOCH FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT date_part('millisecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT date_part('second', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); diff --git a/ydb/library/yql/tests/postgresql/cases/truncate.err b/ydb/library/yql/tests/postgresql/cases/truncate.err index 4e7b29c54a..1256fa4a6c 100644 --- a/ydb/library/yql/tests/postgresql/cases/truncate.err +++ b/ydb/library/yql/tests/postgresql/cases/truncate.err @@ -11,17 +11,654 @@ INSERT INTO truncate_a VALUES (2); <sql-statement> SELECT * FROM truncate_a; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F93B8C29D90) -__libc_start_main+128 (0x7F93B8C29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- Roll truncate back +BEGIN; +</sql-statement> +<sql-statement> +TRUNCATE truncate_a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE truncate_a; + ^ +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +SELECT * FROM truncate_a; +</sql-statement> +<sql-statement> +-- Commit the truncate this time +BEGIN; +</sql-statement> +<sql-statement> +TRUNCATE truncate_a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE truncate_a; + ^ +<sql-statement> +COMMIT; +</sql-statement> +<sql-statement> +SELECT * FROM truncate_a; +</sql-statement> +<sql-statement> +-- Test foreign-key checks +CREATE TABLE trunc_b (a int REFERENCES truncate_a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: column constraint not supported + -- Test foreign-key checks + ^ +<sql-statement> +CREATE TABLE trunc_c (a serial PRIMARY KEY); +</sql-statement> +<sql-statement> +CREATE TABLE trunc_d (a int REFERENCES trunc_c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: column constraint not supported + CREATE TABLE trunc_d (a int REFERENCES trunc_c); + ^ +<sql-statement> +CREATE TABLE trunc_e (a int REFERENCES truncate_a, b int REFERENCES trunc_c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: column constraint not supported + CREATE TABLE trunc_e (a int REFERENCES truncate_a, b int REFERENCES trunc_c); + ^ +<sql-statement> +TRUNCATE TABLE truncate_a; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE truncate_a; -- fail + ^ +<sql-statement> +TRUNCATE TABLE truncate_a,trunc_b; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE truncate_a,trunc_b; -- fail + ^ +<sql-statement> +TRUNCATE TABLE truncate_a,trunc_b,trunc_e; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE truncate_a,trunc_b,trunc_e; -- ok + ^ +<sql-statement> +TRUNCATE TABLE truncate_a,trunc_e; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE truncate_a,trunc_e; -- fail + ^ +<sql-statement> +TRUNCATE TABLE trunc_c; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c; -- fail + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,trunc_d; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,trunc_d; -- fail + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,trunc_d,trunc_e; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,trunc_d,trunc_e; -- ok + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a; -- fail + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a,trunc_b; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a,trunc_b; -- ok + ^ +<sql-statement> +TRUNCATE TABLE truncate_a RESTRICT; -- fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE truncate_a RESTRICT; -- fail + ^ +<sql-statement> +TRUNCATE TABLE truncate_a CASCADE; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE truncate_a CASCADE; -- ok + ^ +<sql-statement> +-- circular references +ALTER TABLE truncate_a ADD FOREIGN KEY (col1) REFERENCES trunc_c; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + -- circular references + ^ +<sql-statement> +-- Add some data to verify that truncating actually works ... +INSERT INTO trunc_c VALUES (1); +</sql-statement> +<sql-statement> +INSERT INTO truncate_a VALUES (1); +</sql-statement> +<sql-statement> +INSERT INTO trunc_b VALUES (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_b + +<sql-statement> +INSERT INTO trunc_d VALUES (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_d + +<sql-statement> +INSERT INTO trunc_e VALUES (1,1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_e + +<sql-statement> +TRUNCATE TABLE trunc_c; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c; + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,truncate_a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,truncate_a; + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,truncate_a,trunc_d; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,truncate_a,trunc_d; + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e; + ^ +<sql-statement> +TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b; + ^ +<sql-statement> +-- Verify that truncating did actually work +SELECT * FROM truncate_a + UNION ALL + SELECT * FROM trunc_c + UNION ALL + SELECT * FROM trunc_b + UNION ALL + SELECT * FROM trunc_d; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_b + +<sql-statement> +SELECT * FROM trunc_e; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_e + +<sql-statement> +-- Add data again to test TRUNCATE ... CASCADE +INSERT INTO trunc_c VALUES (1); +</sql-statement> +<sql-statement> +INSERT INTO truncate_a VALUES (1); +</sql-statement> +<sql-statement> +INSERT INTO trunc_b VALUES (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_b + +<sql-statement> +INSERT INTO trunc_d VALUES (1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_d + +<sql-statement> +INSERT INTO trunc_e VALUES (1,1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_e + +<sql-statement> +TRUNCATE TABLE trunc_c CASCADE; -- ok +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE TABLE trunc_c CASCADE; -- ok + ^ +<sql-statement> +SELECT * FROM truncate_a + UNION ALL + SELECT * FROM trunc_c + UNION ALL + SELECT * FROM trunc_b + UNION ALL + SELECT * FROM trunc_d; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_b + +<sql-statement> +SELECT * FROM trunc_e; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_e + +<sql-statement> +DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: CASCADE is not implemented + DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE; + ^ +<sql-statement> +-- Test TRUNCATE with inheritance +CREATE TABLE trunc_f (col1 integer primary key); +</sql-statement> +<sql-statement> +INSERT INTO trunc_f VALUES (1); +</sql-statement> +<sql-statement> +INSERT INTO trunc_f VALUES (2); +</sql-statement> +<sql-statement> +CREATE TABLE trunc_fa (col2a text) INHERITS (trunc_f); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE trunc_fa (col2a text) INHERITS (trunc_f); + ^ +<sql-statement> +INSERT INTO trunc_fa VALUES (3, 'three'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_fa + +<sql-statement> +CREATE TABLE trunc_fb (col2b int) INHERITS (trunc_f); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE trunc_fb (col2b int) INHERITS (trunc_f); + ^ +<sql-statement> +INSERT INTO trunc_fb VALUES (4, 444); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_fb + +<sql-statement> +CREATE TABLE trunc_faa (col3 text) INHERITS (trunc_fa); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE trunc_faa (col3 text) INHERITS (trunc_fa); + ^ +<sql-statement> +INSERT INTO trunc_faa VALUES (5, 'five', 'FIVE'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_faa + +<sql-statement> +BEGIN; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +TRUNCATE trunc_f; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE trunc_f; + ^ +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +BEGIN; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +TRUNCATE ONLY trunc_f; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE ONLY trunc_f; + ^ +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +BEGIN; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_fa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_fa + +<sql-statement> +SELECT * FROM trunc_faa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_faa + +<sql-statement> +TRUNCATE ONLY trunc_fb, ONLY trunc_fa; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE ONLY trunc_fb, ONLY trunc_fa; + ^ +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_fa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_fa + +<sql-statement> +SELECT * FROM trunc_faa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_faa + +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +BEGIN; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_fa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_fa + +<sql-statement> +SELECT * FROM trunc_faa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_faa + +<sql-statement> +TRUNCATE ONLY trunc_fb, trunc_fa; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE ONLY trunc_fb, trunc_fa; + ^ +<sql-statement> +SELECT * FROM trunc_f; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_fa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_fa + +<sql-statement> +SELECT * FROM trunc_faa; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.trunc_faa + +<sql-statement> +ROLLBACK; +</sql-statement> +<sql-statement> +DROP TABLE trunc_f CASCADE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: CASCADE is not implemented + DROP TABLE trunc_f CASCADE; + ^ +<sql-statement> +-- Test ON TRUNCATE triggers +CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text); +</sql-statement> +<sql-statement> +CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text, + tgargv text, tgtable name, rowcount bigint); +</sql-statement> +<sql-statement> +CREATE FUNCTION trunctrigger() RETURNS trigger as $$ +declare c bigint; +begin + execute 'select count(*) from ' || quote_ident(tg_table_name) into c; + insert into trunc_trigger_log values + (TG_OP, TG_LEVEL, TG_WHEN, TG_ARGV[0], tg_table_name, c); + return null; +end; +$$ LANGUAGE plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION trunctrigger() RETURNS trigger as $$ + ^ +<sql-statement> +-- basic before trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +</sql-statement> +<sql-statement> +CREATE TRIGGER t +BEFORE TRUNCATE ON trunc_trigger_test +FOR EACH STATEMENT +EXECUTE PROCEDURE trunctrigger('before trigger truncate'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER t + ^ +<sql-statement> +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_trigger_log; +</sql-statement> +<sql-statement> +TRUNCATE trunc_trigger_test; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE trunc_trigger_test; + ^ +<sql-statement> +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_trigger_log; +</sql-statement> +<sql-statement> +DROP TRIGGER t ON trunc_trigger_test; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER t ON trunc_trigger_test; + ^ +<sql-statement> +truncate trunc_trigger_log; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + truncate trunc_trigger_log; + ^ +<sql-statement> +-- same test with an after trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +</sql-statement> +<sql-statement> +CREATE TRIGGER tt +AFTER TRUNCATE ON trunc_trigger_test +FOR EACH STATEMENT +EXECUTE PROCEDURE trunctrigger('after trigger truncate'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER tt + ^ +<sql-statement> +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_trigger_log; +</sql-statement> +<sql-statement> +TRUNCATE trunc_trigger_test; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257 + TRUNCATE trunc_trigger_test; + ^ +<sql-statement> +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +</sql-statement> +<sql-statement> +SELECT * FROM trunc_trigger_log; +</sql-statement> +<sql-statement> +DROP TABLE trunc_trigger_test; +</sql-statement> +<sql-statement> +DROP TABLE trunc_trigger_log; +</sql-statement> +<sql-statement> +DROP FUNCTION trunctrigger(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + DROP FUNCTION trunctrigger(); + ^ +<sql-statement> +-- test TRUNCATE ... RESTART IDENTITY +CREATE SEQUENCE truncate_a_id1 START WITH 33; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 278 + -- test TRUNCATE ... RESTART IDENTITY + ^ +<sql-statement> +CREATE TABLE truncate_a (id serial, + id1 integer default nextval('truncate_a_id1')); +</sql-statement> +(TFileError) (File exists) util/system/file.cpp:857: can't open "/tmp/tmpmso99vtd/truncate_a" with mode CreateNew (0x00000003) diff --git a/ydb/library/yql/tests/postgresql/cases/truncate.out b/ydb/library/yql/tests/postgresql/cases/truncate.out index 5ec9a033fd..0f25ec0ad4 100644 --- a/ydb/library/yql/tests/postgresql/cases/truncate.out +++ b/ydb/library/yql/tests/postgresql/cases/truncate.out @@ -2,3 +2,54 @@ CREATE TABLE truncate_a (col1 integer primary key); INSERT INTO truncate_a VALUES (1); INSERT INTO truncate_a VALUES (2); +-- Roll truncate back +BEGIN; +ROLLBACK; +-- Commit the truncate this time +BEGIN; +COMMIT; +CREATE TABLE trunc_c (a serial PRIMARY KEY); +-- Add some data to verify that truncating actually works ... +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +-- Add data again to test TRUNCATE ... CASCADE +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +-- Test TRUNCATE with inheritance +CREATE TABLE trunc_f (col1 integer primary key); +INSERT INTO trunc_f VALUES (1); +INSERT INTO trunc_f VALUES (2); +BEGIN; +ROLLBACK; +BEGIN; +ROLLBACK; +BEGIN; +ROLLBACK; +BEGIN; +ROLLBACK; +-- Test ON TRUNCATE triggers +CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text); +CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text, + tgargv text, tgtable name, rowcount bigint); +-- basic before trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; + Row count in test table +------------------------- + 2 +(1 row) + +SELECT * FROM trunc_trigger_log; + tgop | tglevel | tgwhen | tgargv | tgtable | rowcount +------+---------+--------+--------+---------+---------- +(0 rows) + +-- same test with an after trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +SELECT * FROM trunc_trigger_log; + tgop | tglevel | tgwhen | tgargv | tgtable | rowcount +------+---------+--------+--------+---------+---------- +(0 rows) + +DROP TABLE trunc_trigger_test; +DROP TABLE trunc_trigger_log; diff --git a/ydb/library/yql/tests/postgresql/cases/truncate.sql b/ydb/library/yql/tests/postgresql/cases/truncate.sql index 5ec9a033fd..72efec79d8 100644 --- a/ydb/library/yql/tests/postgresql/cases/truncate.sql +++ b/ydb/library/yql/tests/postgresql/cases/truncate.sql @@ -2,3 +2,41 @@ CREATE TABLE truncate_a (col1 integer primary key); INSERT INTO truncate_a VALUES (1); INSERT INTO truncate_a VALUES (2); +-- Roll truncate back +BEGIN; +ROLLBACK; +-- Commit the truncate this time +BEGIN; +COMMIT; +CREATE TABLE trunc_c (a serial PRIMARY KEY); +-- Add some data to verify that truncating actually works ... +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +-- Add data again to test TRUNCATE ... CASCADE +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +-- Test TRUNCATE with inheritance +CREATE TABLE trunc_f (col1 integer primary key); +INSERT INTO trunc_f VALUES (1); +INSERT INTO trunc_f VALUES (2); +BEGIN; +ROLLBACK; +BEGIN; +ROLLBACK; +BEGIN; +ROLLBACK; +BEGIN; +ROLLBACK; +-- Test ON TRUNCATE triggers +CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text); +CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text, + tgargv text, tgtable name, rowcount bigint); +-- basic before trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +SELECT * FROM trunc_trigger_log; +-- same test with an after trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +SELECT * FROM trunc_trigger_log; +DROP TABLE trunc_trigger_test; +DROP TABLE trunc_trigger_log; diff --git a/ydb/library/yql/tests/postgresql/cases/update.err b/ydb/library/yql/tests/postgresql/cases/update.err index 974d2a732f..bac87e0cbf 100644 --- a/ydb/library/yql/tests/postgresql/cases/update.err +++ b/ydb/library/yql/tests/postgresql/cases/update.err @@ -23,17 +23,2313 @@ INSERT INTO update_test(b, a) VALUES (15, 10); <sql-statement> SELECT * FROM update_test; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7FECC4229D90) -__libc_start_main+128 (0x7FECC4229E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +UPDATE update_test SET a = DEFAULT, b = DEFAULT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 148 + UPDATE update_test SET a = DEFAULT, b = DEFAULT; + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- aliases for the UPDATE target table +UPDATE update_test AS t SET b = 10 WHERE t.a = 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alias is not supported + -- aliases for the UPDATE target table + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alias is not supported + UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10; + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- +-- Test VALUES in FROM +-- +UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j) + WHERE update_test.b = v.j; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- fail, wrong data type: +UPDATE update_test SET a = v.* FROM (VALUES(100, 20)) AS v(i, j) + WHERE update_test.b = v.j; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- +-- Test multiple-set-clause syntax +-- +INSERT INTO update_test SELECT a,b+1,c FROM update_test; +</sql-statement> +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo'; + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10; + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- fail, multi assignment to same column: +UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- fail, multi assignment to same column: + ^ +<sql-statement> +-- uncorrelated sub-select: +UPDATE update_test + SET (b,a) = (select a,b from update_test where b = 41 and c = 'car') + WHERE a = 100 AND b = 20; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- uncorrelated sub-select: + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- correlated sub-select: +UPDATE update_test o + SET (b,a) = (select a+1,b from update_test i + where i.a=o.a and i.b=o.b and i.c is not distinct from o.c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- correlated sub-select: + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- fail, multiple rows supplied: +UPDATE update_test SET (b,a) = (select a+1,b from update_test); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- fail, multiple rows supplied: + ^ +<sql-statement> +-- set to null if no rows supplied: +UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000) + WHERE a = 11; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- set to null if no rows supplied: + ^ +<sql-statement> +SELECT * FROM update_test; +</sql-statement> +<sql-statement> +-- *-expansion should work in this context: +UPDATE update_test SET (a,b) = ROW(v.*) FROM (VALUES(21, 100)) AS v(i, j) + WHERE update_test.a = v.i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- *-expansion should work in this context: + ^ +<sql-statement> +-- you might expect this to work, but syntactically it's not a RowExpr: +UPDATE update_test SET (a,b) = (v.*) FROM (VALUES(21, 101)) AS v(i, j) + WHERE update_test.a = v.i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 363 + -- you might expect this to work, but syntactically it's not a RowExpr: + ^ +<sql-statement> +-- if an alias for the target table is specified, don't allow references +-- to the original table name +UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a = 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alias is not supported + -- if an alias for the target table is specified, don't allow references + ^ +<sql-statement> +-- Make sure that we can update to a TOASTed value. +UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT a, b, char_length(c) FROM update_test; +</sql-statement> +<sql-statement> +-- Check multi-assignment with a Result node to handle a one-time filter. +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE update_test t + SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) + WHERE CURRENT_USER = SESSION_USER; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Check multi-assignment with a Result node to handle a one-time filter. + ^ +<sql-statement> +UPDATE update_test t + SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) + WHERE CURRENT_USER = SESSION_USER; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:9: Error: Usupported SQLValueFunction: 10 + WHERE CURRENT_USER = SESSION_USER; + ^ + -stdin-:<main>:3:24: Error: Usupported SQLValueFunction: 12 + WHERE CURRENT_USER = SESSION_USER; + ^ +<sql-statement> +SELECT a, b, char_length(c) FROM update_test; +</sql-statement> +<sql-statement> +-- Test ON CONFLICT DO UPDATE +INSERT INTO upsert_test VALUES(1, 'Boo'), (3, 'Zoo'); +</sql-statement> +<sql-statement> +-- uncorrelated sub-select: +WITH aaa AS (SELECT 1 AS a, 'Foo' AS b) INSERT INTO upsert_test + VALUES (1, 'Bar') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- uncorrelated sub-select: + ^ +<sql-statement> +-- correlated sub-select: +INSERT INTO upsert_test VALUES (1, 'Baz'), (3, 'Zaz') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Correlated', a from upsert_test i WHERE i.a = upsert_test.a) + RETURNING *; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- correlated sub-select: + ^ +<sql-statement> +-- correlated sub-select (EXCLUDED.* alias): +INSERT INTO upsert_test VALUES (1, 'Bat'), (3, 'Zot') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING *; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- correlated sub-select (EXCLUDED.* alias): + ^ +<sql-statement> +-- ON CONFLICT using system attributes in RETURNING, testing both the +-- inserting and updating paths. See bug report at: +-- https://www.postgresql.org/message-id/73436355-6432-49B1-92ED-1FE4F7E7E100%40finefun.com.au +INSERT INTO upsert_test VALUES (2, 'Beeble') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING tableoid::regclass, xmin = pg_current_xact_id()::xid AS xmin_correct, xmax = 0 AS xmax_correct; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- ON CONFLICT using system attributes in RETURNING, testing both the + ^ +<sql-statement> +-- currently xmax is set after a conflict - that's probably not good, +-- but it seems worthwhile to have to be explicit if that changes. +INSERT INTO upsert_test VALUES (2, 'Brox') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING tableoid::regclass, xmin = pg_current_xact_id()::xid AS xmin_correct, xmax = pg_current_xact_id()::xid AS xmax_correct; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- currently xmax is set after a conflict - that's probably not good, + ^ +<sql-statement> +DROP TABLE update_test; +</sql-statement> +<sql-statement> +DROP TABLE upsert_test; +</sql-statement> +<sql-statement> +-- Test ON CONFLICT DO UPDATE with partitioned table and non-identical children +CREATE TABLE upsert_test ( + a INT PRIMARY KEY, + b TEXT +) PARTITION BY LIST (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- Test ON CONFLICT DO UPDATE with partitioned table and non-identical children + ^ +<sql-statement> +CREATE TABLE upsert_test_1 PARTITION OF upsert_test FOR VALUES IN (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE upsert_test_1 PARTITION OF upsert_test FOR VALUES IN (1); + ^ +<sql-statement> +CREATE TABLE upsert_test_2 (b TEXT, a INT PRIMARY KEY); +</sql-statement> +<sql-statement> +ALTER TABLE upsert_test ATTACH PARTITION upsert_test_2 FOR VALUES IN (2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE upsert_test ATTACH PARTITION upsert_test_2 FOR VALUES IN (2); + ^ +<sql-statement> +INSERT INTO upsert_test VALUES(1, 'Boo'), (2, 'Zoo'); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.upsert_test + +<sql-statement> +-- uncorrelated sub-select: +WITH aaa AS (SELECT 1 AS a, 'Foo' AS b) INSERT INTO upsert_test + VALUES (1, 'Bar') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- uncorrelated sub-select: + ^ +<sql-statement> +-- correlated sub-select: +WITH aaa AS (SELECT 1 AS ctea, ' Foo' AS cteb) INSERT INTO upsert_test + VALUES (1, 'Bar'), (2, 'Baz') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT upsert_test.b||cteb, upsert_test.a FROM aaa) RETURNING *; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: InsertStmt: not supported onConflictClause + -- correlated sub-select: + ^ +<sql-statement> +DROP TABLE upsert_test; +</sql-statement> +<sql-statement> +--------------------------- +-- UPDATE with row movement +--------------------------- +-- When a partitioned table receives an UPDATE to the partitioned key and the +-- new values no longer meet the partition's bound, the row must be moved to +-- the correct partition for the new partition key (if one exists). We must +-- also ensure that updatable views on partitioned tables properly enforce any +-- WITH CHECK OPTION that is defined. The situation with triggers in this case +-- also requires thorough testing as partition key updates causing row +-- movement convert UPDATEs into DELETE+INSERT. +CREATE TABLE range_parted ( + a text, + b bigint, + c numeric, + d int, + e varchar +) PARTITION BY RANGE (a, b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + --------------------------- + ^ +<sql-statement> +-- Create partitions intentionally in descending bound order, so as to test +-- that update-row-movement works with the leaf partitions not in bound order. +CREATE TABLE part_b_20_b_30 (e varchar, c numeric, a text, b bigint, d int); +</sql-statement> +<sql-statement> +ALTER TABLE range_parted ATTACH PARTITION part_b_20_b_30 FOR VALUES FROM ('b', 20) TO ('b', 30); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE range_parted ATTACH PARTITION part_b_20_b_30 FOR VALUES FROM ('b', 20) TO ('b', 30); + ^ +<sql-statement> +CREATE TABLE part_b_10_b_20 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY RANGE (c); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + CREATE TABLE part_b_10_b_20 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY RANGE (c); + ^ +<sql-statement> +CREATE TABLE part_b_1_b_10 PARTITION OF range_parted FOR VALUES FROM ('b', 1) TO ('b', 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE part_b_1_b_10 PARTITION OF range_parted FOR VALUES FROM ('b', 1) TO ('b', 10); + ^ +<sql-statement> +ALTER TABLE range_parted ATTACH PARTITION part_b_10_b_20 FOR VALUES FROM ('b', 10) TO ('b', 20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE range_parted ATTACH PARTITION part_b_10_b_20 FOR VALUES FROM ('b', 10) TO ('b', 20); + ^ +<sql-statement> +CREATE TABLE part_a_10_a_20 PARTITION OF range_parted FOR VALUES FROM ('a', 10) TO ('a', 20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE part_a_10_a_20 PARTITION OF range_parted FOR VALUES FROM ('a', 10) TO ('a', 20); + ^ +<sql-statement> +CREATE TABLE part_a_1_a_10 PARTITION OF range_parted FOR VALUES FROM ('a', 1) TO ('a', 10); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE part_a_1_a_10 PARTITION OF range_parted FOR VALUES FROM ('a', 1) TO ('a', 10); + ^ +<sql-statement> +-- Check that partition-key UPDATE works sanely on a partitioned table that +-- does not have any child partitions. +UPDATE part_b_10_b_20 set b = b - 6; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- Create some more partitions following the above pattern of descending bound +-- order, but let's make the situation a bit more complex by having the +-- attribute numbers of the columns vary from their parent partition. +CREATE TABLE part_c_100_200 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY range (abs(d)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- Create some more partitions following the above pattern of descending bound + ^ +<sql-statement> +ALTER TABLE part_c_100_200 DROP COLUMN e, DROP COLUMN c, DROP COLUMN a; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE part_c_100_200 DROP COLUMN e, DROP COLUMN c, DROP COLUMN a; + ^ +<sql-statement> +ALTER TABLE part_c_100_200 ADD COLUMN c numeric, ADD COLUMN e varchar, ADD COLUMN a text; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE part_c_100_200 ADD COLUMN c numeric, ADD COLUMN e varchar, ADD COLUMN a text; + ^ +<sql-statement> +ALTER TABLE part_c_100_200 DROP COLUMN b; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE part_c_100_200 DROP COLUMN b; + ^ +<sql-statement> +ALTER TABLE part_c_100_200 ADD COLUMN b bigint; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE part_c_100_200 ADD COLUMN b bigint; + ^ +<sql-statement> +CREATE TABLE part_d_1_15 PARTITION OF part_c_100_200 FOR VALUES FROM (1) TO (15); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE part_d_1_15 PARTITION OF part_c_100_200 FOR VALUES FROM (1) TO (15); + ^ +<sql-statement> +CREATE TABLE part_d_15_20 PARTITION OF part_c_100_200 FOR VALUES FROM (15) TO (20); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE part_d_15_20 PARTITION OF part_c_100_200 FOR VALUES FROM (15) TO (20); + ^ +<sql-statement> +ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_100_200 FOR VALUES FROM (100) TO (200); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_100_200 FOR VALUES FROM (100) TO (200); + ^ +<sql-statement> +CREATE TABLE part_c_1_100 (e varchar, d int, c numeric, b bigint, a text); +</sql-statement> +<sql-statement> +ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_1_100 FOR VALUES FROM (1) TO (100); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_1_100 FOR VALUES FROM (1) TO (100); + ^ +<sql-statement> +\set init_range_parted 'truncate range_parted; insert into range_parted VALUES (''a'', 1, 1, 1), (''a'', 10, 200, 1), (''b'', 12, 96, 1), (''b'', 13, 97, 2), (''b'', 15, 105, 16), (''b'', 17, 105, 19)' +</sql-statement> +Metacommand \set init_range_parted 'truncate range_parted; insert into range_parted VALUES (''a'', 1, 1, 1), (''a'', 10, 200, 1), (''b'', 12, 96, 1), (''b'', 13, 97, 2), (''b'', 15, 105, 16), (''b'', 17, 105, 19)' is not supported +<sql-statement> +\set show_data 'select tableoid::regclass::text COLLATE "C" partname, * from range_parted ORDER BY 1, 2, 3, 4, 5, 6' +</sql-statement> +Metacommand \set show_data 'select tableoid::regclass::text COLLATE "C" partname, * from range_parted ORDER BY 1, 2, 3, 4, 5, 6' is not supported +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- The order of subplans should be in bound order +EXPLAIN (costs off) UPDATE range_parted set c = c - 50 WHERE c > 97; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- The order of subplans should be in bound order + ^ +<sql-statement> +-- fail, row movement happens only within the partition subtree. +UPDATE part_c_100_200 set c = c - 20, d = c WHERE c = 105; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- fail, no partition key update, so no attempt to move tuple, +-- but "a = 'a'" violates partition constraint enforced by root partition) +UPDATE part_b_10_b_20 set a = 'a'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok, partition key update, no constraint violation +UPDATE range_parted set d = d - 10 WHERE d > 10; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok, no partition key update, no constraint violation +UPDATE range_parted set e = d; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- No row found +UPDATE part_c_1_100 set c = c + 20 WHERE c = 98; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok, row movement +UPDATE part_b_10_b_20 set c = c + 20 returning c, b, a; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- fail, row movement happens only within the partition subtree. +UPDATE part_b_10_b_20 set b = b - 6 WHERE c > 116 returning *; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok, row movement, with subset of rows moved into different partition. +UPDATE range_parted set b = b - 6 WHERE c > 116 returning a, b + c; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 353 + -- ok, row movement, with subset of rows moved into different partition. + ^ +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- Common table needed for multiple test scenarios. +CREATE TABLE mintab(c1 int); +</sql-statement> +<sql-statement> +INSERT into mintab VALUES (120); +</sql-statement> +<sql-statement> +-- update partition key using updatable view. +CREATE VIEW upview AS SELECT * FROM range_parted WHERE (select c > c1 FROM mintab) WITH CHECK OPTION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + -- update partition key using updatable view. + ^ +<sql-statement> +-- ok +UPDATE upview set c = 199 WHERE b = 4; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- fail, check option violation +UPDATE upview set c = 120 WHERE b = 4; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- fail, row movement with check option violation +UPDATE upview set a = 'b', b = 15, c = 120 WHERE b = 4; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok, row movement, check option passes +UPDATE upview set a = 'b', b = 15 WHERE b = 4; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- cleanup +DROP VIEW upview; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: View not found: 'upview' + -- cleanup + ^ +<sql-statement> +-- RETURNING having whole-row vars. +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +UPDATE range_parted set c = 95 WHERE a = 'b' and b > 10 and c > 100 returning (range_parted), *; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- Transition tables with update row movement +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +CREATE FUNCTION trans_updatetrigfunc() RETURNS trigger LANGUAGE plpgsql AS +$$ + begin + raise notice 'trigger = %, old table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' ORDER BY a) FROM old_table), + (select string_agg(new_table::text, ', ' ORDER BY a) FROM new_table); + return null; + end; +$$; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION trans_updatetrigfunc() RETURNS trigger LANGUAGE plpgsql AS + ^ +<sql-statement> +CREATE TRIGGER trans_updatetrig + AFTER UPDATE ON range_parted REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trans_updatetrig + ^ +<sql-statement> +UPDATE range_parted set c = (case when c = 96 then 110 else c + 1 end ) WHERE a = 'b' and b > 10 and c >= 96; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +-- Enabling OLD TABLE capture for both DELETE as well as UPDATE stmt triggers +-- should not cause DELETEd rows to be captured twice. Similar thing for +-- INSERT triggers and inserted rows. +CREATE TRIGGER trans_deletetrig + AFTER DELETE ON range_parted REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + -- Enabling OLD TABLE capture for both DELETE as well as UPDATE stmt triggers + ^ +<sql-statement> +CREATE TRIGGER trans_inserttrig + AFTER INSERT ON range_parted REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trans_inserttrig + ^ +<sql-statement> +UPDATE range_parted set c = c + 50 WHERE a = 'b' and b > 10 and c >= 96; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +DROP TRIGGER trans_deletetrig ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trans_deletetrig ON range_parted; + ^ +<sql-statement> +DROP TRIGGER trans_inserttrig ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trans_inserttrig ON range_parted; + ^ +<sql-statement> +-- Don't drop trans_updatetrig yet. It is required below. +-- Test with transition tuple conversion happening for rows moved into the +-- new partition. This requires a trigger that references transition table +-- (we already have trans_updatetrig). For inserted rows, the conversion +-- is not usually needed, because the original tuple is already compatible with +-- the desired transition tuple format. But conversion happens when there is a +-- BR trigger because the trigger can change the inserted row. So install a +-- BR triggers on those child partitions where the rows will be moved. +CREATE FUNCTION func_parted_mod_b() RETURNS trigger AS $$ +BEGIN + NEW.b = NEW.b + 1; + return NEW; +END $$ language plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- Don't drop trans_updatetrig yet. It is required below. + ^ +<sql-statement> +CREATE TRIGGER trig_c1_100 BEFORE UPDATE OR INSERT ON part_c_1_100 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trig_c1_100 BEFORE UPDATE OR INSERT ON part_c_1_100 + ^ +<sql-statement> +CREATE TRIGGER trig_d1_15 BEFORE UPDATE OR INSERT ON part_d_1_15 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trig_d1_15 BEFORE UPDATE OR INSERT ON part_d_1_15 + ^ +<sql-statement> +CREATE TRIGGER trig_d15_20 BEFORE UPDATE OR INSERT ON part_d_15_20 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trig_d15_20 BEFORE UPDATE OR INSERT ON part_d_15_20 + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +UPDATE range_parted set c = (case when c = 96 then 110 else c + 1 end) WHERE a = 'b' and b > 10 and c >= 96; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +UPDATE range_parted set c = c + 50 WHERE a = 'b' and b > 10 and c >= 96; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- Case where per-partition tuple conversion map array is allocated, but the +-- map is not required for the particular tuple that is routed, thanks to +-- matching table attributes of the partition and the target table. +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:1: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +UPDATE range_parted set b = 15 WHERE b = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +DROP TRIGGER trans_updatetrig ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trans_updatetrig ON range_parted; + ^ +<sql-statement> +DROP TRIGGER trig_c1_100 ON part_c_1_100; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trig_c1_100 ON part_c_1_100; + ^ +<sql-statement> +DROP TRIGGER trig_d1_15 ON part_d_1_15; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trig_d1_15 ON part_d_1_15; + ^ +<sql-statement> +DROP TRIGGER trig_d15_20 ON part_d_15_20; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trig_d15_20 ON part_d_15_20; + ^ +<sql-statement> +DROP FUNCTION func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + DROP FUNCTION func_parted_mod_b(); + ^ +<sql-statement> +-- RLS policies with update-row-movement +----------------------------------------- +ALTER TABLE range_parted ENABLE ROW LEVEL SECURITY; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + -- RLS policies with update-row-movement + ^ +<sql-statement> +CREATE USER regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 285 + CREATE USER regress_range_parted_user; + ^ +<sql-statement> +GRANT ALL ON range_parted, mintab TO regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + GRANT ALL ON range_parted, mintab TO regress_range_parted_user; + ^ +<sql-statement> +CREATE POLICY seeall ON range_parted AS PERMISSIVE FOR SELECT USING (true); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:42: Error: ERROR: unrecognized row security option "PERMISSIVE" + + CREATE POLICY seeall ON range_parted AS PERMISSIVE FOR SELECT USING (true); + ^ +<sql-statement> +CREATE POLICY policy_range_parted ON range_parted for UPDATE USING (true) WITH CHECK (c % 2 = 0); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 340 + CREATE POLICY policy_range_parted ON range_parted for UPDATE USING (true) WITH CHECK (c % 2 = 0); + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +SET SESSION AUTHORIZATION regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: session_authorization + SET SESSION AUTHORIZATION regress_range_parted_user; + ^ +<sql-statement> +-- This should fail with RLS violation error while moving row from +-- part_a_10_a_20 to part_d_1_15, because we are setting 'c' to an odd number. +UPDATE range_parted set a = 'b', c = 151 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET SESSION AUTHORIZATION; + ^ +<sql-statement> +-- Create a trigger on part_d_1_15 +CREATE FUNCTION func_d_1_15() RETURNS trigger AS $$ +BEGIN + NEW.c = NEW.c + 1; -- Make even numbers odd, or vice versa + return NEW; +END $$ LANGUAGE plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- Create a trigger on part_d_1_15 + ^ +<sql-statement> +CREATE TRIGGER trig_d_1_15 BEFORE INSERT ON part_d_1_15 + FOR EACH ROW EXECUTE PROCEDURE func_d_1_15(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trig_d_1_15 BEFORE INSERT ON part_d_1_15 + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +SET SESSION AUTHORIZATION regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: session_authorization + SET SESSION AUTHORIZATION regress_range_parted_user; + ^ +<sql-statement> +-- Here, RLS checks should succeed while moving row from part_a_10_a_20 to +-- part_d_1_15. Even though the UPDATE is setting 'c' to an odd number, the +-- trigger at the destination partition again makes it an even number. +UPDATE range_parted set a = 'b', c = 151 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET SESSION AUTHORIZATION; + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +SET SESSION AUTHORIZATION regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: session_authorization + SET SESSION AUTHORIZATION regress_range_parted_user; + ^ +<sql-statement> +-- This should fail with RLS violation error. Even though the UPDATE is setting +-- 'c' to an even number, the trigger at the destination partition again makes +-- it an odd number. +UPDATE range_parted set a = 'b', c = 150 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- Cleanup +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + -- Cleanup + ^ +<sql-statement> +DROP TRIGGER trig_d_1_15 ON part_d_1_15; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER trig_d_1_15 ON part_d_1_15; + ^ +<sql-statement> +DROP FUNCTION func_d_1_15(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + DROP FUNCTION func_d_1_15(); + ^ +<sql-statement> +-- Policy expression contains SubPlan +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + -- Policy expression contains SubPlan + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +CREATE POLICY policy_range_parted_subplan on range_parted + AS RESTRICTIVE for UPDATE USING (true) + WITH CHECK ((SELECT range_parted.c <= c1 FROM mintab)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:8: Error: ERROR: unrecognized row security option "RESTRICTIVE" + + AS RESTRICTIVE for UPDATE USING (true) + ^ +<sql-statement> +SET SESSION AUTHORIZATION regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: session_authorization + SET SESSION AUTHORIZATION regress_range_parted_user; + ^ +<sql-statement> +-- fail, mintab has row with c1 = 120 +UPDATE range_parted set a = 'b', c = 122 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok +UPDATE range_parted set a = 'b', c = 120 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- RLS policy expression contains whole row. +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + -- RLS policy expression contains whole row. + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +CREATE POLICY policy_range_parted_wholerow on range_parted AS RESTRICTIVE for UPDATE USING (true) + WITH CHECK (range_parted = row('b', 10, 112, 1, NULL)::range_parted); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:64: Error: ERROR: unrecognized row security option "RESTRICTIVE" + + CREATE POLICY policy_range_parted_wholerow on range_parted AS RESTRICTIVE for UPDATE USING (true) + ^ +<sql-statement> +SET SESSION AUTHORIZATION regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: session_authorization + SET SESSION AUTHORIZATION regress_range_parted_user; + ^ +<sql-statement> +-- ok, should pass the RLS check +UPDATE range_parted set a = 'b', c = 112 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + RESET SESSION AUTHORIZATION; + ^ +<sql-statement> +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +SET SESSION AUTHORIZATION regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: session_authorization + SET SESSION AUTHORIZATION regress_range_parted_user; + ^ +<sql-statement> +-- fail, the whole row RLS check should fail +UPDATE range_parted set a = 'b', c = 116 WHERE a = 'a' and c = 200; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- Cleanup +RESET SESSION AUTHORIZATION; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported kind: 4 + -- Cleanup + ^ +<sql-statement> +DROP POLICY policy_range_parted ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP POLICY policy_range_parted ON range_parted; + ^ +<sql-statement> +DROP POLICY policy_range_parted_subplan ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP POLICY policy_range_parted_subplan ON range_parted; + ^ +<sql-statement> +DROP POLICY policy_range_parted_wholerow ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP POLICY policy_range_parted_wholerow ON range_parted; + ^ +<sql-statement> +REVOKE ALL ON range_parted, mintab FROM regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 248 + REVOKE ALL ON range_parted, mintab FROM regress_range_parted_user; + ^ +<sql-statement> +DROP USER regress_range_parted_user; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 287 + DROP USER regress_range_parted_user; + ^ +<sql-statement> +DROP TABLE mintab; +</sql-statement> +<sql-statement> +-- statement triggers with update row movement +--------------------------------------------------- +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:1: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +CREATE FUNCTION trigfunc() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = % fired on table % during %', + TG_NAME, TG_TABLE_NAME, TG_OP; + return null; + end; +$$; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION trigfunc() returns trigger language plpgsql as + ^ +<sql-statement> +-- Triggers on root partition +CREATE TRIGGER parent_delete_trig + AFTER DELETE ON range_parted for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + -- Triggers on root partition + ^ +<sql-statement> +CREATE TRIGGER parent_update_trig + AFTER UPDATE ON range_parted for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER parent_update_trig + ^ +<sql-statement> +CREATE TRIGGER parent_insert_trig + AFTER INSERT ON range_parted for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER parent_insert_trig + ^ +<sql-statement> +-- Triggers on leaf partition part_c_1_100 +CREATE TRIGGER c1_delete_trig + AFTER DELETE ON part_c_1_100 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + -- Triggers on leaf partition part_c_1_100 + ^ +<sql-statement> +CREATE TRIGGER c1_update_trig + AFTER UPDATE ON part_c_1_100 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER c1_update_trig + ^ +<sql-statement> +CREATE TRIGGER c1_insert_trig + AFTER INSERT ON part_c_1_100 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER c1_insert_trig + ^ +<sql-statement> +-- Triggers on leaf partition part_d_1_15 +CREATE TRIGGER d1_delete_trig + AFTER DELETE ON part_d_1_15 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + -- Triggers on leaf partition part_d_1_15 + ^ +<sql-statement> +CREATE TRIGGER d1_update_trig + AFTER UPDATE ON part_d_1_15 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER d1_update_trig + ^ +<sql-statement> +CREATE TRIGGER d1_insert_trig + AFTER INSERT ON part_d_1_15 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER d1_insert_trig + ^ +<sql-statement> +-- Triggers on leaf partition part_d_15_20 +CREATE TRIGGER d15_delete_trig + AFTER DELETE ON part_d_15_20 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + -- Triggers on leaf partition part_d_15_20 + ^ +<sql-statement> +CREATE TRIGGER d15_update_trig + AFTER UPDATE ON part_d_15_20 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER d15_update_trig + ^ +<sql-statement> +CREATE TRIGGER d15_insert_trig + AFTER INSERT ON part_d_15_20 for each statement execute procedure trigfunc(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER d15_insert_trig + ^ +<sql-statement> +-- Move all rows from part_c_100_200 to part_c_1_100. None of the delete or +-- insert statement triggers should be fired. +UPDATE range_parted set c = c - 50 WHERE c > 97; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +DROP TRIGGER parent_delete_trig ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER parent_delete_trig ON range_parted; + ^ +<sql-statement> +DROP TRIGGER parent_update_trig ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER parent_update_trig ON range_parted; + ^ +<sql-statement> +DROP TRIGGER parent_insert_trig ON range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER parent_insert_trig ON range_parted; + ^ +<sql-statement> +DROP TRIGGER c1_delete_trig ON part_c_1_100; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER c1_delete_trig ON part_c_1_100; + ^ +<sql-statement> +DROP TRIGGER c1_update_trig ON part_c_1_100; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER c1_update_trig ON part_c_1_100; + ^ +<sql-statement> +DROP TRIGGER c1_insert_trig ON part_c_1_100; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER c1_insert_trig ON part_c_1_100; + ^ +<sql-statement> +DROP TRIGGER d1_delete_trig ON part_d_1_15; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER d1_delete_trig ON part_d_1_15; + ^ +<sql-statement> +DROP TRIGGER d1_update_trig ON part_d_1_15; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER d1_update_trig ON part_d_1_15; + ^ +<sql-statement> +DROP TRIGGER d1_insert_trig ON part_d_1_15; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER d1_insert_trig ON part_d_1_15; + ^ +<sql-statement> +DROP TRIGGER d15_delete_trig ON part_d_15_20; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER d15_delete_trig ON part_d_15_20; + ^ +<sql-statement> +DROP TRIGGER d15_update_trig ON part_d_15_20; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER d15_update_trig ON part_d_15_20; + ^ +<sql-statement> +DROP TRIGGER d15_insert_trig ON part_d_15_20; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER d15_insert_trig ON part_d_15_20; + ^ +<sql-statement> +-- Creating default partition for range +:init_range_parted; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:1: Error: ERROR: syntax error at or near ":" + + :init_range_parted; + ^ +<sql-statement> +create table part_def partition of range_parted default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table part_def partition of range_parted default; + ^ +<sql-statement> +\d+ part_def +</sql-statement> +Metacommand \d+ part_def is not supported +<sql-statement> +insert into range_parted values ('c', 9); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.range_parted + +<sql-statement> +-- ok +update part_def set a = 'd' where a = 'c'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- fail +update part_def set a = 'a' where a = 'd'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- Update row movement from non-default to default partition. +-- fail, default partition is not under part_a_10_a_20; +UPDATE part_a_10_a_20 set a = 'ad' WHERE a = 'a'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok +UPDATE range_parted set a = 'ad' WHERE a = 'a'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +UPDATE range_parted set a = 'bd' WHERE a = 'b'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- Update row movement from default to non-default partitions. +-- ok +UPDATE range_parted set a = 'a' WHERE a = 'ad'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +UPDATE range_parted set a = 'b' WHERE a = 'bd'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +:show_data; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:2: Error: ERROR: syntax error at or near ":" + + :show_data; + ^ +<sql-statement> +-- Cleanup: range_parted no longer needed. +DROP TABLE range_parted; +</sql-statement> +<sql-statement> +CREATE TABLE list_parted ( + a text, + b int +) PARTITION BY list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + CREATE TABLE list_parted ( + ^ +<sql-statement> +CREATE TABLE list_part1 PARTITION OF list_parted for VALUES in ('a', 'b'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE list_part1 PARTITION OF list_parted for VALUES in ('a', 'b'); + ^ +<sql-statement> +CREATE TABLE list_default PARTITION OF list_parted default; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE list_default PARTITION OF list_parted default; + ^ +<sql-statement> +INSERT into list_part1 VALUES ('a', 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_part1 + +<sql-statement> +INSERT into list_default VALUES ('d', 10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_default + +<sql-statement> +-- fail +UPDATE list_default set a = 'a' WHERE a = 'd'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok +UPDATE list_default set a = 'x' WHERE a = 'd'; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +DROP TABLE list_parted; +</sql-statement> +<sql-statement> +-- Test retrieval of system columns with non-consistent partition row types. +-- This is only partially supported, as seen in the results. +create table utrtest (a int, b text) partition by list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -- Test retrieval of system columns with non-consistent partition row types. + ^ +<sql-statement> +create table utr1 (a int check (a in (1)), q text, b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: column constraint not supported + create table utr1 (a int check (a in (1)), q text, b text); + ^ +<sql-statement> +create table utr2 (a int check (a in (2)), b text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: column constraint not supported + create table utr2 (a int check (a in (2)), b text); + ^ +<sql-statement> +alter table utr1 drop column q; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table utr1 drop column q; + ^ +<sql-statement> +alter table utrtest attach partition utr1 for values in (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table utrtest attach partition utr1 for values in (1); + ^ +<sql-statement> +alter table utrtest attach partition utr2 for values in (2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + alter table utrtest attach partition utr2 for values in (2); + ^ +<sql-statement> +insert into utrtest values (1, 'foo') + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + insert into utrtest values (1, 'foo') + ^ +<sql-statement> +insert into utrtest values (2, 'bar') + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; -- fails +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + insert into utrtest values (2, 'bar') + ^ +<sql-statement> +insert into utrtest values (2, 'bar') + returning *, tableoid::regclass; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + insert into utrtest values (2, 'bar') + ^ +<sql-statement> +update utrtest set b = b || b from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + update utrtest set b = b || b from (values (1), (2)) s(x) where a = s.x + ^ +<sql-statement> +update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; -- fails +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + ^ +<sql-statement> +update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + ^ +<sql-statement> +delete from utrtest + returning *, tableoid::regclass, xmax = pg_current_xact_id()::xid as xmax_ok; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 364 + delete from utrtest + ^ +<sql-statement> +drop table utrtest; +</sql-statement> +<sql-statement> +-------------- +-- Some more update-partition-key test scenarios below. This time use list +-- partitions. +-------------- +-- Setup for list partitions +CREATE TABLE list_parted (a numeric, b int, c int8) PARTITION BY list (a); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + -------------- + ^ +<sql-statement> +CREATE TABLE sub_parted PARTITION OF list_parted for VALUES in (1) PARTITION BY list (b); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + CREATE TABLE sub_parted PARTITION OF list_parted for VALUES in (1) PARTITION BY list (b); + ^ +<sql-statement> +CREATE TABLE sub_part1(b int, c int8, a numeric); +</sql-statement> +<sql-statement> +ALTER TABLE sub_parted ATTACH PARTITION sub_part1 for VALUES in (1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE sub_parted ATTACH PARTITION sub_part1 for VALUES in (1); + ^ +<sql-statement> +CREATE TABLE sub_part2(b int, c int8, a numeric); +</sql-statement> +<sql-statement> +ALTER TABLE sub_parted ATTACH PARTITION sub_part2 for VALUES in (2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE sub_parted ATTACH PARTITION sub_part2 for VALUES in (2); + ^ +<sql-statement> +CREATE TABLE list_part1(a numeric, b int, c int8); +</sql-statement> +<sql-statement> +ALTER TABLE list_parted ATTACH PARTITION list_part1 for VALUES in (2,3); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 244 + ALTER TABLE list_parted ATTACH PARTITION list_part1 for VALUES in (2,3); + ^ +<sql-statement> +INSERT into list_parted VALUES (2,5,50); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +INSERT into list_parted VALUES (3,6,60); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +INSERT into sub_parted VALUES (1,1,60); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.sub_parted + +<sql-statement> +INSERT into sub_parted VALUES (1,2,10); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.sub_parted + +<sql-statement> +-- Test partition constraint violation when intermediate ancestor is used and +-- constraint is inherited from upper root. +UPDATE sub_parted set a = 2 WHERE c = 10; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- Test update-partition-key, where the unpruned partitions do not have their +-- partition keys updated. +SELECT tableoid::regclass::text, * FROM list_parted WHERE a = 2 ORDER BY 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +UPDATE list_parted set b = c + a WHERE a = 2; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT tableoid::regclass::text, * FROM list_parted WHERE a = 2 ORDER BY 1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- Test the case where BR UPDATE triggers change the partition key. +CREATE FUNCTION func_parted_mod_b() returns trigger as $$ +BEGIN + NEW.b = 2; -- This is changing partition key column. + return NEW; +END $$ LANGUAGE plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- Test the case where BR UPDATE triggers change the partition key. + ^ +<sql-statement> +CREATE TRIGGER parted_mod_b before update on sub_part1 + for each row execute procedure func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER parted_mod_b before update on sub_part1 + ^ +<sql-statement> +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- This should do the tuple routing even though there is no explicit +-- partition-key update, because there is a trigger on sub_part1. +UPDATE list_parted set c = 70 WHERE b = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +DROP TRIGGER parted_mod_b ON sub_part1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + DROP TRIGGER parted_mod_b ON sub_part1; + ^ +<sql-statement> +-- If BR DELETE trigger prevented DELETE from happening, we should also skip +-- the INSERT if that delete is part of UPDATE=>DELETE+INSERT. +CREATE OR REPLACE FUNCTION func_parted_mod_b() returns trigger as $$ +BEGIN + raise notice 'Trigger: Got OLD row %, but returning NULL', OLD; + return NULL; +END $$ LANGUAGE plpgsql; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- If BR DELETE trigger prevented DELETE from happening, we should also skip + ^ +<sql-statement> +CREATE TRIGGER trig_skip_delete before delete on sub_part2 + for each row execute procedure func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 283 + CREATE TRIGGER trig_skip_delete before delete on sub_part2 + ^ +<sql-statement> +UPDATE list_parted set b = 1 WHERE c = 70; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +-- Drop the trigger. Now the row should be moved. +DROP TRIGGER trig_skip_delete ON sub_part2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + -- Drop the trigger. Now the row should be moved. + ^ +<sql-statement> +UPDATE list_parted set b = 1 WHERE c = 70; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +DROP FUNCTION func_parted_mod_b(); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + DROP FUNCTION func_parted_mod_b(); + ^ +<sql-statement> +-- UPDATE partition-key with FROM clause. If join produces multiple output +-- rows for the same row to be modified, we should tuple-route the row only +-- once. There should not be any rows inserted. +CREATE TABLE non_parted (id int); +</sql-statement> +<sql-statement> +INSERT into non_parted VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3); +</sql-statement> +<sql-statement> +UPDATE list_parted t1 set a = 2 FROM non_parted t2 WHERE t1.a = t2.id and a = 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alias is not supported + UPDATE list_parted t1 set a = 2 FROM non_parted t2 WHERE t1.a = t2.id and a = 1; + ^ +<sql-statement> +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.list_parted + +<sql-statement> +DROP TABLE non_parted; +</sql-statement> +<sql-statement> +-- Cleanup: list_parted no longer needed. +DROP TABLE list_parted; +</sql-statement> +<sql-statement> +-- create custom operator class and hash function, for the same reason +-- explained in alter_table.sql +create or replace function dummy_hashint4(a int4, seed int8) returns int8 as +$$ begin return (a + seed); end; $$ language 'plpgsql' immutable; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- create custom operator class and hash function, for the same reason + ^ +<sql-statement> +create operator class custom_opclass for type int4 using hash as +operator 1 = , function 2 dummy_hashint4(int4, int8); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 298 + create operator class custom_opclass for type int4 using hash as + ^ +<sql-statement> +create table hash_parted ( + a int, + b int +) partition by hash (a custom_opclass, b custom_opclass); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: PARTITION BY clause not supported + create table hash_parted ( + ^ +<sql-statement> +create table hpart1 partition of hash_parted for values with (modulus 2, remainder 1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart1 partition of hash_parted for values with (modulus 2, remainder 1); + ^ +<sql-statement> +create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); + ^ +<sql-statement> +create table hpart3 partition of hash_parted for values with (modulus 8, remainder 0); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart3 partition of hash_parted for values with (modulus 8, remainder 0); + ^ +<sql-statement> +create table hpart4 partition of hash_parted for values with (modulus 8, remainder 4); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: table inheritance not supported + create table hpart4 partition of hash_parted for values with (modulus 8, remainder 4); + ^ +<sql-statement> +insert into hpart1 values (1, 1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hpart1 + +<sql-statement> +insert into hpart2 values (2, 5); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hpart2 + +<sql-statement> +insert into hpart4 values (3, 4); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.hpart4 + +<sql-statement> +-- fail +update hpart1 set a = 3, b=4 where a = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok, row movement +update hash_parted set b = b - 1 where b = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- ok +update hash_parted set b = b + 8 where b = 1; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +-- cleanup +drop table hash_parted; +</sql-statement> +<sql-statement> +drop operator class custom_opclass using hash; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: Not supported object type for DROP + drop operator class custom_opclass using hash; + ^ +<sql-statement> +drop function dummy_hashint4(a int4, seed int8); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: DropStmt: alternative is not implemented yet : 386 + drop function dummy_hashint4(a int4, seed int8); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/update.out b/ydb/library/yql/tests/postgresql/cases/update.out index 768698f8fa..1a9afb30ab 100644 --- a/ydb/library/yql/tests/postgresql/cases/update.out +++ b/ydb/library/yql/tests/postgresql/cases/update.out @@ -12,3 +12,31 @@ CREATE TABLE upsert_test ( ); INSERT INTO update_test VALUES (5, 10, 'foo'); INSERT INTO update_test(b, a) VALUES (15, 10); +-- +-- Test multiple-set-clause syntax +-- +INSERT INTO update_test SELECT a,b+1,c FROM update_test; +-- Test ON CONFLICT DO UPDATE +INSERT INTO upsert_test VALUES(1, 'Boo'), (3, 'Zoo'); +DROP TABLE update_test; +DROP TABLE upsert_test; +CREATE TABLE upsert_test_2 (b TEXT, a INT PRIMARY KEY); +-- Create partitions intentionally in descending bound order, so as to test +-- that update-row-movement works with the leaf partitions not in bound order. +CREATE TABLE part_b_20_b_30 (e varchar, c numeric, a text, b bigint, d int); +CREATE TABLE part_c_1_100 (e varchar, d int, c numeric, b bigint, a text); +\set init_range_parted 'truncate range_parted; insert into range_parted VALUES (''a'', 1, 1, 1), (''a'', 10, 200, 1), (''b'', 12, 96, 1), (''b'', 13, 97, 2), (''b'', 15, 105, 16), (''b'', 17, 105, 19)' +\set show_data 'select tableoid::regclass::text COLLATE "C" partname, * from range_parted ORDER BY 1, 2, 3, 4, 5, 6' +-- Common table needed for multiple test scenarios. +CREATE TABLE mintab(c1 int); +INSERT into mintab VALUES (120); +DROP TABLE mintab; +CREATE TABLE sub_part1(b int, c int8, a numeric); +CREATE TABLE sub_part2(b int, c int8, a numeric); +CREATE TABLE list_part1(a numeric, b int, c int8); +-- UPDATE partition-key with FROM clause. If join produces multiple output +-- rows for the same row to be modified, we should tuple-route the row only +-- once. There should not be any rows inserted. +CREATE TABLE non_parted (id int); +INSERT into non_parted VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3); +DROP TABLE non_parted; diff --git a/ydb/library/yql/tests/postgresql/cases/update.sql b/ydb/library/yql/tests/postgresql/cases/update.sql index 768698f8fa..1a9afb30ab 100644 --- a/ydb/library/yql/tests/postgresql/cases/update.sql +++ b/ydb/library/yql/tests/postgresql/cases/update.sql @@ -12,3 +12,31 @@ CREATE TABLE upsert_test ( ); INSERT INTO update_test VALUES (5, 10, 'foo'); INSERT INTO update_test(b, a) VALUES (15, 10); +-- +-- Test multiple-set-clause syntax +-- +INSERT INTO update_test SELECT a,b+1,c FROM update_test; +-- Test ON CONFLICT DO UPDATE +INSERT INTO upsert_test VALUES(1, 'Boo'), (3, 'Zoo'); +DROP TABLE update_test; +DROP TABLE upsert_test; +CREATE TABLE upsert_test_2 (b TEXT, a INT PRIMARY KEY); +-- Create partitions intentionally in descending bound order, so as to test +-- that update-row-movement works with the leaf partitions not in bound order. +CREATE TABLE part_b_20_b_30 (e varchar, c numeric, a text, b bigint, d int); +CREATE TABLE part_c_1_100 (e varchar, d int, c numeric, b bigint, a text); +\set init_range_parted 'truncate range_parted; insert into range_parted VALUES (''a'', 1, 1, 1), (''a'', 10, 200, 1), (''b'', 12, 96, 1), (''b'', 13, 97, 2), (''b'', 15, 105, 16), (''b'', 17, 105, 19)' +\set show_data 'select tableoid::regclass::text COLLATE "C" partname, * from range_parted ORDER BY 1, 2, 3, 4, 5, 6' +-- Common table needed for multiple test scenarios. +CREATE TABLE mintab(c1 int); +INSERT into mintab VALUES (120); +DROP TABLE mintab; +CREATE TABLE sub_part1(b int, c int8, a numeric); +CREATE TABLE sub_part2(b int, c int8, a numeric); +CREATE TABLE list_part1(a numeric, b int, c int8); +-- UPDATE partition-key with FROM clause. If join produces multiple output +-- rows for the same row to be modified, we should tuple-route the row only +-- once. There should not be any rows inserted. +CREATE TABLE non_parted (id int); +INSERT into non_parted VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3); +DROP TABLE non_parted; diff --git a/ydb/library/yql/tests/postgresql/cases/window.err b/ydb/library/yql/tests/postgresql/cases/window.err index 188388b056..81c5dff580 100644 --- a/ydb/library/yql/tests/postgresql/cases/window.err +++ b/ydb/library/yql/tests/postgresql/cases/window.err @@ -314,17 +314,3052 @@ FROM empsalary GROUP BY depname; SELECT sum(salary) OVER w1, count(*) OVER w2 FROM empsalary WINDOW w1 AS (ORDER BY salary), w2 AS (ORDER BY salary); </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F2872029D90) -__libc_start_main+128 (0x7F2872029E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +-- subplan +SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten) +FROM tenk1 s WHERE unique2 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- empty table +SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 WHERE FALSE)s; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- mixture of agg/wfunc in the same window +SELECT sum(salary) OVER w, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: CalcOverWindow + -- mixture of agg/wfunc in the same window + ^ + -stdin-:<main>:1:1: Error: Expected hashable and equatable type for key column: _yql_partition_key_0_0, but got: pgvarchar + -- mixture of agg/wfunc in the same window + ^ +<sql-statement> +-- strict aggs +SELECT empno, depname, salary, bonus, depadj, MIN(bonus) OVER (ORDER BY empno), MAX(depadj) OVER () FROM( + SELECT *, + CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus, + CASE WHEN + AVG(salary) OVER (PARTITION BY depname) < salary + THEN 200 END AS depadj FROM empsalary +)s; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgSelect, At function: PgSetItem + -- strict aggs + ^ + -stdin-:<main>:4:13: Error: Star is incompatible to column reference + CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus, + ^ + -stdin-:<main>:4:70: Error: Star is incompatible to column reference + CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus, + ^ +<sql-statement> +-- window function over ungrouped agg over empty row set (bug before 9.1) +SELECT SUM(COUNT(f1)) OVER () FROM int4_tbl WHERE f1=42; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.int4_tbl + +<sql-statement> +-- window function with ORDER BY an expression involving aggregates (9.1 bug) +select ten, + sum(unique1) + sum(unique2) as res, + rank() over (order by sum(unique1) + sum(unique2)) as rank +from tenk1 +group by ten order by ten; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- window and aggregate with GROUP BY expression (9.2 bug) +explain (costs off) +select first_value(max(x)) over (), y + from (select unique1 as x, ten+four as y from tenk1) ss + group by y; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- window and aggregate with GROUP BY expression (9.2 bug) + ^ +<sql-statement> +-- test non-default frame specifications +SELECT four, ten, + sum(ten) over (partition by four order by ten), + last_value(ten) over (partition by four order by ten) +FROM (select distinct ten, four from tenk1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT four, ten, + sum(ten) over (partition by four order by ten range between unbounded preceding and current row), + last_value(ten) over (partition by four order by ten range between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT four, ten, + sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following), + last_value(ten) over (partition by four order by ten range between unbounded preceding and unbounded following) +FROM (select distinct ten, four from tenk1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT four, ten/4 as two, + sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row), + last_value(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT four, ten/4 as two, + sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row), + last_value(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four range between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 2 preceding and 2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude no others), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 2 preceding and 1 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between 1 following and 3 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (rows between unbounded preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (w range between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT first_value(unique1) over w, + nth_value(unique1, 2) over w AS nth_2, + last_value(unique1) over w, unique1, four +FROM tenk1 WHERE unique1 < 10 +WINDOW w AS (order by four range between current row and unbounded following); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over + (order by unique1 + rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING), + unique1 +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:8: Error: SubLinks are not allowed in: FRAME + rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING), + ^ +<sql-statement> +CREATE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following) as sum_rows + FROM generate_series(1, 10) i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT * FROM v_window; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.v_window + +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude current row) as sum_rows FROM generate_series(1, 10) i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE OR REPLACE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT * FROM v_window; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.v_window + +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude group) as sum_rows FROM generate_series(1, 10) i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE OR REPLACE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT * FROM v_window; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.v_window + +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude ties) as sum_rows FROM generate_series(1, 10) i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE OR REPLACE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT * FROM v_window; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.v_window + +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude no others) as sum_rows FROM generate_series(1, 10) i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE OR REPLACE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT * FROM v_window; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.v_window + +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i groups between 1 preceding and 1 following) as sum_rows FROM generate_series(1, 10) i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE OR REPLACE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT * FROM v_window; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.v_window + +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +DROP VIEW v_window; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: View not found: 'v_window' + DROP VIEW v_window; + ^ +<sql-statement> +CREATE TEMP VIEW v_window AS + SELECT i, min(i) over (order by i range between '1 day' preceding and '10 days' following) as min_i + FROM generate_series(now(), now()+'100 days'::interval, '1 hour') i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE TEMP VIEW v_window AS + ^ +<sql-statement> +SELECT pg_get_viewdef('v_window'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT pg_get_viewdef('v_window'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: relation "v_window" does not exist + + SELECT pg_get_viewdef('v_window'); + ^ +<sql-statement> +-- RANGE offset PRECEDING/FOLLOWING tests +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:2:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:2:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding), + ^ + -stdin-:<main>:2:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four desc range between 2::int8 preceding and 1::int2 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four desc range between 2::int8 preceding and 1::int2 preceding), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four desc range between 2::int8 preceding and 1::int2 preceding), + ^ + -stdin-:<main>:1:63: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four desc range between 2::int8 preceding and 1::int2 preceding), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude no others), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude no others), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude no others), + ^ + -stdin-:<main>:1:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude no others), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude current row), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude current row), + ^ + -stdin-:<main>:1:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude current row), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude group), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude group), + ^ + -stdin-:<main>:1:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude group), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude ties), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude ties), + ^ + -stdin-:<main>:1:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude ties), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude ties), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude ties), + ^ + -stdin-:<main>:1:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude ties), + ^ +<sql-statement> +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude group), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude group), + ^ + -stdin-:<main>:1:58: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude group), + ^ +<sql-statement> +SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following), + ^ + -stdin-:<main>:1:79: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following), + ^ +<sql-statement> +SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following + exclude current row),unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:26: Error: At function: EvaluateExpr + SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:26: Error: At function: Unwrap + SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following + ^ + -stdin-:<main>:1:79: Error: Can't unwrap PostgreSQL type + SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following + ^ +<sql-statement> +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following), + ^ + -stdin-:<main>:1:71: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following), + ^ +<sql-statement> +select sum(salary) over (order by enroll_date desc range between '1 year'::interval preceding and '1 year'::interval following), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date desc range between '1 year'::interval preceding and '1 year'::interval following), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date desc range between '1 year'::interval preceding and '1 year'::interval following), + ^ + -stdin-:<main>:1:76: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date desc range between '1 year'::interval preceding and '1 year'::interval following), + ^ +<sql-statement> +select sum(salary) over (order by enroll_date desc range between '1 year'::interval following and '1 year'::interval following), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date desc range between '1 year'::interval following and '1 year'::interval following), + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date desc range between '1 year'::interval following and '1 year'::interval following), + ^ + -stdin-:<main>:1:76: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date desc range between '1 year'::interval following and '1 year'::interval following), + ^ +<sql-statement> +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude current row), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:71: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ +<sql-statement> +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude group), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:71: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ +<sql-statement> +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:71: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + ^ +<sql-statement> +select first_value(salary) over(order by salary range between 1000 preceding and 1000 following), + lead(salary) over(order by salary range between 1000 preceding and 1000 following), + nth_value(salary, 1) over(order by salary range between 1000 preceding and 1000 following), + salary from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select first_value(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:1:32: Error: At function: PgWindow + select first_value(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:1:32: Error: Unsupported frame type: range + select first_value(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:2:19: Error: At function: PgWindow + lead(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:2:19: Error: Unsupported frame type: range + lead(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:3:27: Error: At function: PgWindow + nth_value(salary, 1) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:3:27: Error: Unsupported frame type: range + nth_value(salary, 1) over(order by salary range between 1000 preceding and 1000 following), + ^ +<sql-statement> +select last_value(salary) over(order by salary range between 1000 preceding and 1000 following), + lag(salary) over(order by salary range between 1000 preceding and 1000 following), + salary from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select last_value(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:1:31: Error: At function: PgWindow + select last_value(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:1:31: Error: Unsupported frame type: range + select last_value(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:2:18: Error: At function: PgWindow + lag(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ + -stdin-:<main>:2:18: Error: Unsupported frame type: range + lag(salary) over(order by salary range between 1000 preceding and 1000 following), + ^ +<sql-statement> +select first_value(salary) over(order by salary range between 1000 following and 3000 following + exclude current row), + lead(salary) over(order by salary range between 1000 following and 3000 following exclude ties), + nth_value(salary, 1) over(order by salary range between 1000 following and 3000 following + exclude ties), + salary from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select first_value(salary) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:1:32: Error: At function: PgWindow + select first_value(salary) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:1:32: Error: Excludes are not supported + select first_value(salary) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:3:19: Error: At function: PgWindow + lead(salary) over(order by salary range between 1000 following and 3000 following exclude ties), + ^ + -stdin-:<main>:3:19: Error: Excludes are not supported + lead(salary) over(order by salary range between 1000 following and 3000 following exclude ties), + ^ + -stdin-:<main>:4:27: Error: At function: PgWindow + nth_value(salary, 1) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:4:27: Error: Excludes are not supported + nth_value(salary, 1) over(order by salary range between 1000 following and 3000 following + ^ +<sql-statement> +select last_value(salary) over(order by salary range between 1000 following and 3000 following + exclude group), + lag(salary) over(order by salary range between 1000 following and 3000 following exclude group), + salary from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select last_value(salary) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:1:31: Error: At function: PgWindow + select last_value(salary) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:1:31: Error: Excludes are not supported + select last_value(salary) over(order by salary range between 1000 following and 3000 following + ^ + -stdin-:<main>:3:18: Error: At function: PgWindow + lag(salary) over(order by salary range between 1000 following and 3000 following exclude group), + ^ + -stdin-:<main>:3:18: Error: Excludes are not supported + lag(salary) over(order by salary range between 1000 following and 3000 following exclude group), + ^ +<sql-statement> +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:32: Error: At function: EvaluateExpr + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:32: Error: At function: Unwrap + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:102: Error: Can't unwrap PostgreSQL type + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ +<sql-statement> +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:32: Error: At function: EvaluateExpr + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:32: Error: At function: Unwrap + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:102: Error: Can't unwrap PostgreSQL type + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ +<sql-statement> +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude group), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude group), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:32: Error: At function: EvaluateExpr + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:32: Error: At function: Unwrap + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:102: Error: Can't unwrap PostgreSQL type + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ +<sql-statement> +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude current row), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude current row), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:32: Error: At function: EvaluateExpr + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:32: Error: At function: Unwrap + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ + -stdin-:<main>:1:102: Error: Can't unwrap PostgreSQL type + select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + ^ +<sql-statement> +-- RANGE offset PRECEDING/FOLLOWING with null values +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x asc nulls first range between 2 preceding and 2 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:10:3: Error: sortby_nulls unsupported value: 1 + (order by x asc nulls first range between 2 preceding and 2 following); + ^ +<sql-statement> +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x asc nulls last range between 2 preceding and 2 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:9:3: Error: sortby_nulls unsupported value: 2 + (order by x asc nulls last range between 2 preceding and 2 following); + ^ +<sql-statement> +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x desc nulls first range between 2 preceding and 2 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:9:3: Error: sortby_nulls unsupported value: 1 + (order by x desc nulls first range between 2 preceding and 2 following); + ^ +<sql-statement> +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x desc nulls last range between 2 preceding and 2 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:9:3: Error: sortby_nulls unsupported value: 2 + (order by x desc nulls last range between 2 preceding and 2 following); + ^ +<sql-statement> +-- Check overflow behavior for various integer sizes +select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) +from generate_series(32764, 32766) x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- Check overflow behavior for various integer sizes + ^ + -stdin-:<main>:2:30: Error: At function: PgWindow + select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) + ^ + -stdin-:<main>:2:30: Error: Unsupported frame type: range + select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) + ^ +<sql-statement> +select x, last_value(x) over (order by x::smallint desc range between current row and 2147450885 following) +from generate_series(-32766, -32764) x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select x, last_value(x) over (order by x::smallint desc range between current row and 2147450885 following) + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select x, last_value(x) over (order by x::smallint desc range between current row and 2147450885 following) + ^ + -stdin-:<main>:1:30: Error: Unsupported frame type: range + select x, last_value(x) over (order by x::smallint desc range between current row and 2147450885 following) + ^ +<sql-statement> +select x, last_value(x) over (order by x range between current row and 4 following) +from generate_series(2147483644, 2147483646) x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select x, last_value(x) over (order by x range between current row and 4 following) + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select x, last_value(x) over (order by x range between current row and 4 following) + ^ + -stdin-:<main>:1:30: Error: Unsupported frame type: range + select x, last_value(x) over (order by x range between current row and 4 following) + ^ +<sql-statement> +select x, last_value(x) over (order by x desc range between current row and 5 following) +from generate_series(-2147483646, -2147483644) x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select x, last_value(x) over (order by x desc range between current row and 5 following) + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select x, last_value(x) over (order by x desc range between current row and 5 following) + ^ + -stdin-:<main>:1:30: Error: Unsupported frame type: range + select x, last_value(x) over (order by x desc range between current row and 5 following) + ^ +<sql-statement> +select x, last_value(x) over (order by x range between current row and 4 following) +from generate_series(9223372036854775804, 9223372036854775806) x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select x, last_value(x) over (order by x range between current row and 4 following) + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select x, last_value(x) over (order by x range between current row and 4 following) + ^ + -stdin-:<main>:1:30: Error: Unsupported frame type: range + select x, last_value(x) over (order by x range between current row and 4 following) + ^ +<sql-statement> +select x, last_value(x) over (order by x desc range between current row and 5 following) +from generate_series(-9223372036854775806, -9223372036854775804) x; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select x, last_value(x) over (order by x desc range between current row and 5 following) + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select x, last_value(x) over (order by x desc range between current row and 5 following) + ^ + -stdin-:<main>:1:30: Error: Unsupported frame type: range + select x, last_value(x) over (order by x desc range between current row and 5 following) + ^ +<sql-statement> +-- Test in_range for other numeric datatypes +create temp table numerics( + id int, + f_float4 float4, + f_float8 float8, + f_numeric numeric +); +</sql-statement> +<sql-statement> +insert into numerics values +(0, '-infinity', '-infinity', '-infinity'), +(1, -3, -3, -3), +(2, -1, -1, -1), +(3, 0, 0, 0), +(4, 1.1, 1.1, 1.1), +(5, 1.12, 1.12, 1.12), +(6, 2, 2, 2), +(7, 100, 100, 100), +(8, 'infinity', 'infinity', 'infinity'), +(9, 'NaN', 'NaN', 'NaN'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: AsList + insert into numerics values + ^ + -stdin-:<main>:1:1: Error: Cannot infer common type for int4 and numeric + insert into numerics values + ^ + -stdin-:<main>:1:1: Error: Cannot infer common type for numeric and int4 + insert into numerics values + ^ +<sql-statement> +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select id, f_float4, first_value(id) over w, last_value(id) over w + ^ + -stdin-:<main>:3:13: Error: At function: PgWindow + window w as (order by f_float4 range between + ^ + -stdin-:<main>:3:13: Error: Unsupported frame type: range + window w as (order by f_float4 range between + ^ +<sql-statement> +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1 preceding and 1.1::float4 following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float4 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float4 range between + ^ + -stdin-:<main>:4:35: Error: Can't unwrap PostgreSQL type + 1 preceding and 1.1::float4 following); + ^ +<sql-statement> +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' preceding and 'inf' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float4 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float4 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' preceding and 'inf' following); + ^ +<sql-statement> +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' preceding and 'inf' preceding); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float4 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float4 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' preceding and 'inf' preceding); + ^ +<sql-statement> +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' following and 'inf' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float4 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float4 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' following and 'inf' following); + ^ +<sql-statement> +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float4 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float4 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 1.1 preceding and 'NaN' following); -- error, NaN disallowed + ^ +<sql-statement> +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select id, f_float8, first_value(id) over w, last_value(id) over w + ^ + -stdin-:<main>:3:13: Error: At function: PgWindow + window w as (order by f_float8 range between + ^ + -stdin-:<main>:3:13: Error: Unsupported frame type: range + window w as (order by f_float8 range between + ^ +<sql-statement> +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1 preceding and 1.1::float8 following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float8 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float8 range between + ^ + -stdin-:<main>:4:35: Error: Can't unwrap PostgreSQL type + 1 preceding and 1.1::float8 following); + ^ +<sql-statement> +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' preceding and 'inf' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float8 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float8 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' preceding and 'inf' following); + ^ +<sql-statement> +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' preceding and 'inf' preceding); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float8 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float8 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' preceding and 'inf' preceding); + ^ +<sql-statement> +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' following and 'inf' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float8 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float8 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' following and 'inf' following); + ^ +<sql-statement> +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_float8 range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_float8 range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 1.1 preceding and 'NaN' following); -- error, NaN disallowed + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select id, f_numeric, first_value(id) over w, last_value(id) over w + ^ + -stdin-:<main>:3:13: Error: At function: PgWindow + window w as (order by f_numeric range between + ^ + -stdin-:<main>:3:13: Error: Unsupported frame type: range + window w as (order by f_numeric range between + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1.1::numeric following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_numeric range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_numeric range between + ^ + -stdin-:<main>:4:35: Error: Can't unwrap PostgreSQL type + 1 preceding and 1.1::numeric following); + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1.1::float8 following); -- currently unsupported +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_numeric range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_numeric range between + ^ + -stdin-:<main>:4:35: Error: Can't unwrap PostgreSQL type + 1 preceding and 1.1::float8 following); -- currently unsupported + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' preceding and 'inf' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_numeric range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_numeric range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' preceding and 'inf' following); + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' preceding and 'inf' preceding); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_numeric range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_numeric range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' preceding and 'inf' preceding); + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' following and 'inf' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_numeric range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_numeric range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 'inf' following and 'inf' following); + ^ +<sql-statement> +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_numeric range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_numeric range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + 1.1 preceding and 'NaN' following); -- error, NaN disallowed + ^ +<sql-statement> +-- Test in_range for other datetime datatypes +create temp table datetimes( + id int, + f_time time, + f_timetz timetz, + f_interval interval, + f_timestamptz timestamptz, + f_timestamp timestamp +); +</sql-statement> +<sql-statement> +insert into datetimes values +(1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), +(2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(4, '14:00', '14:00 BST', '4 years', '2002-10-19 10:23:54+01', '2002-10-19 10:23:54'), +(5, '15:00', '15:00 BST', '5 years', '2003-10-19 10:23:54+01', '2003-10-19 10:23:54'), +(6, '15:00', '15:00 BST', '5 years', '2004-10-19 10:23:54+01', '2004-10-19 10:23:54'), +(7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), +(8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), +(9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); +</sql-statement> +<sql-statement> +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + '70 min'::interval preceding and '2 hours'::interval following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_time range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_time range between + ^ + -stdin-:<main>:4:24: Error: Can't unwrap PostgreSQL type + '70 min'::interval preceding and '2 hours'::interval following); + ^ +<sql-statement> +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time desc range between + '70 min' preceding and '2 hours' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_time desc range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_time desc range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + '70 min' preceding and '2 hours' following); + ^ +<sql-statement> +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + '70 min'::interval preceding and '2 hours'::interval following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_timetz range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_timetz range between + ^ + -stdin-:<main>:4:24: Error: Can't unwrap PostgreSQL type + '70 min'::interval preceding and '2 hours'::interval following); + ^ +<sql-statement> +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz desc range between + '70 min' preceding and '2 hours' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_timetz desc range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_timetz desc range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + '70 min' preceding and '2 hours' following); + ^ +<sql-statement> +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + '1 year'::interval preceding and '1 year'::interval following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_interval range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_interval range between + ^ + -stdin-:<main>:4:24: Error: Can't unwrap PostgreSQL type + '1 year'::interval preceding and '1 year'::interval following); + ^ +<sql-statement> +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval desc range between + '1 year' preceding and '1 year' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_interval desc range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_interval desc range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + '1 year' preceding and '1 year' following); + ^ +<sql-statement> +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + '1 year'::interval preceding and '1 year'::interval following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_timestamptz range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_timestamptz range between + ^ + -stdin-:<main>:4:24: Error: Can't unwrap PostgreSQL type + '1 year'::interval preceding and '1 year'::interval following); + ^ +<sql-statement> +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz desc range between + '1 year' preceding and '1 year' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_timestamptz desc range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_timestamptz desc range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + '1 year' preceding and '1 year' following); + ^ +<sql-statement> +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + '1 year'::interval preceding and '1 year'::interval following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_timestamp range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_timestamp range between + ^ + -stdin-:<main>:4:24: Error: Can't unwrap PostgreSQL type + '1 year'::interval preceding and '1 year'::interval following); + ^ +<sql-statement> +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp desc range between + '1 year' preceding and '1 year' following); +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:3:13: Error: At function: EvaluateExpr + window w as (order by f_timestamp desc range between + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:3:13: Error: At function: Unwrap + window w as (order by f_timestamp desc range between + ^ + -stdin-:<main>:4:14: Error: Can't unwrap PostgreSQL type + '1 year' preceding and '1 year' following); + ^ +<sql-statement> +-- RANGE offset PRECEDING/FOLLOWING error cases +select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:2:25: Error: At function: EvaluateExpr + select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:2:25: Error: At function: Unwrap + select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>:2:79: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following + ^ +<sql-statement> +select sum(salary) over (range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>:1:50: Error: Can't unwrap PostgreSQL type + select sum(salary) over (range between '1 year'::interval preceding and '2 years'::interval following + ^ +<sql-statement> +select sum(salary) over (order by depname range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:25: Error: At function: EvaluateExpr + select sum(salary) over (order by depname range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:25: Error: At function: Unwrap + select sum(salary) over (order by depname range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>:1:67: Error: Can't unwrap PostgreSQL type + select sum(salary) over (order by depname range between '1 year'::interval preceding and '2 years'::interval following + ^ +<sql-statement> +select max(enroll_date) over (order by enroll_date range between 1 preceding and 2 following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select max(enroll_date) over (order by enroll_date range between 1 preceding and 2 following + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select max(enroll_date) over (order by enroll_date range between 1 preceding and 2 following + ^ + -stdin-:<main>:1:30: Error: Excludes are not supported + select max(enroll_date) over (order by enroll_date range between 1 preceding and 2 following + ^ +<sql-statement> +select max(enroll_date) over (order by salary range between -1 preceding and 2 following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select max(enroll_date) over (order by salary range between -1 preceding and 2 following + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select max(enroll_date) over (order by salary range between -1 preceding and 2 following + ^ + -stdin-:<main>:1:30: Error: Excludes are not supported + select max(enroll_date) over (order by salary range between -1 preceding and 2 following + ^ +<sql-statement> +select max(enroll_date) over (order by salary range between 1 preceding and -2 following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select max(enroll_date) over (order by salary range between 1 preceding and -2 following + ^ + -stdin-:<main>:1:30: Error: At function: PgWindow + select max(enroll_date) over (order by salary range between 1 preceding and -2 following + ^ + -stdin-:<main>:1:30: Error: Excludes are not supported + select max(enroll_date) over (order by salary range between 1 preceding and -2 following + ^ +<sql-statement> +select max(enroll_date) over (order by salary range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:30: Error: At function: EvaluateExpr + select max(enroll_date) over (order by salary range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:30: Error: At function: Unwrap + select max(enroll_date) over (order by salary range between '1 year'::interval preceding and '2 years'::interval following + ^ + -stdin-:<main>:1:71: Error: Can't unwrap PostgreSQL type + select max(enroll_date) over (order by salary range between '1 year'::interval preceding and '2 years'::interval following + ^ +<sql-statement> +select max(enroll_date) over (order by enroll_date range between '1 year'::interval preceding and '-2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Expression evaluation + + -stdin-:<main>:1:30: Error: At function: EvaluateExpr + select max(enroll_date) over (order by enroll_date range between '1 year'::interval preceding and '-2 years'::interval following + ^ + -stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:30: Error: At function: Unwrap + select max(enroll_date) over (order by enroll_date range between '1 year'::interval preceding and '-2 years'::interval following + ^ + -stdin-:<main>:1:76: Error: Can't unwrap PostgreSQL type + select max(enroll_date) over (order by enroll_date range between '1 year'::interval preceding and '-2 years'::interval following + ^ +<sql-statement> +-- GROUPS tests +SELECT sum(unique1) over (order by four groups between unbounded preceding and current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between unbounded preceding and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 1 preceding and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 1 following and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between unbounded preceding and 2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 0 preceding and 0 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude current row), unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude group), unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude ties), unique1, four +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following),unique1, four, ten +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude current row), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude group), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude ties), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +select first_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + lead(salary) over(order by enroll_date groups between 1 preceding and 1 following), + nth_value(salary, 1) over(order by enroll_date groups between 1 preceding and 1 following), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select first_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:1:32: Error: At function: PgWindow + select first_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:1:32: Error: Unsupported frame type: groups + select first_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:2:19: Error: At function: PgWindow + lead(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:2:19: Error: Unsupported frame type: groups + lead(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:3:27: Error: At function: PgWindow + nth_value(salary, 1) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:3:27: Error: Unsupported frame type: groups + nth_value(salary, 1) over(order by enroll_date groups between 1 preceding and 1 following), + ^ +<sql-statement> +select last_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + lag(salary) over(order by enroll_date groups between 1 preceding and 1 following), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select last_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:1:31: Error: At function: PgWindow + select last_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:1:31: Error: Unsupported frame type: groups + select last_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:2:18: Error: At function: PgWindow + lag(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ + -stdin-:<main>:2:18: Error: Unsupported frame type: groups + lag(salary) over(order by enroll_date groups between 1 preceding and 1 following), + ^ +<sql-statement> +select first_value(salary) over(order by enroll_date groups between 1 following and 3 following + exclude current row), + lead(salary) over(order by enroll_date groups between 1 following and 3 following exclude ties), + nth_value(salary, 1) over(order by enroll_date groups between 1 following and 3 following + exclude ties), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select first_value(salary) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:1:32: Error: At function: PgWindow + select first_value(salary) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:1:32: Error: Excludes are not supported + select first_value(salary) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:3:19: Error: At function: PgWindow + lead(salary) over(order by enroll_date groups between 1 following and 3 following exclude ties), + ^ + -stdin-:<main>:3:19: Error: Excludes are not supported + lead(salary) over(order by enroll_date groups between 1 following and 3 following exclude ties), + ^ + -stdin-:<main>:4:27: Error: At function: PgWindow + nth_value(salary, 1) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:4:27: Error: Excludes are not supported + nth_value(salary, 1) over(order by enroll_date groups between 1 following and 3 following + ^ +<sql-statement> +select last_value(salary) over(order by enroll_date groups between 1 following and 3 following + exclude group), + lag(salary) over(order by enroll_date groups between 1 following and 3 following exclude group), + salary, enroll_date from empsalary; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select last_value(salary) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:1:31: Error: At function: PgWindow + select last_value(salary) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:1:31: Error: Excludes are not supported + select last_value(salary) over(order by enroll_date groups between 1 following and 3 following + ^ + -stdin-:<main>:3:18: Error: At function: PgWindow + lag(salary) over(order by enroll_date groups between 1 following and 3 following exclude group), + ^ + -stdin-:<main>:3:18: Error: Excludes are not supported + lag(salary) over(order by enroll_date groups between 1 following and 3 following exclude group), + ^ +<sql-statement> +-- Show differences in offset interpretation between ROWS, RANGE, and GROUPS +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x rows between 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT x, (sum(x) over w) + ^ +<sql-statement> +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x range between 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT x, (sum(x) over w) + ^ +<sql-statement> +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x groups between 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT x, (sum(x) over w) + ^ +<sql-statement> +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x rows between 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT x, (sum(x) over w) + ^ +<sql-statement> +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x range between 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT x, (sum(x) over w) + ^ +<sql-statement> +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x groups between 1 preceding and 1 following); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT x, (sum(x) over w) + ^ +<sql-statement> +-- with UNION +SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 UNION ALL SELECT * FROM tenk2)s LIMIT 0; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- check some degenerate cases +create temp table t1 (f1 int, f2 int8); +</sql-statement> +<sql-statement> +insert into t1 values (1,1),(1,2),(2,2); +</sql-statement> +<sql-statement> +select f1, sum(f1) over (partition by f1 + range between 1 preceding and 1 following) +from t1 where f1 = f2; -- error, must have order by +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: range + select f1, sum(f1) over (partition by f1 + ^ +<sql-statement> +explain (costs off) +select f1, sum(f1) over (partition by f1 order by f2 + range between 1 preceding and 1 following) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1 order by f2 + range between 1 preceding and 1 following) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: range + select f1, sum(f1) over (partition by f1 order by f2 + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1, f1 order by f2 + range between 2 preceding and 1 preceding) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1, f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1, f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: range + select f1, sum(f1) over (partition by f1, f1 order by f2 + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1, f2 order by f2 + range between 1 following and 2 following) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1, f2 order by f2 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1, f2 order by f2 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: range + select f1, sum(f1) over (partition by f1, f2 order by f2 + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; -- error, must have order by +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: groups + select f1, sum(f1) over (partition by f1 + ^ +<sql-statement> +explain (costs off) +select f1, sum(f1) over (partition by f1 order by f2 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + explain (costs off) + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1 order by f2 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: groups + select f1, sum(f1) over (partition by f1 order by f2 + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1, f1 order by f2 + groups between 2 preceding and 1 preceding) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1, f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1, f1 order by f2 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: groups + select f1, sum(f1) over (partition by f1, f1 order by f2 + ^ +<sql-statement> +select f1, sum(f1) over (partition by f1, f2 order by f2 + groups between 1 following and 2 following) +from t1 where f1 = f2; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + select f1, sum(f1) over (partition by f1, f2 order by f2 + ^ + -stdin-:<main>:1:25: Error: At function: PgWindow + select f1, sum(f1) over (partition by f1, f2 order by f2 + ^ + -stdin-:<main>:1:25: Error: Unsupported frame type: groups + select f1, sum(f1) over (partition by f1, f2 order by f2 + ^ +<sql-statement> +-- ordering by a non-integer constant is allowed +SELECT rank() OVER (ORDER BY length('abc')); +</sql-statement> +<sql-statement> +-- can't order by another window function +SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:30: Error: Over is not allowed in: ORDER BY + SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())); + ^ +<sql-statement> +-- some other errors +SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:31: Error: Over is not allowed in: WHERE + SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10; + ^ +<sql-statement> +SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:45: Error: Over is not allowed in: JOIN ON + SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10; + ^ +<sql-statement> +SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: YtMap! + SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1; + ^ + -stdin-:<main>:1:1: Fatal: ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp:364 GetCallable(): requirement Callables.cend() != compiler failed, message: Missed callable: PgWindowCall + SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1; + ^ +<sql-statement> +SELECT * FROM rank() OVER (ORDER BY random()); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:29: Error: ERROR: syntax error at or near "ORDER" + + SELECT * FROM rank() OVER (ORDER BY random()); + ^ +<sql-statement> +DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:30: Error: Over is not allowed in: WHERE + DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10; + ^ +<sql-statement> +DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random()); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: ResTarget: alternative is not implemented yet : 357 + DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random()); + ^ +<sql-statement> +SELECT count(*) OVER w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY unique1); +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:41: Error: ERROR: syntax error at or near "ORDER" + + SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1; + ^ +<sql-statement> +SELECT count() OVER () FROM tenk1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: FuncCall: count(*) must be used to call a parameterless aggregate function + SELECT count() OVER () FROM tenk1; + ^ +<sql-statement> +SELECT generate_series(1, 100) OVER () FROM empsalary; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: Generator functions are not allowed in: SELECT + SELECT generate_series(1, 100) OVER () FROM empsalary; + ^ +<sql-statement> +SELECT ntile(0) OVER (ORDER BY ten), ten, four FROM tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +SELECT nth_value(four, 0) OVER (ORDER BY ten), ten, four FROM tenk1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- filter +SELECT sum(salary), row_number() OVER (ORDER BY depname), sum( + sum(salary) FILTER (WHERE enroll_date > '2007-01-01') +) FILTER (WHERE depname <> 'sales') OVER (ORDER BY depname DESC) AS "filtered_sum", + depname +FROM empsalary GROUP BY depname; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:59: Error: FuncCall: unsupported agg_filter + SELECT sum(salary), row_number() OVER (ORDER BY depname), sum( + ^ +<sql-statement> +-- Test pushdown of quals into a subquery containing window functions +-- pushdown is safe because all PARTITION BY clauses include depname: +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY depname) depsalary, + min(salary) OVER (PARTITION BY depname || 'A', depname) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test pushdown of quals into a subquery containing window functions + ^ +<sql-statement> +-- pushdown is unsafe because there's a PARTITION BY clause without depname: +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY enroll_date) enroll_salary, + min(salary) OVER (PARTITION BY depname) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- pushdown is unsafe because there's a PARTITION BY clause without depname: + ^ +<sql-statement> +-- Test Sort node collapsing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY depname order by empno) depsalary, + min(salary) OVER (PARTITION BY depname, empno order by enroll_date) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test Sort node collapsing + ^ +<sql-statement> +-- Test Sort node reordering +EXPLAIN (COSTS OFF) +SELECT + lead(1) OVER (PARTITION BY depname ORDER BY salary, enroll_date), + lag(1) OVER (PARTITION BY depname ORDER BY salary,enroll_date,empno) +FROM empsalary; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test Sort node reordering + ^ +<sql-statement> +-- Test incremental sorting +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + empno, + salary, + enroll_date, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date) AS first_emp, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date DESC) AS last_emp + FROM empsalary) emp +WHERE first_emp = 1 OR last_emp = 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + -- Test incremental sorting + ^ +<sql-statement> +SELECT * FROM + (SELECT depname, + empno, + salary, + enroll_date, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date) AS first_emp, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date DESC) AS last_emp + FROM empsalary) emp +WHERE first_emp = 1 OR last_emp = 1; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: PgSelect, At function: PgSetItem, At function: AssumeColumnOrder, At function: PgReplaceUnknown, At function: OrderedMap, At function: CalcOverWindow, At function: OrderedMap, At function: CalcOverWindow + SELECT * FROM + ^ + -stdin-:<main>:1:1: Error: Expected hashable and equatable type for key column: _yql_partition_key_0_0, but got: pgvarchar + SELECT * FROM + ^ +<sql-statement> +-- cleanup +DROP TABLE empsalary; +</sql-statement> +<sql-statement> +-- test user-defined window function with named args and default args +CREATE FUNCTION nth_value_def(val anyelement, n integer = 1) RETURNS anyelement + LANGUAGE internal WINDOW IMMUTABLE STRICT AS 'window_nth_value'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- test user-defined window function with named args and default args + ^ +<sql-statement> +SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:8: Error: alternative is not implemented yet : 118 + SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY four), ten, four + ^ +<sql-statement> +SELECT nth_value_def(ten) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.tenk1 + +<sql-statement> +-- +-- Test the basic moving-aggregate machinery +-- +-- create aggregates that record the series of transform calls (these are +-- intentionally not true inverses) +CREATE FUNCTION logging_sfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT COALESCE($1, '') || '*' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- + ^ +<sql-statement> +CREATE FUNCTION logging_msfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT COALESCE($1, '') || '+' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION logging_msfunc_nonstrict(text, anyelement) RETURNS text AS + ^ +<sql-statement> +CREATE FUNCTION logging_minvfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '-' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION logging_minvfunc_nonstrict(text, anyelement) RETURNS text AS + ^ +<sql-statement> +CREATE AGGREGATE logging_agg_nonstrict (anyelement) + stype = text, + sfunc = logging_sfunc_nonstrict, + mstype = text, + msfunc = logging_msfunc_nonstrict, + minvfunc = logging_minvfunc_nonstrict +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:2: Error: ERROR: syntax error at or near "stype" + + stype = text, + ^ +<sql-statement> +CREATE AGGREGATE logging_agg_nonstrict_initcond (anyelement) + stype = text, + sfunc = logging_sfunc_nonstrict, + mstype = text, + msfunc = logging_msfunc_nonstrict, + minvfunc = logging_minvfunc_nonstrict, + initcond = 'I', + minitcond = 'MI' +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:2: Error: ERROR: syntax error at or near "stype" + + stype = text, + ^ +<sql-statement> +CREATE FUNCTION logging_sfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '*' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION logging_sfunc_strict(text, anyelement) RETURNS text AS + ^ +<sql-statement> +CREATE FUNCTION logging_msfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '+' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION logging_msfunc_strict(text, anyelement) RETURNS text AS + ^ +<sql-statement> +CREATE FUNCTION logging_minvfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '-' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + CREATE FUNCTION logging_minvfunc_strict(text, anyelement) RETURNS text AS + ^ +<sql-statement> +CREATE AGGREGATE logging_agg_strict (text) + stype = text, + sfunc = logging_sfunc_strict, + mstype = text, + msfunc = logging_msfunc_strict, + minvfunc = logging_minvfunc_strict +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:2: Error: ERROR: syntax error at or near "stype" + + stype = text, + ^ +<sql-statement> +CREATE AGGREGATE logging_agg_strict_initcond (anyelement) + stype = text, + sfunc = logging_sfunc_strict, + mstype = text, + msfunc = logging_msfunc_strict, + minvfunc = logging_minvfunc_strict, + initcond = 'I', + minitcond = 'MI' +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:2: Error: ERROR: syntax error at or near "stype" + + stype = text, + ^ +<sql-statement> +-- test strict and non-strict cases +SELECT + p::text || ',' || i::text || ':' || COALESCE(v::text, 'NULL') AS row, + logging_agg_nonstrict(v) over wnd as nstrict, + logging_agg_nonstrict_initcond(v) over wnd as nstrict_init, + logging_agg_strict(v::text) over wnd as strict, + logging_agg_strict_initcond(v) over wnd as strict_init +FROM (VALUES + (1, 1, NULL), + (1, 2, 'a'), + (1, 3, 'b'), + (1, 4, NULL), + (1, 5, NULL), + (1, 6, 'c'), + (2, 1, NULL), + (2, 2, 'x'), + (3, 1, 'z') +) AS t(p, i, v) +WINDOW wnd AS (PARTITION BY P ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY p, i; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- test strict and non-strict cases + ^ + -stdin-:<main>:19:29: Error: No such column: P + WINDOW wnd AS (PARTITION BY P ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) + ^ +<sql-statement> +-- and again, but with filter +SELECT + p::text || ',' || i::text || ':' || + CASE WHEN f THEN COALESCE(v::text, 'NULL') ELSE '-' END as row, + logging_agg_nonstrict(v) filter(where f) over wnd as nstrict_filt, + logging_agg_nonstrict_initcond(v) filter(where f) over wnd as nstrict_init_filt, + logging_agg_strict(v::text) filter(where f) over wnd as strict_filt, + logging_agg_strict_initcond(v) filter(where f) over wnd as strict_init_filt +FROM (VALUES + (1, 1, true, NULL), + (1, 2, false, 'a'), + (1, 3, true, 'b'), + (1, 4, false, NULL), + (1, 5, false, NULL), + (1, 6, false, 'c'), + (2, 1, false, NULL), + (2, 2, true, 'x'), + (3, 1, true, 'z') +) AS t(p, i, f, v) +WINDOW wnd AS (PARTITION BY p ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY p, i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:2: Error: FuncCall: unsupported agg_filter + logging_agg_nonstrict(v) filter(where f) over wnd as nstrict_filt, + ^ +<sql-statement> +-- test that volatile arguments disable moving-aggregate mode +SELECT + i::text || ':' || COALESCE(v::text, 'NULL') as row, + logging_agg_strict(v::text) + over wnd as inverse, + logging_agg_strict(v::text || CASE WHEN random() < 0 then '?' ELSE '' END) + over wnd as noinverse +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY i; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem + -- test that volatile arguments disable moving-aggregate mode + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- test that volatile arguments disable moving-aggregate mode + ^ + -stdin-:<main>:4:2: Error: At function: PgWindowCall + logging_agg_strict(v::text) + ^ + -stdin-:<main>:4:2: Error: Unsupported function: logging_agg_strict + logging_agg_strict(v::text) + ^ + -stdin-:<main>:1:1: Error: At function: PgResultItem + -- test that volatile arguments disable moving-aggregate mode + ^ + -stdin-:<main>:6:2: Error: At function: PgWindowCall + logging_agg_strict(v::text || CASE WHEN random() < 0 then '?' ELSE '' END) + ^ + -stdin-:<main>:6:2: Error: Unsupported function: logging_agg_strict + logging_agg_strict(v::text || CASE WHEN random() < 0 then '?' ELSE '' END) + ^ +<sql-statement> +SELECT + i::text || ':' || COALESCE(v::text, 'NULL') as row, + logging_agg_strict(v::text) filter(where true) + over wnd as inverse, + logging_agg_strict(v::text) filter(where random() >= 0) + over wnd as noinverse +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY i; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:2: Error: FuncCall: unsupported agg_filter + logging_agg_strict(v::text) filter(where true) + ^ +<sql-statement> +-- test that non-overlapping windows don't use inverse transitions +SELECT + logging_agg_strict(v::text) OVER wnd +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN CURRENT ROW AND CURRENT ROW) +ORDER BY i; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- test that non-overlapping windows don't use inverse transitions + ^ + -stdin-:<main>:3:2: Error: At function: PgWindowCall + logging_agg_strict(v::text) OVER wnd + ^ + -stdin-:<main>:3:2: Error: Unsupported function: logging_agg_strict + logging_agg_strict(v::text) OVER wnd + ^ +<sql-statement> +-- test that returning NULL from the inverse transition functions +-- restarts the aggregation from scratch. The second aggregate is supposed +-- to test cases where only some aggregates restart, the third one checks +-- that one aggregate restarting doesn't cause others to restart. +CREATE FUNCTION sum_int_randrestart_minvfunc(int4, int4) RETURNS int4 AS +$$ SELECT CASE WHEN random() < 0.2 THEN NULL ELSE $1 - $2 END $$ +LANGUAGE SQL STRICT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261 + -- test that returning NULL from the inverse transition functions + ^ +<sql-statement> +CREATE AGGREGATE sum_int_randomrestart (int4) + stype = int4, + sfunc = int4pl, + mstype = int4, + msfunc = int4pl, + minvfunc = sum_int_randrestart_minvfunc +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:2: Error: ERROR: syntax error at or near "stype" + + stype = int4, + ^ +<sql-statement> +WITH +vs AS ( + SELECT i, (random() * 100)::int4 AS v + FROM generate_series(1, 100) AS i +), +sum_following AS ( + SELECT i, SUM(v) OVER + (ORDER BY i DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS s + FROM vs +SELECT DISTINCT + sum_following.s = sum_int_randomrestart(v) OVER fwd AS eq1, + -sum_following.s = sum_int_randomrestart(-v) OVER fwd AS eq2, + 100*3+(vs.i-1)*3 = length(logging_agg_nonstrict(''::text) OVER fwd) AS eq3 +FROM vs +JOIN sum_following ON sum_following.i = vs.i +WINDOW fwd AS ( + ORDER BY vs.i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:10:1: Error: ERROR: syntax error at or near "SELECT" + + SELECT DISTINCT + ^ +<sql-statement> +-- +-- Test various built-in aggregates that have moving-aggregate support +-- +-- test inverse transition functions handle NULLs properly +SELECT i,AVG(v::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); +</sql-statement> +<sql-statement> +SELECT i,AVG(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); +</sql-statement> +VERIFY failed (2023-12-12T19:41:50.094283+0300): Value is not boxed + ydb/library/yql/public/udf/udf_value_inl.h:379 + AsBoxed(): requirement IsBoxed() failed +BackTrace(void**, unsigned long)+29 (0x14087F6D) +FormatBackTrace(IOutputStream*)+32 (0x14088440) +PrintBackTrace()+17 (0x14088491) +NPrivate::InternalPanicImpl(int, char const*, char const*, int, int, int, TBasicStringBuf<char, std::__y1::char_traits<char> >, char const*, unsigned long)+995 (0x140CE743) +NPrivate::Panic(NPrivate::TStaticBuf const&, int, char const*, char const*, char const*, ...)+418 (0x140C18B2) +NYql::NUdf::TUnboxedValuePod::AsBoxed() const+218 (0x152AF12A) +NYql::PointerDatumFromPod(NYql::NUdf::TUnboxedValuePod const&)+29 (0x1B7A9E8D) +NYql::TPgResolvedCall<true>::DoCalculate(NKikimr::NMiniKQL::TComputationContext&) const+771 (0x1B7E5C33) +NKikimr::NMiniKQL::TMutableComputationNode<NYql::TPgResolvedCall<true> >::GetValue(NKikimr::NMiniKQL::TComputationContext&) const+420 (0x1B7E50D4) +??+0 (0x7F854D4FCC53) +??+0 (0x7F854D4FC47C) +??+0 (0x7F854D4FAE01) +??+0 (0x1FD82FD2) +NYql::NUdf::TBoxedValueAccessor::Fetch(NYql::NUdf::IBoxedValue&, NYql::NUdf::TUnboxedValue&)+244 (0x178E67A4) +NYql::NUdf::TUnboxedValuePod::Fetch(NYql::NUdf::TUnboxedValue&) const+228 (0x178E6624) +NKikimr::NMiniKQL::TForwardListValue::TIterator::Next(NYql::NUdf::TUnboxedValue&)+36 (0x17B99974) +NYql::NUdf::TBoxedValueAccessor::Next(NYql::NUdf::IBoxedValue&, NYql::NUdf::TUnboxedValue&)+244 (0x14EFDD24) +NYql::NUdf::TUnboxedValuePod::Next(NYql::NUdf::TUnboxedValue&) const+228 (0x14EFD9F4) +NYql::TYsonExecuteResOrPull::WriteValue(NYql::NUdf::TUnboxedValue const&, NKikimr::NMiniKQL::TType*)+436 (0x209F9A54) +NYql::NFile::TYtFileGateway::ExecuteResult(NYql::NFile::TSession&, NYson::TYsonWriter&, NYql::NNodes::TExprBase, NYql::TExprContext&, NYql::IYtGateway::TResOrPullOptions&&, TVector<TBasicString<char, std::__y1::char_traits<char> >, std::__y1::allocator<TBasicString<char, std::__y1::char_traits<char> > > > const&) const+2002 (0x1C34AE12) +NYql::NFile::TYtFileGateway::ResOrPull(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, NYql::TExprContext&, NYql::IYtGateway::TResOrPullOptions&&)+1128 (0x1C31DEF8) +??+0 (0x1AB7ECFE) +??+0 (0x1AB82F89) +??+0 (0x1AB82EE8) +??+0 (0x1AB82E78) +??+0 (0x1AB82E28) +??+0 (0x1AB821BC) +std::__y1::__function::__value_func<std::__y1::pair<NYql::IGraphTransformer::TStatus, NThreading::TFuture<std::__y1::function<NYql::IGraphTransformer::TStatus (TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)> > > (TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)>::operator()[abi:v15000](TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&) const+93 (0x1AB92C9D) +std::__y1::function<std::__y1::pair<NYql::IGraphTransformer::TStatus, NThreading::TFuture<std::__y1::function<NYql::IGraphTransformer::TStatus (TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)> > > (TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)>::operator()(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&) const+56 (0x1AB91FE8) +NYql::TExecTransformerBase::CallbackTransform(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> > const&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)+811 (0x1AB91C6B) +NYql::TAsyncCallbackTransformer<NYql::TExecTransformerBase>::DoTransform(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)+64 (0x1AB7FF50) +NYql::TGraphTransformerBase::Transform(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)+100 (0x153FF174) +??+0 (0x176F665C) +??+0 (0x176EA0A6) +NYql::TGraphTransformerBase::Transform(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)+100 (0x153FF174) +??+0 (0x1786F3EC) +??+0 (0x17861728) +??+0 (0x1786DCCC) +??+0 (0x178619D7) +??+0 (0x1786D98A) +??+0 (0x178619D7) +??+0 (0x17859F2E) +NYql::TGraphTransformerBase::Transform(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)+100 (0x153FF174) +??+0 (0x15403098) +??+0 (0x15402DC9) +??+0 (0x153FF7D5) +NYql::TGraphTransformerBase::Transform(TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&)+100 (0x153FF174) +NYql::AsyncTransformStepImpl(NYql::IGraphTransformer&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&, bool, bool, TBasicStringBuf<char, std::__y1::char_traits<char> > const&)+1222 (0x153FE226) +NYql::AsyncTransform(NYql::IGraphTransformer&, TIntrusivePtr<NYql::TExprNode, TDefaultIntrusivePtrOps<NYql::TExprNode> >&, NYql::TExprContext&, bool)+127 (0x153FEAAF) +NYql::TProgram::AsyncTransformWithFallback(bool)+120 (0x16C17A78) +??+0 (0x16C3EC1E) +??+0 (0x16C3E797) +??+0 (0x16C3E665) +??+0 (0x16C3D140) +??+0 (0x16C3D007) +??+0 (0x16C15F8D) +NYql::TProgram::RunAsync(TBasicString<char, std::__y1::char_traits<char> > const&, IOutputStream*, IOutputStream*, IOutputStream*, bool)+3760 (0x16C15C20) +??+0 (0x16C12804) +NYql::TProgram::Run(TBasicString<char, std::__y1::char_traits<char> > const&, IOutputStream*, IOutputStream*, IOutputStream*, bool)+301 (0x16C14CCD) +Main(int, char**)+4924 (0x13F14D4C) +main+273 (0x13F16831) +??+0 (0x7F854D229D90) +__libc_start_main+128 (0x7F854D229E40) +??+0 (0x13EA0029) +pthread_kill at ./nptl/./nptl/pthread_kill.c:43:17 +?? at ??:0:0 diff --git a/ydb/library/yql/tests/postgresql/cases/window.out b/ydb/library/yql/tests/postgresql/cases/window.out index 9cdd9febaa..b96ff63dea 100644 --- a/ydb/library/yql/tests/postgresql/cases/window.out +++ b/ydb/library/yql/tests/postgresql/cases/window.out @@ -18,3 +18,30 @@ INSERT INTO empsalary VALUES ('sales', 3, 4800, '2007-08-01'), ('develop', 8, 6000, '2006-10-01'), ('develop', 11, 5200, '2007-08-15'); +-- Test in_range for other numeric datatypes +create temp table numerics( + id int, + f_float4 float4, + f_float8 float8, + f_numeric numeric +); +-- Test in_range for other datetime datatypes +create temp table datetimes( + id int, + f_time time, + f_timetz timetz, + f_interval interval, + f_timestamptz timestamptz, + f_timestamp timestamp +); +insert into datetimes values +(1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), +(2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(4, '14:00', '14:00 BST', '4 years', '2002-10-19 10:23:54+01', '2002-10-19 10:23:54'), +(5, '15:00', '15:00 BST', '5 years', '2003-10-19 10:23:54+01', '2003-10-19 10:23:54'), +(6, '15:00', '15:00 BST', '5 years', '2004-10-19 10:23:54+01', '2004-10-19 10:23:54'), +(7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), +(8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), +(9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); diff --git a/ydb/library/yql/tests/postgresql/cases/window.sql b/ydb/library/yql/tests/postgresql/cases/window.sql index 9cdd9febaa..b96ff63dea 100644 --- a/ydb/library/yql/tests/postgresql/cases/window.sql +++ b/ydb/library/yql/tests/postgresql/cases/window.sql @@ -18,3 +18,30 @@ INSERT INTO empsalary VALUES ('sales', 3, 4800, '2007-08-01'), ('develop', 8, 6000, '2006-10-01'), ('develop', 11, 5200, '2007-08-15'); +-- Test in_range for other numeric datatypes +create temp table numerics( + id int, + f_float4 float4, + f_float8 float8, + f_numeric numeric +); +-- Test in_range for other datetime datatypes +create temp table datetimes( + id int, + f_time time, + f_timetz timetz, + f_interval interval, + f_timestamptz timestamptz, + f_timestamp timestamp +); +insert into datetimes values +(1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), +(2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(4, '14:00', '14:00 BST', '4 years', '2002-10-19 10:23:54+01', '2002-10-19 10:23:54'), +(5, '15:00', '15:00 BST', '5 years', '2003-10-19 10:23:54+01', '2003-10-19 10:23:54'), +(6, '15:00', '15:00 BST', '5 years', '2004-10-19 10:23:54+01', '2004-10-19 10:23:54'), +(7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), +(8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), +(9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); diff --git a/ydb/library/yql/tests/postgresql/cases/xml.err b/ydb/library/yql/tests/postgresql/cases/xml.err index d2ea950126..7ac69d2213 100644 --- a/ydb/library/yql/tests/postgresql/cases/xml.err +++ b/ydb/library/yql/tests/postgresql/cases/xml.err @@ -16,17 +16,2023 @@ INSERT INTO xmltest VALUES (3, '<wrong'); <sql-statement> SELECT * FROM xmltest; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F4627A29D90) -__libc_start_main+128 (0x7F4627A29E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT xmlcomment('test'); +</sql-statement> +<sql-statement> +SELECT xmlcomment('-test'); +</sql-statement> +<sql-statement> +SELECT xmlcomment('test-'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xmlcomment('test-'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML comment + + SELECT xmlcomment('test-'); + ^ +<sql-statement> +SELECT xmlcomment('--test'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xmlcomment('--test'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML comment + + SELECT xmlcomment('--test'); + ^ +<sql-statement> +SELECT xmlcomment('te st'); +</sql-statement> +<sql-statement> +SELECT xmlconcat(xmlcomment('hello'), + xmlelement(NAME qux, 'foo'), + xmlcomment('world')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(xmlcomment('hello'), + ^ +<sql-statement> +SELECT xmlconcat('hello', 'you'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('hello', 'you'); + ^ +<sql-statement> +SELECT xmlconcat(1, 2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(1, 2); + ^ +<sql-statement> +SELECT xmlconcat('bad', '<syntax'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('bad', '<syntax'); + ^ +<sql-statement> +SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); + ^ +<sql-statement> +SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); + ^ +<sql-statement> +SELECT xmlconcat(NULL); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(NULL); + ^ +<sql-statement> +SELECT xmlconcat(NULL, NULL); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(NULL, NULL); + ^ +<sql-statement> +SELECT xmlelement(name element, + xmlattributes (1 as one, 'deuce' as two), + 'content'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, + ^ +<sql-statement> +SELECT xmlelement(name element, + xmlattributes ('unnamed and wrong')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, + ^ +<sql-statement> +SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); + ^ +<sql-statement> +SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + ^ +<sql-statement> +SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); + ^ +<sql-statement> +SELECT xmlelement(name num, 37); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name num, 37); + ^ +<sql-statement> +SELECT xmlelement(name foo, text 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, text 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xml 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xml 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, text 'b<a/>r'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, text 'b<a/>r'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xml 'b<a/>r'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xml 'b<a/>r'); + ^ +<sql-statement> +SELECT xmlelement(name foo, array[1, 2, 3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, array[1, 2, 3]); + ^ +<sql-statement> +SET xmlbinary TO base64; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: xmlbinary + SET xmlbinary TO base64; + ^ +<sql-statement> +SELECT xmlelement(name foo, bytea 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, bytea 'bar'); + ^ +<sql-statement> +SET xmlbinary TO hex; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: xmlbinary + SET xmlbinary TO hex; + ^ +<sql-statement> +SELECT xmlelement(name foo, bytea 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, bytea 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes(true as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes(true as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier)); + ^ +<sql-statement> +SELECT xmlparse(content ''); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content ''); + ^ +<sql-statement> +SELECT xmlparse(content ' '); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content ' '); + ^ +<sql-statement> +SELECT xmlparse(content 'abc'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content 'abc'); + ^ +<sql-statement> +SELECT xmlparse(content '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<abc>x</abc>'); + ^ +<sql-statement> +SELECT xmlparse(content '<invalidentity>&</invalidentity>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<invalidentity>&</invalidentity>'); + ^ +<sql-statement> +SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>'); + ^ +<sql-statement> +SELECT xmlparse(content '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +SELECT xmlparse(content '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>'); + ^ +<sql-statement> +SELECT xmlparse(content '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<nosuchprefix:tag/>'); + ^ +<sql-statement> +SELECT xmlparse(document ' '); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document ' '); + ^ +<sql-statement> +SELECT xmlparse(document 'abc'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document 'abc'); + ^ +<sql-statement> +SELECT xmlparse(document '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<abc>x</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<invalidentity>&</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<invalidentity>&</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +SELECT xmlparse(document '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>'); + ^ +<sql-statement> +SELECT xmlparse(document '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<nosuchprefix:tag/>'); + ^ +<sql-statement> +SELECT xmlpi(name foo); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo); + ^ +<sql-statement> +SELECT xmlpi(name xml); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xml); + ^ +<sql-statement> +SELECT xmlpi(name xmlstuff); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xmlstuff); + ^ +<sql-statement> +SELECT xmlpi(name foo, 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, 'bar'); + ^ +<sql-statement> +SELECT xmlpi(name foo, 'in?>valid'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, 'in?>valid'); + ^ +<sql-statement> +SELECT xmlpi(name foo, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, null); + ^ +<sql-statement> +SELECT xmlpi(name xml, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xml, null); + ^ +<sql-statement> +SELECT xmlpi(name xmlstuff, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xmlstuff, null); + ^ +<sql-statement> +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); + ^ +<sql-statement> +SELECT xmlpi(name foo, ' bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, ' bar'); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version no value, standalone no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version no value, standalone no value); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version '2.0'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version '2.0'); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version no value, standalone yes); + ^ +<sql-statement> +SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes); + ^ +<sql-statement> +SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value); + ^ +<sql-statement> +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot ( + ^ +<sql-statement> +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(content data as character varying(20)) FROM xmltest; + ^ +<sql-statement> +SELECT xmlserialize(content 'good' as char(10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(content 'good' as char(10)); + ^ +<sql-statement> +SELECT xmlserialize(document 'bad' as text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(document 'bad' as text); + ^ +<sql-statement> +SELECT xml '<foo>bar</foo>' IS DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xml '<foo>bar</foo>' IS DOCUMENT; + ^ +<sql-statement> +SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; + ^ +<sql-statement> +SELECT xml '<abc/>' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:21: Error: alternative is not implemented yet : 143 + SELECT xml '<abc/>' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT xml 'abc' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: alternative is not implemented yet : 143 + SELECT xml 'abc' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT '<>' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:13: Error: alternative is not implemented yet : 143 + SELECT '<>' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT xmlagg(data) FROM xmltest; +</sql-statement> +<sql-statement> +SELECT xmlagg(data) FROM xmltest WHERE id > 10; +</sql-statement> +<sql-statement> +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; + ^ +<sql-statement> +-- Check mapping SQL identifier to XML name +SELECT xmlpi(name ":::_xml_abc135.%-&_"); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- Check mapping SQL identifier to XML name + ^ +<sql-statement> +SELECT xmlpi(name "123"); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name "123"); + ^ +<sql-statement> +PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 301 + PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1); + ^ +<sql-statement> +SET XML OPTION DOCUMENT; +</sql-statement> +<sql-statement> +EXECUTE foo ('<bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('<bar/>'); + ^ +<sql-statement> +EXECUTE foo ('bad'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('bad'); + ^ +<sql-statement> +SELECT xml '<!DOCTYPE a><a/><b/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!DOCTYPE a><a/><b/> + ^ + + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ +<sql-statement> +SET XML OPTION CONTENT; +</sql-statement> +<sql-statement> +EXECUTE foo ('<bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('<bar/>'); + ^ +<sql-statement> +EXECUTE foo ('good'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('good'); + ^ +<sql-statement> +SELECT xml '<!-- in SQL:2006+ a doc is content too--> <?y z?> <!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<?xml version="1.0"?> <!-- hi--> <!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found + <!-- hi--> oops <!DOCTYPE a><a/> + ^ + + SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; + ^ +<sql-statement> +SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!-- hi--> <oops/> <!DOCTYPE a><a/> + ^ + + SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; + ^ +<sql-statement> +SELECT xml '<!DOCTYPE a><a/><b/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!DOCTYPE a><a/><b/> + ^ + + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ +<sql-statement> +-- Test backwards parsing +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + -- Test backwards parsing + ^ +<sql-statement> +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); + ^ +<sql-statement> +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); + ^ +<sql-statement> +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + ^ +<sql-statement> +CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>'); + ^ +<sql-statement> +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); + ^ +<sql-statement> +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes); + ^ +<sql-statement> +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); + ^ +<sql-statement> +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); + ^ +<sql-statement> +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:41: Error: Unknown cluster: information_schema + SELECT table_name, view_definition FROM information_schema.views + ^ +<sql-statement> +-- Text XPath expressions evaluation +SELECT xpath('/value', data) FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- Text XPath expressions evaluation + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT xpath('/value', data) FROM xmltest; + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,xml) + SELECT xpath('/value', data) FROM xmltest; + ^ +<sql-statement> +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:26: Error: At function: ToPg, At function: Not, At function: Exists + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ +<sql-statement> +SELECT xpath('', '<!-- error -->'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('', '<!-- error -->'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('', '<!-- error -->'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('', '<!-- error -->'); + ^ +<sql-statement> +SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ +<sql-statement> +SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1" xmlns="http://127.0.0.2"><local:piece id="1"><internal>number one</internal><internal2/></local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ +<sql-statement> +SELECT xpath('//text()', '<root><</root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//text()', '<root><</root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//text()', '<root><</root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//text()', '<root><</root>'); + ^ +<sql-statement> +SELECT xpath('//@value', '<root value="<"/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//@value', '<root value="<"/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//@value', '<root value="<"/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//@value', '<root value="<"/>'); + ^ +<sql-statement> +SELECT xpath('''<<invalid>>''', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ +<sql-statement> +SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('/nosuchtag', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('/nosuchtag', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('/nosuchtag', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/nosuchtag', '<root/>'); + ^ +<sql-statement> +SELECT xpath('root', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('root', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('root', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('root', '<root/>'); + ^ +<sql-statement> +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := '<?xml version="1.0" encoding="ISO-8859-1"?>'; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '<x>' || degree_symbol || '</x>')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 263 + -- Round-trip non-ASCII data through xpath(). + ^ +<sql-statement> +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'); +</sql-statement> +<sql-statement> +SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'); +</sql-statement> +<sql-statement> +SELECT xmlexists('count(/nosuchtag)' PASSING BY REF '<root/>'); +</sql-statement> +<sql-statement> +SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ +<sql-statement> +SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ +<sql-statement> +SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ +<sql-statement> +INSERT INTO xmltest VALUES (4, '<menu><beers><name>Budvar</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (5, '<menu><beers><name>Molson</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (6, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Budvar</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (7, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Molson</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +CREATE TABLE query ( expr TEXT ); +</sql-statement> +<sql-statement> +INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); +</sql-statement> +<sql-statement> +-- Test xml_is_well_formed and variants +SELECT xml_is_well_formed_document('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_document('abc'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_content('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_content('abc'); +</sql-statement> +<sql-statement> +SET xmloption TO DOCUMENT; +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('abc'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<abc/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo>bar</foo'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo><bar>baz</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<invalidentity>&</abc>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<undefinedentity>&idontexist;</abc>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<invalidns xmlns=''<''/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<relativens xmlns=''relative''/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +<sql-statement> +SET xmloption TO CONTENT; +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('abc'); +</sql-statement> +<sql-statement> +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- <invalidns xmlns='<'/> +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:11:1: Error: ERROR: syntax error at or near "\" + + \set VERBOSITY terse + ^ +<sql-statement> +SELECT xpath('/*', '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +\set VERBOSITY default +</sql-statement> +Metacommand \set VERBOSITY default is not supported +<sql-statement> +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- Again, the XML isn't well-formed for namespace purposes + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT xpath('/*', '<nosuchprefix:tag/>'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<nosuchprefix:tag/>'); + ^ +<sql-statement> +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- XPath deprecates relative namespaces, but they're not supposed to + ^ + -stdin-:<main>:3:8: Error: At function: PgCall + SELECT xpath('/*', '<relativens xmlns=''relative''/>'); + ^ + -stdin-:<main>:3:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/passwd">]><foo>&c;</foo>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- External entity references should not leak filesystem information. + ^ +<sql-statement> +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>'); + ^ +<sql-statement> +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"><chapter> </chapter>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- This might or might not load the requested DTD, but it mustn't throw error. + ^ +<sql-statement> +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +</sql-statement> +<sql-statement> +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="1"> + <COUNTRY_ID>AU</COUNTRY_ID> + <COUNTRY_NAME>Australia</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="2"> + <COUNTRY_ID>CN</COUNTRY_ID> + <COUNTRY_NAME>China</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="3"> + <COUNTRY_ID>HK</COUNTRY_ID> + <COUNTRY_NAME>HongKong</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="4"> + <COUNTRY_ID>IN</COUNTRY_ID> + <COUNTRY_NAME>India</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="5"> + <COUNTRY_ID>JP</COUNTRY_ID> + <COUNTRY_NAME>Japan</COUNTRY_NAME> + <REGION_ID>3</REGION_ID><PREMIER_NAME>Sinzo Abe</PREMIER_NAME> +</ROW> +<ROW id="6"> + <COUNTRY_ID>SG</COUNTRY_ID> + <COUNTRY_NAME>Singapore</COUNTRY_NAME> + <REGION_ID>3</REGION_ID><SIZE unit="km">791</SIZE> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.xmltableview1 + +<sql-statement> +\sv xmltableview1 +</sql-statement> +Metacommand \sv xmltableview1 is not supported +<sql-statement> +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; + ^ +<sql-statement> +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + ^ +<sql-statement> +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- errors + ^ +<sql-statement> +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'zz:a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'zz:a'); + ^ +<sql-statement> +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'zz:a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'zz:a'); + ^ +<sql-statement> +SELECT * FROM xmltableview2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.xmltableview2 + +<sql-statement> +SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), + '/rows/row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'a'); + ^ +<sql-statement> +SELECT * FROM XMLTABLE('.' + PASSING '<foo/>' + COLUMNS a text PATH 'foo/namespace::node()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:39: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a text PATH 'foo/namespace::node()'); + ^ +<sql-statement> +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:7:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +EXECUTE pp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE pp; + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + ^ +<sql-statement> +SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text); + ^ +<sql-statement> +SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text PATH 'element/text()'); -- should fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:154: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text PATH 'element/text()'); -- should fail + ^ +<sql-statement> +-- CDATA test +select * from xmltable('d/r' passing '<d><r><c><![CDATA[<hello> &"<>!<a>foo</a>]]></c></r><r><c>2</c></r></d>' columns c text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- CDATA test + ^ +<sql-statement> +-- XML builtin entities +SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- XML builtin entities + ^ +<sql-statement> +SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent xml); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent xml); + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- test qual + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (VERBOSE, COSTS OFF) + ^ +<sql-statement> +-- should to work with more data +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="10"> + <COUNTRY_ID>CZ</COUNTRY_ID> + <COUNTRY_NAME>Czech Republic</COUNTRY_NAME> + <REGION_ID>2</REGION_ID><PREMIER_NAME>Milos Zeman</PREMIER_NAME> +</ROW> +<ROW id="11"> + <COUNTRY_ID>DE</COUNTRY_ID> + <COUNTRY_NAME>Germany</COUNTRY_NAME> + <REGION_ID>2</REGION_ID> +</ROW> +<ROW id="12"> + <COUNTRY_ID>FR</COUNTRY_ID> + <COUNTRY_NAME>France</COUNTRY_NAME> + <REGION_ID>2</REGION_ID> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="20"> + <COUNTRY_ID>EG</COUNTRY_ID> + <COUNTRY_NAME>Egypt</COUNTRY_NAME> + <REGION_ID>1</REGION_ID> +</ROW> +<ROW id="21"> + <COUNTRY_ID>SD</COUNTRY_ID> + <COUNTRY_NAME>Sudan</COUNTRY_NAME> + <REGION_ID>1</REGION_ID> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:8:4: Error: alternative is not implemented yet : 143 + y AS (SELECT xmlelement(name proc, + ^ +<sql-statement> +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:7:4: Error: alternative is not implemented yet : 143 + y AS (SELECT xmlelement(name data, + ^ +<sql-statement> +CREATE TABLE xmltest2(x xml, _path text); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><ac>1</ac></r></d>', 'A'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><bc>2</bc></r></d>', 'B'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><cc>3</cc></r></d>', 'C'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><dc>2</dc></r></d>', 'D'); +</sql-statement> +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:83: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:109: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:109: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + ^ +<sql-statement> +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING '<a>a</a>' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:61: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('*' PASSING '<a>a</a>' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); + ^ +<sql-statement> +\x +</sql-statement> +Metacommand \x is not supported +<sql-statement> +SELECT * FROM XMLTABLE('*' PASSING '<e>pre<!--c1--><?pi arg?><![CDATA[&ent1]]><n2>&deep</n2>post</e>' COLUMNS x xml PATH 'node()', y xml PATH '/'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:122: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('*' PASSING '<e>pre<!--c1--><?pi arg?><![CDATA[&ent1]]><n2>&deep</n2>post</e>' COLUMNS x xml PATH 'node()', y xml PATH '/'); + ^ +<sql-statement> +\x +</sql-statement> +Metacommand \x is not supported +<sql-statement> +SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '"<foo/>"', b xml PATH '"<foo/>"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:78: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '"<foo/>"', b xml PATH '"<foo/>"'); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/xml.err.1 b/ydb/library/yql/tests/postgresql/cases/xml.err.1 index 950ebc73d7..7ac69d2213 100644 --- a/ydb/library/yql/tests/postgresql/cases/xml.err.1 +++ b/ydb/library/yql/tests/postgresql/cases/xml.err.1 @@ -16,17 +16,2023 @@ INSERT INTO xmltest VALUES (3, '<wrong'); <sql-statement> SELECT * FROM xmltest; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F1E82229D90) -__libc_start_main+128 (0x7F1E82229E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT xmlcomment('test'); +</sql-statement> +<sql-statement> +SELECT xmlcomment('-test'); +</sql-statement> +<sql-statement> +SELECT xmlcomment('test-'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xmlcomment('test-'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML comment + + SELECT xmlcomment('test-'); + ^ +<sql-statement> +SELECT xmlcomment('--test'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xmlcomment('--test'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML comment + + SELECT xmlcomment('--test'); + ^ +<sql-statement> +SELECT xmlcomment('te st'); +</sql-statement> +<sql-statement> +SELECT xmlconcat(xmlcomment('hello'), + xmlelement(NAME qux, 'foo'), + xmlcomment('world')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(xmlcomment('hello'), + ^ +<sql-statement> +SELECT xmlconcat('hello', 'you'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('hello', 'you'); + ^ +<sql-statement> +SELECT xmlconcat(1, 2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(1, 2); + ^ +<sql-statement> +SELECT xmlconcat('bad', '<syntax'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('bad', '<syntax'); + ^ +<sql-statement> +SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); + ^ +<sql-statement> +SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); + ^ +<sql-statement> +SELECT xmlconcat(NULL); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(NULL); + ^ +<sql-statement> +SELECT xmlconcat(NULL, NULL); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(NULL, NULL); + ^ +<sql-statement> +SELECT xmlelement(name element, + xmlattributes (1 as one, 'deuce' as two), + 'content'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, + ^ +<sql-statement> +SELECT xmlelement(name element, + xmlattributes ('unnamed and wrong')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, + ^ +<sql-statement> +SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); + ^ +<sql-statement> +SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + ^ +<sql-statement> +SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); + ^ +<sql-statement> +SELECT xmlelement(name num, 37); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name num, 37); + ^ +<sql-statement> +SELECT xmlelement(name foo, text 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, text 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xml 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xml 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, text 'b<a/>r'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, text 'b<a/>r'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xml 'b<a/>r'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xml 'b<a/>r'); + ^ +<sql-statement> +SELECT xmlelement(name foo, array[1, 2, 3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, array[1, 2, 3]); + ^ +<sql-statement> +SET xmlbinary TO base64; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: xmlbinary + SET xmlbinary TO base64; + ^ +<sql-statement> +SELECT xmlelement(name foo, bytea 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, bytea 'bar'); + ^ +<sql-statement> +SET xmlbinary TO hex; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: xmlbinary + SET xmlbinary TO hex; + ^ +<sql-statement> +SELECT xmlelement(name foo, bytea 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, bytea 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes(true as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes(true as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier)); + ^ +<sql-statement> +SELECT xmlparse(content ''); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content ''); + ^ +<sql-statement> +SELECT xmlparse(content ' '); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content ' '); + ^ +<sql-statement> +SELECT xmlparse(content 'abc'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content 'abc'); + ^ +<sql-statement> +SELECT xmlparse(content '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<abc>x</abc>'); + ^ +<sql-statement> +SELECT xmlparse(content '<invalidentity>&</invalidentity>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<invalidentity>&</invalidentity>'); + ^ +<sql-statement> +SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>'); + ^ +<sql-statement> +SELECT xmlparse(content '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +SELECT xmlparse(content '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>'); + ^ +<sql-statement> +SELECT xmlparse(content '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<nosuchprefix:tag/>'); + ^ +<sql-statement> +SELECT xmlparse(document ' '); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document ' '); + ^ +<sql-statement> +SELECT xmlparse(document 'abc'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document 'abc'); + ^ +<sql-statement> +SELECT xmlparse(document '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<abc>x</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<invalidentity>&</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<invalidentity>&</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +SELECT xmlparse(document '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>'); + ^ +<sql-statement> +SELECT xmlparse(document '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<nosuchprefix:tag/>'); + ^ +<sql-statement> +SELECT xmlpi(name foo); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo); + ^ +<sql-statement> +SELECT xmlpi(name xml); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xml); + ^ +<sql-statement> +SELECT xmlpi(name xmlstuff); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xmlstuff); + ^ +<sql-statement> +SELECT xmlpi(name foo, 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, 'bar'); + ^ +<sql-statement> +SELECT xmlpi(name foo, 'in?>valid'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, 'in?>valid'); + ^ +<sql-statement> +SELECT xmlpi(name foo, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, null); + ^ +<sql-statement> +SELECT xmlpi(name xml, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xml, null); + ^ +<sql-statement> +SELECT xmlpi(name xmlstuff, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xmlstuff, null); + ^ +<sql-statement> +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); + ^ +<sql-statement> +SELECT xmlpi(name foo, ' bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, ' bar'); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version no value, standalone no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version no value, standalone no value); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version '2.0'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version '2.0'); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version no value, standalone yes); + ^ +<sql-statement> +SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes); + ^ +<sql-statement> +SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value); + ^ +<sql-statement> +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot ( + ^ +<sql-statement> +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(content data as character varying(20)) FROM xmltest; + ^ +<sql-statement> +SELECT xmlserialize(content 'good' as char(10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(content 'good' as char(10)); + ^ +<sql-statement> +SELECT xmlserialize(document 'bad' as text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(document 'bad' as text); + ^ +<sql-statement> +SELECT xml '<foo>bar</foo>' IS DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xml '<foo>bar</foo>' IS DOCUMENT; + ^ +<sql-statement> +SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; + ^ +<sql-statement> +SELECT xml '<abc/>' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:21: Error: alternative is not implemented yet : 143 + SELECT xml '<abc/>' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT xml 'abc' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: alternative is not implemented yet : 143 + SELECT xml 'abc' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT '<>' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:13: Error: alternative is not implemented yet : 143 + SELECT '<>' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT xmlagg(data) FROM xmltest; +</sql-statement> +<sql-statement> +SELECT xmlagg(data) FROM xmltest WHERE id > 10; +</sql-statement> +<sql-statement> +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; + ^ +<sql-statement> +-- Check mapping SQL identifier to XML name +SELECT xmlpi(name ":::_xml_abc135.%-&_"); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- Check mapping SQL identifier to XML name + ^ +<sql-statement> +SELECT xmlpi(name "123"); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name "123"); + ^ +<sql-statement> +PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 301 + PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1); + ^ +<sql-statement> +SET XML OPTION DOCUMENT; +</sql-statement> +<sql-statement> +EXECUTE foo ('<bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('<bar/>'); + ^ +<sql-statement> +EXECUTE foo ('bad'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('bad'); + ^ +<sql-statement> +SELECT xml '<!DOCTYPE a><a/><b/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!DOCTYPE a><a/><b/> + ^ + + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ +<sql-statement> +SET XML OPTION CONTENT; +</sql-statement> +<sql-statement> +EXECUTE foo ('<bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('<bar/>'); + ^ +<sql-statement> +EXECUTE foo ('good'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('good'); + ^ +<sql-statement> +SELECT xml '<!-- in SQL:2006+ a doc is content too--> <?y z?> <!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<?xml version="1.0"?> <!-- hi--> <!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found + <!-- hi--> oops <!DOCTYPE a><a/> + ^ + + SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; + ^ +<sql-statement> +SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!-- hi--> <oops/> <!DOCTYPE a><a/> + ^ + + SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; + ^ +<sql-statement> +SELECT xml '<!DOCTYPE a><a/><b/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!DOCTYPE a><a/><b/> + ^ + + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ +<sql-statement> +-- Test backwards parsing +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + -- Test backwards parsing + ^ +<sql-statement> +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); + ^ +<sql-statement> +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); + ^ +<sql-statement> +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + ^ +<sql-statement> +CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>'); + ^ +<sql-statement> +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); + ^ +<sql-statement> +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes); + ^ +<sql-statement> +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); + ^ +<sql-statement> +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); + ^ +<sql-statement> +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:41: Error: Unknown cluster: information_schema + SELECT table_name, view_definition FROM information_schema.views + ^ +<sql-statement> +-- Text XPath expressions evaluation +SELECT xpath('/value', data) FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- Text XPath expressions evaluation + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT xpath('/value', data) FROM xmltest; + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,xml) + SELECT xpath('/value', data) FROM xmltest; + ^ +<sql-statement> +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:26: Error: At function: ToPg, At function: Not, At function: Exists + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ +<sql-statement> +SELECT xpath('', '<!-- error -->'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('', '<!-- error -->'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('', '<!-- error -->'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('', '<!-- error -->'); + ^ +<sql-statement> +SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ +<sql-statement> +SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1" xmlns="http://127.0.0.2"><local:piece id="1"><internal>number one</internal><internal2/></local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ +<sql-statement> +SELECT xpath('//text()', '<root><</root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//text()', '<root><</root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//text()', '<root><</root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//text()', '<root><</root>'); + ^ +<sql-statement> +SELECT xpath('//@value', '<root value="<"/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//@value', '<root value="<"/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//@value', '<root value="<"/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//@value', '<root value="<"/>'); + ^ +<sql-statement> +SELECT xpath('''<<invalid>>''', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ +<sql-statement> +SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('/nosuchtag', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('/nosuchtag', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('/nosuchtag', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/nosuchtag', '<root/>'); + ^ +<sql-statement> +SELECT xpath('root', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('root', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('root', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('root', '<root/>'); + ^ +<sql-statement> +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := '<?xml version="1.0" encoding="ISO-8859-1"?>'; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '<x>' || degree_symbol || '</x>')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 263 + -- Round-trip non-ASCII data through xpath(). + ^ +<sql-statement> +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'); +</sql-statement> +<sql-statement> +SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'); +</sql-statement> +<sql-statement> +SELECT xmlexists('count(/nosuchtag)' PASSING BY REF '<root/>'); +</sql-statement> +<sql-statement> +SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ +<sql-statement> +SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ +<sql-statement> +SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ +<sql-statement> +INSERT INTO xmltest VALUES (4, '<menu><beers><name>Budvar</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (5, '<menu><beers><name>Molson</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (6, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Budvar</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (7, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Molson</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +CREATE TABLE query ( expr TEXT ); +</sql-statement> +<sql-statement> +INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); +</sql-statement> +<sql-statement> +-- Test xml_is_well_formed and variants +SELECT xml_is_well_formed_document('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_document('abc'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_content('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_content('abc'); +</sql-statement> +<sql-statement> +SET xmloption TO DOCUMENT; +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('abc'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<abc/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo>bar</foo'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo><bar>baz</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<invalidentity>&</abc>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<undefinedentity>&idontexist;</abc>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<invalidns xmlns=''<''/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<relativens xmlns=''relative''/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +<sql-statement> +SET xmloption TO CONTENT; +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('abc'); +</sql-statement> +<sql-statement> +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- <invalidns xmlns='<'/> +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:11:1: Error: ERROR: syntax error at or near "\" + + \set VERBOSITY terse + ^ +<sql-statement> +SELECT xpath('/*', '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +\set VERBOSITY default +</sql-statement> +Metacommand \set VERBOSITY default is not supported +<sql-statement> +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- Again, the XML isn't well-formed for namespace purposes + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT xpath('/*', '<nosuchprefix:tag/>'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<nosuchprefix:tag/>'); + ^ +<sql-statement> +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- XPath deprecates relative namespaces, but they're not supposed to + ^ + -stdin-:<main>:3:8: Error: At function: PgCall + SELECT xpath('/*', '<relativens xmlns=''relative''/>'); + ^ + -stdin-:<main>:3:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/passwd">]><foo>&c;</foo>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- External entity references should not leak filesystem information. + ^ +<sql-statement> +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>'); + ^ +<sql-statement> +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"><chapter> </chapter>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- This might or might not load the requested DTD, but it mustn't throw error. + ^ +<sql-statement> +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +</sql-statement> +<sql-statement> +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="1"> + <COUNTRY_ID>AU</COUNTRY_ID> + <COUNTRY_NAME>Australia</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="2"> + <COUNTRY_ID>CN</COUNTRY_ID> + <COUNTRY_NAME>China</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="3"> + <COUNTRY_ID>HK</COUNTRY_ID> + <COUNTRY_NAME>HongKong</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="4"> + <COUNTRY_ID>IN</COUNTRY_ID> + <COUNTRY_NAME>India</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="5"> + <COUNTRY_ID>JP</COUNTRY_ID> + <COUNTRY_NAME>Japan</COUNTRY_NAME> + <REGION_ID>3</REGION_ID><PREMIER_NAME>Sinzo Abe</PREMIER_NAME> +</ROW> +<ROW id="6"> + <COUNTRY_ID>SG</COUNTRY_ID> + <COUNTRY_NAME>Singapore</COUNTRY_NAME> + <REGION_ID>3</REGION_ID><SIZE unit="km">791</SIZE> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.xmltableview1 + +<sql-statement> +\sv xmltableview1 +</sql-statement> +Metacommand \sv xmltableview1 is not supported +<sql-statement> +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; + ^ +<sql-statement> +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + ^ +<sql-statement> +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- errors + ^ +<sql-statement> +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'zz:a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'zz:a'); + ^ +<sql-statement> +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'zz:a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'zz:a'); + ^ +<sql-statement> +SELECT * FROM xmltableview2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.xmltableview2 + +<sql-statement> +SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), + '/rows/row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'a'); + ^ +<sql-statement> +SELECT * FROM XMLTABLE('.' + PASSING '<foo/>' + COLUMNS a text PATH 'foo/namespace::node()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:39: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a text PATH 'foo/namespace::node()'); + ^ +<sql-statement> +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:7:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +EXECUTE pp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE pp; + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + ^ +<sql-statement> +SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text); + ^ +<sql-statement> +SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text PATH 'element/text()'); -- should fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:154: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text PATH 'element/text()'); -- should fail + ^ +<sql-statement> +-- CDATA test +select * from xmltable('d/r' passing '<d><r><c><![CDATA[<hello> &"<>!<a>foo</a>]]></c></r><r><c>2</c></r></d>' columns c text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- CDATA test + ^ +<sql-statement> +-- XML builtin entities +SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- XML builtin entities + ^ +<sql-statement> +SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent xml); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent xml); + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- test qual + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (VERBOSE, COSTS OFF) + ^ +<sql-statement> +-- should to work with more data +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="10"> + <COUNTRY_ID>CZ</COUNTRY_ID> + <COUNTRY_NAME>Czech Republic</COUNTRY_NAME> + <REGION_ID>2</REGION_ID><PREMIER_NAME>Milos Zeman</PREMIER_NAME> +</ROW> +<ROW id="11"> + <COUNTRY_ID>DE</COUNTRY_ID> + <COUNTRY_NAME>Germany</COUNTRY_NAME> + <REGION_ID>2</REGION_ID> +</ROW> +<ROW id="12"> + <COUNTRY_ID>FR</COUNTRY_ID> + <COUNTRY_NAME>France</COUNTRY_NAME> + <REGION_ID>2</REGION_ID> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="20"> + <COUNTRY_ID>EG</COUNTRY_ID> + <COUNTRY_NAME>Egypt</COUNTRY_NAME> + <REGION_ID>1</REGION_ID> +</ROW> +<ROW id="21"> + <COUNTRY_ID>SD</COUNTRY_ID> + <COUNTRY_NAME>Sudan</COUNTRY_NAME> + <REGION_ID>1</REGION_ID> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:8:4: Error: alternative is not implemented yet : 143 + y AS (SELECT xmlelement(name proc, + ^ +<sql-statement> +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:7:4: Error: alternative is not implemented yet : 143 + y AS (SELECT xmlelement(name data, + ^ +<sql-statement> +CREATE TABLE xmltest2(x xml, _path text); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><ac>1</ac></r></d>', 'A'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><bc>2</bc></r></d>', 'B'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><cc>3</cc></r></d>', 'C'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><dc>2</dc></r></d>', 'D'); +</sql-statement> +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:83: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:109: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:109: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + ^ +<sql-statement> +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING '<a>a</a>' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:61: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('*' PASSING '<a>a</a>' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); + ^ +<sql-statement> +\x +</sql-statement> +Metacommand \x is not supported +<sql-statement> +SELECT * FROM XMLTABLE('*' PASSING '<e>pre<!--c1--><?pi arg?><![CDATA[&ent1]]><n2>&deep</n2>post</e>' COLUMNS x xml PATH 'node()', y xml PATH '/'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:122: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('*' PASSING '<e>pre<!--c1--><?pi arg?><![CDATA[&ent1]]><n2>&deep</n2>post</e>' COLUMNS x xml PATH 'node()', y xml PATH '/'); + ^ +<sql-statement> +\x +</sql-statement> +Metacommand \x is not supported +<sql-statement> +SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '"<foo/>"', b xml PATH '"<foo/>"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:78: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '"<foo/>"', b xml PATH '"<foo/>"'); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/xml.err.2 b/ydb/library/yql/tests/postgresql/cases/xml.err.2 index 8e39a77712..7ac69d2213 100644 --- a/ydb/library/yql/tests/postgresql/cases/xml.err.2 +++ b/ydb/library/yql/tests/postgresql/cases/xml.err.2 @@ -16,17 +16,2023 @@ INSERT INTO xmltest VALUES (3, '<wrong'); <sql-statement> SELECT * FROM xmltest; </sql-statement> -BackTrace(void**, unsigned long)+29 (0x14033ECD) -TBackTrace::Capture()+30 (0x1403443E) -TWithBackTrace<yexception>::TWithBackTrace<>()+72 (0x13FD0568) -NYT::TNode::TTypeError::TTypeError()+25 (0x144DC3E9) -NYT::TNode::CheckType(NYT::TNode::EType) const+267 (0x144DD9BB) -NYT::TNode::AsString() const+30 (0x144DC53E) -WriteTableToStream(IOutputStream&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&, TVector<NYT::TNode, std::__y1::allocator<NYT::TNode> > const&)+830 (0x13EBBB7E) -Main(int, char**)+5748 (0x13EC0FB4) -main+273 (0x13EC2761) -??+0 (0x7F12BF829D90) -__libc_start_main+128 (0x7F12BF829E40) -??+0 (0x13E4C029) - -(NYT::TNode::TTypeError) library/cpp/yson/node/node.cpp:829: TNode type string_node expected, actual type null +<sql-statement> +SELECT xmlcomment('test'); +</sql-statement> +<sql-statement> +SELECT xmlcomment('-test'); +</sql-statement> +<sql-statement> +SELECT xmlcomment('test-'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xmlcomment('test-'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML comment + + SELECT xmlcomment('test-'); + ^ +<sql-statement> +SELECT xmlcomment('--test'); +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xmlcomment('--test'); + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML comment + + SELECT xmlcomment('--test'); + ^ +<sql-statement> +SELECT xmlcomment('te st'); +</sql-statement> +<sql-statement> +SELECT xmlconcat(xmlcomment('hello'), + xmlelement(NAME qux, 'foo'), + xmlcomment('world')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(xmlcomment('hello'), + ^ +<sql-statement> +SELECT xmlconcat('hello', 'you'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('hello', 'you'); + ^ +<sql-statement> +SELECT xmlconcat(1, 2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(1, 2); + ^ +<sql-statement> +SELECT xmlconcat('bad', '<syntax'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('bad', '<syntax'); + ^ +<sql-statement> +SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); + ^ +<sql-statement> +SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); + ^ +<sql-statement> +SELECT xmlconcat(NULL); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(NULL); + ^ +<sql-statement> +SELECT xmlconcat(NULL, NULL); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlconcat(NULL, NULL); + ^ +<sql-statement> +SELECT xmlelement(name element, + xmlattributes (1 as one, 'deuce' as two), + 'content'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, + ^ +<sql-statement> +SELECT xmlelement(name element, + xmlattributes ('unnamed and wrong')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, + ^ +<sql-statement> +SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); + ^ +<sql-statement> +SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + ^ +<sql-statement> +SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); + ^ +<sql-statement> +SELECT xmlelement(name num, 37); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name num, 37); + ^ +<sql-statement> +SELECT xmlelement(name foo, text 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, text 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xml 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xml 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, text 'b<a/>r'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, text 'b<a/>r'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xml 'b<a/>r'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xml 'b<a/>r'); + ^ +<sql-statement> +SELECT xmlelement(name foo, array[1, 2, 3]); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, array[1, 2, 3]); + ^ +<sql-statement> +SET xmlbinary TO base64; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: xmlbinary + SET xmlbinary TO base64; + ^ +<sql-statement> +SELECT xmlelement(name foo, bytea 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, bytea 'bar'); + ^ +<sql-statement> +SET xmlbinary TO hex; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: VariableSetStmt, not supported name: xmlbinary + SET xmlbinary TO hex; + ^ +<sql-statement> +SELECT xmlelement(name foo, bytea 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, bytea 'bar'); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes(true as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes(true as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); + ^ +<sql-statement> +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier)); + ^ +<sql-statement> +SELECT xmlparse(content ''); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content ''); + ^ +<sql-statement> +SELECT xmlparse(content ' '); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content ' '); + ^ +<sql-statement> +SELECT xmlparse(content 'abc'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content 'abc'); + ^ +<sql-statement> +SELECT xmlparse(content '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<abc>x</abc>'); + ^ +<sql-statement> +SELECT xmlparse(content '<invalidentity>&</invalidentity>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<invalidentity>&</invalidentity>'); + ^ +<sql-statement> +SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>'); + ^ +<sql-statement> +SELECT xmlparse(content '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +SELECT xmlparse(content '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>'); + ^ +<sql-statement> +SELECT xmlparse(content '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(content '<nosuchprefix:tag/>'); + ^ +<sql-statement> +SELECT xmlparse(document ' '); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document ' '); + ^ +<sql-statement> +SELECT xmlparse(document 'abc'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document 'abc'); + ^ +<sql-statement> +SELECT xmlparse(document '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<abc>x</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<invalidentity>&</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<invalidentity>&</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>'); + ^ +<sql-statement> +SELECT xmlparse(document '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +SELECT xmlparse(document '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>'); + ^ +<sql-statement> +SELECT xmlparse(document '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlparse(document '<nosuchprefix:tag/>'); + ^ +<sql-statement> +SELECT xmlpi(name foo); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo); + ^ +<sql-statement> +SELECT xmlpi(name xml); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xml); + ^ +<sql-statement> +SELECT xmlpi(name xmlstuff); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xmlstuff); + ^ +<sql-statement> +SELECT xmlpi(name foo, 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, 'bar'); + ^ +<sql-statement> +SELECT xmlpi(name foo, 'in?>valid'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, 'in?>valid'); + ^ +<sql-statement> +SELECT xmlpi(name foo, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, null); + ^ +<sql-statement> +SELECT xmlpi(name xml, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xml, null); + ^ +<sql-statement> +SELECT xmlpi(name xmlstuff, null); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name xmlstuff, null); + ^ +<sql-statement> +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); + ^ +<sql-statement> +SELECT xmlpi(name foo, ' bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name foo, ' bar'); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version no value, standalone no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version no value, standalone no value); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version '2.0'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version '2.0'); + ^ +<sql-statement> +SELECT xmlroot(xml '<foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<foo/>', version no value, standalone yes); + ^ +<sql-statement> +SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes); + ^ +<sql-statement> +SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value); + ^ +<sql-statement> +SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value); + ^ +<sql-statement> +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlroot ( + ^ +<sql-statement> +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(content data as character varying(20)) FROM xmltest; + ^ +<sql-statement> +SELECT xmlserialize(content 'good' as char(10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(content 'good' as char(10)); + ^ +<sql-statement> +SELECT xmlserialize(document 'bad' as text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 393 + SELECT xmlserialize(document 'bad' as text); + ^ +<sql-statement> +SELECT xml '<foo>bar</foo>' IS DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xml '<foo>bar</foo>' IS DOCUMENT; + ^ +<sql-statement> +SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; + ^ +<sql-statement> +SELECT xml '<abc/>' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:21: Error: alternative is not implemented yet : 143 + SELECT xml '<abc/>' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT xml 'abc' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:18: Error: alternative is not implemented yet : 143 + SELECT xml 'abc' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT '<>' IS NOT DOCUMENT; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:13: Error: alternative is not implemented yet : 143 + SELECT '<>' IS NOT DOCUMENT; + ^ +<sql-statement> +SELECT xmlagg(data) FROM xmltest; +</sql-statement> +<sql-statement> +SELECT xmlagg(data) FROM xmltest WHERE id > 10; +</sql-statement> +<sql-statement> +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; + ^ +<sql-statement> +-- Check mapping SQL identifier to XML name +SELECT xmlpi(name ":::_xml_abc135.%-&_"); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- Check mapping SQL identifier to XML name + ^ +<sql-statement> +SELECT xmlpi(name "123"); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT xmlpi(name "123"); + ^ +<sql-statement> +PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 301 + PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1); + ^ +<sql-statement> +SET XML OPTION DOCUMENT; +</sql-statement> +<sql-statement> +EXECUTE foo ('<bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('<bar/>'); + ^ +<sql-statement> +EXECUTE foo ('bad'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('bad'); + ^ +<sql-statement> +SELECT xml '<!DOCTYPE a><a/><b/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!DOCTYPE a><a/><b/> + ^ + + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ +<sql-statement> +SET XML OPTION CONTENT; +</sql-statement> +<sql-statement> +EXECUTE foo ('<bar/>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('<bar/>'); + ^ +<sql-statement> +EXECUTE foo ('good'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE foo ('good'); + ^ +<sql-statement> +SELECT xml '<!-- in SQL:2006+ a doc is content too--> <?y z?> <!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<?xml version="1.0"?> <!-- hi--> <!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<!DOCTYPE a><a/>'; +</sql-statement> +<sql-statement> +SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found + <!-- hi--> oops <!DOCTYPE a><a/> + ^ + + SELECT xml '<!-- hi--> oops <!DOCTYPE a><a/>'; + ^ +<sql-statement> +SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!-- hi--> <oops/> <!DOCTYPE a><a/> + ^ + + SELECT xml '<!-- hi--> <oops/> <!DOCTYPE a><a/>'; + ^ +<sql-statement> +SELECT xml '<!DOCTYPE a><a/><b/>'; +</sql-statement> +-stdin-:<main>: Fatal: Execution + + -stdin-:<main>:1:1: Fatal: Execution of node: Result + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ + -stdin-:<main>:1:1: Fatal: ERROR: invalid XML document +DETAIL: line 1: Extra content at the end of the document + <!DOCTYPE a><a/><b/> + ^ + + SELECT xml '<!DOCTYPE a><a/><b/>'; + ^ +<sql-statement> +-- Test backwards parsing +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + -- Test backwards parsing + ^ +<sql-statement> +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); + ^ +<sql-statement> +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); + ^ +<sql-statement> +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + ^ +<sql-statement> +CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>'); + ^ +<sql-statement> +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); + ^ +<sql-statement> +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes); + ^ +<sql-statement> +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); + ^ +<sql-statement> +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: expected at least one target column + CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); + ^ +<sql-statement> +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:41: Error: Unknown cluster: information_schema + SELECT table_name, view_definition FROM information_schema.views + ^ +<sql-statement> +-- Text XPath expressions evaluation +SELECT xpath('/value', data) FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- Text XPath expressions evaluation + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT xpath('/value', data) FROM xmltest; + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,xml) + SELECT xpath('/value', data) FROM xmltest; + ^ +<sql-statement> +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:26: Error: At function: ToPg, At function: Not, At function: Exists + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ^ +<sql-statement> +SELECT xpath('', '<!-- error -->'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('', '<!-- error -->'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('', '<!-- error -->'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('', '<!-- error -->'); + ^ +<sql-statement> +SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); + ^ +<sql-statement> +SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1" xmlns="http://127.0.0.2"><local:piece id="1"><internal>number one</internal><internal2/></local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +</sql-statement> +<sql-statement> +SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'); + ^ +<sql-statement> +SELECT xpath('//text()', '<root><</root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//text()', '<root><</root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//text()', '<root><</root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//text()', '<root><</root>'); + ^ +<sql-statement> +SELECT xpath('//@value', '<root value="<"/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('//@value', '<root value="<"/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('//@value', '<root value="<"/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('//@value', '<root value="<"/>'); + ^ +<sql-statement> +SELECT xpath('''<<invalid>>''', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('''<<invalid>>''', '<root/>'); + ^ +<sql-statement> +SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('name(/*)', '<root><sub/><sub/></root>'); + ^ +<sql-statement> +SELECT xpath('/nosuchtag', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('/nosuchtag', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('/nosuchtag', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/nosuchtag', '<root/>'); + ^ +<sql-statement> +SELECT xpath('root', '<root/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('root', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('root', '<root/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('root', '<root/>'); + ^ +<sql-statement> +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := '<?xml version="1.0" encoding="ISO-8859-1"?>'; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '<x>' || degree_symbol || '</x>')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 263 + -- Round-trip non-ASCII data through xpath(). + ^ +<sql-statement> +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'); +</sql-statement> +<sql-statement> +SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'); +</sql-statement> +<sql-statement> +SELECT xmlexists('count(/nosuchtag)' PASSING BY REF '<root/>'); +</sql-statement> +<sql-statement> +SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ +<sql-statement> +SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml); + ^ +<sql-statement> +SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml); + ^ +<sql-statement> +INSERT INTO xmltest VALUES (4, '<menu><beers><name>Budvar</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (5, '<menu><beers><name>Molson</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (6, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Budvar</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml); +</sql-statement> +<sql-statement> +INSERT INTO xmltest VALUES (7, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Molson</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>: Error: At function: PgSetItem + + -stdin-:<main>:1:1: Error: At function: PgWhere + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>:1:37: Error: At function: PgCall + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ + -stdin-:<main>:1:37: Error: Unable to find an overload for proc xpath_exists with given argument types: (unknown,xml) + SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + ^ +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); +</sql-statement> +<sql-statement> +CREATE TABLE query ( expr TEXT ); +</sql-statement> +<sql-statement> +INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); +</sql-statement> +<sql-statement> +SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); +</sql-statement> +<sql-statement> +-- Test xml_is_well_formed and variants +SELECT xml_is_well_formed_document('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_document('abc'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_content('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed_content('abc'); +</sql-statement> +<sql-statement> +SET xmloption TO DOCUMENT; +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('abc'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<abc/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo>bar</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo>bar</foo'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<foo><bar>baz</foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<invalidentity>&</abc>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<undefinedentity>&idontexist;</abc>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<invalidns xmlns=''<''/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<relativens xmlns=''relative''/>'); +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('<twoerrors>&idontexist;</unbalanced>'); +</sql-statement> +<sql-statement> +SET xmloption TO CONTENT; +</sql-statement> +<sql-statement> +SELECT xml_is_well_formed('abc'); +</sql-statement> +<sql-statement> +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- <invalidns xmlns='<'/> +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:11:1: Error: ERROR: syntax error at or near "\" + + \set VERBOSITY terse + ^ +<sql-statement> +SELECT xpath('/*', '<invalidns xmlns=''<''/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ + -stdin-:<main>:1:8: Error: At function: PgCall + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ + -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<invalidns xmlns=''<''/>'); + ^ +<sql-statement> +\set VERBOSITY default +</sql-statement> +Metacommand \set VERBOSITY default is not supported +<sql-statement> +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', '<nosuchprefix:tag/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- Again, the XML isn't well-formed for namespace purposes + ^ + -stdin-:<main>:2:8: Error: At function: PgCall + SELECT xpath('/*', '<nosuchprefix:tag/>'); + ^ + -stdin-:<main>:2:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<nosuchprefix:tag/>'); + ^ +<sql-statement> +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', '<relativens xmlns=''relative''/>'); +</sql-statement> +-stdin-:<main>: Error: Type annotation + + -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem + -- XPath deprecates relative namespaces, but they're not supposed to + ^ + -stdin-:<main>:3:8: Error: At function: PgCall + SELECT xpath('/*', '<relativens xmlns=''relative''/>'); + ^ + -stdin-:<main>:3:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown) + SELECT xpath('/*', '<relativens xmlns=''relative''/>'); + ^ +<sql-statement> +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/passwd">]><foo>&c;</foo>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- External entity references should not leak filesystem information. + ^ +<sql-statement> +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>'); + ^ +<sql-statement> +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT '<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"><chapter> </chapter>'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143 + -- This might or might not load the requested DTD, but it mustn't throw error. + ^ +<sql-statement> +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +</sql-statement> +<sql-statement> +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="1"> + <COUNTRY_ID>AU</COUNTRY_ID> + <COUNTRY_NAME>Australia</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="2"> + <COUNTRY_ID>CN</COUNTRY_ID> + <COUNTRY_NAME>China</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="3"> + <COUNTRY_ID>HK</COUNTRY_ID> + <COUNTRY_NAME>HongKong</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="4"> + <COUNTRY_ID>IN</COUNTRY_ID> + <COUNTRY_NAME>India</COUNTRY_NAME> + <REGION_ID>3</REGION_ID> +</ROW> +<ROW id="5"> + <COUNTRY_ID>JP</COUNTRY_ID> + <COUNTRY_NAME>Japan</COUNTRY_NAME> + <REGION_ID>3</REGION_ID><PREMIER_NAME>Sinzo Abe</PREMIER_NAME> +</ROW> +<ROW id="6"> + <COUNTRY_ID>SG</COUNTRY_ID> + <COUNTRY_NAME>Singapore</COUNTRY_NAME> + <REGION_ID>3</REGION_ID><SIZE unit="km">791</SIZE> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.xmltableview1 + +<sql-statement> +\sv xmltableview1 +</sql-statement> +Metacommand \sv xmltableview1 is not supported +<sql-statement> +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; + ^ +<sql-statement> +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + ^ +<sql-statement> +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- errors + ^ +<sql-statement> +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'zz:a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'zz:a'); + ^ +<sql-statement> +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'zz:a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'zz:a'); + ^ +<sql-statement> +SELECT * FROM xmltableview2; +</sql-statement> +-stdin-:<main>: Fatal: Table metadata loading + + -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.xmltableview2 + +<sql-statement> +SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), + '/rows/row' + PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>' + COLUMNS a int PATH 'a'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:4:37: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a int PATH 'a'); + ^ +<sql-statement> +SELECT * FROM XMLTABLE('.' + PASSING '<foo/>' + COLUMNS a text PATH 'foo/namespace::node()'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:3:39: Error: ERROR: unrecognized column option "PATH" + + COLUMNS a text PATH 'foo/namespace::node()'); + ^ +<sql-statement> +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:7:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +EXECUTE pp; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 302 + EXECUTE pp; + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:137: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + ^ +<sql-statement> +SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text); + ^ +<sql-statement> +SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text PATH 'element/text()'); -- should fail +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:154: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM xmltable('/root' passing '<root><element>a1a<!-- aaaa -->a2a<?aaaaa?> <!--z--> bbbb<x>xxx</x>cccc</element></root>' COLUMNS element text PATH 'element/text()'); -- should fail + ^ +<sql-statement> +-- CDATA test +select * from xmltable('d/r' passing '<d><r><c><![CDATA[<hello> &"<>!<a>foo</a>]]></c></r><r><c>2</c></r></d>' columns c text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- CDATA test + ^ +<sql-statement> +-- XML builtin entities +SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent text); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- XML builtin entities + ^ +<sql-statement> +SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent xml); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + SELECT * FROM xmltable('/x/a' PASSING '<x><a><ent>'</ent></a><a><ent>"</ent></a><a><ent>&</ent></a><a><ent><</ent></a><a><ent>></ent></a></x>' COLUMNS ent xml); + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: SelectStmt: alternative is not implemented yet : 371 + -- test qual + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276 + EXPLAIN (VERBOSE, COSTS OFF) + ^ +<sql-statement> +-- should to work with more data +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="10"> + <COUNTRY_ID>CZ</COUNTRY_ID> + <COUNTRY_NAME>Czech Republic</COUNTRY_NAME> + <REGION_ID>2</REGION_ID><PREMIER_NAME>Milos Zeman</PREMIER_NAME> +</ROW> +<ROW id="11"> + <COUNTRY_ID>DE</COUNTRY_ID> + <COUNTRY_NAME>Germany</COUNTRY_NAME> + <REGION_ID>2</REGION_ID> +</ROW> +<ROW id="12"> + <COUNTRY_ID>FR</COUNTRY_ID> + <COUNTRY_NAME>France</COUNTRY_NAME> + <REGION_ID>2</REGION_ID> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +INSERT INTO xmldata VALUES('<ROWS> +<ROW id="20"> + <COUNTRY_ID>EG</COUNTRY_ID> + <COUNTRY_NAME>Egypt</COUNTRY_NAME> + <REGION_ID>1</REGION_ID> +</ROW> +<ROW id="21"> + <COUNTRY_ID>SD</COUNTRY_ID> + <COUNTRY_NAME>Sudan</COUNTRY_NAME> + <REGION_ID>1</REGION_ID> +</ROW> +</ROWS>'); +</sql-statement> +<sql-statement> +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:5:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:6:41: Error: ERROR: unrecognized column option "PATH" + + COLUMNS id int PATH '@id', + ^ +<sql-statement> +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:8:4: Error: alternative is not implemented yet : 143 + y AS (SELECT xmlelement(name proc, + ^ +<sql-statement> +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:7:4: Error: alternative is not implemented yet : 143 + y AS (SELECT xmlelement(name data, + ^ +<sql-statement> +CREATE TABLE xmltest2(x xml, _path text); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><ac>1</ac></r></d>', 'A'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><bc>2</bc></r></d>', 'B'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><cc>3</cc></r></d>', 'C'); +</sql-statement> +<sql-statement> +INSERT INTO xmltest2 VALUES('<d><r><dc>2</dc></r></d>', 'D'); +</sql-statement> +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:83: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:109: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); + ^ +<sql-statement> +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:109: Error: ERROR: unrecognized column option "PATH" + + SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + ^ +<sql-statement> +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING '<a>a</a>' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:2:61: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('*' PASSING '<a>a</a>' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); + ^ +<sql-statement> +\x +</sql-statement> +Metacommand \x is not supported +<sql-statement> +SELECT * FROM XMLTABLE('*' PASSING '<e>pre<!--c1--><?pi arg?><![CDATA[&ent1]]><n2>&deep</n2>post</e>' COLUMNS x xml PATH 'node()', y xml PATH '/'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:122: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('*' PASSING '<e>pre<!--c1--><?pi arg?><![CDATA[&ent1]]><n2>&deep</n2>post</e>' COLUMNS x xml PATH 'node()', y xml PATH '/'); + ^ +<sql-statement> +\x +</sql-statement> +Metacommand \x is not supported +<sql-statement> +SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '"<foo/>"', b xml PATH '"<foo/>"'); +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:78: Error: ERROR: unrecognized column option "PATH" + + SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '"<foo/>"', b xml PATH '"<foo/>"'); + ^ diff --git a/ydb/library/yql/tests/postgresql/cases/xml.out b/ydb/library/yql/tests/postgresql/cases/xml.out index ab0012d138..354ba54f58 100644 --- a/ydb/library/yql/tests/postgresql/cases/xml.out +++ b/ydb/library/yql/tests/postgresql/cases/xml.out @@ -4,3 +4,57 @@ CREATE TABLE xmltest ( ); INSERT INTO xmltest VALUES (1, '<value>one</value>'); INSERT INTO xmltest VALUES (2, '<value>two</value>'); +SELECT xmlcomment('test'); + xmlcomment +------------- + <!--test--> +(1 row) + +SELECT xmlcomment('-test'); + xmlcomment +-------------- + <!---test--> +(1 row) + +SELECT xmlcomment('test-'); +ERROR: invalid XML comment +SELECT xmlcomment('--test'); +ERROR: invalid XML comment +SELECT xmlcomment('te st'); + xmlcomment +-------------- + <!--te st--> +(1 row) + +SELECT xmlagg(data) FROM xmltest WHERE id > 10; + xmlagg +-------- + +(1 row) + +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; +SELECT xml '<!-- in SQL:2006+ a doc is content too--> <?y z?> <!DOCTYPE a><a/>'; + xml +-------------------------------------------------------------------- + <!-- in SQL:2006+ a doc is content too--> <?y z?> <!DOCTYPE a><a/> +(1 row) + +SELECT xml '<?xml version="1.0"?> <!-- hi--> <!DOCTYPE a><a/>'; + xml +------------------------------ + <!-- hi--> <!DOCTYPE a><a/> +(1 row) + +SELECT xml '<!DOCTYPE a><a/>'; + xml +------------------ + <!DOCTYPE a><a/> +(1 row) + +SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------- + {1,2} +(1 row) + diff --git a/ydb/library/yql/tests/postgresql/cases/xml.sql b/ydb/library/yql/tests/postgresql/cases/xml.sql index ab0012d138..8a458b87b6 100644 --- a/ydb/library/yql/tests/postgresql/cases/xml.sql +++ b/ydb/library/yql/tests/postgresql/cases/xml.sql @@ -4,3 +4,15 @@ CREATE TABLE xmltest ( ); INSERT INTO xmltest VALUES (1, '<value>one</value>'); INSERT INTO xmltest VALUES (2, '<value>two</value>'); +SELECT xmlcomment('test'); +SELECT xmlcomment('-test'); +SELECT xmlcomment('test-'); +SELECT xmlcomment('--test'); +SELECT xmlcomment('te st'); +SELECT xmlagg(data) FROM xmltest WHERE id > 10; +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; +SELECT xml '<!-- in SQL:2006+ a doc is content too--> <?y z?> <!DOCTYPE a><a/>'; +SELECT xml '<?xml version="1.0"?> <!-- hi--> <!DOCTYPE a><a/>'; +SELECT xml '<!DOCTYPE a><a/>'; +SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); diff --git a/ydb/library/yql/tests/postgresql/pg_tests.csv b/ydb/library/yql/tests/postgresql/pg_tests.csv index 37520932cb..b363fc4fa6 100644 --- a/ydb/library/yql/tests/postgresql/pg_tests.csv +++ b/ydb/library/yql/tests/postgresql/pg_tests.csv @@ -1,54 +1,54 @@ testcase,statements,successful,ratio
comments,7,7,100.0
-expressions,63,14,22.22
functional_deps,40,6,15.0
+expressions,63,14,22.22
dbsize,24,24,100.0
-create_table,368,47,12.77
-alter_table,1679,4,0.24
+create_table,368,43,11.68
create_misc,76,3,3.95
-aggregates,416,1,0.24
+alter_table,1679,11,0.66
+insert,357,15,4.2
json_encoding,42,42,100.0
-jsonb_jsonpath,427,5,1.17
-insert,357,2,0.56
-bit,115,4,3.48
-limit,84,5,5.95
jsonpath_encoding,31,31,100.0
-numerology,24,8,33.33
horology,306,79,25.82
-select_distinct,46,1,2.17
+limit,84,5,5.95
+jsonb_jsonpath,427,88,20.61
+numerology,24,8,33.33
jsonpath,169,152,89.94
+delete,10,0,0.0
+select_distinct,46,1,2.17
select_distinct_on,4,0,0.0
-select,88,4,4.55
-arrays,410,1,0.24
-case,63,13,20.63
+date,264,200,75.76
+case,63,29,46.03
+name,40,22,55.0
select_into,67,3,4.48
strings,390,31,7.95
-int8,142,13,9.15
-date,264,17,6.44
-text,76,5,6.58
-delete,10,0,0.0
-truncate,193,3,1.55
-unicode,13,4,30.77
-time,39,11,28.21
-subselect,234,2,0.85
-boolean,93,64,68.82
-update,288,4,1.39
-join,591,23,3.89
-name,40,22,55.0
-timetz,45,13,28.89
-union,186,0,0.0
oid,27,21,77.78
-xml,234,3,1.28
-interval,168,115,68.45
-json,454,51,11.23
+text,76,15,19.74
+select,88,9,10.23
float4,96,48,50.0
-window,298,2,0.67
+interval,168,115,68.45
+subselect,234,2,0.85
+boolean,93,67,72.04
+unicode,13,4,30.77
+time,39,33,84.62
int2,49,47,95.92
-float8,168,96,57.14
-jsonb,1017,50,4.92
+bit,115,84,73.04
+union,186,0,0.0
int4,70,70,100.0
-select_implicit,44,11,25.0
-timestamp,145,81,55.86
-timestamptz,315,83,26.35
-select_having,23,11,47.83
-numeric,915,526,57.49
+float8,168,96,57.14
+timetz,45,29,64.44
+update,288,22,7.64
+json,454,115,25.33
+truncate,193,33,17.1
+arrays,410,119,29.02
+window,298,5,1.68
+aggregates,416,51,12.26
+jsonb,1017,381,37.46
+timestamp,145,98,67.59
+int8,142,48,33.8
+timestamptz,315,108,34.29
+xml,234,15,6.41
+select_having,23,16,69.57
+join,591,106,17.94
+select_implicit,44,13,29.55
+numeric,915,715,78.14
diff --git a/ydb/library/yql/tests/postgresql/status.md b/ydb/library/yql/tests/postgresql/status.md index 5603c33126..8da5ecf2d5 100644 --- a/ydb/library/yql/tests/postgresql/status.md +++ b/ydb/library/yql/tests/postgresql/status.md @@ -2,60 +2,60 @@ #| ||№ п/п | Имя теста|Число операторов| Из них выполняется| % выполнения | Последнее обновление | Основные проблемы || -|| 1 | boolean | 93 | 64 (+1) | 68.82 | 29.09.2023 | DROP TABLE, implicit casts, \pset (null) || +|| 1 | boolean | 93 | 67 (+3) | 72.04 | 12.12.2023 | DROP TABLE, implicit casts, \pset (null) || || 2 | char | 25 | 3 | 12.0 | 25.05.2023 | implicit cast, pgbpchar vs pgtext || || 3 | name | 40 | 22 (+17) | 55.0 | 29.09.2023 | parse_ident, implicit casts || || 4 | varchar | 24 | 2 | 8.33 | 25.05.2023 | || -|| 5 | text | 76 | 5 | 6.58 | 25.05.2023 | строковые функции (format, concat, concat_ws, length) и оператор конкатенации, implicit casts, отличаются сообщения об ошибках для оператора конкатенации с аргументами неподходящих типов || +|| 5 | text | 76 | 15 (+10) | 19.74 | 12.12.2023 | строковые функции (format, concat, concat_ws, length) и оператор конкатенации, implicit casts, отличаются сообщения об ошибках для оператора конкатенации с аргументами неподходящих типов || || 6 | int2 | 49 | 47 (+39) | 95.92 | 29.09.2023 | || || 7 | int4 | 70 | 70 (+42) | 100.0 | 29.09.2023 | || -|| 8 | int8 | 142 | 13 (+7) | 9.15 | 29.09.2023 | generate_series, pg_type, gcd, implicit casts || +|| 8 | int8 | 142 | 48 (+35) | 33.8 | 12.12.2023 | generate_series, pg_type, gcd, implicit casts || || 9 | oid | 27 | 21 (+19) | 77.78 | 29.09.2023 | || || 10 | float4 | 96 | 48 (+31) | 50.0 | 29.09.2023 | CREATE TYPE, CREATE FUNCTION, WITH, форматирование NaN и Infinity, float4send || || 11 | float8 | 168 | 96 (+1) | 57.14 | 25.10.2023 | CREATE CAST, форматирование NaN и Infinity, extra_float_digits, implicit casts, float8send || -|| 12 | bit | 115 | 4 (+4) | 3.48 | 25.10.2023 | substring, COPY FROM stdin, битовые константы || -|| 13 | numeric | 915 | 526 (+23) | 57.49 | 10.08.2023 | CREATE UNIQUE INDEX, VACUUM ANALYZE, implicit casts, ошибочно проходит cast в int2 и int8, форматирование NaN и Infinity, COPY FROM stdin, SET lc_numeric, умножение больших целых чисел не дает в результате число с плавающей точкой, sum(), округление, nullif, форматирование чисел || +|| 12 | bit | 115 | 84 (+80) | 73.04 | 12.12.2023 | substring, COPY FROM stdin, битовые константы || +|| 13 | numeric | 915 | 715 (+189) | 78.14 | 12.12.2023 | CREATE UNIQUE INDEX, VACUUM ANALYZE, implicit casts, ошибочно проходит cast в int2 и int8, форматирование NaN и Infinity, COPY FROM stdin, SET lc_numeric, умножение больших целых чисел не дает в результате число с плавающей точкой, sum(), округление, nullif, форматирование чисел || || 14 | uuid | 36 | 0 | 0.0 | 02.05.2023 | ||· || 15 | strings | 390 | 31 (+3) | 7.95 | 25.08.2023 | SET, RESET, standard_conforming_strings, bytea_output, \pset, неинициализированная поддержка регулярок, pg_class || || 16 | numerology | 24 | 8 (+4) | 33.33 | 26.07.2023 | || -|| 17 | date | 264 | 17 | 6.44 | 25.05.2023 | || -|| 18 | time | 39 | 11 | 28.21 | 25.05.2023 | || -|| 19 | timetz | 45 | 13 | 28.89 | 25.05.2023 | || -|| 20 | timestamp | 145 | 81 (+3) | 55.86 | 10.08.2023 | || -|| 21 | timestamptz | 315 | 83 (+4) | 26.35 | 10.08.2023 | || +|| 17 | date | 264 | 200 (+183) | 75.76 | 12.12.2023 | || +|| 18 | time | 39 | 33 (+22) | 84.62 | 12.12.2023 | || +|| 19 | timetz | 45 | 29 (+16) | 64.44 | 12.12.2023 | || +|| 20 | timestamp | 145 | 98 (+17) | 67.59 | 12.12.2023 | || +|| 21 | timestamptz | 315 | 108 (+25) | 34.29 | 12.12.2023 | || || 22 | interval | 168 | 115 (+1) | 68.45 | 25.10.2023 | || || 23 | horology | 306 | 79 (+28) | 25.82 | 10.08.2023 | SET, DateStyle, TimeZone, автоматически назначаемые имена колонкам-выражениям, SET TIME ZOME, RESET TIME ZONE, интервальный тип ПГ, || || 24 | comments | 7 | 7 | 100.0 | 25.05.2023 | || || 25 | expressions | 63 | 14 (+4) | 22.22 | 25.10.2023 | || || 26 | unicode | 13 | 4 (+4) | 30.77 | 10.08.2023 | || -|| 27 | create_table | 368 | 47 (+1) | 12.77 | 25.10.2023 | CREATE UNLOGGED TABLE, REINDEX, PREPARE ... SELECT, DEALLOCATE, \gexec, pg_class, pg_attribute, CREATE TABLE PARTITION OF || -|| 28 | insert | 357 | 10 (+10) | 2.8 | 25.10.2023 | CREATE TEMP TABLE, ALTER TABLE, DROP TABLE, CREATE TYPE, CREATE RULE, \d+, DROP TYPE, create table...partition by range, create table ... partition of ..., tableoid::regclass, create or replace function, create operator, || +|| 27 | create_table | 368 | 43 | 11.68 | 12.12.2023 | CREATE UNLOGGED TABLE, REINDEX, PREPARE ... SELECT, DEALLOCATE, \gexec, pg_class, pg_attribute, CREATE TABLE PARTITION OF || +|| 28 | insert | 357 | 15 (+5) | 4.2 | 12.12.2023 | CREATE TEMP TABLE, ALTER TABLE, DROP TABLE, CREATE TYPE, CREATE RULE, \d+, DROP TYPE, create table...partition by range, create table ... partition of ..., tableoid::regclass, create or replace function, create operator, || || 29 | create_misc | 76 | 3 (+2) | 3.95 | 29.09.2023 | || -|| 30 | select | 88 | 4 (+4) | 4.55 | 25.10.2023 | порядок сортировки в виде ORDER BY поле using > или <, а также NULLS FIRST/LAST; ANALYZE, переменные enable_seqscan, enable_bitmapscan, enable_sort, whole-row Var referencing a subquery, подзапросы внутри values, INSERT INTO ... DEFAULT VALUES, Range sub select unsupported lateral, CREATE INDEX, DROP INDEX, explain (опции costs, analyze, timing, summary), SELECT 1 AS x ORDER BY x; CREATE FUNCTION, DROP FUNCTION, table inheritance, PARTITION BY || +|| 30 | select | 88 | 9 (+5) | 10.23 | 12.12.2023 | порядок сортировки в виде ORDER BY поле using > или <, а также NULLS FIRST/LAST; ANALYZE, переменные enable_seqscan, enable_bitmapscan, enable_sort, whole-row Var referencing a subquery, подзапросы внутри values, INSERT INTO ... DEFAULT VALUES, Range sub select unsupported lateral, CREATE INDEX, DROP INDEX, explain (опции costs, analyze, timing, summary), SELECT 1 AS x ORDER BY x; CREATE FUNCTION, DROP FUNCTION, table inheritance, PARTITION BY || || 31 | select_into | 67 | 3 | 4.48 | 27.07.2023 | || || 32 | select_distinct | 46 | 1 | 2.17 | 27.07.2023 | || || 33 | select_distinct_on | 4 | 0 | 0.0 | 25.05.2023 | || -|| 34 | select_implicit | 44 | 11 | 25.0 | 25.05.2023 | || -|| 35 | select_having | 23 | 11 | 47.83 | 25.05.2023 | || +|| 34 | select_implicit | 44 | 13 (+2) | 29.55 | 12.12.2023 | || +|| 35 | select_having | 23 | 16 (+5) | 69.57 | 12.12.2023 | || || 36 | subselect | 234 | 2 | 0.85 | 25.05.2023 | || || 37 | union | 186 | 0 | 0.0 | 25.05.2023 | || -|| 38 | case | 63 | 13 | 20.63 | 25.05.2023 | implicit casts, create function volatile || -|| 39 | join | 591 | 23 (+1) | 3.89 | 14.06.2023 | || -|| 40 | aggregates | 416 | 1 (+1) | 0.24 | 25.08.2023 | || -|| 41 | arrays | 410 | 1 | 0.24 | 29.09.2023 | || -|| 42 | update | 288 | 17 | 5.9 | 27.07.2023 | :-переменные || +|| 38 | case | 63 | 29 (+16) | 46.03 | 12.12.2023 | implicit casts, create function volatile || +|| 39 | join | 591 | 106 (+83) | 17.94 | 12.12.2023 | || +|| 40 | aggregates | 416 | 51 (+50) | 12.26 | 12.12.2023 | || +|| 41 | arrays | 410 | 119 (+118) | 29.02 | 12.12.2023 | || +|| 42 | update | 288 | 22 (+5) | 7.64 | 12.12.2023 | :-переменные || || 43 | delete | 10 | 0 | 0.0 | 25.05.2023 | || || 44 | dbsize | 24 | 24 (+16) | 100.0 | 10.08.2023 | || -|| 45 | window | 298 | 2 (+2) | 0.67 | 14.06.2023 | || -|| 46 | functional_deps | 40 | 4 (+1) | 10.0 | 29.09.2023 | || -|| 47 | json | 454 | 51 (+1) | 11.23 | 25.10.2023 | || -|| 48 | jsonb | 1017 | 50 (+1) | 4.92 | 25.10.2023 | || +|| 45 | window | 298 | 5 (+3) | 1.68 | 12.12.2023 | || +|| 46 | functional_deps | 40 | 6 (+2) | 15.0 | 12.12.2023 | || +|| 47 | json | 454 | 115 (+64) | 25.33 | 12.12.2023 | || +|| 48 | jsonb | 1017 | 381 (+331) | 37.46 | 12.12.2023 | || || 49 | json_encoding | 42 | 42 | 100.0 | 29.05.2023 | || || 50 | jsonpath | 169 | 152 | 89.94 | 29.05.2023 | числа с точкой без целой части (например .1), литерал '00' || || 51 | jsonpath_encoding | 31 | 31 | 100.0 | 29.05.2023 | || -|| 52 | jsonb_jsonpath | 427 | 5 (+5) | 1.17 | 27.07.2023 | || +|| 52 | jsonb_jsonpath | 427 | 88 (+83) | 20.61 | 12.12.2023 | || || 53 | limit | 84 | 5 (+4) | 5.95 | 10.08.2023 | || -|| 54 | truncate | 193 | 3 | 1.55 | 25.05.2023 | || -|| 55 | alter_table | 1679 | 4 (+2) | 0.24 | 25.08.2023 | COMMENT ON TABLE || -|| 56 | xml | 234 | 3 | 1.28 | 25.05.2023 | \set VERBOSITY || +|| 54 | truncate | 193 | 33 (+30) | 17.1 | 12.12.2023 | || +|| 55 | alter_table | 1679 | 11 (+7) | 0.66 | 12.12.2023 | COMMENT ON TABLE || +|| 56 | xml | 234 | 15 (+12) | 6.41 | 12.12.2023 | \set VERBOSITY || |# diff --git a/ydb/library/yql/tests/postgresql/status.old b/ydb/library/yql/tests/postgresql/status.old index e74e294ea7..5603c33126 100644 --- a/ydb/library/yql/tests/postgresql/status.old +++ b/ydb/library/yql/tests/postgresql/status.old @@ -2,38 +2,38 @@ #| ||№ п/п | Имя теста|Число операторов| Из них выполняется| % выполнения | Последнее обновление | Основные проблемы || -|| 1 | boolean | 93 | 62 | 66.67 | 29.05.2023 | DROP TABLE, implicit casts, \pset (null) || +|| 1 | boolean | 93 | 64 (+1) | 68.82 | 29.09.2023 | DROP TABLE, implicit casts, \pset (null) || || 2 | char | 25 | 3 | 12.0 | 25.05.2023 | implicit cast, pgbpchar vs pgtext || -|| 3 | name | 40 | 4 | 10.0 | 25.05.2023 | parse_ident, implicit casts || +|| 3 | name | 40 | 22 (+17) | 55.0 | 29.09.2023 | parse_ident, implicit casts || || 4 | varchar | 24 | 2 | 8.33 | 25.05.2023 | || || 5 | text | 76 | 5 | 6.58 | 25.05.2023 | строковые функции (format, concat, concat_ws, length) и оператор конкатенации, implicit casts, отличаются сообщения об ошибках для оператора конкатенации с аргументами неподходящих типов || -|| 6 | int2 | 49 | 8 | 16.33 | 26.04.2023 | || -|| 7 | int4 | 70 | 27 | 38.57 | 29.05.2023 | implicit casts || -|| 8 | int8 | 142 | 6 | 4.23 | 25.05.2023 | generate_series, pg_type, gcd, implicit casts || -|| 9 | oid | 27 | 1 | 3.7 | 25.05.2023 | || -|| 10 | float4 | 96 | 17 | 17.71 | 29.05.2023 | CREATE TYPE, CREATE FUNCTION, WITH, форматирование NaN и Infinity, float4send || -|| 11 | float8 | 168 | 49 | 29.17 | 29.05.2023 | CREATE CAST, форматирование NaN и Infinity, extra_float_digits, implicit casts, float8send || -|| 12 | bit | 115 | 13 | 11.3 | 28.04.2023 | substring, COPY FROM stdin, битовые константы || -|| 13 | numeric | 915 | 490 (+12) | 53.55 | 14.06.2023 | CREATE UNIQUE INDEX, VACUUM ANALYZE, implicit casts, ошибочно проходит cast в int2 и int8, форматирование NaN и Infinity, COPY FROM stdin, SET lc_numeric, умножение больших целых чисел не дает в результате число с плавающей точкой, sum(), округление, nullif, форматирование чисел || +|| 6 | int2 | 49 | 47 (+39) | 95.92 | 29.09.2023 | || +|| 7 | int4 | 70 | 70 (+42) | 100.0 | 29.09.2023 | || +|| 8 | int8 | 142 | 13 (+7) | 9.15 | 29.09.2023 | generate_series, pg_type, gcd, implicit casts || +|| 9 | oid | 27 | 21 (+19) | 77.78 | 29.09.2023 | || +|| 10 | float4 | 96 | 48 (+31) | 50.0 | 29.09.2023 | CREATE TYPE, CREATE FUNCTION, WITH, форматирование NaN и Infinity, float4send || +|| 11 | float8 | 168 | 96 (+1) | 57.14 | 25.10.2023 | CREATE CAST, форматирование NaN и Infinity, extra_float_digits, implicit casts, float8send || +|| 12 | bit | 115 | 4 (+4) | 3.48 | 25.10.2023 | substring, COPY FROM stdin, битовые константы || +|| 13 | numeric | 915 | 526 (+23) | 57.49 | 10.08.2023 | CREATE UNIQUE INDEX, VACUUM ANALYZE, implicit casts, ошибочно проходит cast в int2 и int8, форматирование NaN и Infinity, COPY FROM stdin, SET lc_numeric, умножение больших целых чисел не дает в результате число с плавающей точкой, sum(), округление, nullif, форматирование чисел || || 14 | uuid | 36 | 0 | 0.0 | 02.05.2023 | ||· -|| 15 | strings | 390 | 28 | 7.18 | 29.05.2023 | SET, RESET, standard_conforming_strings, bytea_output, \pset, неинициализированная поддержка регулярок, pg_class || -|| 16 | numerology | 24 | 4 | 16.67 | 25.05.2023 | || +|| 15 | strings | 390 | 31 (+3) | 7.95 | 25.08.2023 | SET, RESET, standard_conforming_strings, bytea_output, \pset, неинициализированная поддержка регулярок, pg_class || +|| 16 | numerology | 24 | 8 (+4) | 33.33 | 26.07.2023 | || || 17 | date | 264 | 17 | 6.44 | 25.05.2023 | || || 18 | time | 39 | 11 | 28.21 | 25.05.2023 | || || 19 | timetz | 45 | 13 | 28.89 | 25.05.2023 | || -|| 20 | timestamp | 145 | 78 (+1) | 53.79 | 14.06.2023 | || -|| 21 | timestamptz | 315 | 79 (+1) | 25.08 | 14.06.2023 | || -|| 22 | interval | 168 | 87 (+1) | 51.79 | 14.06.2023 | || -|| 23 | horology | 306 | 76 | 24.84 | 29.05.2023 | SET, DateStyle, TimeZone, автоматически назначаемые имена колонкам-выражениям, SET TIME ZOME, RESET TIME ZONE, интервальный тип ПГ, || +|| 20 | timestamp | 145 | 81 (+3) | 55.86 | 10.08.2023 | || +|| 21 | timestamptz | 315 | 83 (+4) | 26.35 | 10.08.2023 | || +|| 22 | interval | 168 | 115 (+1) | 68.45 | 25.10.2023 | || +|| 23 | horology | 306 | 79 (+28) | 25.82 | 10.08.2023 | SET, DateStyle, TimeZone, автоматически назначаемые имена колонкам-выражениям, SET TIME ZOME, RESET TIME ZONE, интервальный тип ПГ, || || 24 | comments | 7 | 7 | 100.0 | 25.05.2023 | || -|| 25 | expressions | 63 | 8 (+6) | 12.7 | 14.06.2023 | || -|| 26 | unicode | 13 | 4 | 30.77 | 03.05.2023 | || -|| 27 | create_table | 383 | 41 (+11) | 10.7 | 14.06.2023 | CREATE UNLOGGED TABLE, REINDEX, PREPARE ... SELECT, DEALLOCATE, \gexec, || -|| 28 | insert | 357 | 8 | 2.24 | 25.05.2023 | CREATE TEMP TABLE, ALTER TABLE, DROP TABLE, CREATE TYPE, CREATE RULE, \d+, DROP TYPE, create table...partition by range, create table ... partition of ..., tableoid::regclass, create or replace function, create operator, || -|| 29 | create_misc | 76 | 1 | 1.32 | 25.05.2023 | || -|| 30 | select | 85 | 1 (+1) | 1.18 | 14.06.2023 | порядок сортировки в виде ORDER BY поле using > или <, а также NULLS FIRST/LAST; ANALYZE, переменные enable_seqscan, enable_bitmapscan, enable_sort, whole-row Var referencing a subquery, подзапросы внутри values, INSERT INTO ... DEFAULT VALUES, Range sub select unsupported lateral, CREATE INDEX, DROP INDEX, explain (опции costs, analyze, timing, summary), SELECT 1 AS x ORDER BY x; CREATE FUNCTION, DROP FUNCTION, table inheritance, PARTITION BY || -|| 31 | select_into | 67 | 2 | 2.99 | 25.05.2023 | || -|| 32 | select_distinct | 46 | 1 (+1) | 2.17 | 14.06.2023 | || +|| 25 | expressions | 63 | 14 (+4) | 22.22 | 25.10.2023 | || +|| 26 | unicode | 13 | 4 (+4) | 30.77 | 10.08.2023 | || +|| 27 | create_table | 368 | 47 (+1) | 12.77 | 25.10.2023 | CREATE UNLOGGED TABLE, REINDEX, PREPARE ... SELECT, DEALLOCATE, \gexec, pg_class, pg_attribute, CREATE TABLE PARTITION OF || +|| 28 | insert | 357 | 10 (+10) | 2.8 | 25.10.2023 | CREATE TEMP TABLE, ALTER TABLE, DROP TABLE, CREATE TYPE, CREATE RULE, \d+, DROP TYPE, create table...partition by range, create table ... partition of ..., tableoid::regclass, create or replace function, create operator, || +|| 29 | create_misc | 76 | 3 (+2) | 3.95 | 29.09.2023 | || +|| 30 | select | 88 | 4 (+4) | 4.55 | 25.10.2023 | порядок сортировки в виде ORDER BY поле using > или <, а также NULLS FIRST/LAST; ANALYZE, переменные enable_seqscan, enable_bitmapscan, enable_sort, whole-row Var referencing a subquery, подзапросы внутри values, INSERT INTO ... DEFAULT VALUES, Range sub select unsupported lateral, CREATE INDEX, DROP INDEX, explain (опции costs, analyze, timing, summary), SELECT 1 AS x ORDER BY x; CREATE FUNCTION, DROP FUNCTION, table inheritance, PARTITION BY || +|| 31 | select_into | 67 | 3 | 4.48 | 27.07.2023 | || +|| 32 | select_distinct | 46 | 1 | 2.17 | 27.07.2023 | || || 33 | select_distinct_on | 4 | 0 | 0.0 | 25.05.2023 | || || 34 | select_implicit | 44 | 11 | 25.0 | 25.05.2023 | || || 35 | select_having | 23 | 11 | 47.83 | 25.05.2023 | || @@ -41,21 +41,21 @@ || 37 | union | 186 | 0 | 0.0 | 25.05.2023 | || || 38 | case | 63 | 13 | 20.63 | 25.05.2023 | implicit casts, create function volatile || || 39 | join | 591 | 23 (+1) | 3.89 | 14.06.2023 | || -|| 40 | aggregates | 416 | 0 | 0.0 | 25.05.2023 | || -|| 41 | arrays | 410 | 6 | 1.46 | 14.06.2023 | || -|| 42 | update | 288 | 13 | 4.51 | 25.05.2023 | :-переменные || +|| 40 | aggregates | 416 | 1 (+1) | 0.24 | 25.08.2023 | || +|| 41 | arrays | 410 | 1 | 0.24 | 29.09.2023 | || +|| 42 | update | 288 | 17 | 5.9 | 27.07.2023 | :-переменные || || 43 | delete | 10 | 0 | 0.0 | 25.05.2023 | || -|| 44 | dbsize | 24 | 22 (+1) | 91.67 | 14.06.2023 | || +|| 44 | dbsize | 24 | 24 (+16) | 100.0 | 10.08.2023 | || || 45 | window | 298 | 2 (+2) | 0.67 | 14.06.2023 | || -|| 46 | functional_deps | 40 | 3 (+3) | 7.5 | 14.06.2023 | || -|| 47 | json | 454 | 44 (+2) | 9.69 | 14.06.2023 | || -|| 48 | jsonb | 1017 | 43 (+2) | 4.23 | 14.06.2023 | || +|| 46 | functional_deps | 40 | 4 (+1) | 10.0 | 29.09.2023 | || +|| 47 | json | 454 | 51 (+1) | 11.23 | 25.10.2023 | || +|| 48 | jsonb | 1017 | 50 (+1) | 4.92 | 25.10.2023 | || || 49 | json_encoding | 42 | 42 | 100.0 | 29.05.2023 | || || 50 | jsonpath | 169 | 152 | 89.94 | 29.05.2023 | числа с точкой без целой части (например .1), литерал '00' || || 51 | jsonpath_encoding | 31 | 31 | 100.0 | 29.05.2023 | || -|| 52 | jsonb_jsonpath | 427 | 0 | 0.0 | 25.05.2023 | || -|| 53 | limit | 84 | 5 (+2) | 5.95 | 14.06.2023 | || +|| 52 | jsonb_jsonpath | 427 | 5 (+5) | 1.17 | 27.07.2023 | || +|| 53 | limit | 84 | 5 (+4) | 5.95 | 10.08.2023 | || || 54 | truncate | 193 | 3 | 1.55 | 25.05.2023 | || -|| 55 | alter_table | 1679 | 2 | 0.12 | 29.05.2023 | COMMENT ON TABLE || +|| 55 | alter_table | 1679 | 4 (+2) | 0.24 | 25.08.2023 | COMMENT ON TABLE || || 56 | xml | 234 | 3 | 1.28 | 25.05.2023 | \set VERBOSITY || |# diff --git a/ydb/library/yql/tools/pgrun/pgrun.cpp b/ydb/library/yql/tools/pgrun/pgrun.cpp index 9a992a592b..7199f25293 100644 --- a/ydb/library/yql/tools/pgrun/pgrun.cpp +++ b/ydb/library/yql/tools/pgrun/pgrun.cpp @@ -38,6 +38,8 @@ namespace NMiniKQL = NKikimr::NMiniKQL; const ui32 PRETTY_FLAGS = NYql::TAstPrintFlags::PerLine | NYql::TAstPrintFlags::ShortQuote | NYql::TAstPrintFlags::AdaptArbitraryContent; +const TString nullRepr(""); + bool IsEscapedChar(const TString& s, size_t pos) { bool escaped = false; while (s[--pos] == '\\') { @@ -720,6 +722,7 @@ inline const TString FormatBool(const TString& value) return (value == "true") ? T : (value == "false") ? F + : (value == nullRepr) ? nullRepr : ythrow yexception() << "Unexpected bool literal: " << value; } @@ -790,7 +793,7 @@ void WriteTableToStream(IOutputStream& stream, const NYT::TNode::TListType& cols { int i = 0; for (const auto& col : row.AsList()) { - const auto& cellData = col.AsString(); + const auto& cellData = col.HasValue() ? col.AsString() : nullRepr; auto& c = columns[i]; rowData.emplace_back(c.Formatter(cellData)); |