aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarsaly <marsaly@ydb.tech>2023-12-14 19:36:48 +0300
committermarsaly <marsaly@ydb.tech>2023-12-14 20:29:33 +0300
commit7f3897e948d99ad46654f4c256948296692b45d0 (patch)
treec052d1f7b50b3ec54f47d54ad99012360f2f5ab4
parentc68f7e8d18583fc189c8349895f3f3d8e84bd7bc (diff)
downloadydb-7f3897e948d99ad46654f4c256948296692b45d0.tar.gz
Fix WriteTableToStream in pgrun
Fixed null output in table
-rw-r--r--ydb/library/yql/tests/postgresql/cases/aggregates.err1217
-rw-r--r--ydb/library/yql/tests/postgresql/cases/aggregates.out196
-rw-r--r--ydb/library/yql/tests/postgresql/cases/aggregates.sql76
-rw-r--r--ydb/library/yql/tests/postgresql/cases/alter_table.err312
-rw-r--r--ydb/library/yql/tests/postgresql/cases/alter_table.out22
-rw-r--r--ydb/library/yql/tests/postgresql/cases/alter_table.sql19
-rw-r--r--ydb/library/yql/tests/postgresql/cases/arrays.err3266
-rw-r--r--ydb/library/yql/tests/postgresql/cases/arrays.out533
-rw-r--r--ydb/library/yql/tests/postgresql/cases/arrays.sql159
-rw-r--r--ydb/library/yql/tests/postgresql/cases/bit.err477
-rw-r--r--ydb/library/yql/tests/postgresql/cases/bit.out349
-rw-r--r--ydb/library/yql/tests/postgresql/cases/bit.sql93
-rw-r--r--ydb/library/yql/tests/postgresql/cases/boolean.err67
-rw-r--r--ydb/library/yql/tests/postgresql/cases/boolean.out9
-rw-r--r--ydb/library/yql/tests/postgresql/cases/boolean.sql9
-rw-r--r--ydb/library/yql/tests/postgresql/cases/case.err432
-rw-r--r--ydb/library/yql/tests/postgresql/cases/case.out94
-rw-r--r--ydb/library/yql/tests/postgresql/cases/case.sql54
-rw-r--r--ydb/library/yql/tests/postgresql/cases/create_table.err20
-rw-r--r--ydb/library/yql/tests/postgresql/cases/create_table.out10
-rw-r--r--ydb/library/yql/tests/postgresql/cases/create_table.sql10
-rw-r--r--ydb/library/yql/tests/postgresql/cases/date.err1281
-rw-r--r--ydb/library/yql/tests/postgresql/cases/date.out1033
-rw-r--r--ydb/library/yql/tests/postgresql/cases/date.sql212
-rw-r--r--ydb/library/yql/tests/postgresql/cases/delete.err42
-rw-r--r--ydb/library/yql/tests/postgresql/cases/float4.err24
-rw-r--r--ydb/library/yql/tests/postgresql/cases/insert.err2615
-rw-r--r--ydb/library/yql/tests/postgresql/cases/insert.out17
-rw-r--r--ydb/library/yql/tests/postgresql/cases/insert.sql17
-rw-r--r--ydb/library/yql/tests/postgresql/cases/int8.err626
-rw-r--r--ydb/library/yql/tests/postgresql/cases/int8.out119
-rw-r--r--ydb/library/yql/tests/postgresql/cases/int8.sql37
-rw-r--r--ydb/library/yql/tests/postgresql/cases/join.err1594
-rw-r--r--ydb/library/yql/tests/postgresql/cases/join.out123
-rw-r--r--ydb/library/yql/tests/postgresql/cases/join.sql119
-rw-r--r--ydb/library/yql/tests/postgresql/cases/json.err3285
-rw-r--r--ydb/library/yql/tests/postgresql/cases/json.out374
-rw-r--r--ydb/library/yql/tests/postgresql/cases/json.sql103
-rw-r--r--ydb/library/yql/tests/postgresql/cases/jsonb.err6790
-rw-r--r--ydb/library/yql/tests/postgresql/cases/jsonb.out1810
-rw-r--r--ydb/library/yql/tests/postgresql/cases/jsonb.sql386
-rw-r--r--ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.err3253
-rw-r--r--ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.out498
-rw-r--r--ydb/library/yql/tests/postgresql/cases/jsonb_jsonpath.sql83
-rw-r--r--ydb/library/yql/tests/postgresql/cases/numeric.err1339
-rw-r--r--ydb/library/yql/tests/postgresql/cases/numeric.out925
-rw-r--r--ydb/library/yql/tests/postgresql/cases/numeric.sql247
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select.err423
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select.out20
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select.sql8
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_having.err71
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_having.err.171
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_having.err.271
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_having.out27
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_having.sql9
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_implicit.err262
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_implicit.err.1262
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_implicit.err.2262
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_implicit.out9
-rw-r--r--ydb/library/yql/tests/postgresql/cases/select_implicit.sql4
-rw-r--r--ydb/library/yql/tests/postgresql/cases/strings.err24
-rw-r--r--ydb/library/yql/tests/postgresql/cases/text.err838
-rw-r--r--ydb/library/yql/tests/postgresql/cases/text.out69
-rw-r--r--ydb/library/yql/tests/postgresql/cases/text.sql13
-rw-r--r--ydb/library/yql/tests/postgresql/cases/time.err169
-rw-r--r--ydb/library/yql/tests/postgresql/cases/time.out117
-rw-r--r--ydb/library/yql/tests/postgresql/cases/time.sql28
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timestamp.err396
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timestamp.out202
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timestamp.sql93
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timestamptz.err710
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timestamptz.out91
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timestamptz.sql40
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timetz.err213
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timetz.out92
-rw-r--r--ydb/library/yql/tests/postgresql/cases/timetz.sql21
-rw-r--r--ydb/library/yql/tests/postgresql/cases/truncate.err665
-rw-r--r--ydb/library/yql/tests/postgresql/cases/truncate.out51
-rw-r--r--ydb/library/yql/tests/postgresql/cases/truncate.sql38
-rw-r--r--ydb/library/yql/tests/postgresql/cases/update.err2324
-rw-r--r--ydb/library/yql/tests/postgresql/cases/update.out28
-rw-r--r--ydb/library/yql/tests/postgresql/cases/update.sql28
-rw-r--r--ydb/library/yql/tests/postgresql/cases/window.err3063
-rw-r--r--ydb/library/yql/tests/postgresql/cases/window.out27
-rw-r--r--ydb/library/yql/tests/postgresql/cases/window.sql27
-rw-r--r--ydb/library/yql/tests/postgresql/cases/xml.err2034
-rw-r--r--ydb/library/yql/tests/postgresql/cases/xml.err.12034
-rw-r--r--ydb/library/yql/tests/postgresql/cases/xml.err.22034
-rw-r--r--ydb/library/yql/tests/postgresql/cases/xml.out54
-rw-r--r--ydb/library/yql/tests/postgresql/cases/xml.sql12
-rw-r--r--ydb/library/yql/tests/postgresql/pg_tests.csv76
-rw-r--r--ydb/library/yql/tests/postgresql/status.md56
-rw-r--r--ydb/library/yql/tests/postgresql/status.old68
-rw-r--r--ydb/library/yql/tools/pgrun/pgrun.cpp5
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=''&lt;''/>');
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+ -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143
+ SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
+ ^
+<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=''&lt;''/>');
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+ -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143
+ SELECT xmlparse(document '<invalidns xmlns=''&lt;''/>');
+ ^
+<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>&lt;</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>&lt;</root>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('//text()', '<root>&lt;</root>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('//text()', '<root>&lt;</root>');
+ ^
+<sql-statement>
+SELECT xpath('//@value', '<root value="&lt;"/>');
+</sql-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="&lt;"/>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('//@value', '<root value="&lt;"/>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('//@value', '<root value="&lt;"/>');
+ ^
+<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=''&lt;''/>');
+</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=''&lt;''/>');
+</sql-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=''&lt;''/>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('/*', '<invalidns xmlns=''&lt;''/>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('/*', '<invalidns xmlns=''&lt;''/>');
+ ^
+<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>&nbsp;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&amp;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>&amp;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=''&lt;''/>');
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+ -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143
+ SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
+ ^
+<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=''&lt;''/>');
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+ -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143
+ SELECT xmlparse(document '<invalidns xmlns=''&lt;''/>');
+ ^
+<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>&lt;</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>&lt;</root>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('//text()', '<root>&lt;</root>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('//text()', '<root>&lt;</root>');
+ ^
+<sql-statement>
+SELECT xpath('//@value', '<root value="&lt;"/>');
+</sql-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="&lt;"/>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('//@value', '<root value="&lt;"/>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('//@value', '<root value="&lt;"/>');
+ ^
+<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=''&lt;''/>');
+</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=''&lt;''/>');
+</sql-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=''&lt;''/>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('/*', '<invalidns xmlns=''&lt;''/>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('/*', '<invalidns xmlns=''&lt;''/>');
+ ^
+<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>&nbsp;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&amp;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>&amp;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=''&lt;''/>');
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+ -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143
+ SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
+ ^
+<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=''&lt;''/>');
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+ -stdin-:<main>:1:1: Error: alternative is not implemented yet : 143
+ SELECT xmlparse(document '<invalidns xmlns=''&lt;''/>');
+ ^
+<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>&lt;</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>&lt;</root>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('//text()', '<root>&lt;</root>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('//text()', '<root>&lt;</root>');
+ ^
+<sql-statement>
+SELECT xpath('//@value', '<root value="&lt;"/>');
+</sql-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="&lt;"/>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('//@value', '<root value="&lt;"/>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('//@value', '<root value="&lt;"/>');
+ ^
+<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=''&lt;''/>');
+</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=''&lt;''/>');
+</sql-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=''&lt;''/>');
+ ^
+ -stdin-:<main>:1:8: Error: At function: PgCall
+ SELECT xpath('/*', '<invalidns xmlns=''&lt;''/>');
+ ^
+ -stdin-:<main>:1:8: Error: Unable to find an overload for proc xpath with given argument types: (unknown,unknown)
+ SELECT xpath('/*', '<invalidns xmlns=''&lt;''/>');
+ ^
+<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>&nbsp;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&apos;</ent></a><a><ent>&quot;</ent></a><a><ent>&amp;</ent></a><a><ent>&lt;</ent></a><a><ent>&gt;</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>&amp;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>&amp;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));