diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp index 9bb561242acf..35d5ab5e5716 100644 --- a/ydb/library/yql/sql/pg/pg_sql.cpp +++ b/ydb/library/yql/sql/pg/pg_sql.cpp @@ -2159,25 +2159,34 @@ class TConverter : public IPGParseEvents { auto name = to_lower(TString(value->name)); if (name == "search_path") { - if (ListLength(value->args) != 1) { - AddError(TStringBuilder() << "VariableSetStmt, expected 1 arg, but got: " << ListLength(value->args)); - return nullptr; - } - auto val = ListNodeNth(value->args, 0); - if (!isSetConfig) { - if (NodeTag(val) == T_A_Const) { - val = (const Node*)&CAST_NODE(A_Const, val)->val; - } else { - AddError(TStringBuilder() << "VariableSetStmt, expected const for " << value->name << " option"); + THashSet visitedValues; + TVector values; + for (int i = 0; i < ListLength(value->args); ++i) { + auto val = ListNodeNth(value->args, i); + if (!isSetConfig) { + if (NodeTag(val) == T_A_Const) { + val = (const Node*)&CAST_NODE(A_Const, val)->val; + } else { + AddError(TStringBuilder() << "VariableSetStmt, expected const for " << value->name << " option"); + return nullptr; + } + } + + if (NodeTag(val) != T_String) { + AddError(TStringBuilder() << "VariableSetStmt, expected string literal for " << value->name << " option"); return nullptr; } + TString rawStr = to_lower(TString(StrVal(val))); + if (visitedValues.emplace(rawStr).second) { + values.emplace_back(rawStr); + } } - if (NodeTag(val) != T_String) { - AddError(TStringBuilder() << "VariableSetStmt, expected string literal for " << value->name << " option"); + if (values.size() != 1) { + AddError(TStringBuilder() << "VariableSetStmt, expected 1 unique scheme, but got: " << values.size()); return nullptr; } - TString rawStr = to_lower(TString(StrVal(val))); + auto rawStr = values[0]; if (rawStr != "pg_catalog" && rawStr != "public" && rawStr != "" && rawStr != "information_schema") { AddError(TStringBuilder() << "VariableSetStmt, search path supports only 'information_schema', 'public', 'pg_catalog', '' but got: '" << rawStr << "'"); return nullptr; diff --git a/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json index 2dc7935b0e0e..d924aa2b8bb0 100644 --- a/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json @@ -2207,6 +2207,28 @@ } ], "test.test[pg-distinct_on_single_projection_no_order-default.txt-Results]": [], + "test.test[pg-doubles_search_path-default.txt-Analyze]": [ + { + "checksum": "fd1b97c2f54d4e50aa4de237cf4d4fa7", + "size": 5591, + "uri": "https://{canondata_backend}/1936842/4c93d91b791c8afc87ba8ddb554fd8416c95c5a3/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Analyze_/plan.txt" + } + ], + "test.test[pg-doubles_search_path-default.txt-Debug]": [ + { + "checksum": "298c84fb95295be7e6f186f5c5dd6b64", + "size": 2865, + "uri": "https://{canondata_backend}/1936842/4c93d91b791c8afc87ba8ddb554fd8416c95c5a3/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-doubles_search_path-default.txt-Plan]": [ + { + "checksum": "fd1b97c2f54d4e50aa4de237cf4d4fa7", + "size": 5591, + "uri": "https://{canondata_backend}/1936842/4c93d91b791c8afc87ba8ddb554fd8416c95c5a3/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-doubles_search_path-default.txt-Results]": [], "test.test[pg-order_by_shadow_input_columns_qual-default.txt-Analyze]": [ { "checksum": "b4dd508a329723c74293d80f0278c705", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json index f7d567ae12f1..0e748511fac2 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json @@ -1646,9 +1646,23 @@ ], "test.test[pg-join_using_tables1-default.txt-Plan]": [ { - "checksum": "c5f207bd0617164c2954b2b2cd0da34a", - "size": 7043, - "uri": "https://{canondata_backend}/1942671/586e1cad89b59a85e10d70e6019aeefccc0f0382/resource.tar.gz#test.test_pg-join_using_tables1-default.txt-Plan_/plan.txt" + "checksum": "2285226db23bdeb50a3b9be08816a9e1", + "size": 5286, + "uri": "https://{canondata_backend}/1889210/ef7367b4155f26b3ef23170f285effb15331f727/resource.tar.gz#test.test_pg-join_using_tables1-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-doubles_search_path-default.txt-Debug]": [ + { + "checksum": "ea64351f9e62c70ad3ea607991b54517", + "size": 3388, + "uri": "https://{canondata_backend}/1936842/06c9068023d4aba6d1f84ef3d63cea3dfcf5c68c/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-doubles_search_path-default.txt-Plan]": [ + { + "checksum": "78f0e1e757a64d6371b7201489602b7a", + "size": 5824, + "uri": "https://{canondata_backend}/1936842/06c9068023d4aba6d1f84ef3d63cea3dfcf5c68c/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Plan_/plan.txt" } ], "test.test[pg-order_by_distinct_same_expr_agg-default.txt-Debug]": [ diff --git a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json index 2876c02db9bc..1748ad606254 100644 --- a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json +++ b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json @@ -11066,6 +11066,13 @@ "uri": "https://{canondata_backend}/1781765/838f2ea2c0326d84b118c1ad739c96cc6935c327/resource.tar.gz#test_sql2yql.test_pg-distinct_on_single_projection_order_expr_/sql.yql" } ], + "test_sql2yql.test[pg-doubles_search_path]": [ + { + "checksum": "916f87f6b75cf45a4534a43c50d0cb5b", + "size": 618, + "uri": "https://{canondata_backend}/1936947/6c85d45b858dd603cc78503a28189df349b6a33d/resource.tar.gz#test_sql2yql.test_pg-doubles_search_path_/sql.yql" + } + ], "test_sql2yql.test[pg-drop_table]": [ { "checksum": "a17122997a6bf872af77c286174322eb", diff --git a/ydb/library/yql/tests/sql/suites/pg/doubles_search_path.sql b/ydb/library/yql/tests/sql/suites/pg/doubles_search_path.sql new file mode 100644 index 000000000000..f35d89bdca77 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/pg/doubles_search_path.sql @@ -0,0 +1,3 @@ +--!syntax_pg +SET search_path = "public", public; +select count(*) from plato."Input"; diff --git a/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json index 12ea88b7c4e5..fc38a9d2e392 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json @@ -1946,6 +1946,27 @@ "uri": "https://{canondata_backend}/1773845/6143a04775e36199e856448cbf4178c399f51a42/resource.tar.gz#test.test_pg-distinct_on_single_projection_no_order-default.txt-Results_/results.txt" } ], + "test.test[pg-doubles_search_path-default.txt-Debug]": [ + { + "checksum": "be03c9b8e3aeadbe2b2ed449c3d4e42a", + "size": 2907, + "uri": "https://{canondata_backend}/1936842/735d816861a5616c53b1eee68a7a6a4cbda384a4/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Debug_/opt.yql" + } + ], + "test.test[pg-doubles_search_path-default.txt-Plan]": [ + { + "checksum": "c28acd305df85fa1613226503487ff19", + "size": 4552, + "uri": "https://{canondata_backend}/1936842/735d816861a5616c53b1eee68a7a6a4cbda384a4/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-doubles_search_path-default.txt-Results]": [ + { + "checksum": "308de242a9e376534973cfd8c4e97327", + "size": 660, + "uri": "https://{canondata_backend}/1936842/735d816861a5616c53b1eee68a7a6a4cbda384a4/resource.tar.gz#test.test_pg-doubles_search_path-default.txt-Results_/results.txt" + } + ], "test.test[pg-order_by_shadow_input_columns_qual-default.txt-Debug]": [ { "checksum": "ddee8cf57e110cdad12ba4c177ce1145",