summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-10-10 16:31:33 +0300
committervvvv <[email protected]>2025-10-10 17:08:12 +0300
commit98f2ee1a36436bada54371eef656138d98dd40e0 (patch)
tree3bb7cf502482258623b4d94721714612bd16c4de /yql/essentials/sql
parentc62509aef170f46a8d9464bafa8b83bc293ebb63 (diff)
YQL-20086 invert flag
commit_hash:a6b640bc576263b62884a0b4187ba79c893e13d9
Diffstat (limited to 'yql/essentials/sql')
-rw-r--r--yql/essentials/sql/cluster_mapping.cpp2
-rw-r--r--yql/essentials/sql/cluster_mapping.h2
-rw-r--r--yql/essentials/sql/pg/optimizer.cpp155
-rw-r--r--yql/essentials/sql/pg/optimizer.h1
-rw-r--r--yql/essentials/sql/pg/optimizer_impl_ut.cpp17
-rw-r--r--yql/essentials/sql/pg/optimizer_ut.cpp54
-rw-r--r--yql/essentials/sql/pg/pg_sql.cpp1323
-rw-r--r--yql/essentials/sql/pg/pg_sql_autoparam_ut.cpp386
-rw-r--r--yql/essentials/sql/pg/pg_sql_ut.cpp1302
-rw-r--r--yql/essentials/sql/pg/ut/util.h28
-rw-r--r--yql/essentials/sql/pg/utils.cpp2
-rw-r--r--yql/essentials/sql/pg/utils.h2
-rw-r--r--yql/essentials/sql/pg_dummy/pg_sql_dummy.cpp73
-rw-r--r--yql/essentials/sql/settings/partitioning.cpp4
-rw-r--r--yql/essentials/sql/settings/partitioning.h20
-rw-r--r--yql/essentials/sql/settings/translation_settings.cpp216
-rw-r--r--yql/essentials/sql/settings/translation_settings.h247
-rw-r--r--yql/essentials/sql/settings/translator.cpp17
-rw-r--r--yql/essentials/sql/settings/translator.h12
-rw-r--r--yql/essentials/sql/sql.cpp377
-rw-r--r--yql/essentials/sql/sql.h32
-rw-r--r--yql/essentials/sql/v0/lexer/ya.make2
-rw-r--r--yql/essentials/sql/v0/ut/ya.make2
-rw-r--r--yql/essentials/sql/v0/ya.make2
-rw-r--r--yql/essentials/sql/v1/complete/ya.make2
-rw-r--r--yql/essentials/sql/v1/format/ya.make2
-rw-r--r--yql/essentials/sql/v1/highlight/ya.make2
-rw-r--r--yql/essentials/sql/v1/lexer/ya.make2
-rw-r--r--yql/essentials/sql/v1/perf/ya.make2
-rw-r--r--yql/essentials/sql/v1/proto_parser/ya.make2
-rw-r--r--yql/essentials/sql/v1/reflect/ya.make2
-rw-r--r--yql/essentials/sql/v1/ya.make2
32 files changed, 2099 insertions, 2195 deletions
diff --git a/yql/essentials/sql/cluster_mapping.cpp b/yql/essentials/sql/cluster_mapping.cpp
index fb2a5100b5b..65659f9baf4 100644
--- a/yql/essentials/sql/cluster_mapping.cpp
+++ b/yql/essentials/sql/cluster_mapping.cpp
@@ -31,4 +31,4 @@ TMaybe<TString> TClusterMapping::GetClusterProvider(const TString& cluster, TStr
}
return Nothing();
}
-}
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/cluster_mapping.h b/yql/essentials/sql/cluster_mapping.h
index bf943253642..84a356a7e36 100644
--- a/yql/essentials/sql/cluster_mapping.h
+++ b/yql/essentials/sql/cluster_mapping.h
@@ -13,4 +13,4 @@ private:
THashMap<TString, TString> CaseSensitiveClusters_;
THashMap<TString, TString> CaseInsensitiveClusters_;
};
-}
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/pg/optimizer.cpp b/yql/essentials/sql/pg/optimizer.cpp
index 6ce6fd0fa30..55948d6a360 100644
--- a/yql/essentials/sql/pg/optimizer.cpp
+++ b/yql/essentials/sql/pg/optimizer.cpp
@@ -10,26 +10,26 @@
#include <util/generic/scope.h>
#ifdef _WIN32
-#define __restrict
+ #define __restrict
#endif
#define TypeName PG_TypeName // NOLINT(readability-identifier-naming)
-#define SortBy PG_SortBy // NOLINT(readability-identifier-naming)
+#define SortBy PG_SortBy // NOLINT(readability-identifier-naming)
#undef SIZEOF_SIZE_T
extern "C" {
-Y_PRAGMA_DIAGNOSTIC_PUSH
+ Y_PRAGMA_DIAGNOSTIC_PUSH
#ifdef _win_
-Y_PRAGMA("GCC diagnostic ignored \"-Wshift-count-overflow\"")
+ Y_PRAGMA("GCC diagnostic ignored \"-Wshift-count-overflow\"")
#endif
-Y_PRAGMA("GCC diagnostic ignored \"-Wunused-parameter\"")
+ Y_PRAGMA("GCC diagnostic ignored \"-Wunused-parameter\"")
#include "postgres.h"
#include "miscadmin.h"
#include "optimizer/paths.h"
#include "nodes/print.h"
#include "utils/selfuncs.h"
#include "utils/palloc.h"
-Y_PRAGMA_DIAGNOSTIC_POP
+ Y_PRAGMA_DIAGNOSTIC_POP
}
#undef Min
@@ -42,10 +42,10 @@ namespace NYql {
namespace {
bool RelationStatsHook(
- PlannerInfo *root,
- RangeTblEntry *rte,
+ PlannerInfo* root,
+ RangeTblEntry* rte,
AttrNumber attnum,
- VariableStatData *vardata)
+ VariableStatData* vardata)
{
Y_UNUSED(root);
Y_UNUSED(rte);
@@ -58,11 +58,11 @@ bool RelationStatsHook(
Var* MakeVar(int relno, int varno) {
Var* v = makeNode(Var);
- v->varno = relno; // table number
+ v->varno = relno; // table number
v->varattno = varno; // column number in table
// ?
- v->vartype = 25; // ?
+ v->vartype = 25; // ?
v->vartypmod = -1; // ?
v->varcollid = 0;
v->varnosyn = v->varno;
@@ -84,8 +84,8 @@ RelOptInfo* MakeRelOptInfo(const IOptimizer::TRel& r, int relno) {
PathTarget* t = makeNode(PathTarget);
int maxattno = 0;
for (int i = 0; i < (int)r.TargetVars.size(); i++) {
- t->exprs = lappend(t->exprs, MakeVar(relno, i+1));
- maxattno = i+1;
+ t->exprs = lappend(t->exprs, MakeVar(relno, i + 1));
+ maxattno = i + 1;
}
t->width = 8;
@@ -103,7 +103,7 @@ RelOptInfo* MakeRelOptInfo(const IOptimizer::TRel& r, int relno) {
rel->pathlist = list_make1(p);
rel->cheapest_total_path = p;
rel->relids = bms_add_member(nullptr, rel->relid);
- rel->attr_needed = (Relids*)palloc0((1+maxattno)*sizeof(Relids));
+ rel->attr_needed = (Relids*)palloc0((1 + maxattno) * sizeof(Relids));
return rel;
}
@@ -127,7 +127,8 @@ TPgOptimizer::TPgOptimizer(
}
TPgOptimizer::~TPgOptimizer()
-{ }
+{
+}
TPgOptimizer::TOutput TPgOptimizer::JoinSearch()
{
@@ -145,8 +146,8 @@ TPgOptimizer::TOutput TPgOptimizer::JoinSearch()
Var* TPgOptimizer::MakeVar(TVarId varId) {
auto*& var = Vars_[varId];
return var
- ? var
- : (var = ::NYql::MakeVar(std::get<0>(varId), std::get<1>(varId)));
+ ? var
+ : (var = ::NYql::MakeVar(std::get<0>(varId), std::get<1>(varId)));
}
EquivalenceClass* TPgOptimizer::MakeEqClass(int i) {
@@ -216,21 +217,21 @@ int TPgOptimizer::MakeOutputJoin(TOutput& output, Path* path) {
JoinPath* jpath = (JoinPath*)path;
switch (jpath->jointype) {
- case JOIN_INNER:
- node.Mode = EJoinType::Inner;
- break;
- case JOIN_LEFT:
- node.Mode = EJoinType::Left;
- break;
- case JOIN_RIGHT:
- node.Mode = EJoinType::Right;
- break;
- default:
- YQL_ENSURE(false, "Unsupported join type");
- break;
+ case JOIN_INNER:
+ node.Mode = EJoinType::Inner;
+ break;
+ case JOIN_LEFT:
+ node.Mode = EJoinType::Left;
+ break;
+ case JOIN_RIGHT:
+ node.Mode = EJoinType::Right;
+ break;
+ default:
+ YQL_ENSURE(false, "Unsupported join type");
+ break;
}
- YQL_ENSURE(list_length(jpath->joinrestrictinfo) >= 1, "Unsupported joinrestrictinfo len");
+ YQL_ENSURE(list_length(jpath->joinrestrictinfo) >= 1, "Unsupported joinrestrictinfo len");
for (int i = 0; i < list_length(jpath->joinrestrictinfo); i++) {
RestrictInfo* rinfo = (RestrictInfo*)jpath->joinrestrictinfo->elements[i].ptr_value;
@@ -309,7 +310,7 @@ void TPgOptimizer::MakeLeftOrRightRestrictions(std::vector<RestrictInfo*>& dst,
RelOptInfo* TPgOptimizer::JoinSearchInternal() {
RestrictInfos_.clear();
- RestrictInfos_.resize(Input_.Rels.size()+1);
+ RestrictInfos_.resize(Input_.Rels.size() + 1);
LeftRestriction_.clear();
LeftRestriction_.reserve(Input_.Left.size());
MakeLeftOrRightRestrictions(LeftRestriction_, Input_.Left);
@@ -337,13 +338,11 @@ RelOptInfo* TPgOptimizer::JoinSearchInternal() {
memset(&root, 0, sizeof(root));
root.type = T_PlannerInfo;
root.query_level = 1;
- root.simple_rel_array_size = rels->length+1;
+ root.simple_rel_array_size = rels->length + 1;
root.simple_rel_array = (RelOptInfo**)palloc0(
- root.simple_rel_array_size
- * sizeof(RelOptInfo*));
+ root.simple_rel_array_size * sizeof(RelOptInfo*));
root.simple_rte_array = (RangeTblEntry**)palloc0(
- root.simple_rel_array_size * sizeof(RangeTblEntry*)
- );
+ root.simple_rel_array_size * sizeof(RangeTblEntry*));
for (int i = 0; i <= rels->length; i++) {
root.simple_rte_array[i] = makeNode(RangeTblEntry);
root.simple_rte_array[i]->rtekind = RTE_RELATION;
@@ -389,7 +388,7 @@ RelOptInfo* TPgOptimizer::JoinSearchInternal() {
for (int i = 0; i < rels->length; i++) {
auto* r = (RelOptInfo*)rels->elements[i].ptr_value;
- root.simple_rel_array[i+1] = r;
+ root.simple_rel_array[i + 1] = r;
}
for (int eqId = 0; eqId < (int)Input_.EqClasses.size(); eqId++) {
@@ -401,7 +400,7 @@ RelOptInfo* TPgOptimizer::JoinSearchInternal() {
}
for (int i = 0; i < rels->length; i++) {
- root.simple_rel_array[i+1]->has_eclass_joins = bms_num_members(root.simple_rel_array[i+1]->eclass_indexes) > 1;
+ root.simple_rel_array[i + 1]->has_eclass_joins = bms_num_members(root.simple_rel_array[i + 1]->eclass_indexes) > 1;
}
root.ec_merging_done = 1;
@@ -412,8 +411,7 @@ RelOptInfo* TPgOptimizer::JoinSearchInternal() {
return result;
}
-struct TPgOptimizerImpl
-{
+struct TPgOptimizerImpl {
TPgOptimizerImpl(
const std::shared_ptr<TJoinOptimizerNode>& root,
TExprContext& ctx,
@@ -421,7 +419,8 @@ struct TPgOptimizerImpl
: Root(root)
, Ctx(ctx)
, Log(log)
- { }
+ {
+ }
std::shared_ptr<TJoinOptimizerNode> Do() {
CollectRels(Root);
@@ -474,8 +473,8 @@ struct TPgOptimizerImpl
int GetVarId(int relId, TStringBuf column) {
int varId = 0;
- auto maybeVarId = VarIds[relId-1].find(column);
- if (maybeVarId != VarIds[relId-1].end()) {
+ auto maybeVarId = VarIds[relId - 1].find(column);
+ if (maybeVarId != VarIds[relId - 1].end()) {
varId = maybeVarId->second;
} else {
varId = Rels[relId - 1].TargetVars.size() + 1;
@@ -487,11 +486,11 @@ struct TPgOptimizerImpl
}
void ExtractVars(
- std::vector<std::tuple<int,int,TStringBuf,TStringBuf>>& leftVars,
- std::vector<std::tuple<int,int,TStringBuf,TStringBuf>>& rightVars,
+ std::vector<std::tuple<int, int, TStringBuf, TStringBuf>>& leftVars,
+ std::vector<std::tuple<int, int, TStringBuf, TStringBuf>>& rightVars,
const std::shared_ptr<TJoinOptimizerNode>& op)
{
- for (size_t i=0; i<op->LeftJoinKeys.size(); i++ ) {
+ for (size_t i = 0; i < op->LeftJoinKeys.size(); i++) {
auto& ltable = op->LeftJoinKeys[i].RelName;
auto& lcol = op->LeftJoinKeys[i].AttributeName;
auto& rtable = op->RightJoinKeys[i].RelName;
@@ -531,7 +530,8 @@ struct TPgOptimizerImpl
auto& [lrelId, lvarId, ltable, lcolumn] = leftVars[i];
auto& [rrelId, rvarId, rtable, rcolumn] = rightVars[i];
- IOptimizer::TEq eqClass; eqClass.Vars.reserve(2);
+ IOptimizer::TEq eqClass;
+ eqClass.Vars.reserve(2);
eqClass.Vars.emplace_back(std::make_tuple(lrelId, lvarId));
eqClass.Vars.emplace_back(std::make_tuple(rrelId, rvarId));
@@ -543,18 +543,18 @@ struct TPgOptimizerImpl
}
bool OnOp(const std::shared_ptr<TJoinOptimizerNode>& op) {
-#define CHECK(A, B) \
- if (Y_UNLIKELY(!(A))) { \
- TIssues issues; \
- issues.AddIssue(TIssue(B).SetCode(0, NYql::TSeverityIds::S_INFO)); \
- Ctx.IssueManager.AddIssues(issues); \
- return false; \
- }
+#define CHECK(A, B) \
+ if (Y_UNLIKELY(!(A))) { \
+ TIssues issues; \
+ issues.AddIssue(TIssue(B).SetCode(0, NYql::TSeverityIds::S_INFO)); \
+ Ctx.IssueManager.AddIssues(issues); \
+ return false; \
+ }
if (op->JoinType == InnerJoin) {
// relId, varId, table, column
- std::vector<std::tuple<int,int,TStringBuf,TStringBuf>> leftVars;
- std::vector<std::tuple<int,int,TStringBuf,TStringBuf>> rightVars;
+ std::vector<std::tuple<int, int, TStringBuf, TStringBuf>> leftVars;
+ std::vector<std::tuple<int, int, TStringBuf, TStringBuf>> rightVars;
ExtractVars(leftVars, rightVars, op);
@@ -564,7 +564,7 @@ struct TPgOptimizerImpl
} else if (op->JoinType == LeftJoin || op->JoinType == RightJoin) {
CHECK(op->LeftJoinKeys.size() == 1 && op->RightJoinKeys.size() == 1, "Only 1 var per join supported");
- std::vector<std::tuple<int,int,TStringBuf,TStringBuf>> leftVars, rightVars;
+ std::vector<std::tuple<int, int, TStringBuf, TStringBuf>> leftVars, rightVars;
ExtractVars(leftVars, rightVars, op);
IOptimizer::TEq leftEqClass = MakeEqClass(leftVars);
@@ -593,9 +593,7 @@ struct TPgOptimizerImpl
{
if (node->Kind == JoinNodeType) {
auto op = std::static_pointer_cast<TJoinOptimizerNode>(node);
- return OnOp(op)
- && CollectOps(op->LeftArg)
- && CollectOps(op->RightArg);
+ return OnOp(op) && CollectOps(op->LeftArg) && CollectOps(op->RightArg);
}
return true;
}
@@ -616,20 +614,23 @@ struct TPgOptimizerImpl
const auto* node = &Result.Nodes[nodeId];
if (node->Outer == -1 && node->Inner == -1) {
YQL_ENSURE(node->Rels.size() == 1);
- auto leaf = Leafs[node->Rels[0]-1];
+ auto leaf = Leafs[node->Rels[0] - 1];
return leaf;
} else if (node->Outer != -1 && node->Inner != -1) {
EJoinKind joinKind;
switch (node->Mode) {
- case IOptimizer::EJoinType::Inner:
- joinKind = InnerJoin; break;
- case IOptimizer::EJoinType::Left:
- joinKind = LeftJoin; break;
- case IOptimizer::EJoinType::Right:
- joinKind = RightJoin; break;
- default:
- YQL_ENSURE(false, "Unsupported join type");
- break;
+ case IOptimizer::EJoinType::Inner:
+ joinKind = InnerJoin;
+ break;
+ case IOptimizer::EJoinType::Left:
+ joinKind = LeftJoin;
+ break;
+ case IOptimizer::EJoinType::Right:
+ joinKind = RightJoin;
+ break;
+ default:
+ YQL_ENSURE(false, "Unsupported join type");
+ break;
};
auto left = Convert(node->Outer);
@@ -657,8 +658,7 @@ struct TPgOptimizerImpl
joinKind,
EJoinAlgoType::MapJoin,
false,
- false
- );
+ false);
} else {
YQL_ENSURE(false, "Wrong CBO node");
}
@@ -684,19 +684,18 @@ struct TPgOptimizerImpl
IOptimizer::TOutput Result;
};
-class TPgOptimizerNew: public IOptimizerNew
-{
+class TPgOptimizerNew: public IOptimizerNew {
public:
TPgOptimizerNew(IProviderContext& pctx, TExprContext& ctx, const std::function<void(const TString&)>& log)
: IOptimizerNew(pctx)
, Ctx_(ctx)
, Log_(log)
- { }
+ {
+ }
std::shared_ptr<TJoinOptimizerNode> JoinSearch(
const std::shared_ptr<TJoinOptimizerNode>& joinTree,
- const TOptimizerHints& hints = {}) override
- {
+ const TOptimizerHints& hints = {}) override {
Y_UNUSED(hints);
return TPgOptimizerImpl(joinTree, Ctx_, Log_).Do();
}
@@ -716,4 +715,4 @@ IOptimizerNew* MakePgOptimizerNew(IProviderContext& pctx, TExprContext& ctx, con
return new TPgOptimizerNew(pctx, ctx, log);
}
-} // namespace NYql {
+} // namespace NYql
diff --git a/yql/essentials/sql/pg/optimizer.h b/yql/essentials/sql/pg/optimizer.h
index b7a874bcda3..a4ca6ba965d 100644
--- a/yql/essentials/sql/pg/optimizer.h
+++ b/yql/essentials/sql/pg/optimizer.h
@@ -44,4 +44,3 @@ RelOptInfo* MakeRelOptInfo(const IOptimizer::TRel& r, int relno);
List* MakeRelOptInfoList(const IOptimizer::TInput& input);
} // namespace NYql
-
diff --git a/yql/essentials/sql/pg/optimizer_impl_ut.cpp b/yql/essentials/sql/pg/optimizer_impl_ut.cpp
index 43828ad912a..bd1f4497b4a 100644
--- a/yql/essentials/sql/pg/optimizer_impl_ut.cpp
+++ b/yql/essentials/sql/pg/optimizer_impl_ut.cpp
@@ -12,11 +12,11 @@ extern "C" {
}
#ifdef _WIN32
-#define __restrict
+ #define __restrict
#endif
#define TypeName PG_TypeName // NOLINT(readability-identifier-naming)
-#define SortBy PG_SortBy // NOLINT(readability-identifier-naming)
+#define SortBy PG_SortBy // NOLINT(readability-identifier-naming)
#undef SIZEOF_SIZE_T
extern "C" {
@@ -55,16 +55,13 @@ Y_UNIT_TEST(MakeRelOptInfo) {
UNIT_ASSERT(r1);
UNIT_ASSERT_EQUAL(r1->reltarget->exprs->length, 1);
UNIT_ASSERT_EQUAL(
- ((Var*)r1->reltarget->exprs->elements[0].ptr_value)->varattno, 1
- );
+ ((Var*)r1->reltarget->exprs->elements[0].ptr_value)->varattno, 1);
UNIT_ASSERT_EQUAL(r1->pathlist->length, 1);
UNIT_ASSERT_EQUAL(
- ((Path*)r1->pathlist->elements[0].ptr_value)->rows, 10
- );
+ ((Path*)r1->pathlist->elements[0].ptr_value)->rows, 10);
UNIT_ASSERT_EQUAL(
- ((Path*)r1->pathlist->elements[0].ptr_value)->total_cost, 100
- );
+ ((Path*)r1->pathlist->elements[0].ptr_value)->total_cost, 100);
IOptimizer::TRel rel2 = {100, 99, {{}, {}}};
auto* r2 = MakeRelOptInfo(rel2, 2);
@@ -82,10 +79,10 @@ Y_UNIT_TEST(MakeRelOptInfoList) {
TArenaMemoryContext ctx;
IOptimizer::TRel rel1 = {10, 100, {{}}};
IOptimizer::TRel rel2 = {100, 99, {{}}};
- IOptimizer::TInput input = {.Rels={rel1, rel2}};
+ IOptimizer::TInput input = {.Rels = {rel1, rel2}};
auto* l = MakeRelOptInfoList(input);
UNIT_ASSERT(l);
UNIT_ASSERT_EQUAL(l->length, 2);
}
-} // PgOptimizerImpl
+} // Y_UNIT_TEST_SUITE(PgOptimizerImpl)
diff --git a/yql/essentials/sql/pg/optimizer_ut.cpp b/yql/essentials/sql/pg/optimizer_ut.cpp
index 6b27c031851..cfe9e1312d6 100644
--- a/yql/essentials/sql/pg/optimizer_ut.cpp
+++ b/yql/essentials/sql/pg/optimizer_ut.cpp
@@ -18,11 +18,10 @@ Y_TEST_HOOK_BEFORE_RUN(InitTest) {
Y_UNIT_TEST(PgJoinSearch2Rels) {
IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
- IOptimizer::TInput input = {.Rels={rel1, rel2}};
+ IOptimizer::TInput input = {.Rels = {rel1, rel2}};
- input.EqClasses.emplace_back(IOptimizer::TEq {
- {{1, 1}, {2, 1}}
- });
+ input.EqClasses.emplace_back(IOptimizer::TEq{
+ {{1, 1}, {2, 1}}});
auto log = [](const TString& str) {
Cerr << str << "\n";
@@ -56,19 +55,15 @@ Y_UNIT_TEST(PgJoinSearch2Rels) {
Y_UNIT_TEST(PgJoinSearch2RelsLeft) {
IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
- IOptimizer::TInput input = {.Rels={rel1, rel2}};
-
- input.EqClasses.emplace_back(IOptimizer::TEq {
- {{1, 1}}
- });
- input.EqClasses.emplace_back(IOptimizer::TEq {
- {{2, 1}}
- });
+ IOptimizer::TInput input = {.Rels = {rel1, rel2}};
+
+ input.EqClasses.emplace_back(IOptimizer::TEq{
+ {{1, 1}}});
+ input.EqClasses.emplace_back(IOptimizer::TEq{
+ {{2, 1}}});
input.Left.emplace_back(
- IOptimizer::TEq {
- {{1, 1}, {2, 1}}
- }
- );
+ IOptimizer::TEq{
+ {{1, 1}, {2, 1}}});
auto log = [](const TString& str) {
Cerr << str << "\n";
@@ -102,19 +97,15 @@ Y_UNIT_TEST(PgJoinSearch2RelsLeft) {
Y_UNIT_TEST(PgJoinSearch2RelsRight) {
IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
- IOptimizer::TInput input = {.Rels={rel1, rel2}};
-
- input.EqClasses.emplace_back(IOptimizer::TEq {
- {{1, 1}}
- });
- input.EqClasses.emplace_back(IOptimizer::TEq {
- {{2, 1}}
- });
+ IOptimizer::TInput input = {.Rels = {rel1, rel2}};
+
+ input.EqClasses.emplace_back(IOptimizer::TEq{
+ {{1, 1}}});
+ input.EqClasses.emplace_back(IOptimizer::TEq{
+ {{2, 1}}});
input.Right.emplace_back(
- IOptimizer::TEq {
- {{1, 1}, {2, 1}}
- }
- );
+ IOptimizer::TEq{
+ {{1, 1}, {2, 1}}});
auto log = [](const TString& str) {
Cerr << str << "\n";
@@ -149,11 +140,10 @@ Y_UNIT_TEST(PgJoinSearch3Rels) {
IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
IOptimizer::TRel rel3 = {10000, 9009, {{'c'}}};
- IOptimizer::TInput input = {.Rels={rel1, rel2, rel3}};
+ IOptimizer::TInput input = {.Rels = {rel1, rel2, rel3}};
- input.EqClasses.emplace_back(IOptimizer::TEq {
- {{1, 1}, {2, 1}, {3, 1}}
- });
+ input.EqClasses.emplace_back(IOptimizer::TEq{
+ {{1, 1}, {2, 1}, {3, 1}}});
auto log = [](const TString& str) {
Cerr << str << "\n";
diff --git a/yql/essentials/sql/pg/pg_sql.cpp b/yql/essentials/sql/pg/pg_sql.cpp
index 534c6b95104..3d2b994439b 100644
--- a/yql/essentials/sql/pg/pg_sql.cpp
+++ b/yql/essentials/sql/pg/pg_sql.cpp
@@ -1,11 +1,11 @@
#include "../../parser/pg_wrapper/pg_compat.h"
#ifdef _WIN32
-#define __restrict
+ #define __restrict
#endif
#define TypeName PG_TypeName // NOLINT(readability-identifier-naming)
-#define SortBy PG_SortBy // NOLINT(readability-identifier-naming)
+#define SortBy PG_SortBy // NOLINT(readability-identifier-naming)
#undef SIZEOF_SIZE_T
extern "C" {
#include "postgres.h"
@@ -51,15 +51,15 @@ extern "C" {
#include <util/generic/stack.h>
#include <util/generic/hash_set.h>
-constexpr auto PREPARED_PARAM_PREFIX = "$p";
-constexpr auto AUTO_PARAM_PREFIX = "a";
+constexpr auto PREPARED_PARAM_PREFIX = "$p";
+constexpr auto AUTO_PARAM_PREFIX = "a";
constexpr auto DEFAULT_PARAM_TYPE = "unknown";
namespace NSQLTranslationPG {
using namespace NYql;
-static const THashSet<TString> SystemColumns = { "tableoid", "xmin", "cmin", "xmax", "cmax", "ctid" };
+static const THashSet<TString> SystemColumns = {"tableoid", "xmin", "cmin", "xmax", "cmax", "ctid"};
template <typename T>
const T* CastNode(const void* nodeptr, int tag) {
@@ -131,25 +131,25 @@ bool ValueAsString(const ValUnion& val, bool isNull, TString& ret) {
}
switch (NodeTag(val)) {
- case T_Boolean: {
- ret = BoolVal(val) ? "t" : "f";
- return true;
- }
- case T_Integer: {
- ret = ToString(IntVal(val));
- return true;
- }
- case T_Float: {
- ret = StrFloatVal(val);
- return true;
- }
- case T_String:
- case T_BitString: {
- ret = StrVal(val);
- return true;
- }
- default:
- return false;
+ case T_Boolean: {
+ ret = BoolVal(val) ? "t" : "f";
+ return true;
+ }
+ case T_Integer: {
+ ret = ToString(IntVal(val));
+ return true;
+ }
+ case T_Float: {
+ ret = StrFloatVal(val);
+ return true;
+ }
+ case T_String:
+ case T_BitString: {
+ ret = StrVal(val);
+ return true;
+ }
+ default:
+ return false;
}
}
@@ -193,7 +193,7 @@ const IndexElem* IndexElement(const Node* node) {
#define AT_LOCATION_EX(node, field) \
TLocationGuard guard(this, node->field);
-std::tuple<TStringBuf, TStringBuf> GetSchemaAndObjectName(const List* nameList) {
+std::tuple<TStringBuf, TStringBuf> GetSchemaAndObjectName(const List* nameList) {
switch (ListLength(nameList)) {
case 2: {
const auto clusterName = StrVal(ListNodeNth(nameList, 0));
@@ -241,7 +241,7 @@ struct TPgConst {
return "bit";
case TPgConst::EType::nil:
return "unknown";
- }
+ }
}
EType Type;
@@ -290,7 +290,7 @@ TMaybe<TPgConst> GetValueNType(const A_Const* value) {
}
}
-class TConverter : public IPGParseEvents {
+class TConverter: public IPGParseEvents {
friend class TLocationGuard;
private:
@@ -356,8 +356,8 @@ public:
};
TConverter(TVector<TAstParseResult>& astParseResults, const NSQLTranslation::TTranslationSettings& settings,
- const TString& query, TVector<TStmtParseInfo>* stmtParseInfo, bool perStatementResult,
- TMaybe<ui32> sqlProcArgsCount)
+ const TString& query, TVector<TStmtParseInfo>* stmtParseInfo, bool perStatementResult,
+ TMaybe<ui32> sqlProcArgsCount)
: AstParseResults_(astParseResults)
, Settings_(settings)
, DqEngineEnabled_(Settings_.DqDefaultAuto->Allow())
@@ -384,7 +384,7 @@ public:
BlockEngineEnabled_ = true;
} else if (flag == "BlockEngineForce") {
BlockEngineForce_ = true;
- } if (flag == "UnorderedResult") {
+ } else if (flag == "UnorderedResult") {
UnorderedResult_ = true;
}
}
@@ -411,7 +411,6 @@ public:
typeOid != UNKNOWNOID ? NPg::LookupType(typeOid).Name : DEFAULT_PARAM_TYPE;
State_.ParamNameToPgTypeName[paramName] = typeName;
}
-
}
void OnResult(const List* raw) {
@@ -440,7 +439,7 @@ public:
void PrepareStatements() {
auto configSource = L(A("DataSource"), QA(TString(NYql::ConfigProviderName)));
State_.Statements.push_back(L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource,
- QA("OrderedColumns"))));
+ QA("OrderedColumns"))));
}
TAstNode* ParseResult(const List* raw, const TMaybe<ui32> statementId = Nothing()) {
@@ -473,7 +472,7 @@ public:
if (Settings_.EndOfQueryCommit && Settings_.Mode != NSQLTranslation::ESqlMode::LIMITED_VIEW) {
State_.Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
- A("world"))));
+ A("world"))));
}
AddVariableDeclarations();
@@ -484,21 +483,21 @@ public:
if (DqEngineEnabled_) {
State_.Statements[dqEnginePgmPos] = L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource,
- QA("DqEngine"), QA(DqEngineForce_ ? "force" : "auto")));
+ QA("DqEngine"), QA(DqEngineForce_ ? "force" : "auto")));
} else {
State_.Statements.erase(State_.Statements.begin() + dqEnginePgmPos);
}
if (State_.CostBasedOptimizer) {
State_.Statements[costBasedOptimizerPos] = L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource,
- QA("CostBasedOptimizer"), QA(State_.CostBasedOptimizer)));
+ QA("CostBasedOptimizer"), QA(State_.CostBasedOptimizer)));
} else {
State_.Statements.erase(State_.Statements.begin() + costBasedOptimizerPos);
}
if (BlockEngineEnabled_) {
State_.Statements[blockEnginePgmPos] = L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource,
- QA("BlockEngine"), QA(BlockEngineForce_ ? "force" : "auto")));
+ QA("BlockEngine"), QA(BlockEngineForce_ ? "force" : "auto")));
} else {
State_.Statements.erase(State_.Statements.begin() + blockEnginePgmPos);
}
@@ -524,33 +523,32 @@ public:
(*StmtParseInfo_)[StatementId_].CommandTagName = GetCommandName(node);
}
switch (NodeTag(node)) {
- case T_SelectStmt:
- return ParseSelectStmt(CAST_NODE(SelectStmt, node), {.Inner = false}) != nullptr;
- case T_InsertStmt:
- return ParseInsertStmt(CAST_NODE(InsertStmt, node)) != nullptr;
- case T_UpdateStmt:
- return ParseUpdateStmt(CAST_NODE(UpdateStmt, node)) != nullptr;
- case T_ViewStmt:
- return ParseViewStmt(CAST_NODE(ViewStmt, node)) != nullptr;
- case T_CreateStmt:
- return ParseCreateStmt(CAST_NODE(CreateStmt, node)) != nullptr;
- case T_DropStmt:
- return ParseDropStmt(CAST_NODE(DropStmt, node)) != nullptr;
- case T_VariableSetStmt:
- {
+ case T_SelectStmt:
+ return ParseSelectStmt(CAST_NODE(SelectStmt, node), {.Inner = false}) != nullptr;
+ case T_InsertStmt:
+ return ParseInsertStmt(CAST_NODE(InsertStmt, node)) != nullptr;
+ case T_UpdateStmt:
+ return ParseUpdateStmt(CAST_NODE(UpdateStmt, node)) != nullptr;
+ case T_ViewStmt:
+ return ParseViewStmt(CAST_NODE(ViewStmt, node)) != nullptr;
+ case T_CreateStmt:
+ return ParseCreateStmt(CAST_NODE(CreateStmt, node)) != nullptr;
+ case T_DropStmt:
+ return ParseDropStmt(CAST_NODE(DropStmt, node)) != nullptr;
+ case T_VariableSetStmt: {
// YQL-16284
const char* node_name = CAST_NODE(VariableSetStmt, node)->name;
const char* skip_statements[] = {
- "extra_float_digits", // jdbc
- "application_name", // jdbc
- "statement_timeout", // pg_dump
- "lock_timeout", // pg_dump
- "idle_in_transaction_session_timeout", // pg_dump
- "client_encoding", // pg_dump
- "standard_conforming_strings", // pg_dump
- "check_function_bodies", // pg_dump
- "xmloption", // pg_dump
- "client_min_messages", // pg_dump
+ "extra_float_digits", // jdbc
+ "application_name", // jdbc
+ "statement_timeout", // pg_dump
+ "lock_timeout", // pg_dump
+ "idle_in_transaction_session_timeout", // pg_dump
+ "client_encoding", // pg_dump
+ "standard_conforming_strings", // pg_dump
+ "check_function_bodies", // pg_dump
+ "xmloption", // pg_dump
+ "client_min_messages", // pg_dump
"row_security", // pg_dump
"escape_string_warning", // zabbix
"bytea_output", // zabbix
@@ -559,32 +557,32 @@ public:
NULL,
};
- for (int i = 0; skip_statements[i] != NULL; i++){
- const char *skip_name = skip_statements[i];
- if (stricmp(node_name, skip_name) == 0){
+ for (int i = 0; skip_statements[i] != NULL; i++) {
+ const char* skip_name = skip_statements[i];
+ if (stricmp(node_name, skip_name) == 0) {
return true;
}
};
};
- return ParseVariableSetStmt(CAST_NODE(VariableSetStmt, node)) != nullptr;
- case T_DeleteStmt:
- return ParseDeleteStmt(CAST_NODE(DeleteStmt, node)) != nullptr;
- case T_VariableShowStmt:
- return ParseVariableShowStmt(CAST_NODE(VariableShowStmt, node)) != nullptr;
- case T_TransactionStmt:
- return ParseTransactionStmt(CAST_NODE(TransactionStmt, node));
- case T_IndexStmt:
- return ParseIndexStmt(CAST_NODE(IndexStmt, node)) != nullptr;
- case T_CreateSeqStmt:
- return ParseCreateSeqStmt(CAST_NODE(CreateSeqStmt, node)) != nullptr;
- case T_AlterSeqStmt:
- return ParseAlterSeqStmt(CAST_NODE(AlterSeqStmt, node)) != nullptr;
- case T_AlterTableStmt:
- return ParseAlterTableStmt(CAST_NODE(AlterTableStmt, node)) != nullptr;
- default:
- NodeNotImplemented(value, node);
- return false;
+ return ParseVariableSetStmt(CAST_NODE(VariableSetStmt, node)) != nullptr;
+ case T_DeleteStmt:
+ return ParseDeleteStmt(CAST_NODE(DeleteStmt, node)) != nullptr;
+ case T_VariableShowStmt:
+ return ParseVariableShowStmt(CAST_NODE(VariableShowStmt, node)) != nullptr;
+ case T_TransactionStmt:
+ return ParseTransactionStmt(CAST_NODE(TransactionStmt, node));
+ case T_IndexStmt:
+ return ParseIndexStmt(CAST_NODE(IndexStmt, node)) != nullptr;
+ case T_CreateSeqStmt:
+ return ParseCreateSeqStmt(CAST_NODE(CreateSeqStmt, node)) != nullptr;
+ case T_AlterSeqStmt:
+ return ParseAlterSeqStmt(CAST_NODE(AlterSeqStmt, node)) != nullptr;
+ case T_AlterTableStmt:
+ return ParseAlterTableStmt(CAST_NODE(AlterTableStmt, node)) != nullptr;
+ default:
+ NodeNotImplemented(value, node);
+ return false;
}
}
@@ -645,7 +643,7 @@ public:
}
TVector<TPgConst::EType> columnTypes;
- for (auto& maybeColumnType: maybeColumnTypes) {
+ for (auto& maybeColumnType : maybeColumnTypes) {
if (maybeColumnType.Empty()) {
YQL_CLOG(INFO, Default) << "Failed to auto parametrize: can't infer PgType for column";
return {};
@@ -691,7 +689,7 @@ public:
auto& data = type.FinishType();
data.BeginList();
size_t cols = columnTypes.size();
- for (size_t idx = 0; idx < values.size(); idx += cols){
+ for (size_t idx = 0; idx < values.size(); idx += cols) {
data.BeforeItem();
data.BeginTuple();
for (size_t delta = 0; delta < cols; ++delta) {
@@ -858,8 +856,7 @@ public:
[[nodiscard]]
TAstNode* ParseSelectStmt(
const SelectStmt* value,
- const TSelectStmtSettings& selectSettings
- ) {
+ const TSelectStmtSettings& selectSettings) {
if (Settings_.Mode == NSQLTranslation::ESqlMode::LIMITED_VIEW) {
if (HasSelectInLimitedView_) {
AddError("Expected exactly one SELECT in LIMITED_VIEW mode");
@@ -886,7 +883,7 @@ public:
}
TTraverseSelectStack traverseSelectStack;
- traverseSelectStack.push({ value, false });
+ traverseSelectStack.push({value, false});
TVector<const SelectStmt*> setItems;
TVector<TAstNode*> setOpsNodes;
@@ -905,21 +902,24 @@ public:
}
if (!top.second) {
- traverseSelectStack.push({ top.first->rarg, false });
- traverseSelectStack.push({ top.first->larg, false });
+ traverseSelectStack.push({top.first->rarg, false});
+ traverseSelectStack.push({top.first->larg, false});
top.second = true;
} else {
TString op;
switch (top.first->op) {
- case SETOP_UNION:
- op = "union"; break;
- case SETOP_INTERSECT:
- op = "intersect"; break;
- case SETOP_EXCEPT:
- op = "except"; break;
- default:
- AddError(TStringBuilder() << "SetOperation unsupported value: " << (int)top.first->op);
- return nullptr;
+ case SETOP_UNION:
+ op = "union";
+ break;
+ case SETOP_INTERSECT:
+ op = "intersect";
+ break;
+ case SETOP_EXCEPT:
+ op = "except";
+ break;
+ default:
+ AddError(TStringBuilder() << "SetOperation unsupported value: " << (int)top.first->op);
+ return nullptr;
}
if (top.first->all) {
@@ -980,7 +980,6 @@ public:
return nullptr;
}
-
auto lambda = L(A("lambda"), QL(), expr);
distinctOnItems.push_back(L(A("PgGroup"), L(A("Void")), lambda));
}
@@ -1006,7 +1005,7 @@ public:
joinOps.push_back(QL(QL(QA("push"))));
} else {
TTraverseNodeStack traverseNodeStack;
- traverseNodeStack.push({ node, false });
+ traverseNodeStack.push({node, false});
TVector<TAstNode*> oneJoinGroup;
while (!traverseNodeStack.empty()) {
@@ -1038,23 +1037,27 @@ public:
}
if (!top.second) {
- traverseNodeStack.push({ join->rarg, false });
- traverseNodeStack.push({ join->larg, false });
+ traverseNodeStack.push({join->rarg, false});
+ traverseNodeStack.push({join->larg, false});
top.second = true;
} else {
TString op;
switch (join->jointype) {
- case JOIN_INNER:
- op = join->quals ? "inner" : "cross"; break;
- case JOIN_LEFT:
- op = "left"; break;
- case JOIN_FULL:
- op = "full"; break;
- case JOIN_RIGHT:
- op = "right"; break;
- default:
- AddError(TStringBuilder() << "jointype unsupported value: " << (int)join->jointype);
- return nullptr;
+ case JOIN_INNER:
+ op = join->quals ? "inner" : "cross";
+ break;
+ case JOIN_LEFT:
+ op = "left";
+ break;
+ case JOIN_FULL:
+ op = "full";
+ break;
+ case JOIN_RIGHT:
+ op = "right";
+ break;
+ default:
+ AddError(TStringBuilder() << "jointype unsupported value: " << (int)join->jointype);
+ return nullptr;
}
if (ListLength(join->usingClause) > 0) {
@@ -1082,7 +1085,6 @@ public:
}
oneJoinGroup.push_back(QL(QA(op), QA("using"), QVL(fields)));
} else {
-
if (op != "cross" && !join->quals) {
AddError("join_expr: expected quals for non-cross join");
return nullptr;
@@ -1222,7 +1224,7 @@ public:
res.emplace_back(CreatePgStarResultItem());
i++;
}
- bool maybeSelectWithJustSetConfig = !selectSettings.Inner && !sort && windowItems.empty() && !having && !groupBy && !whereFilter && !x->distinctClause && ListLength(x->targetList) == 1;
+ bool maybeSelectWithJustSetConfig = !selectSettings.Inner && !sort && windowItems.empty() && !having && !groupBy && !whereFilter && !x->distinctClause && ListLength(x->targetList) == 1;
if (maybeSelectWithJustSetConfig) {
auto node = ListNodeNth(x->targetList, 0);
if (NodeTag(node) != T_ResTarget) {
@@ -1410,9 +1412,9 @@ public:
State_.Statements.push_back(L(A("let"), A("output"), output));
State_.Statements.push_back(L(A("let"), A("result_sink"), L(A("DataSink"), QA(TString(NYql::ResultProviderName)))));
State_.Statements.push_back(L(A("let"), A("world"), L(A("Write!"),
- A("world"), A("result_sink"), L(A("Key")), A("output"), resOptions)));
+ A("world"), A("result_sink"), L(A("Key")), A("output"), resOptions)));
State_.Statements.push_back(L(A("let"), A("world"), L(A("Commit!"),
- A("world"), A("result_sink"))));
+ A("world"), A("result_sink"))));
return State_.Statements.back();
}
@@ -1466,10 +1468,8 @@ public:
return false;
}
- view.Source = ParseSelectStmt(CAST_NODE(SelectStmt, value->ctequery), {
- .Inner = true,
- .Recursive = recursive ? &view : nullptr
- });
+ view.Source = ParseSelectStmt(CAST_NODE(SelectStmt, value->ctequery), {.Inner = true,
+ .Recursive = recursive ? &view : nullptr});
if (!view.Source) {
return false;
@@ -1544,7 +1544,7 @@ public:
[[nodiscard]]
std::optional<TVector<TAstNode*>> ParseReturningList(const List* returningList) {
- TVector <TAstNode*> list;
+ TVector<TAstNode*> list;
if (ListLength(returningList) == 0) {
return {};
}
@@ -1582,7 +1582,7 @@ public:
return nullptr;
}
- TVector <TAstNode*> returningList;
+ TVector<TAstNode*> returningList;
if (value->returningList) {
auto list = ParseReturningList(value->returningList);
if (list.has_value()) {
@@ -1602,7 +1602,7 @@ public:
return nullptr;
}
- TVector <TAstNode*> targetColumns;
+ TVector<TAstNode*> targetColumns;
if (value->cols) {
for (int i = 0; i < ListLength(value->cols); i++) {
auto node = ListNodeNth(value->cols, i);
@@ -1620,17 +1620,15 @@ public:
}
const auto select = (value->selectStmt)
- ? ParseSelectStmt(
- CAST_NODE(SelectStmt, value->selectStmt),
- {
- .Inner = true,
- .TargetColumns = targetColumns,
- .AllowEmptyResSet = false,
- .EmitPgStar = false,
- .FillTargetColumns = true,
- .UnknownsAllowed = true
- })
- : L(A("Void"));
+ ? ParseSelectStmt(
+ CAST_NODE(SelectStmt, value->selectStmt),
+ {.Inner = true,
+ .TargetColumns = targetColumns,
+ .AllowEmptyResSet = false,
+ .EmitPgStar = false,
+ .FillTargetColumns = true,
+ .UnknownsAllowed = true})
+ : L(A("Void"));
if (!select) {
return nullptr;
}
@@ -1646,9 +1644,7 @@ public:
sink,
key,
select,
- writeOptions
- )
- ));
+ writeOptions)));
return State_.Statements.back();
}
@@ -1656,7 +1652,7 @@ public:
[[nodiscard]]
TAstNode* ParseUpdateStmt(const UpdateStmt* value) {
const auto fromClause = value->fromClause ? value->fromClause : ListMake1(value->relation).get();
- SelectStmt selectStmt {
+ SelectStmt selectStmt{
.type = T_SelectStmt,
.targetList = value->targetList,
.fromClause = fromClause,
@@ -1665,14 +1661,11 @@ public:
};
const auto select = ParseSelectStmt(
&selectStmt,
- {
- .Inner = true,
- .AllowEmptyResSet = true,
- .EmitPgStar = true,
- .FillTargetColumns = false,
- .UnknownsAllowed = true
- }
- );
+ {.Inner = true,
+ .AllowEmptyResSet = true,
+ .EmitPgStar = true,
+ .FillTargetColumns = false,
+ .UnknownsAllowed = true});
if (!select) {
return nullptr;
}
@@ -1699,22 +1692,20 @@ public:
options.push_back(QL(QA("returning"), QVL(returningList.data(), returningList.size())));
}
const auto writeUpdate = L(A("block"), QL(
- L(A("let"), A("update_select"), select),
- L(A("let"), A("sink"), sink),
- L(A("let"), A("key"), key),
- L(A("return"), L(
- A("Write!"),
- A("world"),
- A("sink"),
- A("key"),
- L(A("Void")),
- QVL(options.data(), options.size())))
- ));
+ L(A("let"), A("update_select"), select),
+ L(A("let"), A("sink"), sink),
+ L(A("let"), A("key"), key),
+ L(A("return"), L(
+ A("Write!"),
+ A("world"),
+ A("sink"),
+ A("key"),
+ L(A("Void")),
+ QVL(options.data(), options.size())))));
State_.Statements.push_back(L(
A("let"),
A("world"),
- writeUpdate
- ));
+ writeUpdate));
return State_.Statements.back();
}
@@ -1768,8 +1759,7 @@ public:
return nullptr;
}
-
- view.Source = ParseSelectStmt(CAST_NODE(SelectStmt, value->query), { .Inner = true });
+ view.Source = ParseSelectStmt(CAST_NODE(SelectStmt, value->query), {.Inner = true});
if (!view.Source) {
return nullptr;
}
@@ -1786,7 +1776,6 @@ public:
#pragma region CreateTable
private:
-
struct TColumnInfo {
TString Name;
TString Type;
@@ -1841,8 +1830,9 @@ private:
}
bool FillPrimaryKeyColumns(TCreateTableCtx& ctx, const Constraint* pk) {
- if (!CheckConstraintSupported(pk))
+ if (!CheckConstraintSupported(pk)) {
return false;
+ }
for (int i = 0; i < ListLength(pk->keys); ++i) {
auto node = ListNodeNth(pk->keys, i);
@@ -1863,8 +1853,9 @@ private:
}
bool FillUniqueConstraint(TCreateTableCtx& ctx, const Constraint* constr) {
- if (!CheckConstraintSupported(constr))
+ if (!CheckConstraintSupported(constr)) {
return false;
+ }
const auto length = ListLength(constr->keys);
std::vector<TAstNode*> uniq;
@@ -1888,7 +1879,7 @@ private:
}
const TString& FindColumnTypeAlias(const TString& colType, bool& isTypeSerial) {
- const static std::unordered_map<TString, TString> aliasMap {
+ const static std::unordered_map<TString, TString> aliasMap{
{"smallserial", "int2"},
{"serial2", "int2"},
{"serial", "int4"},
@@ -1915,7 +1906,7 @@ private:
if (node->constraints) {
for (int i = 0; i < ListLength(node->constraints); ++i) {
auto constraintNode =
- CAST_NODE(Constraint, ListNodeNth(node->constraints, i));
+ CAST_NODE(Constraint, ListNodeNth(node->constraints, i));
switch (constraintNode->contype) {
case CONSTR_NOTNULL:
@@ -1954,8 +1945,8 @@ private:
}
// for now we pass just the last part of the type name
- auto colTypeVal = StrVal( ListNodeNth(node->typeName->names,
- ListLength(node->typeName->names) - 1));
+ auto colTypeVal = StrVal(ListNodeNth(node->typeName->names,
+ ListLength(node->typeName->names) - 1));
cinfo.Type = FindColumnTypeAlias(colTypeVal, cinfo.Serial);
auto [it, inserted] = ctx.ColumnsSet.emplace(node->colname, cinfo);
@@ -1986,8 +1977,8 @@ private:
}
} break;
- // TODO: support table-level not null constraints like:
- // CHECK (col1 is not null [OR col2 is not null])
+ // TODO: support table-level not null constraints like:
+ // CHECK (col1 is not null [OR col2 is not null])
default:
AddError("table constraint not supported");
@@ -1999,7 +1990,7 @@ private:
TAstNode* BuildColumnsOptions(TCreateTableCtx& ctx) {
std::vector<TAstNode*> columns;
- for(const auto& name: ctx.ColumnOrder) {
+ for (const auto& name : ctx.ColumnOrder) {
auto it = ctx.ColumnsSet.find(name);
Y_ENSURE(it != ctx.ColumnsSet.end());
@@ -2036,10 +2027,10 @@ private:
for (auto& uniq : ctx.UniqConstr) {
auto columns = QVL(uniq.data(), uniq.size());
options.push_back(QL(QA("index"), QL(
- QL(QA("indexName")),
- QL(QA("indexType"), QA("syncGlobalUnique")),
- QL(QA("dataColumns"), QL()),
- QL(QA("indexColumns"), columns))));
+ QL(QA("indexName")),
+ QL(QA("indexType"), QA("syncGlobalUnique")),
+ QL(QA("dataColumns"), QL()),
+ QL(QA("indexColumns"), columns))));
}
if (ctx.IsTemporary) {
options.push_back(QL(QA("temporary")));
@@ -2051,8 +2042,8 @@ private:
std::vector<TAstNode*> options;
const auto insertMode = (ProviderToInsertModeMap.contains(Provider_))
- ? ProviderToInsertModeMap.at(Provider_)
- : "append";
+ ? ProviderToInsertModeMap.at(Provider_)
+ : "append";
options.push_back(QL(QA("mode"), QA(insertMode)));
if (!returningList.empty()) {
@@ -2111,7 +2102,7 @@ public:
return nullptr;
}
- TCreateTableCtx ctx {};
+ TCreateTableCtx ctx{};
if (value->if_not_exists) {
ctx.IfNotExists = true;
@@ -2159,9 +2150,9 @@ public:
}
State_.Statements.push_back(
- L(A("let"), A("world"),
- L(A("Write!"), A("world"), sink, key, L(A("Void")),
- BuildCreateTableOptions(ctx))));
+ L(A("let"), A("world"),
+ L(A("Write!"), A("world"), sink, key, L(A("Void")),
+ BuildCreateTableOptions(ctx))));
return State_.Statements.back();
}
@@ -2242,8 +2233,7 @@ public:
clusterName,
tableName,
/* isSink */ true,
- /* isScheme */ true
- );
+ /* isScheme */ true);
if (sink == nullptr) {
return nullptr;
}
@@ -2259,10 +2249,7 @@ public:
key,
L(A("Void")),
QL(
- QL(QA("mode"), QA(mode))
- )
- )
- ));
+ QL(QA("mode"), QA(mode))))));
}
return State_.Statements.back();
@@ -2285,8 +2272,7 @@ public:
/* catalogName */ "",
clusterName,
indexName,
- "pgIndex"
- );
+ "pgIndex");
TString missingOk = (value->missing_ok) ? "true" : "false";
State_.Statements.push_back(L(
@@ -2300,10 +2286,7 @@ public:
L(A("Void")),
QL(
QL(QA("mode"), QA("dropIndex")),
- QL(QA("ifExists"), QA(missingOk))
- )
- )
- ));
+ QL(QA("ifExists"), QA(missingOk))))));
}
return State_.Statements.back();
@@ -2326,8 +2309,7 @@ public:
/* catalogName */ "",
clusterName,
indexName,
- "pgSequence"
- );
+ "pgSequence");
TString mode = (value->missing_ok) ? "drop_if_exists" : "drop";
State_.Statements.push_back(L(
@@ -2340,10 +2322,7 @@ public:
key,
L(A("Void")),
QL(
- QL(QA("mode"), QA(mode))
- )
- )
- ));
+ QL(QA("mode"), QA(mode))))));
}
return State_.Statements.back();
@@ -2411,7 +2390,7 @@ public:
} else {
auto configSource = L(A("DataSource"), QA(TString(NYql::ConfigProviderName)));
State_.Statements.push_back(L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource,
- QA(TString(rawStr == "true" ? "" : "Disable") + TString((name == "useblocks") ? "UseBlocks" : "PgEmitAggApply")))));
+ QA(TString(rawStr == "true" ? "" : "Disable") + TString((name == "useblocks") ? "UseBlocks" : "PgEmitAggApply")))));
}
} else {
AddError(TStringBuilder() << "VariableSetStmt, expected string literal for " << value->name << " option");
@@ -2429,7 +2408,7 @@ public:
auto str = to_lower(TString(rawStr));
const bool isDqEngine = name == "dqengine";
auto& enable = isDqEngine ? DqEngineEnabled_ : BlockEngineEnabled_;
- auto& force = isDqEngine ? DqEngineForce_ : BlockEngineForce_;
+ auto& force = isDqEngine ? DqEngineForce_ : BlockEngineForce_;
if (str == "auto") {
enable = true;
force = false;
@@ -2475,7 +2454,7 @@ public:
auto rawStr = StrVal(CAST_NODE(A_Const, arg)->val);
State_.Statements.push_back(L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), providerSource,
- QA("Attr"), QAX(name.substr(dotPos + 1)), QAX(rawStr))));
+ QA("Attr"), QAX(name.substr(dotPos + 1)), QAX(rawStr))));
} else {
AddError(TStringBuilder() << "VariableSetStmt, expected string literal for " << value->name << " option");
return nullptr;
@@ -2542,7 +2521,7 @@ public:
AddError("using is not supported");
return nullptr;
}
- TVector <TAstNode*> returningList;
+ TVector<TAstNode*> returningList;
if (value->returningList) {
auto list = ParseReturningList(value->returningList);
if (list.has_value()) {
@@ -2621,9 +2600,7 @@ public:
sink,
key,
L(A("Void")),
- QVL(options.data(), options.size())
- )
- ));
+ QVL(options.data(), options.size()))));
return State_.Statements.back();
}
@@ -2634,17 +2611,17 @@ public:
if (varName == "server_version_num") {
return GetPostgresServerVersionNum();
}
- if (varName == "standard_conforming_strings"){
+ if (varName == "standard_conforming_strings") {
return "on";
}
- if (varName == "search_path"){
+ if (varName == "search_path") {
auto searchPath = Settings_.GUCSettings->Get("search_path");
return searchPath ? *searchPath : "public";
}
- if (varName == "default_transaction_read_only"){
+ if (varName == "default_transaction_read_only") {
return "off"; // mediawiki
}
- if (varName == "transaction_isolation"){
+ if (varName == "transaction_isolation") {
return "serializable";
}
return {};
@@ -2669,7 +2646,6 @@ public:
return columns;
}
-
[[nodiscard]]
TAstNode* ParseVariableShowStmt(const VariableShowStmt* value) {
const auto varName = to_lower(TString(value->name));
@@ -2698,38 +2674,38 @@ public:
const auto resOptions = BuildResultOptions(true);
State_.Statements.push_back(L(A("let"), A("world"), L(A("Write!"),
- A("world"), A("result_sink"), L(A("Key")), A("output"), resOptions)));
+ A("world"), A("result_sink"), L(A("Key")), A("output"), resOptions)));
State_.Statements.push_back(L(A("let"), A("world"), L(A("Commit!"),
- A("world"), A("result_sink"))));
+ A("world"), A("result_sink"))));
return State_.Statements.back();
}
[[nodiscard]]
bool ParseTransactionStmt(const TransactionStmt* value) {
switch (value->kind) {
- case TRANS_STMT_BEGIN:
- case TRANS_STMT_START:
- case TRANS_STMT_SAVEPOINT:
- case TRANS_STMT_RELEASE:
- case TRANS_STMT_ROLLBACK_TO:
- return true;
- case TRANS_STMT_COMMIT:
- State_.Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
- A("world"))));
- if (Settings_.GUCSettings) {
- Settings_.GUCSettings->Commit();
- }
- return true;
- case TRANS_STMT_ROLLBACK:
- State_.Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
- A("world"), QL(QL(QA("mode"), QA("rollback"))))));
- if (Settings_.GUCSettings) {
- Settings_.GUCSettings->RollBack();
- }
- return true;
- default:
- AddError(TStringBuilder() << "TransactionStmt: kind is not supported: " << (int)value->kind);
- return false;
+ case TRANS_STMT_BEGIN:
+ case TRANS_STMT_START:
+ case TRANS_STMT_SAVEPOINT:
+ case TRANS_STMT_RELEASE:
+ case TRANS_STMT_ROLLBACK_TO:
+ return true;
+ case TRANS_STMT_COMMIT:
+ State_.Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
+ A("world"))));
+ if (Settings_.GUCSettings) {
+ Settings_.GUCSettings->Commit();
+ }
+ return true;
+ case TRANS_STMT_ROLLBACK:
+ State_.Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
+ A("world"), QL(QL(QA("mode"), QA("rollback"))))));
+ if (Settings_.GUCSettings) {
+ Settings_.GUCSettings->RollBack();
+ }
+ return true;
+ default:
+ AddError(TStringBuilder() << "TransactionStmt: kind is not supported: " << (int)value->kind);
+ return false;
}
}
@@ -2761,12 +2737,14 @@ public:
}
auto columns = ParseIndexElements(value->indexParams);
- if (!columns)
+ if (!columns) {
return nullptr;
+ }
auto coverColumns = ParseIndexElements(value->indexIncludingParams);
- if (!coverColumns)
+ if (!coverColumns) {
return nullptr;
+ }
const auto [sink, key] = ParseWriteRangeVar(value->relation, true);
if (!sink || !key) {
@@ -2802,17 +2780,13 @@ public:
L(A("Void")),
QL(
QL(QA("mode"), QA("alter")),
- QL(QA("actions"), QL(QL(QA("addIndex"), QVL(desc.data(), desc.size()))))
- )
- )
- ));
+ QL(QA("actions"), QL(QL(QA("addIndex"), QVL(desc.data(), desc.size()))))))));
return State_.Statements.back();
}
[[nodiscard]]
TAstNode* ParseCreateSeqStmt(const CreateSeqStmt* value) {
-
std::vector<TAstNode*> options;
TString mode = (value->if_not_exists) ? "create_if_not_exists" : "create";
@@ -2822,8 +2796,7 @@ public:
value->sequence->catalogname,
value->sequence->schemaname,
value->sequence->relname,
- "pgSequence"
- );
+ "pgSequence");
if (!sink || !key) {
return nullptr;
@@ -2865,7 +2838,7 @@ public:
const auto* typeName = CAST_NODE_EXT(PG_TypeName, T_TypeName, defElem->arg);
if (ListLength(typeName->names) > 0) {
options.emplace_back(QL(QAX(nameElem),
- QAX(StrVal(ListNodeNth(typeName->names, ListLength(typeName->names) - 1)))));
+ QAX(StrVal(ListNodeNth(typeName->names, ListLength(typeName->names) - 1)))));
}
break;
}
@@ -2891,16 +2864,15 @@ public:
}
State_.Statements.push_back(
- L(A("let"), A("world"),
- L(A("Write!"), A("world"), sink, key, L(A("Void")),
- QVL(options.data(), options.size()))));
+ L(A("let"), A("world"),
+ L(A("Write!"), A("world"), sink, key, L(A("Void")),
+ QVL(options.data(), options.size()))));
return State_.Statements.back();
}
[[nodiscard]]
TAstNode* ParseAlterSeqStmt(const AlterSeqStmt* value) {
-
std::vector<TAstNode*> options;
TString mode = (value->missing_ok) ? "alter_if_exists" : "alter";
@@ -2910,8 +2882,7 @@ public:
value->sequence->catalogname,
value->sequence->schemaname,
value->sequence->relname,
- "pgSequence"
- );
+ "pgSequence");
if (!sink || !key) {
return nullptr;
@@ -2939,7 +2910,7 @@ public:
const auto* typeName = CAST_NODE_EXT(PG_TypeName, T_TypeName, defElem->arg);
if (ListLength(typeName->names) > 0) {
options.emplace_back(QL(QAX(nameElem),
- QAX(StrVal(ListNodeNth(typeName->names, ListLength(typeName->names) - 1)))));
+ QAX(StrVal(ListNodeNth(typeName->names, ListLength(typeName->names) - 1)))));
}
break;
}
@@ -2965,9 +2936,9 @@ public:
}
State_.Statements.push_back(
- L(A("let"), A("world"),
- L(A("Write!"), A("world"), sink, key, L(A("Void")),
- QVL(options.data(), options.size()))));
+ L(A("let"), A("world"),
+ L(A("Write!"), A("world"), sink, key, L(A("Void")),
+ QVL(options.data(), options.size()))));
return State_.Statements.back();
}
@@ -3052,33 +3023,31 @@ public:
}
}
- std::vector<TAstNode*> actions { QL(QA("alterColumns"), QVL(alterColumns.data(), alterColumns.size())) };
+ std::vector<TAstNode*> actions{QL(QA("alterColumns"), QVL(alterColumns.data(), alterColumns.size()))};
options.push_back(
QL(QA("actions"),
- QVL(actions.data(), actions.size())
- )
- );
+ QVL(actions.data(), actions.size())));
State_.Statements.push_back(
- L(A("let"), A("world"),
- L(A("Write!"), A("world"), sink, key, L(A("Void")),
- QVL(options.data(), options.size()))));
+ L(A("let"), A("world"),
+ L(A("Write!"), A("world"), sink, key, L(A("Void")),
+ QVL(options.data(), options.size()))));
return State_.Statements.back();
}
TMaybe<TFromDesc> ParseFromClause(const Node* node) {
switch (NodeTag(node)) {
- case T_RangeVar:
- return ParseRangeVar(CAST_NODE(RangeVar, node));
- case T_RangeSubselect:
- return ParseRangeSubselect(CAST_NODE(RangeSubselect, node));
- case T_RangeFunction:
- return ParseRangeFunction(CAST_NODE(RangeFunction, node));
- default:
- NodeNotImplementedImpl<SelectStmt>(node);
- return {};
+ case T_RangeVar:
+ return ParseRangeVar(CAST_NODE(RangeVar, node));
+ case T_RangeSubselect:
+ return ParseRangeSubselect(CAST_NODE(RangeSubselect, node));
+ case T_RangeFunction:
+ return ParseRangeFunction(CAST_NODE(RangeFunction, node));
+ default:
+ NodeNotImplementedImpl<SelectStmt>(node);
+ return {};
}
}
@@ -3127,7 +3096,7 @@ public:
}
if (schemaname == "public") {
- return Settings_.DefaultCluster;;
+ return Settings_.DefaultCluster;
}
if (schemaname == "" && Settings_.GUCSettings) {
auto search_path = Settings_.GUCSettings->Get("search_path");
@@ -3141,64 +3110,61 @@ public:
TAstNode* BuildClusterSinkOrSourceExpression(
bool isSink, const TStringBuf schemaname) {
- TString usedCluster(schemaname);
- auto p = Settings_.ClusterMapping.FindPtr(usedCluster);
- if (!p) {
- usedCluster = to_lower(usedCluster);
- p = Settings_.ClusterMapping.FindPtr(usedCluster);
- }
-
- if (!p) {
- AddError(TStringBuilder() << "Unknown cluster: " << schemaname);
- return nullptr;
- }
+ TString usedCluster(schemaname);
+ auto p = Settings_.ClusterMapping.FindPtr(usedCluster);
+ if (!p) {
+ usedCluster = to_lower(usedCluster);
+ p = Settings_.ClusterMapping.FindPtr(usedCluster);
+ }
+
+ if (!p) {
+ AddError(TStringBuilder() << "Unknown cluster: " << schemaname);
+ return nullptr;
+ }
- return L(isSink ? A("DataSink") : A("DataSource"), QAX(*p), QAX(usedCluster));
+ return L(isSink ? A("DataSink") : A("DataSource"), QAX(*p), QAX(usedCluster));
}
TAstNode* BuildTableKeyExpression(const TStringBuf relname,
- const TStringBuf cluster, bool isScheme = false
- ) {
+ const TStringBuf cluster, bool isScheme = false) {
auto lowerCluster = to_lower(TString(cluster));
bool noPrefix = (lowerCluster == "pg_catalog" || lowerCluster == "information_schema");
TString tableName = noPrefix ? to_lower(TString(relname)) : TablePathPrefix_ + relname;
return L(A("Key"), QL(QA(isScheme ? "tablescheme" : "table"),
- L(A("String"), QAX(std::move(tableName)))));
+ L(A("String"), QAX(std::move(tableName)))));
}
TReadWriteKeyExprs ParseQualifiedRelationName(const TStringBuf catalogname,
const TStringBuf schemaname,
const TStringBuf relname,
bool isSink, bool isScheme) {
- if (!catalogname.empty()) {
- AddError("catalogname is not supported");
- return {};
- }
- if (relname.empty()) {
- AddError("relname should be specified");
- return {};
- }
+ if (!catalogname.empty()) {
+ AddError("catalogname is not supported");
+ return {};
+ }
+ if (relname.empty()) {
+ AddError("relname should be specified");
+ return {};
+ }
- const auto cluster = ResolveCluster(schemaname, TString(relname));
- const auto sinkOrSource = BuildClusterSinkOrSourceExpression(isSink, cluster);
- const auto key = BuildTableKeyExpression(relname, cluster, isScheme);
- return {sinkOrSource, key};
+ const auto cluster = ResolveCluster(schemaname, TString(relname));
+ const auto sinkOrSource = BuildClusterSinkOrSourceExpression(isSink, cluster);
+ const auto key = BuildTableKeyExpression(relname, cluster, isScheme);
+ return {sinkOrSource, key};
}
-
TAstNode* BuildPgObjectExpression(const TStringBuf objectName, const TStringBuf objectType) {
bool noPrefix = (objectType == "pgIndex");
TString name = noPrefix ? TString(objectName) : TablePathPrefix_ + TString(objectName);
return L(A("Key"), QL(QA("pgObject"),
L(A("String"), QAX(std::move(name))),
- L(A("String"), QA(objectType))
- ));
+ L(A("String"), QA(objectType))));
}
TReadWriteKeyExprs ParseQualifiedPgObjectName(const TStringBuf catalogname,
- const TStringBuf schemaname,
- const TStringBuf objectName,
- const TStringBuf pgObjectType) {
+ const TStringBuf schemaname,
+ const TStringBuf objectName,
+ const TStringBuf pgObjectType) {
if (!catalogname.empty()) {
AddError("catalogname is not supported");
return {};
@@ -3214,16 +3180,16 @@ public:
return {sinkOrSource, key};
}
- TReadWriteKeyExprs ParseWriteRangeVar(const RangeVar *value,
+ TReadWriteKeyExprs ParseWriteRangeVar(const RangeVar* value,
bool isScheme = false) {
- if (value->alias) {
- AddError("alias is not supported");
- return {};
- }
+ if (value->alias) {
+ AddError("alias is not supported");
+ return {};
+ }
- return ParseQualifiedRelationName(value->catalogname, value->schemaname,
- value->relname,
- /* isSink */ true, isScheme);
+ return ParseQualifiedRelationName(value->catalogname, value->schemaname,
+ value->relname,
+ /* isSink */ true, isScheme);
}
TMaybe<TFromDesc> ParseRangeVar(const RangeVar* value) {
@@ -3261,25 +3227,25 @@ public:
}
if (view) {
- return TFromDesc{view->Source, alias, colnames.empty() ? view->ColNames : colnames, false };
+ return TFromDesc{view->Source, alias, colnames.empty() ? view->ColNames : colnames, false};
}
TString schemaname = value->schemaname;
if (!StrCompare(value->schemaname, "bindings")) {
bool isBinding = false;
switch (Settings_.BindingsMode) {
- case NSQLTranslation::EBindingsMode::DISABLED:
- AddError("Please remove 'bindings.' from your query, the support for this syntax has ended");
- return {};
- case NSQLTranslation::EBindingsMode::ENABLED:
- isBinding = true;
- break;
- case NSQLTranslation::EBindingsMode::DROP_WITH_WARNING:
- AddWarning(TIssuesIds::YQL_DEPRECATED_BINDINGS, "Please remove 'bindings.' from your query, the support for this syntax will be dropped soon");
- [[fallthrough]];
- case NSQLTranslation::EBindingsMode::DROP:
- schemaname = Settings_.DefaultCluster;
- break;
+ case NSQLTranslation::EBindingsMode::DISABLED:
+ AddError("Please remove 'bindings.' from your query, the support for this syntax has ended");
+ return {};
+ case NSQLTranslation::EBindingsMode::ENABLED:
+ isBinding = true;
+ break;
+ case NSQLTranslation::EBindingsMode::DROP_WITH_WARNING:
+ AddWarning(TIssuesIds::YQL_DEPRECATED_BINDINGS, "Please remove 'bindings.' from your query, the support for this syntax will be dropped soon");
+ [[fallthrough]];
+ case NSQLTranslation::EBindingsMode::DROP:
+ schemaname = Settings_.DefaultCluster;
+ break;
}
if (isBinding) {
@@ -3287,11 +3253,10 @@ public:
if (!s) {
return {};
}
- return TFromDesc{ s, alias, colnames, true };
+ return TFromDesc{s, alias, colnames, true};
}
}
-
const auto [source, key] = ParseQualifiedRelationName(
value->catalogname, schemaname, value->relname,
/* isSink */ false,
@@ -3299,26 +3264,22 @@ public:
if (source == nullptr || key == nullptr) {
return {};
}
- const auto readExpr = this->SqlProcArgsCount_ ?
- L(A("Cons!"),
- A("world"),
- L(
- A("PgTableContent"),
- QA("pg_catalog"),
- QAX(value->relname),
- L(A("Void")),
- QL()
- )
- ) :
- L(
- A("Read!"),
- A("world"),
- source,
- key,
- L(A("Void")),
- QL()
- );
- return TFromDesc {
+ const auto readExpr = this->SqlProcArgsCount_ ? L(A("Cons!"),
+ A("world"),
+ L(
+ A("PgTableContent"),
+ QA("pg_catalog"),
+ QAX(value->relname),
+ L(A("Void")),
+ QL()))
+ : L(
+ A("Read!"),
+ A("world"),
+ source,
+ key,
+ L(A("Void")),
+ QL());
+ return TFromDesc{
readExpr,
alias,
colnames,
@@ -3357,25 +3318,20 @@ public:
auto source = L(A("DataSource"), QAX(bindingInfo.ClusterType), QAX(bindingInfo.Cluster));
return L(
- A("Read!"),
- A("world"),
- source,
- L(
- A("MrTableConcat"),
- L(
- A("Key"),
- QL(
+ A("Read!"),
+ A("world"),
+ source,
+ L(
+ A("MrTableConcat"),
+ L(
+ A("Key"),
+ QL(
QA("table"),
L(
- A("String"),
- QAX(bindingInfo.Path)
- )
- )
- )
- ),
- L(A("Void")),
- QVL(hints.data(), hints.size())
- );
+ A("String"),
+ QAX(bindingInfo.Path))))),
+ L(A("Void")),
+ QVL(hints.data(), hints.size()));
}
TMaybe<TFromDesc> ParseRangeFunction(const RangeFunction* value) {
@@ -3440,7 +3396,7 @@ public:
return {};
}
- return TFromDesc{ func, alias, colnames, injectRead };
+ return TFromDesc{func, alias, colnames, injectRead};
}
TMaybe<TFromDesc> ParseRangeSubselect(const RangeSubselect* value) {
@@ -3470,7 +3426,7 @@ public:
return {};
}
- return TFromDesc{ ParseSelectStmt(CAST_NODE(SelectStmt, value->subquery), { .Inner = true }), alias, colnames, false };
+ return TFromDesc{ParseSelectStmt(CAST_NODE(SelectStmt, value->subquery), {.Inner = true}), alias, colnames, false};
}
TAstNode* ParseNullTestExpr(const NullTest* value, const TExprSettings& settings) {
@@ -3517,7 +3473,6 @@ public:
result.Pred = VL(&preds[0], preds.size());
result.Value = L(A("If"), left.Pred, left.Value, right.Value);
return result;
-
}
TAstNode* ParseCaseExpr(const CaseExpr* value, const TExprSettings& settings) {
@@ -3542,15 +3497,14 @@ public:
}
whenExpr = L(A("Coalesce"),
- L(A("FromPg"), whenExpr),
- L(A("Bool"), QA("false"))
- );
+ L(A("FromPg"), whenExpr),
+ L(A("Bool"), QA("false")));
auto whenResult = ParseExpr(Expr2Node(whenNode->result), settings);
if (!whenResult) {
return nullptr;
}
- branches.emplace_back(TCaseBranch{ .Pred = whenExpr,.Value = whenResult });
+ branches.emplace_back(TCaseBranch{.Pred = whenExpr, .Value = whenResult});
}
TAstNode* defaultResult = nullptr;
if (value->defresult) {
@@ -3594,49 +3548,45 @@ public:
TAstNode* ParseSQLValueFunction(const SQLValueFunction* value) {
AT_LOCATION(value);
switch (value->op) {
- case SVFOP_CURRENT_DATE:
- return L(A("PgCast"),
- L(A("PgCall"), QA("now"), QL()),
- L(A("PgType"), QA("date"))
- );
- case SVFOP_CURRENT_TIME:
- return L(A("PgCast"),
- L(A("PgCall"), QA("now"), QL()),
- L(A("PgType"), QA("timetz"))
- );
- case SVFOP_CURRENT_TIME_N:
- return L(A("PgCast"),
- L(A("PgCall"), QA("now"), QL()),
- L(A("PgType"), QA("timetz")),
- L(A("PgConst"), QA(ToString(value->typmod)), L(A("PgType"), QA("int4")))
- );
- case SVFOP_CURRENT_TIMESTAMP:
- return L(A("PgCall"), QA("now"), QL());
- case SVFOP_CURRENT_TIMESTAMP_N:
- return L(A("PgCast"),
- L(A("PgCall"), QA("now"), QL()),
- L(A("PgType"), QA("timestamptz")),
- L(A("PgConst"), QA(ToString(value->typmod)), L(A("PgType"), QA("int4")))
- );
- case SVFOP_CURRENT_USER:
- case SVFOP_CURRENT_ROLE:
- case SVFOP_USER: {
- auto user = Settings_.GUCSettings->Get("ydb_user");
- return L(A("PgConst"), user ? QAX(TString(*user)) : QA("postgres"), L(A("PgType"), QA("name")));
- }
- case SVFOP_CURRENT_CATALOG: {
- std::optional<TString> database;
- if (Settings_.GUCSettings) {
- database = Settings_.GUCSettings->Get("ydb_database");
- }
-
- return L(A("PgConst"), QA(database ? *database : "postgres"), L(A("PgType"), QA("name")));
- }
- case SVFOP_CURRENT_SCHEMA:
- return GetCurrentSchema();
- default:
- AddError(TStringBuilder() << "Usupported SQLValueFunction: " << (int)value->op);
- return nullptr;
+ case SVFOP_CURRENT_DATE:
+ return L(A("PgCast"),
+ L(A("PgCall"), QA("now"), QL()),
+ L(A("PgType"), QA("date")));
+ case SVFOP_CURRENT_TIME:
+ return L(A("PgCast"),
+ L(A("PgCall"), QA("now"), QL()),
+ L(A("PgType"), QA("timetz")));
+ case SVFOP_CURRENT_TIME_N:
+ return L(A("PgCast"),
+ L(A("PgCall"), QA("now"), QL()),
+ L(A("PgType"), QA("timetz")),
+ L(A("PgConst"), QA(ToString(value->typmod)), L(A("PgType"), QA("int4"))));
+ case SVFOP_CURRENT_TIMESTAMP:
+ return L(A("PgCall"), QA("now"), QL());
+ case SVFOP_CURRENT_TIMESTAMP_N:
+ return L(A("PgCast"),
+ L(A("PgCall"), QA("now"), QL()),
+ L(A("PgType"), QA("timestamptz")),
+ L(A("PgConst"), QA(ToString(value->typmod)), L(A("PgType"), QA("int4"))));
+ case SVFOP_CURRENT_USER:
+ case SVFOP_CURRENT_ROLE:
+ case SVFOP_USER: {
+ auto user = Settings_.GUCSettings->Get("ydb_user");
+ return L(A("PgConst"), user ? QAX(TString(*user)) : QA("postgres"), L(A("PgType"), QA("name")));
+ }
+ case SVFOP_CURRENT_CATALOG: {
+ std::optional<TString> database;
+ if (Settings_.GUCSettings) {
+ database = Settings_.GUCSettings->Get("ydb_database");
+ }
+
+ return L(A("PgConst"), QA(database ? *database : "postgres"), L(A("PgType"), QA("name")));
+ }
+ case SVFOP_CURRENT_SCHEMA:
+ return GetCurrentSchema();
+ default:
+ AddError(TStringBuilder() << "Usupported SQLValueFunction: " << (int)value->op);
+ return nullptr;
}
}
@@ -3709,55 +3659,55 @@ public:
TAstNode* ParseExpr(const Node* node, const TExprSettings& settings) {
switch (NodeTag(node)) {
- case T_A_Const: {
- return ParseAConst(CAST_NODE(A_Const, node), settings);
- }
- case T_A_Expr: {
- return ParseAExpr(CAST_NODE(A_Expr, node), settings);
- }
- case T_CaseExpr: {
- return ParseCaseExpr(CAST_NODE(CaseExpr, node), settings);
- }
- case T_ColumnRef: {
- return ParseColumnRef(CAST_NODE(ColumnRef, node), settings);
- }
- case T_TypeCast: {
- return ParseTypeCast(CAST_NODE(TypeCast, node), settings);
- }
- case T_BoolExpr: {
- return ParseBoolExpr(CAST_NODE(BoolExpr, node), settings);
- }
- case T_NullTest: {
- return ParseNullTestExpr(CAST_NODE(NullTest, node), settings);
- }
- case T_FuncCall: {
- bool injectRead;
- return ParseFuncCall(CAST_NODE(FuncCall, node), settings, false, injectRead);
- }
- case T_A_ArrayExpr: {
- return ParseAArrayExpr(CAST_NODE(A_ArrayExpr, node), settings);
- }
- case T_SubLink: {
- return ParseSubLinkExpr(CAST_NODE(SubLink, node), settings);
- }
- case T_CoalesceExpr: {
- return ParseCoalesceExpr(CAST_NODE(CoalesceExpr, node), settings);
- }
- case T_GroupingFunc: {
- return ParseGroupingFunc(CAST_NODE(GroupingFunc, node));
- }
- case T_ParamRef: {
- return ParseParamRefExpr(CAST_NODE(ParamRef, node));
- }
- case T_SQLValueFunction: {
- return ParseSQLValueFunction(CAST_NODE(SQLValueFunction, node));
- }
- case T_BooleanTest: {
- return ParseBooleanTest(CAST_NODE(BooleanTest, node), settings);
- }
- default:
- NodeNotImplemented(node);
- return nullptr;
+ case T_A_Const: {
+ return ParseAConst(CAST_NODE(A_Const, node), settings);
+ }
+ case T_A_Expr: {
+ return ParseAExpr(CAST_NODE(A_Expr, node), settings);
+ }
+ case T_CaseExpr: {
+ return ParseCaseExpr(CAST_NODE(CaseExpr, node), settings);
+ }
+ case T_ColumnRef: {
+ return ParseColumnRef(CAST_NODE(ColumnRef, node), settings);
+ }
+ case T_TypeCast: {
+ return ParseTypeCast(CAST_NODE(TypeCast, node), settings);
+ }
+ case T_BoolExpr: {
+ return ParseBoolExpr(CAST_NODE(BoolExpr, node), settings);
+ }
+ case T_NullTest: {
+ return ParseNullTestExpr(CAST_NODE(NullTest, node), settings);
+ }
+ case T_FuncCall: {
+ bool injectRead;
+ return ParseFuncCall(CAST_NODE(FuncCall, node), settings, false, injectRead);
+ }
+ case T_A_ArrayExpr: {
+ return ParseAArrayExpr(CAST_NODE(A_ArrayExpr, node), settings);
+ }
+ case T_SubLink: {
+ return ParseSubLinkExpr(CAST_NODE(SubLink, node), settings);
+ }
+ case T_CoalesceExpr: {
+ return ParseCoalesceExpr(CAST_NODE(CoalesceExpr, node), settings);
+ }
+ case T_GroupingFunc: {
+ return ParseGroupingFunc(CAST_NODE(GroupingFunc, node));
+ }
+ case T_ParamRef: {
+ return ParseParamRefExpr(CAST_NODE(ParamRef, node));
+ }
+ case T_SQLValueFunction: {
+ return ParseSQLValueFunction(CAST_NODE(SQLValueFunction, node));
+ }
+ case T_BooleanTest: {
+ return ParseBooleanTest(CAST_NODE(BooleanTest, node), settings);
+ }
+ default:
+ NodeNotImplemented(node);
+ return nullptr;
}
}
@@ -3779,8 +3729,8 @@ public:
}
TAstNode* pgTypeNode = !value->isnull
- ? L(A("PgType"), QA(TPgConst::ToString(valueNType->Type)))
- : L(A("PgType"), QA("unknown"));
+ ? L(A("PgType"), QA(TPgConst::ToString(valueNType->Type)))
+ : L(A("PgType"), QA("unknown"));
if (Settings_.AutoParametrizeEnabled && settings.AutoParametrizeEnabled) {
return AutoParametrizeConst(std::move(valueNType.GetRef()), pgTypeNode);
@@ -3862,18 +3812,18 @@ public:
AT_LOCATION(value);
TString mode;
switch (value->kind) {
- case GROUPING_SET_ROLLUP:
- mode = "rollup";
- break;
- case GROUPING_SET_CUBE:
- mode = "cube";
- break;
- case GROUPING_SET_SETS:
- mode = "sets";
- break;
- default:
- AddError(TStringBuilder() << "Unexpected grouping set kind: " << (int)value->kind);
- return nullptr;
+ case GROUPING_SET_ROLLUP:
+ mode = "rollup";
+ break;
+ case GROUPING_SET_CUBE:
+ mode = "cube";
+ break;
+ case GROUPING_SET_SETS:
+ mode = "sets";
+ break;
+ default:
+ AddError(TStringBuilder() << "Unexpected grouping set kind: " << (int)value->kind);
+ return nullptr;
}
auto innerSettings = settings;
@@ -3938,7 +3888,6 @@ public:
return VL(args.data(), args.size());
}
-
TAstNode* ParseSubLinkExpr(const SubLink* value, const TExprSettings& settings) {
AT_LOCATION(value);
if (!settings.AllowSubLinks) {
@@ -3949,26 +3898,26 @@ public:
TString linkType;
TString operName;
switch (value->subLinkType) {
- case EXISTS_SUBLINK:
- linkType = "exists";
- break;
- case ALL_SUBLINK:
- linkType = "all";
- operName = "=";
- break;
- case ANY_SUBLINK:
- linkType = "any";
- operName = "=";
- break;
- case EXPR_SUBLINK:
- linkType = "expr";
- break;
- case ARRAY_SUBLINK:
- linkType = "array";
- break;
- default:
- AddError(TStringBuilder() << "SublinkExpr: unsupported link type: " << (int)value->subLinkType);
- return nullptr;
+ case EXISTS_SUBLINK:
+ linkType = "exists";
+ break;
+ case ALL_SUBLINK:
+ linkType = "all";
+ operName = "=";
+ break;
+ case ANY_SUBLINK:
+ linkType = "any";
+ operName = "=";
+ break;
+ case EXPR_SUBLINK:
+ linkType = "expr";
+ break;
+ case ARRAY_SUBLINK:
+ linkType = "array";
+ break;
+ default:
+ AddError(TStringBuilder() << "SublinkExpr: unsupported link type: " << (int)value->subLinkType);
+ return nullptr;
}
if (ListLength(value->operName) > 1) {
@@ -4036,7 +3985,7 @@ public:
TVector<TAstNode*> concatArgs;
concatArgs.push_back(A("MrTableConcat"));
for (const auto& s : argStrs) {
- concatArgs.push_back(L(A("Key"), QL(QA("table"),L(A("String"), QAX(s)))));
+ concatArgs.push_back(L(A("Key"), QL(QA("table"), L(A("String"), QAX(s)))));
}
key = VL(concatArgs);
@@ -4050,8 +3999,8 @@ public:
concatArgs.push_back(A("MrTableConcat"));
for (ui32 i = 0; i < argStrs.size(); i += 2) {
concatArgs.push_back(L(A("Key"),
- QL(QA("table"),L(A("String"), QAX(argStrs[i]))),
- QL(QA("view"),L(A("String"), QAX(argStrs[i + 1])))));
+ QL(QA("table"), L(A("String"), QAX(argStrs[i]))),
+ QL(QA("view"), L(A("String"), QAX(argStrs[i + 1])))));
}
key = VL(concatArgs);
@@ -4064,22 +4013,21 @@ public:
options = QL(QL(QA("ignorenonexisting")));
TAstNode* expr;
if (argStrs.size() == 1) {
- expr = L(A("Bool"),QA("true"));
+ expr = L(A("Bool"), QA("true"));
} else if (argStrs.size() == 2) {
- expr = L(A(">="),A("item"),L(A("String"),QAX(argStrs[1])));
+ expr = L(A(">="), A("item"), L(A("String"), QAX(argStrs[1])));
} else {
expr = L(A("And"),
- L(A(">="),A("item"),L(A("String"),QAX(argStrs[1]))),
- L(A("<="),A("item"),L(A("String"),QAX(argStrs[2])))
- );
+ L(A(">="), A("item"), L(A("String"), QAX(argStrs[1]))),
+ L(A("<="), A("item"), L(A("String"), QAX(argStrs[2]))));
}
auto lambda = L(A("lambda"), QL(A("item")), expr);
auto range = L(A("MrTableRange"), QAX(argStrs[0]), lambda, QAX(argStrs.size() < 4 ? "" : argStrs[3]));
if (argStrs.size() < 5) {
- key = L(A("Key"), QL(QA("table"),range));
+ key = L(A("Key"), QL(QA("table"), range));
} else {
- key = L(A("Key"), QL(QA("table"),range), QL(QA("view"),L(A("String"), QAX(argStrs[4]))));
+ key = L(A("Key"), QL(QA("table"), range), QL(QA("view"), L(A("String"), QAX(argStrs[4]))));
}
} else if (lowerName == "regexp" || lowerName == "like") {
if (argStrs.size() < 2 || argStrs.size() > 4) {
@@ -4090,23 +4038,23 @@ public:
options = QL(QL(QA("ignorenonexisting")));
TAstNode* expr;
if (lowerName == "regexp") {
- expr = L(A("Apply"),L(A("Udf"),QA("Re2.Grep"),
- QL(L(A("String"),QAX(argStrs[1])),L(A("Null")))),
- A("item"));
+ expr = L(A("Apply"), L(A("Udf"), QA("Re2.Grep"),
+ QL(L(A("String"), QAX(argStrs[1])), L(A("Null")))),
+ A("item"));
} else {
- expr = L(A("Apply"),L(A("Udf"),QA("Re2.Match"),
- QL(L(A("Apply"),
- L(A("Udf"), QA("Re2.PatternFromLike")),
- L(A("String"),QAX(argStrs[1]))),L(A("Null")))),
- A("item"));
+ expr = L(A("Apply"), L(A("Udf"), QA("Re2.Match"),
+ QL(L(A("Apply"),
+ L(A("Udf"), QA("Re2.PatternFromLike")),
+ L(A("String"), QAX(argStrs[1]))), L(A("Null")))),
+ A("item"));
}
auto lambda = L(A("lambda"), QL(A("item")), expr);
auto range = L(A("MrTableRange"), QAX(argStrs[0]), lambda, QAX(argStrs.size() < 3 ? "" : argStrs[2]));
if (argStrs.size() < 4) {
- key = L(A("Key"), QL(QA("table"),range));
+ key = L(A("Key"), QL(QA("table"), range));
} else {
- key = L(A("Key"), QL(QA("table"),range), QL(QA("view"),L(A("String"), QAX(argStrs[3]))));
+ key = L(A("Key"), QL(QA("table"), range), QL(QA("view"), L(A("String"), QAX(argStrs[3]))));
}
} else {
AddError(TStringBuilder() << "Unknown table function: " << name);
@@ -4119,8 +4067,7 @@ public:
source,
key,
L(A("Void")),
- options
- );
+ options);
}
TAstNode* ParseFuncCall(const FuncCall* value, const TExprSettings& settings, bool rangeFunction, bool& injectRead) {
@@ -4187,12 +4134,12 @@ public:
}
// for zabbix https://github.com/ydb-platform/ydb/issues/2904
- if (name == "pg_try_advisory_lock" || name == "pg_try_advisory_lock_shared" || name == "pg_advisory_unlock" || name == "pg_try_advisory_xact_lock" || name == "pg_try_advisory_xact_lock_shared"){
+ if (name == "pg_try_advisory_lock" || name == "pg_try_advisory_lock_shared" || name == "pg_advisory_unlock" || name == "pg_try_advisory_xact_lock" || name == "pg_try_advisory_xact_lock_shared") {
AddWarning(TIssuesIds::PG_COMPAT, name + " function forced to return OK without waiting and without really lock/unlock");
- return L(A("PgConst"), QA("true"), L(A("PgType"), QA("bool")));
+ return L(A("PgConst"), QA("true"), L(A("PgType"), QA("bool")));
}
- if (name == "pg_advisory_lock" || name == "pg_advisory_lock_shared" || name == "pg_advisory_unlock_all" || name == "pg_advisory_xact_lock" || name == "pg_advisory_xact_lock_shared"){
+ if (name == "pg_advisory_lock" || name == "pg_advisory_lock_shared" || name == "pg_advisory_unlock_all" || name == "pg_advisory_xact_lock" || name == "pg_advisory_xact_lock_shared") {
AddWarning(TIssuesIds::PG_COMPAT, name + " function forced to return OK without waiting and without really lock/unlock");
return L(A("Null"));
}
@@ -4330,16 +4277,17 @@ public:
auto arg = value->arg;
auto typeName = value->typeName;
auto supportedTypeName = typeName->typeOid == 0 &&
- !typeName->setof &&
- !typeName->pct_type &&
- (ListLength(typeName->names) == 2 &&
- NodeTag(ListNodeNth(typeName->names, 0)) == T_String &&
- !StrICompare(StrVal(ListNodeNth(typeName->names, 0)), "pg_catalog") || ListLength(typeName->names) == 1) &&
- NodeTag(ListNodeNth(typeName->names, ListLength(typeName->names) - 1)) == T_String;
+ !typeName->setof &&
+ !typeName->pct_type &&
+ (ListLength(typeName->names) == 2 &&
+ NodeTag(ListNodeNth(typeName->names, 0)) == T_String &&
+ !StrICompare(StrVal(ListNodeNth(typeName->names, 0)), "pg_catalog") ||
+ ListLength(typeName->names) == 1) &&
+ NodeTag(ListNodeNth(typeName->names, ListLength(typeName->names) - 1)) == T_String;
if (NodeTag(arg) == T_A_Const &&
(NodeTag(CAST_NODE(A_Const, arg)->val) == T_String ||
- CAST_NODE(A_Const, arg)->isnull) &&
+ CAST_NODE(A_Const, arg)->isnull) &&
supportedTypeName &&
typeName->typemod == -1 &&
ListLength(typeName->typmods) == 0 &&
@@ -4448,28 +4396,28 @@ public:
TAstNode* ParseBoolExpr(const BoolExpr* value, const TExprSettings& settings) {
AT_LOCATION(value);
switch (value->boolop) {
- case AND_EXPR: {
- return ParseAndOrExpr(value, settings, "PgAnd");
- }
- case OR_EXPR: {
- return ParseAndOrExpr(value, settings, "PgOr");
- }
- case NOT_EXPR: {
- if (ListLength(value->args) != 1) {
- AddError("Expected 1 arg for NOT");
- return nullptr;
+ case AND_EXPR: {
+ return ParseAndOrExpr(value, settings, "PgAnd");
}
-
- auto arg = ParseExpr(ListNodeNth(value->args, 0), settings);
- if (!arg) {
- return nullptr;
+ case OR_EXPR: {
+ return ParseAndOrExpr(value, settings, "PgOr");
}
+ case NOT_EXPR: {
+ if (ListLength(value->args) != 1) {
+ AddError("Expected 1 arg for NOT");
+ return nullptr;
+ }
- return L(A("PgNot"), arg);
- }
- default:
- AddError(TStringBuilder() << "BoolExprType unsupported value: " << (int)value->boolop);
- return nullptr;
+ auto arg = ParseExpr(ListNodeNth(value->args, 0), settings);
+ if (!arg) {
+ return nullptr;
+ }
+
+ return L(A("PgNot"), arg);
+ }
+ default:
+ AddError(TStringBuilder() << "BoolExprType unsupported value: " << (int)value->boolop);
+ return nullptr;
}
}
@@ -4706,8 +4654,7 @@ public:
}
TAstNode* ConvertFrameOffset(const Node* off) {
- if (NodeTag(off) == T_A_Const
- && NodeTag(CAST_NODE(A_Const, off)->val) == T_Integer) {
+ if (NodeTag(off) == T_A_Const && NodeTag(CAST_NODE(A_Const, off)->val) == T_Integer) {
return L(A("Int32"), QA(ToString(IntVal(CAST_NODE(A_Const, off)->val))));
} else {
TExprSettings settings;
@@ -4727,32 +4674,32 @@ public:
bool asc = true;
bool nullsFirst = true;
switch (value->sortby_dir) {
- case SORTBY_DEFAULT:
- case SORTBY_ASC:
- if (Settings_.PgSortNulls) {
- nullsFirst = false;
- }
- break;
- case SORTBY_DESC:
- asc = false;
- break;
- default:
- AddError(TStringBuilder() << "sortby_dir unsupported value: " << (int)value->sortby_dir);
- return nullptr;
+ case SORTBY_DEFAULT:
+ case SORTBY_ASC:
+ if (Settings_.PgSortNulls) {
+ nullsFirst = false;
+ }
+ break;
+ case SORTBY_DESC:
+ asc = false;
+ break;
+ default:
+ AddError(TStringBuilder() << "sortby_dir unsupported value: " << (int)value->sortby_dir);
+ return nullptr;
}
switch (value->sortby_nulls) {
- case SORTBY_NULLS_DEFAULT:
- break;
- case SORTBY_NULLS_FIRST:
- nullsFirst = true;
- break;
- case SORTBY_NULLS_LAST:
- nullsFirst = false;
- break;
- default:
- AddError(TStringBuilder() << "sortby_dir unsupported value: " << (int)value->sortby_dir);
- return nullptr;
+ case SORTBY_NULLS_DEFAULT:
+ break;
+ case SORTBY_NULLS_FIRST:
+ nullsFirst = true;
+ break;
+ case SORTBY_NULLS_LAST:
+ nullsFirst = false;
+ break;
+ default:
+ AddError(TStringBuilder() << "sortby_dir unsupported value: " << (int)value->sortby_dir);
+ return nullptr;
}
if (ListLength(value->useOp) > 0) {
@@ -5061,13 +5008,13 @@ public:
TAstNode* ret;
switch (kind) {
- case AEXPR_BETWEEN:
- case AEXPR_BETWEEN_SYM:
- ret = L(A(kind == AEXPR_BETWEEN ? "PgBetween" : "PgBetweenSym"), lhs, rbhs, rehs);
- break;
- default:
- AddError(TStringBuilder() << "BETWEEN kind unsupported value: " << (int)value->kind);
- return nullptr;
+ case AEXPR_BETWEEN:
+ case AEXPR_BETWEEN_SYM:
+ ret = L(A(kind == AEXPR_BETWEEN ? "PgBetween" : "PgBetweenSym"), lhs, rbhs, rehs);
+ break;
+ default:
+ AddError(TStringBuilder() << "BETWEEN kind unsupported value: " << (int)value->kind);
+ return nullptr;
}
if (inverse) {
@@ -5080,35 +5027,34 @@ public:
TAstNode* ParseAExpr(const A_Expr* value, const TExprSettings& settings) {
AT_LOCATION(value);
switch (value->kind) {
- case AEXPR_OP:
- return ParseAExprOp(value, settings);
- case AEXPR_LIKE:
- case AEXPR_ILIKE:
- return ParseAExprLike(value, settings, value->kind == AEXPR_ILIKE);
- case AEXPR_IN:
- return ParseAExprIn(value, settings);
- case AEXPR_BETWEEN:
- case AEXPR_NOT_BETWEEN:
- case AEXPR_BETWEEN_SYM:
- case AEXPR_NOT_BETWEEN_SYM:
- return ParseAExprBetween(value, settings);
- case AEXPR_OP_ANY:
- case AEXPR_OP_ALL:
- return ParseAExprOpAnyAll(value, settings, value->kind == AEXPR_OP_ALL);
- case AEXPR_NULLIF:
- return ParseAExprNullIf(value, settings);
- default:
- AddError(TStringBuilder() << "A_Expr_Kind unsupported value: " << (int)value->kind);
- return nullptr;
+ case AEXPR_OP:
+ return ParseAExprOp(value, settings);
+ case AEXPR_LIKE:
+ case AEXPR_ILIKE:
+ return ParseAExprLike(value, settings, value->kind == AEXPR_ILIKE);
+ case AEXPR_IN:
+ return ParseAExprIn(value, settings);
+ case AEXPR_BETWEEN:
+ case AEXPR_NOT_BETWEEN:
+ case AEXPR_BETWEEN_SYM:
+ case AEXPR_NOT_BETWEEN_SYM:
+ return ParseAExprBetween(value, settings);
+ case AEXPR_OP_ANY:
+ case AEXPR_OP_ALL:
+ return ParseAExprOpAnyAll(value, settings, value->kind == AEXPR_OP_ALL);
+ case AEXPR_NULLIF:
+ return ParseAExprNullIf(value, settings);
+ default:
+ AddError(TStringBuilder() << "A_Expr_Kind unsupported value: " << (int)value->kind);
+ return nullptr;
}
-
}
void AddVariableDeclarations() {
- for (const auto& [varName, typeName] : State_.ParamNameToPgTypeName) {
- const auto pgType = L(A("PgType"), QA(typeName));
- State_.Statements.push_back(L(A("declare"), A(varName), pgType));
- }
+ for (const auto& [varName, typeName] : State_.ParamNameToPgTypeName) {
+ const auto pgType = L(A("PgType"), QA(typeName));
+ State_.Statements.push_back(L(A("declare"), A(varName), pgType));
+ }
}
template <typename T>
@@ -5184,7 +5130,7 @@ public:
}
template <typename... TNodes>
- TAstNode* E(TAstNode* list, TNodes... nodes) {
+ TAstNode* E(TAstNode* list, TNodes... nodes) {
Y_ABORT_UNLESS(list->IsList());
TVector<TAstNode*> nodes_vec;
nodes_vec.reserve(list->GetChildrenCount() + sizeof...(nodes));
@@ -5321,8 +5267,7 @@ private:
const THashMap<TStringBuf, TString> TConverter::ProviderToInsertModeMap = {
{NYql::KikimrProviderName, "insert_abort"},
- {NYql::YtProviderName, "append"}
-};
+ {NYql::YtProviderName, "append"}};
NYql::TAstParseResult PGToYql(const TString& query, const NSQLTranslation::TTranslationSettings& settings, TStmtParseInfo* stmtParseInfo) {
TVector<NYql::TAstParseResult> results;
@@ -5378,7 +5323,7 @@ bool ParseTypeName(const PG_TypeName* typeName, TString& value, bool* setOf = nu
}
bool ParseCreateFunctionStmtImpl(const CreateFunctionStmt* value, ui32 extensionIndex,
- NPg::IExtensionSqlBuilder* builder, NYql::NPg::TProcDesc& desc) {
+ NPg::IExtensionSqlBuilder* builder, NYql::NPg::TProcDesc& desc) {
if (ListLength(value->funcname) != 1) {
return false;
}
@@ -5416,9 +5361,7 @@ bool ParseCreateFunctionStmtImpl(const CreateFunctionStmt* value, ui32 extension
}
auto extStr = TString(StrVal(ListNodeNth(asList, 0)));
- auto srcStr = asListLen > 1 ?
- TString(StrVal(ListNodeNth(asList, 1))) :
- name;
+ auto srcStr = asListLen > 1 ? TString(StrVal(ListNodeNth(asList, 1))) : name;
Y_ENSURE(extensionIndex == NPg::LookupExtensionByInstallName(extStr));
desc.Src = srcStr;
@@ -5431,7 +5374,7 @@ bool ParseCreateFunctionStmtImpl(const CreateFunctionStmt* value, ui32 extension
desc.Src = srcStr;
}
} else if (pass == 0 && defnameStr == "strict") {
- desc.IsStrict = BoolVal(node->arg);
+ desc.IsStrict = BoolVal(node->arg);
} else if (pass == 0 && defnameStr == "language") {
auto langStr = to_lower(TString(StrVal(node->arg)));
if (langStr == "c") {
@@ -5533,12 +5476,13 @@ bool ParseCreateFunctionStmtImpl(const CreateFunctionStmt* value, ui32 extension
return true;
}
-class TExtensionHandler : public IPGParseEvents {
+class TExtensionHandler: public IPGParseEvents {
public:
TExtensionHandler(ui32 extensionIndex, NYql::NPg::IExtensionSqlBuilder& builder)
: ExtensionIndex_(extensionIndex)
, Builder_(builder)
- {}
+ {
+ }
void OnResult(const List* raw) final {
for (int i = 0; i < ListLength(raw); ++i) {
@@ -5556,34 +5500,34 @@ public:
bool ParseRawStmt(const RawStmt* value) {
auto node = value->stmt;
switch (NodeTag(node)) {
- case T_CreateFunctionStmt:
- return ParseCreateFunctionStmt(CAST_NODE(CreateFunctionStmt, node));
- case T_DefineStmt:
- return ParseDefineStmt(CAST_NODE(DefineStmt, node));
- case T_CreateStmt:
- return ParseCreateStmt(CAST_NODE(CreateStmt, node));
- case T_InsertStmt:
- return ParseInsertStmt(CAST_NODE(InsertStmt, node));
- case T_CreateCastStmt:
- return ParseCreateCastStmt(CAST_NODE(CreateCastStmt, node));
- case T_CreateOpClassStmt:
- return ParseCreateOpClassStmt(CAST_NODE(CreateOpClassStmt, node));
- default:
- return false;
+ case T_CreateFunctionStmt:
+ return ParseCreateFunctionStmt(CAST_NODE(CreateFunctionStmt, node));
+ case T_DefineStmt:
+ return ParseDefineStmt(CAST_NODE(DefineStmt, node));
+ case T_CreateStmt:
+ return ParseCreateStmt(CAST_NODE(CreateStmt, node));
+ case T_InsertStmt:
+ return ParseInsertStmt(CAST_NODE(InsertStmt, node));
+ case T_CreateCastStmt:
+ return ParseCreateCastStmt(CAST_NODE(CreateCastStmt, node));
+ case T_CreateOpClassStmt:
+ return ParseCreateOpClassStmt(CAST_NODE(CreateOpClassStmt, node));
+ default:
+ return false;
}
}
[[nodiscard]]
bool ParseDefineStmt(const DefineStmt* value) {
switch (value->kind) {
- case OBJECT_TYPE:
- return ParseDefineType(value);
- case OBJECT_OPERATOR:
- return ParseDefineOperator(value);
- case OBJECT_AGGREGATE:
- return ParseDefineAggregate(value);
- default:
- return false;
+ case OBJECT_TYPE:
+ return ParseDefineType(value);
+ case OBJECT_OPERATOR:
+ return ParseDefineOperator(value);
+ case OBJECT_AGGREGATE:
+ return ParseDefineAggregate(value);
+ default:
+ return false;
}
}
@@ -5653,11 +5597,10 @@ public:
try {
desc.InFuncId = NPg::LookupProc(value, {NPg::LookupType("cstring").TypeId}).ProcId;
} catch (const yexception&) {
- desc.InFuncId = NPg::LookupProc(value, {
- NPg::LookupType("cstring").TypeId,
- NPg::LookupType("oid").TypeId,
- NPg::LookupType("integer").TypeId
- }).ProcId;
+ desc.InFuncId = NPg::LookupProc(value, {NPg::LookupType("cstring").TypeId,
+ NPg::LookupType("oid").TypeId,
+ NPg::LookupType("integer").TypeId})
+ .ProcId;
}
} else if (defnameStr == "output") {
if (NodeTag(node->arg) != T_TypeName) {
@@ -5694,11 +5637,10 @@ public:
try {
desc.ReceiveFuncId = NPg::LookupProc(value, {NPg::LookupType("internal").TypeId}).ProcId;
} catch (const yexception&) {
- desc.ReceiveFuncId = NPg::LookupProc(value, {
- NPg::LookupType("internal").TypeId,
- NPg::LookupType("oid").TypeId,
- NPg::LookupType("integer").TypeId
- }).ProcId;
+ desc.ReceiveFuncId = NPg::LookupProc(value, {NPg::LookupType("internal").TypeId,
+ NPg::LookupType("oid").TypeId,
+ NPg::LookupType("integer").TypeId})
+ .ProcId;
}
} else if (defnameStr == "delimiter") {
if (NodeTag(node->arg) != T_String) {
@@ -5983,22 +5925,22 @@ public:
stateWithArgs.insert(stateWithArgs.end(), desc.ArgTypes.begin(), desc.ArgTypes.end());
desc.TransFuncId = NPg::LookupProc(sfunc, stateWithArgs).ProcId;
if (!finalfunc.empty()) {
- desc.FinalFuncId = NPg::LookupProc(finalfunc, { stype }).ProcId;
+ desc.FinalFuncId = NPg::LookupProc(finalfunc, {stype}).ProcId;
}
if (!combinefunc.empty()) {
- desc.CombineFuncId = NPg::LookupProc(combinefunc, { stype, stype }).ProcId;
+ desc.CombineFuncId = NPg::LookupProc(combinefunc, {stype, stype}).ProcId;
}
if (!serialfunc.empty()) {
- const auto& procDesc = NPg::LookupProc(serialfunc, { stype });
+ const auto& procDesc = NPg::LookupProc(serialfunc, {stype});
Y_ENSURE(procDesc.ResultType == NPg::LookupType("bytea").TypeId);
desc.SerializeFuncId = procDesc.ProcId;
}
if (!deserialfunc.empty()) {
Y_ENSURE(!serialfunc.empty());
- const auto& procDesc = NPg::LookupProc(deserialfunc, { NPg::LookupType("bytea").TypeId, stype });
+ const auto& procDesc = NPg::LookupProc(deserialfunc, {NPg::LookupType("bytea").TypeId, stype});
Y_ENSURE(procDesc.ResultType == stype);
desc.DeserializeFuncId = procDesc.ProcId;
}
@@ -6130,17 +6072,17 @@ public:
}
switch (value->context) {
- case COERCION_IMPLICIT:
- desc.CoercionCode = NPg::ECoercionCode::Implicit;
- break;
- case COERCION_ASSIGNMENT:
- desc.CoercionCode = NPg::ECoercionCode::Assignment;
- break;
- case COERCION_EXPLICIT:
- desc.CoercionCode = NPg::ECoercionCode::Explicit;
- break;
- default:
- return false;
+ case COERCION_IMPLICIT:
+ desc.CoercionCode = NPg::ECoercionCode::Implicit;
+ break;
+ case COERCION_ASSIGNMENT:
+ desc.CoercionCode = NPg::ECoercionCode::Assignment;
+ break;
+ case COERCION_EXPLICIT:
+ desc.CoercionCode = NPg::ECoercionCode::Explicit;
+ break;
+ default:
+ return false;
}
Builder_.CreateCast(desc);
@@ -6214,7 +6156,7 @@ public:
amOpDesc.Strategy = node->number;
amOpDesc.LeftType = typeId;
amOpDesc.RightType = typeId;
- amOpDesc.OperId = NPg::LookupOper(funcName, {typeId,typeId}).OperId;
+ amOpDesc.OperId = NPg::LookupOper(funcName, {typeId, typeId}).OperId;
ops.push_back(amOpDesc);
} else {
NPg::TAmProcDesc amProcDesc;
@@ -6252,7 +6194,7 @@ private:
NYql::NPg::IExtensionSqlBuilder& Builder_;
};
-class TExtensionSqlParser : public NYql::NPg::IExtensionSqlParser {
+class TExtensionSqlParser: public NYql::NPg::IExtensionSqlParser {
public:
void Parse(ui32 extensionIndex, const TVector<TString>& sqls, NYql::NPg::IExtensionSqlBuilder& builder) final {
TExtensionHandler handler(extensionIndex, builder);
@@ -6264,11 +6206,12 @@ public:
}
};
-class TSystemFunctionsHandler : public IPGParseEvents {
+class TSystemFunctionsHandler: public IPGParseEvents {
public:
TSystemFunctionsHandler(TVector<NPg::TProcDesc>& procs)
: Procs_(procs)
- {}
+ {
+ }
void OnResult(const List* raw) final {
for (int i = 0; i < ListLength(raw); ++i) {
@@ -6286,10 +6229,10 @@ public:
bool ParseRawStmt(const RawStmt* value) {
auto node = value->stmt;
switch (NodeTag(node)) {
- case T_CreateFunctionStmt:
- return ParseCreateFunctionStmt(CAST_NODE(CreateFunctionStmt, node));
- default:
- return false;
+ case T_CreateFunctionStmt:
+ return ParseCreateFunctionStmt(CAST_NODE(CreateFunctionStmt, node));
+ default:
+ return false;
}
}
@@ -6308,7 +6251,7 @@ private:
TVector<NPg::TProcDesc>& Procs_;
};
-class TSystemFunctionsParser : public NYql::NPg::ISystemFunctionsParser {
+class TSystemFunctionsParser: public NYql::NPg::ISystemFunctionsParser {
public:
void Parse(const TString& sql, TVector<NPg::TProcDesc>& procs) const final {
TSystemFunctionsHandler handler(procs);
@@ -6316,7 +6259,7 @@ public:
}
};
-class TSqlLanguageParser : public NYql::NPg::ISqlLanguageParser, public IPGParseEvents {
+class TSqlLanguageParser: public NYql::NPg::ISqlLanguageParser, public IPGParseEvents {
public:
TSqlLanguageParser() {
Settings_.ClusterMapping["pg_catalog"] = TString(PgProviderName);
@@ -6345,18 +6288,18 @@ public:
converter.PrepareStatements();
TAstNode* root = nullptr;
switch (NodeTag(stmt)) {
- case T_SelectStmt:
- root = converter.ParseSelectStmt(CAST_NODE(SelectStmt, stmt), {.Inner = false});
- break;
- case T_ReturnStmt:
- root = converter.ParseReturnStmt(CAST_NODE(ReturnStmt, stmt));
- break;
- default:
- return;
+ case T_SelectStmt:
+ root = converter.ParseSelectStmt(CAST_NODE(SelectStmt, stmt), {.Inner = false});
+ break;
+ case T_ReturnStmt:
+ root = converter.ParseReturnStmt(CAST_NODE(ReturnStmt, stmt));
+ break;
+ default:
+ return;
}
if (!root) {
- //Cerr << "Can't parse SQL for function: " << proc.Name << ", " << results[0].Issues.ToString();
+ // Cerr << "Can't parse SQL for function: " << proc.Name << ", " << results[0].Issues.ToString();
return;
}
@@ -6423,7 +6366,7 @@ std::unique_ptr<NYql::NPg::ISqlLanguageParser> CreateSqlLanguageParser() {
return std::make_unique<TSqlLanguageParser>();
}
-class TTranslator : public NSQLTranslation::ITranslator {
+class TTranslator: public NSQLTranslation::ITranslator {
public:
NSQLTranslation::ILexer::TPtr MakeLexer(const NSQLTranslation::TTranslationSettings& settings) final {
Y_UNUSED(settings);
@@ -6431,13 +6374,13 @@ public:
}
NYql::TAstParseResult TextToAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
+ NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
Y_UNUSED(warningRules);
return PGToYql(query, settings, stmtParseInfo);
}
google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
- NYql::TIssues& issues, size_t maxErrors, const NSQLTranslation::TTranslationSettings& settings) final {
+ NYql::TIssues& issues, size_t maxErrors, const NSQLTranslation::TTranslationSettings& settings) final {
Y_UNUSED(query);
Y_UNUSED(queryName);
Y_UNUSED(issues);
@@ -6447,7 +6390,7 @@ public:
}
NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
- const NSQLTranslation::TSQLHints& hints, const NSQLTranslation::TTranslationSettings& settings) final {
+ const NSQLTranslation::TSQLHints& hints, const NSQLTranslation::TTranslationSettings& settings) final {
Y_UNUSED(query);
Y_UNUSED(protoAst);
Y_UNUSED(hints);
@@ -6456,7 +6399,7 @@ public:
}
TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
+ NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
Y_UNUSED(warningRules);
return PGToYqlStatements(query, settings, stmtParseInfo);
}
@@ -6466,4 +6409,4 @@ NSQLTranslation::TTranslatorPtr MakeTranslator() {
return MakeIntrusive<TTranslator>();
}
-} // NSQLTranslationPG
+} // namespace NSQLTranslationPG
diff --git a/yql/essentials/sql/pg/pg_sql_autoparam_ut.cpp b/yql/essentials/sql/pg/pg_sql_autoparam_ut.cpp
index 41819b65993..89d639d0082 100644
--- a/yql/essentials/sql/pg/pg_sql_autoparam_ut.cpp
+++ b/yql/essentials/sql/pg/pg_sql_autoparam_ut.cpp
@@ -5,232 +5,222 @@
using namespace NSQLTranslation;
Y_UNIT_TEST_SUITE(PgSqlParsingAutoparam) {
- Y_UNIT_TEST(AutoParamValues_DisabledByDefault) {
- auto res = PgSqlToYql("insert into plato.Output values (1,2,3), (1,2,3)");
- UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
- auto params = dynamic_cast<TTestAutoParamBuilder*>(res.PgAutoParamValues.Get());
- UNIT_ASSERT_C(!params, "Expected no auto parametrization");
- }
+Y_UNIT_TEST(AutoParamValues_DisabledByDefault) {
+ auto res = PgSqlToYql("insert into plato.Output values (1,2,3), (1,2,3)");
+ UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
+ auto params = dynamic_cast<TTestAutoParamBuilder*>(res.PgAutoParamValues.Get());
+ UNIT_ASSERT_C(!params, "Expected no auto parametrization");
+}
+
+Y_UNIT_TEST(AutoParamValues_NoParametersWithDefaults) {
+ TTranslationSettings settings;
+ settings.AutoParametrizeEnabled = true;
+ settings.AutoParametrizeValuesStmt = true;
+ auto res = SqlToYqlWithMode(
+ R"(CREATE TABLE t (a int PRIMARY KEY, b int DEFAULT 0))",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+
+ UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
+ auto params = dynamic_cast<TTestAutoParamBuilder*>(res.PgAutoParamValues.Get());
+ UNIT_ASSERT_C(!params, "Expected no auto parametrization");
+}
+
+using TUsedParamsGetter = std::function<void(TSet<TString>&, const NYql::TAstNode& node)>;
- Y_UNIT_TEST(AutoParamValues_NoParametersWithDefaults) {
- TTranslationSettings settings;
- settings.AutoParametrizeEnabled = true;
- settings.AutoParametrizeValuesStmt = true;
- auto res = SqlToYqlWithMode(
- R"(CREATE TABLE t (a int PRIMARY KEY, b int DEFAULT 0))",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
-
- UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
- auto params = dynamic_cast<TTestAutoParamBuilder*>(res.PgAutoParamValues.Get());
- UNIT_ASSERT_C(!params, "Expected no auto parametrization");
+void GetUsedParamsInValues(TSet<TString>& usedParams, const NYql::TAstNode& node) {
+ const bool isPgSetItem =
+ node.IsListOfSize(2) && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "PgSetItem";
+ if (!isPgSetItem) {
+ return;
}
+ const auto pgSetItemOptions = node.GetChild(1)->GetChild(1);
- using TUsedParamsGetter = std::function<void(TSet<TString>&, const NYql::TAstNode& node)>;
+ for (const auto* pgOption : pgSetItemOptions->GetChildren()) {
+ const bool isQuotedList =
+ pgOption->IsListOfSize(2) && pgOption->GetChild(0)->IsAtom() && pgOption->GetChild(0)->GetContent() == "quote";
+ if (!isQuotedList) {
+ continue;
+ }
- void GetUsedParamsInValues(TSet<TString>& usedParams, const NYql::TAstNode& node) {
- const bool isPgSetItem =
- node.IsListOfSize(2) && node.GetChild(0)->IsAtom()
- && node.GetChild(0)->GetContent() == "PgSetItem";
- if (!isPgSetItem) {
- return;
+ const auto* option = pgOption->GetChild(1);
+ const auto* optionName = option->GetChild(0);
+
+ const bool isValuesNode =
+ optionName->IsListOfSize(2) && optionName->GetChild(0)->IsAtom() && optionName->GetChild(0)->GetContent() == "quote" && optionName->GetChild(1)->GetContent() == "values";
+ if (!isValuesNode) {
+ continue;
}
- const auto pgSetItemOptions = node.GetChild(1)->GetChild(1);
-
- for (const auto* pgOption : pgSetItemOptions->GetChildren()) {
- const bool isQuotedList =
- pgOption->IsListOfSize(2) && pgOption->GetChild(0)->IsAtom()
- && pgOption->GetChild(0)->GetContent() == "quote";
- if (!isQuotedList) {
- continue;
- }
-
- const auto* option = pgOption->GetChild(1);
- const auto* optionName = option->GetChild(0);
-
- const bool isValuesNode =
- optionName->IsListOfSize(2) && optionName->GetChild(0)->IsAtom()
- && optionName->GetChild(0)->GetContent() == "quote"
- && optionName->GetChild(1)->GetContent() == "values";
- if (!isValuesNode) {
- continue;
- }
- const auto values = option->GetChild(2);
- if (values->IsAtom()) {
- usedParams.insert(TString(values->GetContent()));
- }
+ const auto values = option->GetChild(2);
+ if (values->IsAtom()) {
+ usedParams.insert(TString(values->GetContent()));
}
}
+}
- void TestAutoParam(const TString& query, const THashMap<TString, TString>& expectedParamNameToValue, const TMap<TString, TString>& expectedParamTypes, TUsedParamsGetter usedParamsGetter) {
- TTranslationSettings settings;
- settings.AutoParametrizeEnabled = true;
- settings.AutoParametrizeValuesStmt = true;
- auto res = SqlToYqlWithMode(
- query,
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
- auto params = dynamic_cast<TTestAutoParamBuilder*>(res.PgAutoParamValues.Get());
- UNIT_ASSERT_C(params && params->Size() > 0, "Expected auto param values");
-
- TSet<TString> declaredParams;
- TMap<TString, TString> actualParamTypes;
- VisitAstNodes(*res.Root, [&declaredParams, &actualParamTypes] (const NYql::TAstNode& node) {
- const bool isDeclareNode =
- node.IsList() && node.GetChildrenCount() > 0
- && node.GetChild(0)->IsAtom()
- && node.GetChild(0)->GetContent() == "declare";
- if (isDeclareNode) {
- UNIT_ASSERT_VALUES_EQUAL(node.GetChildrenCount(), 3);
- const auto name = TString(node.GetChild(1)->GetContent());
- declaredParams.insert(name);
- actualParamTypes[name] = node.GetChild(2)->ToString();
- }
- });
- UNIT_ASSERT_VALUES_EQUAL(expectedParamTypes, actualParamTypes);
-
- TSet<TString> usedParams;
- VisitAstNodes(*res.Root, [&usedParams, &usedParamsGetter] (const auto& node) { return usedParamsGetter(usedParams, node); });
- UNIT_ASSERT_VALUES_EQUAL(declaredParams, usedParams);
-
- TSet<TString> expectedParams;
- for (auto& [expectedParamName, val] : expectedParamNameToValue) {
- UNIT_ASSERT_C(params->State.contains(expectedParamName),
- "Autoparametrized values do not contain expected param: " << expectedParamName);
-
- UNIT_ASSERT_STRINGS_EQUAL(val, params->GetParamValue(expectedParamName));
- UNIT_ASSERT_C(declaredParams.contains(expectedParamName),
- "Declared params don't contain expected param name: " << expectedParamName);
-
- expectedParams.insert(expectedParamName);
+void TestAutoParam(const TString& query, const THashMap<TString, TString>& expectedParamNameToValue, const TMap<TString, TString>& expectedParamTypes, TUsedParamsGetter usedParamsGetter) {
+ TTranslationSettings settings;
+ settings.AutoParametrizeEnabled = true;
+ settings.AutoParametrizeValuesStmt = true;
+ auto res = SqlToYqlWithMode(
+ query,
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
+ auto params = dynamic_cast<TTestAutoParamBuilder*>(res.PgAutoParamValues.Get());
+ UNIT_ASSERT_C(params && params->Size() > 0, "Expected auto param values");
+
+ TSet<TString> declaredParams;
+ TMap<TString, TString> actualParamTypes;
+ VisitAstNodes(*res.Root, [&declaredParams, &actualParamTypes](const NYql::TAstNode& node) {
+ const bool isDeclareNode =
+ node.IsList() && node.GetChildrenCount() > 0 && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "declare";
+ if (isDeclareNode) {
+ UNIT_ASSERT_VALUES_EQUAL(node.GetChildrenCount(), 3);
+ const auto name = TString(node.GetChild(1)->GetContent());
+ declaredParams.insert(name);
+ actualParamTypes[name] = node.GetChild(2)->ToString();
}
+ });
+ UNIT_ASSERT_VALUES_EQUAL(expectedParamTypes, actualParamTypes);
- UNIT_ASSERT_VALUES_EQUAL(declaredParams.size(), expectedParams.size());
- }
+ TSet<TString> usedParams;
+ VisitAstNodes(*res.Root, [&usedParams, &usedParamsGetter](const auto& node) { return usedParamsGetter(usedParams, node); });
+ UNIT_ASSERT_VALUES_EQUAL(declaredParams, usedParams);
- Y_UNIT_TEST(AutoParamValues_Int4) {
- TString query = R"(insert into plato.Output values (1,2), (3,4), (4,5))";
- TString expectedParam = "[int4,int4:1,2,3,4,4,5]";
- TString type = "(ListType (TupleType (PgType 'int4) (PgType 'int4)))";
- TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
- }
+ TSet<TString> expectedParams;
+ for (auto& [expectedParamName, val] : expectedParamNameToValue) {
+ UNIT_ASSERT_C(params->State.contains(expectedParamName),
+ "Autoparametrized values do not contain expected param: " << expectedParamName);
+
+ UNIT_ASSERT_STRINGS_EQUAL(val, params->GetParamValue(expectedParamName));
+ UNIT_ASSERT_C(declaredParams.contains(expectedParamName),
+ "Declared params don't contain expected param name: " << expectedParamName);
- Y_UNIT_TEST(AutoParamValues_Int4Text) {
- TString query = R"(insert into plato.Output values (1,'2'), (3,'4'))";
- TString expectedParam = "[int4,unknown:1,2,3,4]";
- TString type = "(ListType (TupleType (PgType 'int4) (PgType 'unknown)))";
- TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
+ expectedParams.insert(expectedParamName);
}
- Y_UNIT_TEST(AutoParamValues_MultipleStmts) {
- TString query = R"(
+ UNIT_ASSERT_VALUES_EQUAL(declaredParams.size(), expectedParams.size());
+}
+
+Y_UNIT_TEST(AutoParamValues_Int4) {
+ TString query = R"(insert into plato.Output values (1,2), (3,4), (4,5))";
+ TString expectedParam = "[int4,int4:1,2,3,4,4,5]";
+ TString type = "(ListType (TupleType (PgType 'int4) (PgType 'int4)))";
+ TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
+}
+
+Y_UNIT_TEST(AutoParamValues_Int4Text) {
+ TString query = R"(insert into plato.Output values (1,'2'), (3,'4'))";
+ TString expectedParam = "[int4,unknown:1,2,3,4]";
+ TString type = "(ListType (TupleType (PgType 'int4) (PgType 'unknown)))";
+ TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
+}
+
+Y_UNIT_TEST(AutoParamValues_MultipleStmts) {
+ TString query = R"(
insert into plato.Output values (1,'2'), (3,'4');
insert into plato.Output1 values (1.23);
)";
- TString expectedParam0 = "[int4,unknown:1,2,3,4]";
- TString expectedParam1 = "[numeric:1.23]";
- TMap<TString, TString> expectedParamTypes {
- {"a0", "(ListType (TupleType (PgType 'int4) (PgType 'unknown)))"},
- {"a1", "(ListType (TupleType (PgType 'numeric)))"}
- };
- TestAutoParam(query, {{"a0", expectedParam0}, {"a1", expectedParam1}}, expectedParamTypes, GetUsedParamsInValues);
- }
+ TString expectedParam0 = "[int4,unknown:1,2,3,4]";
+ TString expectedParam1 = "[numeric:1.23]";
+ TMap<TString, TString> expectedParamTypes{
+ {"a0", "(ListType (TupleType (PgType 'int4) (PgType 'unknown)))"},
+ {"a1", "(ListType (TupleType (PgType 'numeric)))"}};
+ TestAutoParam(query, {{"a0", expectedParam0}, {"a1", expectedParam1}}, expectedParamTypes, GetUsedParamsInValues);
+}
- Y_UNIT_TEST(AutoParamValues_WithNull) {
- TString query = R"(
+Y_UNIT_TEST(AutoParamValues_WithNull) {
+ TString query = R"(
insert into plato.Output values (null, '2'), (3, '4')
)";
- TString expectedParam = "[int4,unknown:#,2,3,4]";
- TString type = "(ListType (TupleType (PgType 'int4) (PgType 'unknown)))";
- TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
- }
+ TString expectedParam = "[int4,unknown:#,2,3,4]";
+ TString type = "(ListType (TupleType (PgType 'int4) (PgType 'unknown)))";
+ TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
+}
- Y_UNIT_TEST(AutoParamValues_NullCol) {
- TString query = R"(
+Y_UNIT_TEST(AutoParamValues_NullCol) {
+ TString query = R"(
insert into plato.Output values (null,1), (null,1)
)";
- TString expectedParam = "[unknown,int4:#,1,#,1]";
- TString type = "(ListType (TupleType (PgType 'unknown) (PgType 'int4)))";
- TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
- }
+ TString expectedParam = "[unknown,int4:#,1,#,1]";
+ TString type = "(ListType (TupleType (PgType 'unknown) (PgType 'int4)))";
+ TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, GetUsedParamsInValues);
+}
- Y_UNIT_TEST(AutoParamConsts_Where) {
- TString query = R"(
+Y_UNIT_TEST(AutoParamConsts_Where) {
+ TString query = R"(
select * from plato.Output where key > 1
)";
- TString expectedParam = "int4:1";
-
- // We expect: (PgOp '">" (PgColumnRef '"key") a0)
- const TUsedParamsGetter usedInWhereComp = [] (TSet<TString>& usedParams, const NYql::TAstNode& node) {
- const auto maybeQuote = MaybeGetQuotedValue(node);
- if (!maybeQuote) {
- return;
- }
- const auto quotedVal = maybeQuote.GetRef();
- const bool isWhere =
- quotedVal->IsListOfSize(2) && quotedVal->GetChild(1)->IsListOfSize(3)
- && quotedVal->GetChild(1)->IsListOfSize(3)
- && quotedVal->GetChild(1)->GetChild(0)->IsAtom()
- && quotedVal->GetChild(1)->GetChild(0)->GetContent() == "PgWhere";
-
- if (!isWhere) {
- return;
- }
- const auto* whereCallable = quotedVal->GetChild(1);
-
- const auto* whereLambda = whereCallable->GetChild(2);
- const auto* pgOp = whereLambda->GetChild(2);
- const bool isBinaryOp = pgOp->IsListOfSize(4);
- if (!isBinaryOp) {
- return;
- }
- const auto* pgBinOpSecondArg = pgOp->GetChild(3);
- usedParams.insert(TString(pgBinOpSecondArg->GetContent()));
- };
- TString type = "(PgType 'int4)";
- TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, usedInWhereComp);
- }
+ TString expectedParam = "int4:1";
+
+ // We expect: (PgOp '">" (PgColumnRef '"key") a0)
+ const TUsedParamsGetter usedInWhereComp = [](TSet<TString>& usedParams, const NYql::TAstNode& node) {
+ const auto maybeQuote = MaybeGetQuotedValue(node);
+ if (!maybeQuote) {
+ return;
+ }
+ const auto quotedVal = maybeQuote.GetRef();
+ const bool isWhere =
+ quotedVal->IsListOfSize(2) && quotedVal->GetChild(1)->IsListOfSize(3) && quotedVal->GetChild(1)->IsListOfSize(3) && quotedVal->GetChild(1)->GetChild(0)->IsAtom() && quotedVal->GetChild(1)->GetChild(0)->GetContent() == "PgWhere";
+
+ if (!isWhere) {
+ return;
+ }
+ const auto* whereCallable = quotedVal->GetChild(1);
+
+ const auto* whereLambda = whereCallable->GetChild(2);
+ const auto* pgOp = whereLambda->GetChild(2);
+ const bool isBinaryOp = pgOp->IsListOfSize(4);
+ if (!isBinaryOp) {
+ return;
+ }
+ const auto* pgBinOpSecondArg = pgOp->GetChild(3);
+ usedParams.insert(TString(pgBinOpSecondArg->GetContent()));
+ };
+ TString type = "(PgType 'int4)";
+ TestAutoParam(query, {{"a0", expectedParam}}, {{"a0", type}}, usedInWhereComp);
+}
- Y_UNIT_TEST(AutoParamConsts_Select) {
- TString query = R"(
+Y_UNIT_TEST(AutoParamConsts_Select) {
+ TString query = R"(
select 1, 'test', B'10001'
)";
- TString expectedParamInt4 = "int4:1";
- TString expectedParamText = "unknown:test";
- TString expectedParamBit = "bit:b10001";
- const TUsedParamsGetter dummyGetter = [] (TSet<TString>& usedParams, const NYql::TAstNode&) {
- usedParams = {"a0", "a1", "a2"};
- };
- TMap<TString, TString> expectedParamTypes {
- {"a0", "(PgType 'int4)"},
- {"a1", "(PgType 'unknown)"},
- {"a2", "(PgType 'bit)"},
- };
- TestAutoParam(query, {
- {"a0", expectedParamInt4},
- {"a1", expectedParamText},
- {"a2", expectedParamBit},
- }, expectedParamTypes, dummyGetter);
- }
-
- Y_UNIT_TEST(AutoParamValues_FailToInferColumnType) {
- const auto query = R"(INSERT INTO test VALUES (1), ('2');)";
- TMap<TString, TString> paramToType = {{"a0", "(PgType 'int4)"}, {"a1", "(PgType 'unknown)"}};
- TString expectedParamInt4 = "int4:1";
- TString expectedParamText = "unknown:2";
- const TUsedParamsGetter dummyGetter = [] (TSet<TString>& usedParams, const NYql::TAstNode&) {
- usedParams = {"a0", "a1"};
- };
- TestAutoParam(query, {{"a0", expectedParamInt4}, {"a1", expectedParamText}}, paramToType, dummyGetter);
- }
+ TString expectedParamInt4 = "int4:1";
+ TString expectedParamText = "unknown:test";
+ TString expectedParamBit = "bit:b10001";
+ const TUsedParamsGetter dummyGetter = [](TSet<TString>& usedParams, const NYql::TAstNode&) {
+ usedParams = {"a0", "a1", "a2"};
+ };
+ TMap<TString, TString> expectedParamTypes{
+ {"a0", "(PgType 'int4)"},
+ {"a1", "(PgType 'unknown)"},
+ {"a2", "(PgType 'bit)"},
+ };
+ TestAutoParam(query, {
+ {"a0", expectedParamInt4},
+ {"a1", expectedParamText},
+ {"a2", expectedParamBit},
+ }, expectedParamTypes, dummyGetter);
+}
+Y_UNIT_TEST(AutoParamValues_FailToInferColumnType) {
+ const auto query = R"(INSERT INTO test VALUES (1), ('2');)";
+ TMap<TString, TString> paramToType = {{"a0", "(PgType 'int4)"}, {"a1", "(PgType 'unknown)"}};
+ TString expectedParamInt4 = "int4:1";
+ TString expectedParamText = "unknown:2";
+ const TUsedParamsGetter dummyGetter = [](TSet<TString>& usedParams, const NYql::TAstNode&) {
+ usedParams = {"a0", "a1"};
+ };
+ TestAutoParam(query, {{"a0", expectedParamInt4}, {"a1", expectedParamText}}, paramToType, dummyGetter);
}
+
+} // Y_UNIT_TEST_SUITE(PgSqlParsingAutoparam)
diff --git a/yql/essentials/sql/pg/pg_sql_ut.cpp b/yql/essentials/sql/pg/pg_sql_ut.cpp
index 6ff55df7761..a89851dd63b 100644
--- a/yql/essentials/sql/pg/pg_sql_ut.cpp
+++ b/yql/essentials/sql/pg/pg_sql_ut.cpp
@@ -9,63 +9,60 @@
using namespace NSQLTranslation;
Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
- Y_UNIT_TEST(Locking) {
- auto res = PgSqlToYql("SELECT 1 FROM plato.Input FOR UPDATE");
- UNIT_ASSERT(res.Root);
- UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
+Y_UNIT_TEST(Locking) {
+ auto res = PgSqlToYql("SELECT 1 FROM plato.Input FOR UPDATE");
+ UNIT_ASSERT(res.Root);
+ UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
- auto issue = *(res.Issues.begin());
- UNIT_ASSERT(issue.GetMessage().find("locking") != TString::npos);
- }
+ auto issue = *(res.Issues.begin());
+ UNIT_ASSERT(issue.GetMessage().find("locking") != TString::npos);
+}
- Y_UNIT_TEST(InsertStmt) {
- auto res = PgSqlToYql("INSERT INTO plato.Input VALUES (1, 1)");
- UNIT_ASSERT(res.Root);
- }
+Y_UNIT_TEST(InsertStmt) {
+ auto res = PgSqlToYql("INSERT INTO plato.Input VALUES (1, 1)");
+ UNIT_ASSERT(res.Root);
+}
- Y_UNIT_TEST(InsertStmt_DefaultValues) {
- auto res = PgSqlToYql("INSERT INTO plato.Input DEFAULT VALUES");
- UNIT_ASSERT(res.Root);
-
- const NYql::TAstNode* writeNode = nullptr;
- VisitAstNodes(*res.Root, [&writeNode] (const NYql::TAstNode& node) {
- const bool isWriteNode = node.IsList() && node.GetChildrenCount() > 0
- && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "Write!";
- if (isWriteNode) {
- writeNode = &node;
- }
- });
-
- UNIT_ASSERT(writeNode);
- UNIT_ASSERT(writeNode->GetChildrenCount() > 5);
- const auto optionsQListNode = writeNode->GetChild(5);
- UNIT_ASSERT(optionsQListNode->ToString().Contains("'default_values"));
- }
+Y_UNIT_TEST(InsertStmt_DefaultValues) {
+ auto res = PgSqlToYql("INSERT INTO plato.Input DEFAULT VALUES");
+ UNIT_ASSERT(res.Root);
- Y_UNIT_TEST(InsertStmt_Returning) {
- auto res = PgSqlToYql("INSERT INTO plato.Input VALUES (1, 1) RETURNING *");
- UNIT_ASSERT(res.Root);
- const NYql::TAstNode* writeNode = nullptr;
- VisitAstNodes(*res.Root, [&writeNode] (const NYql::TAstNode& node) {
- const bool isWriteNode = node.IsList() && node.GetChildrenCount() > 0
- && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "Write!";
- if (isWriteNode) {
- writeNode = &node;
- }
- });
- UNIT_ASSERT(writeNode);
- UNIT_ASSERT(writeNode->GetChildrenCount() > 5);
- const auto optionsQListNode = writeNode->GetChild(5);
- UNIT_ASSERT_STRINGS_EQUAL(
- optionsQListNode->ToString(),
- R"('('('mode 'append) '('returning '((PgResultItem '"" (Void) (lambda '() (PgStar)))))))"
- );
- }
+ const NYql::TAstNode* writeNode = nullptr;
+ VisitAstNodes(*res.Root, [&writeNode](const NYql::TAstNode& node) {
+ const bool isWriteNode = node.IsList() && node.GetChildrenCount() > 0 && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "Write!";
+ if (isWriteNode) {
+ writeNode = &node;
+ }
+ });
- Y_UNIT_TEST(DeleteStmt) {
- auto res = PgSqlToYql("DELETE FROM plato.Input");
- UNIT_ASSERT(res.Root);
- TString program = R"(
+ UNIT_ASSERT(writeNode);
+ UNIT_ASSERT(writeNode->GetChildrenCount() > 5);
+ const auto optionsQListNode = writeNode->GetChild(5);
+ UNIT_ASSERT(optionsQListNode->ToString().Contains("'default_values"));
+}
+
+Y_UNIT_TEST(InsertStmt_Returning) {
+ auto res = PgSqlToYql("INSERT INTO plato.Input VALUES (1, 1) RETURNING *");
+ UNIT_ASSERT(res.Root);
+ const NYql::TAstNode* writeNode = nullptr;
+ VisitAstNodes(*res.Root, [&writeNode](const NYql::TAstNode& node) {
+ const bool isWriteNode = node.IsList() && node.GetChildrenCount() > 0 && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "Write!";
+ if (isWriteNode) {
+ writeNode = &node;
+ }
+ });
+ UNIT_ASSERT(writeNode);
+ UNIT_ASSERT(writeNode->GetChildrenCount() > 5);
+ const auto optionsQListNode = writeNode->GetChild(5);
+ UNIT_ASSERT_STRINGS_EQUAL(
+ optionsQListNode->ToString(),
+ R"('('('mode 'append) '('returning '((PgResultItem '"" (Void) (lambda '() (PgStar)))))))");
+}
+
+Y_UNIT_TEST(DeleteStmt) {
+ auto res = PgSqlToYql("DELETE FROM plato.Input");
+ UNIT_ASSERT(res.Root);
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let read0 (Read! world (DataSource '"yt" '"plato") (Key '('table (String '"input"))) (Void) '()))
@@ -75,35 +72,33 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(DeleteStmt_Returning) {
- auto res = PgSqlToYql("DELETE FROM plato.Input RETURNING name, price AS new_price");
- UNIT_ASSERT(res.Root);
- const NYql::TAstNode* writeNode = nullptr;
- VisitAstNodes(*res.Root, [&writeNode] (const NYql::TAstNode& node) {
- const bool isWriteNode = node.IsList() && node.GetChildrenCount() > 0
- && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "Write!";
- if (isWriteNode) {
- writeNode = &node;
- }
- });
- UNIT_ASSERT(writeNode);
- UNIT_ASSERT(writeNode->GetChildrenCount() > 5);
- const auto optionsQListNode = writeNode->GetChild(5);
- UNIT_ASSERT_STRINGS_EQUAL(
- optionsQListNode->GetChild(1)->GetChild(2)->ToString(),
- R"('('returning '((PgResultItem '"name" (Void) (lambda '() (PgColumnRef '"name"))) (PgResultItem '"new_price" (Void) (lambda '() (PgColumnRef '"price"))))))"
- );
- }
+Y_UNIT_TEST(DeleteStmt_Returning) {
+ auto res = PgSqlToYql("DELETE FROM plato.Input RETURNING name, price AS new_price");
+ UNIT_ASSERT(res.Root);
+ const NYql::TAstNode* writeNode = nullptr;
+ VisitAstNodes(*res.Root, [&writeNode](const NYql::TAstNode& node) {
+ const bool isWriteNode = node.IsList() && node.GetChildrenCount() > 0 && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "Write!";
+ if (isWriteNode) {
+ writeNode = &node;
+ }
+ });
+ UNIT_ASSERT(writeNode);
+ UNIT_ASSERT(writeNode->GetChildrenCount() > 5);
+ const auto optionsQListNode = writeNode->GetChild(5);
+ UNIT_ASSERT_STRINGS_EQUAL(
+ optionsQListNode->GetChild(1)->GetChild(2)->ToString(),
+ R"('('returning '((PgResultItem '"name" (Void) (lambda '() (PgColumnRef '"name"))) (PgResultItem '"new_price" (Void) (lambda '() (PgColumnRef '"price"))))))");
+}
- Y_UNIT_TEST(CreateTableStmt_Basic) {
- auto res = PgSqlToYql("CREATE TABLE t (a int, b text)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_Basic) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int, b text)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '())) '('b (PgType 'text) '('columnConstraints '())))))))
@@ -111,24 +106,24 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_SystemColumns) {
- auto res = PgSqlToYql("CREATE TABLE t(XMIN int)");
- UNIT_ASSERT(!res.Root);
- UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
+Y_UNIT_TEST(CreateTableStmt_SystemColumns) {
+ auto res = PgSqlToYql("CREATE TABLE t(XMIN int)");
+ UNIT_ASSERT(!res.Root);
+ UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
- auto issue = *(res.Issues.begin());
- UNIT_ASSERT(issue.GetMessage().find("system column") != TString::npos);
- }
+ auto issue = *(res.Issues.begin());
+ UNIT_ASSERT(issue.GetMessage().find("system column") != TString::npos);
+}
- Y_UNIT_TEST(CreateTableStmt_NotNull) {
- auto res = PgSqlToYql("CREATE TABLE t (a int NOT NULL, b text)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_NotNull) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int NOT NULL, b text)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('not_null)))) '('b (PgType 'text) '('columnConstraints '())))))))
@@ -136,15 +131,15 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_JustPK) {
- auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY, b text)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_JustPK) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY, b text)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('not_null)))) '('b (PgType 'text) '('columnConstraints '())))) '('primarykey '('a)))))
@@ -152,15 +147,15 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_Default) {
- auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY, b int DEFAULT 0)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_Default) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY, b int DEFAULT 0)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('not_null)))) '('b (PgType 'int4) '('columnConstraints '('('default (PgConst '0 (PgType 'int4)))))))) '('primarykey '('a)))))
@@ -168,15 +163,15 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_PKAndNotNull) {
- auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY NOT NULL, b text)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_PKAndNotNull) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY NOT NULL, b text)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('not_null)))) '('b (PgType 'text) '('columnConstraints '())))) '('primarykey '('a)))))
@@ -184,15 +179,15 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_PKAndOtherNotNull) {
- auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY, b text NOT NULL)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_PKAndOtherNotNull) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int PRIMARY KEY, b text NOT NULL)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('not_null)))) '('b (PgType 'text) '('columnConstraints '('('not_null)))))) '('primarykey '('a)))))
@@ -200,15 +195,15 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_TableLevelPK) {
- auto res = PgSqlToYql("CREATE TABLE t (a int, b text NOT NULL, PRIMARY KEY (a, b))");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_TableLevelPK) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int, b text NOT NULL, PRIMARY KEY (a, b))");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('not_null)))) '('b (PgType 'text) '('columnConstraints '('('not_null)))))) '('primarykey '('a 'b)))))
@@ -216,48 +211,48 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_RepeatingColumnNames) {
- auto res = PgSqlToYql("CREATE TABLE t (a int, a text)");
- UNIT_ASSERT(!res.Root);
- UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
+Y_UNIT_TEST(CreateTableStmt_RepeatingColumnNames) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int, a text)");
+ UNIT_ASSERT(!res.Root);
+ UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
- auto issue = *(res.Issues.begin());
- UNIT_ASSERT(issue.GetMessage().find("duplicate") != TString::npos);
- }
+ auto issue = *(res.Issues.begin());
+ UNIT_ASSERT(issue.GetMessage().find("duplicate") != TString::npos);
+}
- Y_UNIT_TEST(CreateTableStmt_PKHasColumnsNotBelongingToTable_Fails) {
- auto res = PgSqlToYql("CREATE TABLE t (a int, primary key(b))");
- UNIT_ASSERT(!res.Root);
- UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
+Y_UNIT_TEST(CreateTableStmt_PKHasColumnsNotBelongingToTable_Fails) {
+ auto res = PgSqlToYql("CREATE TABLE t (a int, primary key(b))");
+ UNIT_ASSERT(!res.Root);
+ UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
- auto issue = *(res.Issues.begin());
- UNIT_ASSERT(issue.GetMessage().find("PK column does not belong to table") != TString::npos);
- }
+ auto issue = *(res.Issues.begin());
+ UNIT_ASSERT(issue.GetMessage().find("PK column does not belong to table") != TString::npos);
+}
- Y_UNIT_TEST(CreateTableStmt_AliasSerialToIntType) {
- auto res = PgSqlToYql("CREATE TABLE t (a SerIAL)");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_AliasSerialToIntType) {
+ auto res = PgSqlToYql("CREATE TABLE t (a SerIAL)");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '('('a (PgType 'int4) '('columnConstraints '('('serial)))))))))
(let world (CommitAll! world))
(return world))
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateTableStmt_Temp) {
- auto res = PgSqlToYql("create temp table t ()");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(CreateTableStmt_Temp) {
+ auto res = PgSqlToYql("create temp table t ()");
+ UNIT_ASSERT(res.Root);
- TString program = R"(
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"t"))) (Void) '('('mode 'create) '('columns '()) '('temporary))))
@@ -265,16 +260,16 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(CreateSeqStmt) {
- auto res = PgSqlToYql(
- "CREATE TEMP SEQUENCE IF NOT EXISTS seq AS integer START WITH 10 INCREMENT BY 2 NO MINVALUE NO MAXVALUE CACHE 3;");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+Y_UNIT_TEST(CreateSeqStmt) {
+ auto res = PgSqlToYql(
+ "CREATE TEMP SEQUENCE IF NOT EXISTS seq AS integer START WITH 10 INCREMENT BY 2 NO MINVALUE NO MAXVALUE CACHE 3;");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+ TString program = R"(
((let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"")
(Key '('pgObject (String '"seq") (String 'pgSequence))) (Void) '(
@@ -282,28 +277,28 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
'('"start" '10) '('"increment" '2) '('"cache" '3))))
(let world (CommitAll! world)) (return world))
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(DropSequenceStmt) {
- auto res = PgSqlToYql("DROP SEQUENCE IF EXISTS seq;");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+Y_UNIT_TEST(DropSequenceStmt) {
+ auto res = PgSqlToYql("DROP SEQUENCE IF EXISTS seq;");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns)) (let world (Write! world (DataSink '"kikimr" '"") (Key '('pgObject (String '"seq") (String 'pgSequence))) (Void) '('('mode 'drop_if_exists))))
(let world (CommitAll! world))
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(AlterSequenceStmt) {
- auto res = PgSqlToYql("ALTER SEQUENCE IF EXISTS seq AS integer START WITH 10 RESTART WITH 101 INCREMENT BY 2 NO MINVALUE NO MAXVALUE CACHE 3;");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+Y_UNIT_TEST(AlterSequenceStmt) {
+ auto res = PgSqlToYql("ALTER SEQUENCE IF EXISTS seq AS integer START WITH 10 RESTART WITH 101 INCREMENT BY 2 NO MINVALUE NO MAXVALUE CACHE 3;");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"")
@@ -312,75 +307,75 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(let world (CommitAll! world)) (return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(AlterTableSetDefaultNextvalStmt) {
- auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('seq');");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+Y_UNIT_TEST(AlterTableSetDefaultNextvalStmt) {
+ auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('seq');");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ TString program = R"(
(
- (let world (Configure! world (DataSource 'config) 'OrderedColumns))
- (let world (Write! world (DataSink '"kikimr" '"")
- (Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
+ (let world (Configure! world (DataSource 'config) 'OrderedColumns))
+ (let world (Write! world (DataSink '"kikimr" '"")
+ (Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
(let world (CommitAll! world)) (return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(AlterTableSetDefaultNextvalStmtWithSchemaname) {
- auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('public.seq'::regclass);");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+Y_UNIT_TEST(AlterTableSetDefaultNextvalStmtWithSchemaname) {
+ auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('public.seq'::regclass);");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ TString program = R"(
(
- (let world (Configure! world (DataSource 'config) 'OrderedColumns))
- (let world (Write! world (DataSink '"kikimr" '"")
- (Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
+ (let world (Configure! world (DataSource 'config) 'OrderedColumns))
+ (let world (Write! world (DataSink '"kikimr" '"")
+ (Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
(let world (CommitAll! world)) (return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(AlterTableStmtWithCast) {
- auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('seq'::regclass);");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+Y_UNIT_TEST(AlterTableStmtWithCast) {
+ auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('seq'::regclass);");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ TString program = R"(
(
- (let world (Configure! world (DataSource 'config) 'OrderedColumns))
- (let world (Write! world (DataSink '"kikimr" '"")
- (Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
+ (let world (Configure! world (DataSource 'config) 'OrderedColumns))
+ (let world (Write! world (DataSink '"kikimr" '"")
+ (Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
(let world (CommitAll! world)) (return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(AlterTableDropDefaultStmt) {
- auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id DROP DEFAULT;");
- UNIT_ASSERT_C(res.Root, res.Issues.ToString());
- TString program = R"(
+Y_UNIT_TEST(AlterTableDropDefaultStmt) {
+ auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id DROP DEFAULT;");
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ TString program = R"(
(
- (let world (Configure! world (DataSource 'config) 'OrderedColumns))
- (let world (Write! world (DataSink '"kikimr" '"")
+ (let world (Configure! world (DataSource 'config) 'OrderedColumns))
+ (let world (Write! world (DataSink '"kikimr" '"")
(Key '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('Null))))))))))
(let world (CommitAll! world)) (return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(VariableShowStmt) {
- auto res = PgSqlToYql("Show server_version_num");
- UNIT_ASSERT(res.Root);
+Y_UNIT_TEST(VariableShowStmt) {
+ auto res = PgSqlToYql("Show server_version_num");
+ UNIT_ASSERT(res.Root);
- TString program = fmt::format(R"(
+ TString program = fmt::format(R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let output (PgSelect '('('set_items '((PgSetItem '('('result '((PgResultItem '"server_version_num" (Void) (lambda '() (PgConst '"{}" (PgType 'text)))))))))) '('set_ops '('push)))))
@@ -391,93 +386,92 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)", NYql::GetPostgresServerVersionNum());
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- TMap<TString, TString> GetParamNameToPgType(const NYql::TAstNode& root) {
- TMap<TString, TString> actualParamToType;
-
- VisitAstNodes(root, [&actualParamToType] (const NYql::TAstNode& node) {
- bool isDeclareNode =
- node.IsListOfSize(3) && node.GetChild(0)->IsAtom()
- && node.GetChild(0)->GetContent() == "declare";
- if (isDeclareNode) {
- const auto varNameNode = node.GetChild(1);
- UNIT_ASSERT(varNameNode->IsAtom());
- const auto varName = varNameNode->GetContent();
-
- const auto varTypeNode = node.GetChild(2);
- UNIT_ASSERT(varTypeNode->IsListOfSize(2));
- UNIT_ASSERT(varTypeNode->GetChild(0)->GetContent() == "PgType");
- actualParamToType[TString(varName)] = varTypeNode->GetChild(1)->ToString();
- }
- });
-
- return actualParamToType;
- }
+TMap<TString, TString> GetParamNameToPgType(const NYql::TAstNode& root) {
+ TMap<TString, TString> actualParamToType;
+
+ VisitAstNodes(root, [&actualParamToType](const NYql::TAstNode& node) {
+ bool isDeclareNode =
+ node.IsListOfSize(3) && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "declare";
+ if (isDeclareNode) {
+ const auto varNameNode = node.GetChild(1);
+ UNIT_ASSERT(varNameNode->IsAtom());
+ const auto varName = varNameNode->GetContent();
+
+ const auto varTypeNode = node.GetChild(2);
+ UNIT_ASSERT(varTypeNode->IsListOfSize(2));
+ UNIT_ASSERT(varTypeNode->GetChild(0)->GetContent() == "PgType");
+ actualParamToType[TString(varName)] = varTypeNode->GetChild(1)->ToString();
+ }
+ });
- Y_UNIT_TEST(ParamRef_IntAndPoint) {
- TTranslationSettings settings;
-
- settings.PgParameterTypeOids = {NYql::NPg::LookupType("int4").TypeId, NYql::NPg::LookupType("point").TypeId};
- auto res = SqlToYqlWithMode(
- R"(select $1 as "x", $2 as "y")",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- TMap<TString, TString> expectedParamToType {
- {"$p1", "'int4"},
- {"$p2", "'point"},
- };
- UNIT_ASSERT(res.Root);
- const auto actualParamToTypes = GetParamNameToPgType(*res.Root);
- UNIT_ASSERT(expectedParamToType.size() == actualParamToTypes.size());
- UNIT_ASSERT_EQUAL(expectedParamToType, actualParamToTypes);
- }
+ return actualParamToType;
+}
- Y_UNIT_TEST(ParamRef_IntUnknownInt) {
- TTranslationSettings settings;
- settings.PgParameterTypeOids = {NYql::NPg::LookupType("int4").TypeId, NYql::NPg::LookupType("unknown").TypeId, NYql::NPg::LookupType("int4").TypeId};
- auto res = SqlToYqlWithMode(
- R"(select $1 as "x", $2 as "y", $3 as "z")",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- TMap<TString, TString> expectedParamToType {
- {"$p1", "'int4"},
- {"$p2", "'unknown"},
- {"$p3", "'int4"},
- };
- UNIT_ASSERT(res.Root);
- const auto actualParamToTypes = GetParamNameToPgType(*res.Root);
- UNIT_ASSERT(expectedParamToType.size() == actualParamToTypes.size());
- UNIT_ASSERT_EQUAL(expectedParamToType, actualParamToTypes);
- }
+Y_UNIT_TEST(ParamRef_IntAndPoint) {
+ TTranslationSettings settings;
+
+ settings.PgParameterTypeOids = {NYql::NPg::LookupType("int4").TypeId, NYql::NPg::LookupType("point").TypeId};
+ auto res = SqlToYqlWithMode(
+ R"(select $1 as "x", $2 as "y")",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ TMap<TString, TString> expectedParamToType{
+ {"$p1", "'int4"},
+ {"$p2", "'point"},
+ };
+ UNIT_ASSERT(res.Root);
+ const auto actualParamToTypes = GetParamNameToPgType(*res.Root);
+ UNIT_ASSERT(expectedParamToType.size() == actualParamToTypes.size());
+ UNIT_ASSERT_EQUAL(expectedParamToType, actualParamToTypes);
+}
- Y_UNIT_TEST(ParamRef_NoTypeOids) {
- TTranslationSettings settings;
- settings.PgParameterTypeOids = {};
- auto res = PgSqlToYql(R"(select $1 as "x", $2 as "y", $3 as "z")");
- TMap<TString, TString> expectedParamToType {
- {"$p1", "'unknown"},
- {"$p2", "'unknown"},
- {"$p3", "'unknown"},
- };
- UNIT_ASSERT(res.Root);
- auto actualParamToTypes = GetParamNameToPgType(*res.Root);
- UNIT_ASSERT_VALUES_EQUAL(expectedParamToType, actualParamToTypes);
- }
+Y_UNIT_TEST(ParamRef_IntUnknownInt) {
+ TTranslationSettings settings;
+ settings.PgParameterTypeOids = {NYql::NPg::LookupType("int4").TypeId, NYql::NPg::LookupType("unknown").TypeId, NYql::NPg::LookupType("int4").TypeId};
+ auto res = SqlToYqlWithMode(
+ R"(select $1 as "x", $2 as "y", $3 as "z")",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ TMap<TString, TString> expectedParamToType{
+ {"$p1", "'int4"},
+ {"$p2", "'unknown"},
+ {"$p3", "'int4"},
+ };
+ UNIT_ASSERT(res.Root);
+ const auto actualParamToTypes = GetParamNameToPgType(*res.Root);
+ UNIT_ASSERT(expectedParamToType.size() == actualParamToTypes.size());
+ UNIT_ASSERT_EQUAL(expectedParamToType, actualParamToTypes);
+}
- Y_UNIT_TEST(DropTableStmt) {
- auto res = PgSqlToYql("drop table plato.Input");
- TString program = R"(
+Y_UNIT_TEST(ParamRef_NoTypeOids) {
+ TTranslationSettings settings;
+ settings.PgParameterTypeOids = {};
+ auto res = PgSqlToYql(R"(select $1 as "x", $2 as "y", $3 as "z")");
+ TMap<TString, TString> expectedParamToType{
+ {"$p1", "'unknown"},
+ {"$p2", "'unknown"},
+ {"$p3", "'unknown"},
+ };
+ UNIT_ASSERT(res.Root);
+ auto actualParamToTypes = GetParamNameToPgType(*res.Root);
+ UNIT_ASSERT_VALUES_EQUAL(expectedParamToType, actualParamToTypes);
+}
+
+Y_UNIT_TEST(DropTableStmt) {
+ auto res = PgSqlToYql("drop table plato.Input");
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"yt" '"plato") (Key '('tablescheme (String '"input"))) (Void) '('('mode 'drop))))
@@ -485,13 +479,13 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(DropTableStmtMultiple) {
- auto res = PgSqlToYql("DROP TABLE FakeTable1, FakeTable2");
- TString program = R"(
+Y_UNIT_TEST(DropTableStmtMultiple) {
+ auto res = PgSqlToYql("DROP TABLE FakeTable1, FakeTable2");
+ TString program = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let world (Write! world (DataSink '"kikimr" '"") (Key '('tablescheme (String '"FakeTable1"))) (Void) '('('mode 'drop))))
@@ -500,32 +494,32 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(program);
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(DropTableUnknownClusterStmt) {
- auto res = PgSqlToYql("drop table if exists pub.t");
- UNIT_ASSERT(!res.IsOk());
- UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
+Y_UNIT_TEST(DropTableUnknownClusterStmt) {
+ auto res = PgSqlToYql("drop table if exists pub.t");
+ UNIT_ASSERT(!res.IsOk());
+ UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
- auto issue = *(res.Issues.begin());
- UNIT_ASSERT_C(issue.GetMessage().find("Unknown cluster: pub") != TString::npos, res.Issues.ToString());
- }
+ auto issue = *(res.Issues.begin());
+ UNIT_ASSERT_C(issue.GetMessage().find("Unknown cluster: pub") != TString::npos, res.Issues.ToString());
+}
- Y_UNIT_TEST(PublicSchemeRemove) {
- auto res = PgSqlToYql("DROP TABLE IF EXISTS public.t; CREATE TABLE public.t(id INT PRIMARY KEY, foo INT);\
+Y_UNIT_TEST(PublicSchemeRemove) {
+ auto res = PgSqlToYql("DROP TABLE IF EXISTS public.t; CREATE TABLE public.t(id INT PRIMARY KEY, foo INT);\
INSERT INTO public.t VALUES(1, 2);\
UPDATE public.t SET foo = 3 WHERE id == 1;\
DELETE FROM public.t WHERE id == 1;\
SELECT COUNT(*) FROM public.t;");
- UNIT_ASSERT(res.IsOk());
- UNIT_ASSERT(res.Root->ToString().find("public") == TString::npos);
- }
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root->ToString().find("public") == TString::npos);
+}
- Y_UNIT_TEST(UpdateStmt) {
- auto res = PgSqlToYql("UPDATE plato.Input SET kind = 'test' where kind = 'testtest'");
- TString updateStmtProg = R"(
+Y_UNIT_TEST(UpdateStmt) {
+ auto res = PgSqlToYql("UPDATE plato.Input SET kind = 'test' where kind = 'testtest'");
+ TString updateStmtProg = R"(
(
(let world (Configure! world (DataSource 'config) 'OrderedColumns))
(let read0 (Read! world (DataSource '"yt" '"plato") (Key '('table (String '"input"))) (Void) '()))
@@ -549,125 +543,125 @@ SELECT COUNT(*) FROM public.t;");
(return world)
)
)";
- const auto expectedAst = NYql::ParseAst(updateStmtProg);
+ const auto expectedAst = NYql::ParseAst(updateStmtProg);
- UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
- UNIT_ASSERT_C(res.Root, "Failed to parse statement, root is nullptr");
- UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
- }
+ UNIT_ASSERT_C(res.Issues.Empty(), "Failed to parse statement, issues: " + res.Issues.ToString());
+ UNIT_ASSERT_C(res.Root, "Failed to parse statement, root is nullptr");
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+}
- Y_UNIT_TEST(BlockEngine) {
- auto res = PgSqlToYql("set blockEngine='auto'; select 1;");
- UNIT_ASSERT(res.Root);
- UNIT_ASSERT_STRING_CONTAINS(res.Root->ToString(), "(let world (Configure! world (DataSource 'config) 'BlockEngine 'auto))");
+Y_UNIT_TEST(BlockEngine) {
+ auto res = PgSqlToYql("set blockEngine='auto'; select 1;");
+ UNIT_ASSERT(res.Root);
+ UNIT_ASSERT_STRING_CONTAINS(res.Root->ToString(), "(let world (Configure! world (DataSource 'config) 'BlockEngine 'auto))");
- res = PgSqlToYql("set Blockengine='force'; select 1;");
- UNIT_ASSERT(res.Root);
- UNIT_ASSERT_STRING_CONTAINS(res.Root->ToString(), "(let world (Configure! world (DataSource 'config) 'BlockEngine 'force))");
+ res = PgSqlToYql("set Blockengine='force'; select 1;");
+ UNIT_ASSERT(res.Root);
+ UNIT_ASSERT_STRING_CONTAINS(res.Root->ToString(), "(let world (Configure! world (DataSource 'config) 'BlockEngine 'force))");
- res = PgSqlToYql("set BlockEngine='disable'; select 1;");
- UNIT_ASSERT(res.Root);
- UNIT_ASSERT(!res.Root->ToString().Contains("BlockEngine"));
+ res = PgSqlToYql("set BlockEngine='disable'; select 1;");
+ UNIT_ASSERT(res.Root);
+ UNIT_ASSERT(!res.Root->ToString().Contains("BlockEngine"));
- res = PgSqlToYql("set BlockEngine='foo'; select 1;");
- UNIT_ASSERT(!res.Root);
- UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
+ res = PgSqlToYql("set BlockEngine='foo'; select 1;");
+ UNIT_ASSERT(!res.Root);
+ UNIT_ASSERT_EQUAL(res.Issues.Size(), 1);
- auto issue = *(res.Issues.begin());
- UNIT_ASSERT(issue.GetMessage().Contains("VariableSetStmt, not supported BlockEngine option value: foo"));
- }
+ auto issue = *(res.Issues.begin());
+ UNIT_ASSERT(issue.GetMessage().Contains("VariableSetStmt, not supported BlockEngine option value: foo"));
+}
- Y_UNIT_TEST(SetConfig_SearchPath) {
- TTranslationSettings settings;
- settings.GUCSettings = std::make_shared<TGUCSettings>();
- settings.ClusterMapping["pg_catalog"] = NYql::PgProviderName;
- settings.DefaultCluster = "";
-
- auto res = SqlToYqlWithMode(
- R"(select set_config('search_path', 'pg_catalog', false);)",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::ToCerr,
- false,
- settings);
- UNIT_ASSERT_C(res.IsOk(), res.Issues.ToString());
- UNIT_ASSERT(res.Root);
-
- res = SqlToYqlWithMode(
- R"(select oid,
+Y_UNIT_TEST(SetConfig_SearchPath) {
+ TTranslationSettings settings;
+ settings.GUCSettings = std::make_shared<TGUCSettings>();
+ settings.ClusterMapping["pg_catalog"] = NYql::PgProviderName;
+ settings.DefaultCluster = "";
+
+ auto res = SqlToYqlWithMode(
+ R"(select set_config('search_path', 'pg_catalog', false);)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::ToCerr,
+ false,
+ settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToString());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select oid,
typinput::int4 as typinput,
typname,
typnamespace,
typtype
from pg_type)",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- UNIT_ASSERT(res.IsOk());
- UNIT_ASSERT(res.Root);
-
- res = SqlToYqlWithMode(
- R"(select oid,
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select oid,
typinput::int4 as typinput,
typname,
typnamespace,
typtype
from pg_catalog.pg_type)",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- UNIT_ASSERT(res.IsOk());
- UNIT_ASSERT(res.Root);
-
- res = SqlToYqlWithMode(
- R"(select set_config('search_path', 'public', false);)",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- UNIT_ASSERT(res.IsOk());
- UNIT_ASSERT(res.Root);
-
- res = SqlToYqlWithMode(
- R"(select * from pg_type;)",
- NSQLTranslation::ESqlMode::QUERY,
- 10,
- {},
- EDebugOutput::None,
- false,
- settings);
- UNIT_ASSERT(res.IsOk());
- UNIT_ASSERT(res.Root);
- }
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select set_config('search_path', 'public', false);)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select * from pg_type;)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
}
+} // Y_UNIT_TEST_SUITE(PgSqlParsingOnly)
Y_UNIT_TEST_SUITE(PgExtensions) {
- using namespace NYql;
+using namespace NYql;
- Y_UNIT_TEST(Empty) {
- NPg::ClearExtensions();
- UNIT_ASSERT_VALUES_EQUAL(NPg::ExportExtensions(), "");
- NPg::ImportExtensions("", true, nullptr);
- }
+Y_UNIT_TEST(Empty) {
+ NPg::ClearExtensions();
+ UNIT_ASSERT_VALUES_EQUAL(NPg::ExportExtensions(), "");
+ NPg::ImportExtensions("", true, nullptr);
+}
- Y_UNIT_TEST(ProcsAndType) {
- NPg::ClearExtensions();
- if (NPg::AreAllFunctionsAllowed()) {
- return;
- }
+Y_UNIT_TEST(ProcsAndType) {
+ NPg::ClearExtensions();
+ if (NPg::AreAllFunctionsAllowed()) {
+ return;
+ }
- NPg::TExtensionDesc desc;
- TTempFileHandle h;
- TStringBuf sql = R"(
+ NPg::TExtensionDesc desc;
+ TTempFileHandle h;
+ TStringBuf sql = R"(
CREATE OR REPLACE FUNCTION mytype_in(cstring)
RETURNS mytype
AS '$libdir/MyExt','mytype_in_func'
@@ -686,42 +680,42 @@ Y_UNIT_TEST_SUITE(PgExtensions) {
);
)";
- h.Write(sql.data(), sql.size());
- desc.Name = "MyExt";
- desc.InstallName = "$libdir/MyExt";
- desc.SqlPaths.push_back(h.Name());
- NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
- auto validate = [&]() {
- const auto& type = NPg::LookupType("mytype");
- UNIT_ASSERT_VALUES_EQUAL(type.Category, 'U');
- UNIT_ASSERT_VALUES_EQUAL(type.TypeLen, 65);
- UNIT_ASSERT_VALUES_EQUAL(type.TypeAlign, 'd');
- const auto& arrType = NPg::LookupType("_mytype");
- UNIT_ASSERT_VALUES_EQUAL(arrType.ElementTypeId, type.TypeId);
- const auto& inProc = NPg::LookupProc("mytype_in", { NPg::LookupType("cstring").TypeId });
- UNIT_ASSERT_VALUES_EQUAL(inProc.ArgTypes.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(inProc.Src, "mytype_in_func");
- UNIT_ASSERT(inProc.IsStrict);
- const auto& outProc = NPg::LookupProc("mytype_out", { NPg::LookupType("mytype").TypeId });
- UNIT_ASSERT_VALUES_EQUAL(outProc.ArgTypes.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(outProc.Src, "mytype_out_func");
- UNIT_ASSERT(outProc.IsStrict);
- UNIT_ASSERT_VALUES_EQUAL(type.InFuncId, inProc.ProcId);
- UNIT_ASSERT_VALUES_EQUAL(type.OutFuncId, outProc.ProcId);
- };
-
- validate();
- auto exported = NPg::ExportExtensions();
- NPg::ClearExtensions();
- NPg::ImportExtensions(exported, true, nullptr);
- validate();
- }
+ h.Write(sql.data(), sql.size());
+ desc.Name = "MyExt";
+ desc.InstallName = "$libdir/MyExt";
+ desc.SqlPaths.push_back(h.Name());
+ NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
+ auto validate = [&]() {
+ const auto& type = NPg::LookupType("mytype");
+ UNIT_ASSERT_VALUES_EQUAL(type.Category, 'U');
+ UNIT_ASSERT_VALUES_EQUAL(type.TypeLen, 65);
+ UNIT_ASSERT_VALUES_EQUAL(type.TypeAlign, 'd');
+ const auto& arrType = NPg::LookupType("_mytype");
+ UNIT_ASSERT_VALUES_EQUAL(arrType.ElementTypeId, type.TypeId);
+ const auto& inProc = NPg::LookupProc("mytype_in", {NPg::LookupType("cstring").TypeId});
+ UNIT_ASSERT_VALUES_EQUAL(inProc.ArgTypes.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(inProc.Src, "mytype_in_func");
+ UNIT_ASSERT(inProc.IsStrict);
+ const auto& outProc = NPg::LookupProc("mytype_out", {NPg::LookupType("mytype").TypeId});
+ UNIT_ASSERT_VALUES_EQUAL(outProc.ArgTypes.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(outProc.Src, "mytype_out_func");
+ UNIT_ASSERT(outProc.IsStrict);
+ UNIT_ASSERT_VALUES_EQUAL(type.InFuncId, inProc.ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(type.OutFuncId, outProc.ProcId);
+ };
+
+ validate();
+ auto exported = NPg::ExportExtensions();
+ NPg::ClearExtensions();
+ NPg::ImportExtensions(exported, true, nullptr);
+ validate();
+}
- Y_UNIT_TEST(InsertValues) {
- NPg::ClearExtensions();
- NPg::TExtensionDesc desc;
- TTempFileHandle h;
- TStringBuf sql = R"(
+Y_UNIT_TEST(InsertValues) {
+ NPg::ClearExtensions();
+ NPg::TExtensionDesc desc;
+ TTempFileHandle h;
+ TStringBuf sql = R"(
CREATE TABLE mytable(
foo int4,
bar text,
@@ -732,41 +726,41 @@ Y_UNIT_TEST_SUITE(PgExtensions) {
VALUES ('a', 1, null),('b', null, -3.4);
)";
- h.Write(sql.data(), sql.size());
- desc.Name = "MyExt";
- desc.InstallName = "$libdir/MyExt";
- desc.SqlPaths.push_back(h.Name());
- NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
- auto validate = [&]() {
- const auto& table = NPg::LookupStaticTable({"pg_catalog","mytable"});
- UNIT_ASSERT(table.Kind == NPg::ERelKind::Relation);
- size_t remap[2];
- size_t rowStep;
- const auto& data = *NPg::ReadTable({"pg_catalog", "mytable"}, {"foo", "bar"}, remap, rowStep);
- UNIT_ASSERT_VALUES_EQUAL(rowStep, 3);
- UNIT_ASSERT_VALUES_EQUAL(data.size(), 2 * rowStep);
- UNIT_ASSERT_VALUES_EQUAL(data[rowStep * 0 + remap[0]], "1");
- UNIT_ASSERT_VALUES_EQUAL(data[rowStep * 0 + remap[1]], "a");
- UNIT_ASSERT(!data[rowStep * 1 + remap[0]].Defined());
- UNIT_ASSERT_VALUES_EQUAL(data[rowStep * 1 + remap[1]], "b");
- };
-
- validate();
- auto exported = NPg::ExportExtensions();
- NPg::ClearExtensions();
- NPg::ImportExtensions(exported, true, nullptr);
- validate();
- }
+ h.Write(sql.data(), sql.size());
+ desc.Name = "MyExt";
+ desc.InstallName = "$libdir/MyExt";
+ desc.SqlPaths.push_back(h.Name());
+ NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
+ auto validate = [&]() {
+ const auto& table = NPg::LookupStaticTable({"pg_catalog", "mytable"});
+ UNIT_ASSERT(table.Kind == NPg::ERelKind::Relation);
+ size_t remap[2];
+ size_t rowStep;
+ const auto& data = *NPg::ReadTable({"pg_catalog", "mytable"}, {"foo", "bar"}, remap, rowStep);
+ UNIT_ASSERT_VALUES_EQUAL(rowStep, 3);
+ UNIT_ASSERT_VALUES_EQUAL(data.size(), 2 * rowStep);
+ UNIT_ASSERT_VALUES_EQUAL(data[rowStep * 0 + remap[0]], "1");
+ UNIT_ASSERT_VALUES_EQUAL(data[rowStep * 0 + remap[1]], "a");
+ UNIT_ASSERT(!data[rowStep * 1 + remap[0]].Defined());
+ UNIT_ASSERT_VALUES_EQUAL(data[rowStep * 1 + remap[1]], "b");
+ };
+
+ validate();
+ auto exported = NPg::ExportExtensions();
+ NPg::ClearExtensions();
+ NPg::ImportExtensions(exported, true, nullptr);
+ validate();
+}
- Y_UNIT_TEST(Casts) {
- NPg::ClearExtensions();
- if (NPg::AreAllFunctionsAllowed()) {
- return;
- }
+Y_UNIT_TEST(Casts) {
+ NPg::ClearExtensions();
+ if (NPg::AreAllFunctionsAllowed()) {
+ return;
+ }
- NPg::TExtensionDesc desc;
- TTempFileHandle h;
- TStringBuf sql = R"(
+ NPg::TExtensionDesc desc;
+ TTempFileHandle h;
+ TStringBuf sql = R"(
CREATE TYPE foo (
alignment = double,
internallength = variable
@@ -785,39 +779,39 @@ Y_UNIT_TEST_SUITE(PgExtensions) {
CREATE CAST (foo AS bar) WITH FUNCTION bar(foo);
)";
- h.Write(sql.data(), sql.size());
- desc.Name = "MyExt";
- desc.InstallName = "$libdir/MyExt";
- desc.SqlPaths.push_back(h.Name());
- NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
- auto validate = [&]() {
- auto sourceId = NPg::LookupType("foo").TypeId;
- auto targetId = NPg::LookupType("bar").TypeId;
- UNIT_ASSERT(NPg::HasCast(sourceId, targetId));
- const auto& cast = NPg::LookupCast(sourceId, targetId);
- UNIT_ASSERT_VALUES_EQUAL(cast.SourceId, sourceId);
- UNIT_ASSERT_VALUES_EQUAL(cast.TargetId, targetId);
- UNIT_ASSERT_VALUES_EQUAL((ui32)cast.Method, (ui32)NPg::ECastMethod::Function);
- UNIT_ASSERT_VALUES_EQUAL(cast.CoercionCode, NPg::ECoercionCode::Explicit);
- UNIT_ASSERT_VALUES_EQUAL(cast.FunctionId, NPg::LookupProc("bar",{sourceId}).ProcId);
- };
-
- validate();
- auto exported = NPg::ExportExtensions();
- NPg::ClearExtensions();
- NPg::ImportExtensions(exported, true, nullptr);
- validate();
- }
+ h.Write(sql.data(), sql.size());
+ desc.Name = "MyExt";
+ desc.InstallName = "$libdir/MyExt";
+ desc.SqlPaths.push_back(h.Name());
+ NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
+ auto validate = [&]() {
+ auto sourceId = NPg::LookupType("foo").TypeId;
+ auto targetId = NPg::LookupType("bar").TypeId;
+ UNIT_ASSERT(NPg::HasCast(sourceId, targetId));
+ const auto& cast = NPg::LookupCast(sourceId, targetId);
+ UNIT_ASSERT_VALUES_EQUAL(cast.SourceId, sourceId);
+ UNIT_ASSERT_VALUES_EQUAL(cast.TargetId, targetId);
+ UNIT_ASSERT_VALUES_EQUAL((ui32)cast.Method, (ui32)NPg::ECastMethod::Function);
+ UNIT_ASSERT_VALUES_EQUAL(cast.CoercionCode, NPg::ECoercionCode::Explicit);
+ UNIT_ASSERT_VALUES_EQUAL(cast.FunctionId, NPg::LookupProc("bar", {sourceId}).ProcId);
+ };
+
+ validate();
+ auto exported = NPg::ExportExtensions();
+ NPg::ClearExtensions();
+ NPg::ImportExtensions(exported, true, nullptr);
+ validate();
+}
- Y_UNIT_TEST(Operators) {
- NPg::ClearExtensions();
- if (NPg::AreAllFunctionsAllowed()) {
- return;
- }
+Y_UNIT_TEST(Operators) {
+ NPg::ClearExtensions();
+ if (NPg::AreAllFunctionsAllowed()) {
+ return;
+ }
- NPg::TExtensionDesc desc;
- TTempFileHandle h;
- TStringBuf sql = R"(
+ NPg::TExtensionDesc desc;
+ TTempFileHandle h;
+ TStringBuf sql = R"(
CREATE TYPE foo (
alignment = double,
internallength = variable
@@ -864,69 +858,69 @@ Y_UNIT_TEST_SUITE(PgExtensions) {
);
)";
- h.Write(sql.data(), sql.size());
- desc.Name = "MyExt";
- desc.InstallName = "$libdir/MyExt";
- desc.SqlPaths.push_back(h.Name());
- NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
- auto validate = [&]() {
- auto typeId = NPg::LookupType("foo").TypeId;
- TVector<ui32> args { typeId, typeId };
- auto lessProcId = NPg::LookupProc("foo_lt", args).ProcId;
- auto lessOrEqualProcId = NPg::LookupProc("foo_le", args).ProcId;
- auto greaterProcId = NPg::LookupProc("foo_gt", args).ProcId;
- auto greaterOrEqualProcId = NPg::LookupProc("foo_ge", args).ProcId;
-
- const auto& lessOp = NPg::LookupOper("<", args);
- const auto& lessOrEqualOp = NPg::LookupOper("<=", args);
- const auto& greaterOp = NPg::LookupOper(">", args);
- const auto& greaterOrEqualOp = NPg::LookupOper(">=", args);
-
- UNIT_ASSERT_VALUES_EQUAL(lessOp.Name, "<");
- UNIT_ASSERT_VALUES_EQUAL(lessOp.LeftType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(lessOp.RightType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(lessOp.ProcId, lessProcId);
- UNIT_ASSERT_VALUES_EQUAL(lessOp.ComId, greaterOp.OperId);
- UNIT_ASSERT_VALUES_EQUAL(lessOp.NegateId, greaterOrEqualOp.OperId);
-
- UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.Name, "<=");
- UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.LeftType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.RightType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.ProcId, lessOrEqualProcId);
- UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.ComId, greaterOrEqualOp.OperId);
- UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.NegateId, greaterOp.OperId);
-
- UNIT_ASSERT_VALUES_EQUAL(greaterOp.Name, ">");
- UNIT_ASSERT_VALUES_EQUAL(greaterOp.LeftType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOp.RightType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOp.ProcId, greaterProcId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOp.ComId, lessOp.OperId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOp.NegateId, lessOrEqualOp.OperId);
-
- UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.Name, ">=");
- UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.LeftType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.RightType, typeId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.ProcId, greaterOrEqualProcId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.ComId, lessOrEqualOp.OperId);
- UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.NegateId, lessOp.OperId);
- };
-
- validate();
- auto exported = NPg::ExportExtensions();
- NPg::ClearExtensions();
- NPg::ImportExtensions(exported, true, nullptr);
- validate();
- }
+ h.Write(sql.data(), sql.size());
+ desc.Name = "MyExt";
+ desc.InstallName = "$libdir/MyExt";
+ desc.SqlPaths.push_back(h.Name());
+ NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
+ auto validate = [&]() {
+ auto typeId = NPg::LookupType("foo").TypeId;
+ TVector<ui32> args{typeId, typeId};
+ auto lessProcId = NPg::LookupProc("foo_lt", args).ProcId;
+ auto lessOrEqualProcId = NPg::LookupProc("foo_le", args).ProcId;
+ auto greaterProcId = NPg::LookupProc("foo_gt", args).ProcId;
+ auto greaterOrEqualProcId = NPg::LookupProc("foo_ge", args).ProcId;
+
+ const auto& lessOp = NPg::LookupOper("<", args);
+ const auto& lessOrEqualOp = NPg::LookupOper("<=", args);
+ const auto& greaterOp = NPg::LookupOper(">", args);
+ const auto& greaterOrEqualOp = NPg::LookupOper(">=", args);
+
+ UNIT_ASSERT_VALUES_EQUAL(lessOp.Name, "<");
+ UNIT_ASSERT_VALUES_EQUAL(lessOp.LeftType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOp.RightType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOp.ProcId, lessProcId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOp.ComId, greaterOp.OperId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOp.NegateId, greaterOrEqualOp.OperId);
+
+ UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.Name, "<=");
+ UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.LeftType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.RightType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.ProcId, lessOrEqualProcId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.ComId, greaterOrEqualOp.OperId);
+ UNIT_ASSERT_VALUES_EQUAL(lessOrEqualOp.NegateId, greaterOp.OperId);
+
+ UNIT_ASSERT_VALUES_EQUAL(greaterOp.Name, ">");
+ UNIT_ASSERT_VALUES_EQUAL(greaterOp.LeftType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOp.RightType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOp.ProcId, greaterProcId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOp.ComId, lessOp.OperId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOp.NegateId, lessOrEqualOp.OperId);
+
+ UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.Name, ">=");
+ UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.LeftType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.RightType, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.ProcId, greaterOrEqualProcId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.ComId, lessOrEqualOp.OperId);
+ UNIT_ASSERT_VALUES_EQUAL(greaterOrEqualOp.NegateId, lessOp.OperId);
+ };
+
+ validate();
+ auto exported = NPg::ExportExtensions();
+ NPg::ClearExtensions();
+ NPg::ImportExtensions(exported, true, nullptr);
+ validate();
+}
- Y_UNIT_TEST(Aggregates) {
- NPg::ClearExtensions();
- if (NPg::AreAllFunctionsAllowed()) {
- return;
- }
+Y_UNIT_TEST(Aggregates) {
+ NPg::ClearExtensions();
+ if (NPg::AreAllFunctionsAllowed()) {
+ return;
+ }
- NPg::TExtensionDesc desc;
- TTempFileHandle h;
- TStringBuf sql = R"(
+ NPg::TExtensionDesc desc;
+ TTempFileHandle h;
+ TStringBuf sql = R"(
CREATE TYPE foo (
alignment = double,
internallength = variable
@@ -967,42 +961,42 @@ Y_UNIT_TEST_SUITE(PgExtensions) {
);
)";
- h.Write(sql.data(), sql.size());
- desc.Name = "MyExt";
- desc.InstallName = "$libdir/MyExt";
- desc.SqlPaths.push_back(h.Name());
- NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
- auto validate = [&]() {
- auto typeId = NPg::LookupType("foo").TypeId;
- auto internalTypeId = NPg::LookupType("internal").TypeId;
- auto byteaTypeId = NPg::LookupType("bytea").TypeId;
- const auto& desc = NPg::LookupAggregation("foo_agg", { typeId });
- UNIT_ASSERT_VALUES_EQUAL(desc.Name, "foo_agg");
- UNIT_ASSERT_VALUES_EQUAL(desc.ArgTypes, TVector<ui32>{typeId});
- UNIT_ASSERT_VALUES_EQUAL(desc.TransTypeId, internalTypeId);
- UNIT_ASSERT_VALUES_EQUAL(desc.TransFuncId, NPg::LookupProc("foo_agg_trans", {internalTypeId, typeId}).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(desc.FinalFuncId, NPg::LookupProc("foo_agg_final", {internalTypeId}).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(desc.SerializeFuncId, NPg::LookupProc("foo_agg_serial", {internalTypeId}).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(desc.DeserializeFuncId, NPg::LookupProc("foo_agg_deserial", {byteaTypeId, internalTypeId}).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(desc.CombineFuncId, NPg::LookupProc("foo_agg_combine", {internalTypeId, internalTypeId}).ProcId);
- };
-
- validate();
- auto exported = NPg::ExportExtensions();
- NPg::ClearExtensions();
- NPg::ImportExtensions(exported, true, nullptr);
- validate();
- }
+ h.Write(sql.data(), sql.size());
+ desc.Name = "MyExt";
+ desc.InstallName = "$libdir/MyExt";
+ desc.SqlPaths.push_back(h.Name());
+ NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
+ auto validate = [&]() {
+ auto typeId = NPg::LookupType("foo").TypeId;
+ auto internalTypeId = NPg::LookupType("internal").TypeId;
+ auto byteaTypeId = NPg::LookupType("bytea").TypeId;
+ const auto& desc = NPg::LookupAggregation("foo_agg", {typeId});
+ UNIT_ASSERT_VALUES_EQUAL(desc.Name, "foo_agg");
+ UNIT_ASSERT_VALUES_EQUAL(desc.ArgTypes, TVector<ui32>{typeId});
+ UNIT_ASSERT_VALUES_EQUAL(desc.TransTypeId, internalTypeId);
+ UNIT_ASSERT_VALUES_EQUAL(desc.TransFuncId, NPg::LookupProc("foo_agg_trans", {internalTypeId, typeId}).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(desc.FinalFuncId, NPg::LookupProc("foo_agg_final", {internalTypeId}).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(desc.SerializeFuncId, NPg::LookupProc("foo_agg_serial", {internalTypeId}).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(desc.DeserializeFuncId, NPg::LookupProc("foo_agg_deserial", {byteaTypeId, internalTypeId}).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(desc.CombineFuncId, NPg::LookupProc("foo_agg_combine", {internalTypeId, internalTypeId}).ProcId);
+ };
+
+ validate();
+ auto exported = NPg::ExportExtensions();
+ NPg::ClearExtensions();
+ NPg::ImportExtensions(exported, true, nullptr);
+ validate();
+}
- Y_UNIT_TEST(OpClasses) {
- NPg::ClearExtensions();
- if (NPg::AreAllFunctionsAllowed()) {
- return;
- }
+Y_UNIT_TEST(OpClasses) {
+ NPg::ClearExtensions();
+ if (NPg::AreAllFunctionsAllowed()) {
+ return;
+ }
- NPg::TExtensionDesc desc;
- TTempFileHandle h;
- TStringBuf sql = R"(
+ NPg::TExtensionDesc desc;
+ TTempFileHandle h;
+ TStringBuf sql = R"(
CREATE TYPE foo (
alignment = double,
internallength = variable
@@ -1082,39 +1076,39 @@ Y_UNIT_TEST_SUITE(PgExtensions) {
FUNCTION 1 foo_hash(foo);
)";
- h.Write(sql.data(), sql.size());
- desc.Name = "MyExt";
- desc.InstallName = "$libdir/MyExt";
- desc.SqlPaths.push_back(h.Name());
- NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
- auto validate = [&]() {
- const auto& typeDesc = NPg::LookupType("foo");
- auto typeId = typeDesc.TypeId;
- TVector<ui32> args { typeId, typeId };
- UNIT_ASSERT_VALUES_EQUAL(typeDesc.CompareProcId, NPg::LookupProc("foo_cmp", args).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(typeDesc.LessProcId, NPg::LookupProc("foo_lt", args).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(typeDesc.EqualProcId, NPg::LookupProc("foo_eq", args).ProcId);
- UNIT_ASSERT_VALUES_EQUAL(typeDesc.HashProcId, NPg::LookupProc("foo_hash", {typeId}).ProcId);
-
- const auto& opClassBtree = *NPg::LookupDefaultOpClass(NPg::EOpClassMethod::Btree, typeId);
- UNIT_ASSERT_VALUES_EQUAL(opClassBtree.Name, "btree_foo_ops");
- UNIT_ASSERT_VALUES_EQUAL(opClassBtree.Family, "btree/btree_foo_ops");
- UNIT_ASSERT_VALUES_EQUAL(NPg::LookupAmOp(opClassBtree.FamilyId, (ui32)NPg::EBtreeAmStrategy::Less, typeId, typeId).OperId,
- NPg::LookupOper("<", args).OperId);
- UNIT_ASSERT_VALUES_EQUAL(NPg::LookupAmProc(opClassBtree.FamilyId, (ui32)NPg::EBtreeAmProcNum::Compare, typeId, typeId).ProcId,
- NPg::LookupProc("foo_cmp", args).ProcId);
-
- const auto& opClassHash = *NPg::LookupDefaultOpClass(NPg::EOpClassMethod::Hash, typeId);
- UNIT_ASSERT_VALUES_EQUAL(opClassHash.Name, "hash_foo_ops");
- UNIT_ASSERT_VALUES_EQUAL(opClassHash.Family, "hash/hash_foo_ops");
- UNIT_ASSERT_VALUES_EQUAL(NPg::LookupAmProc(opClassHash.FamilyId, (ui32)NPg::EHashAmProcNum::Hash, typeId, typeId).ProcId,
- NPg::LookupProc("foo_hash", {typeId}).ProcId);
- };
-
- validate();
- auto exported = NPg::ExportExtensions();
- NPg::ClearExtensions();
- NPg::ImportExtensions(exported, true, nullptr);
- validate();
- }
+ h.Write(sql.data(), sql.size());
+ desc.Name = "MyExt";
+ desc.InstallName = "$libdir/MyExt";
+ desc.SqlPaths.push_back(h.Name());
+ NPg::RegisterExtensions({desc}, true, *NSQLTranslationPG::CreateExtensionSqlParser(), nullptr);
+ auto validate = [&]() {
+ const auto& typeDesc = NPg::LookupType("foo");
+ auto typeId = typeDesc.TypeId;
+ TVector<ui32> args{typeId, typeId};
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.CompareProcId, NPg::LookupProc("foo_cmp", args).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.LessProcId, NPg::LookupProc("foo_lt", args).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.EqualProcId, NPg::LookupProc("foo_eq", args).ProcId);
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.HashProcId, NPg::LookupProc("foo_hash", {typeId}).ProcId);
+
+ const auto& opClassBtree = *NPg::LookupDefaultOpClass(NPg::EOpClassMethod::Btree, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(opClassBtree.Name, "btree_foo_ops");
+ UNIT_ASSERT_VALUES_EQUAL(opClassBtree.Family, "btree/btree_foo_ops");
+ UNIT_ASSERT_VALUES_EQUAL(NPg::LookupAmOp(opClassBtree.FamilyId, (ui32)NPg::EBtreeAmStrategy::Less, typeId, typeId).OperId,
+ NPg::LookupOper("<", args).OperId);
+ UNIT_ASSERT_VALUES_EQUAL(NPg::LookupAmProc(opClassBtree.FamilyId, (ui32)NPg::EBtreeAmProcNum::Compare, typeId, typeId).ProcId,
+ NPg::LookupProc("foo_cmp", args).ProcId);
+
+ const auto& opClassHash = *NPg::LookupDefaultOpClass(NPg::EOpClassMethod::Hash, typeId);
+ UNIT_ASSERT_VALUES_EQUAL(opClassHash.Name, "hash_foo_ops");
+ UNIT_ASSERT_VALUES_EQUAL(opClassHash.Family, "hash/hash_foo_ops");
+ UNIT_ASSERT_VALUES_EQUAL(NPg::LookupAmProc(opClassHash.FamilyId, (ui32)NPg::EHashAmProcNum::Hash, typeId, typeId).ProcId,
+ NPg::LookupProc("foo_hash", {typeId}).ProcId);
+ };
+
+ validate();
+ auto exported = NPg::ExportExtensions();
+ NPg::ClearExtensions();
+ NPg::ImportExtensions(exported, true, nullptr);
+ validate();
}
+} // Y_UNIT_TEST_SUITE(PgExtensions)
diff --git a/yql/essentials/sql/pg/ut/util.h b/yql/essentials/sql/pg/ut/util.h
index 72739103643..6b75509cf9c 100644
--- a/yql/essentials/sql/pg/ut/util.h
+++ b/yql/essentials/sql/pg/ut/util.h
@@ -1,3 +1,5 @@
+#pragma once
+
#include <contrib/libs/fmt/include/fmt/format.h>
#include <yql/essentials/ast/yql_expr.h>
@@ -22,7 +24,7 @@ inline TString Err2Str(NYql::TAstParseResult& res, EDebugOutput debug = EDebugOu
return s.Str();
}
-class TTestAutoParamBuilder : public NYql::IAutoParamBuilder {
+class TTestAutoParamBuilder: public NYql::IAutoParamBuilder {
public:
TString GetParamValue(const TString& param) const {
auto ptr = State.FindPtr(param);
@@ -76,11 +78,12 @@ public:
return Type;
}
- class TTypeProxy : public NYql::IAutoParamTypeBuilder {
+ class TTypeProxy: public NYql::IAutoParamTypeBuilder {
public:
TTypeProxy(TTestAutoParamBuilder& owner)
: Owner(owner)
- {}
+ {
+ }
void Pg(const TString& name) {
Owner.State[Owner.CurrentParam].first.push_back(name);
@@ -112,11 +115,12 @@ public:
TTestAutoParamBuilder& Owner;
};
- class TDataProxy : public NYql::IAutoParamDataBuilder {
+ class TDataProxy: public NYql::IAutoParamDataBuilder {
public:
TDataProxy(TTestAutoParamBuilder& owner)
: Owner(owner)
- {}
+ {
+ }
void Pg(const TMaybe<TString>& value) final {
Owner.State[Owner.CurrentParam].second.push_back(value);
@@ -156,10 +160,11 @@ public:
TTestAutoParamBuilder()
: Type(*this)
, Data(*this)
- {}
+ {
+ }
};
-class TTestAutoParamBuilderFactory : public NYql::IAutoParamBuilderFactory {
+class TTestAutoParamBuilderFactory: public NYql::IAutoParamBuilderFactory {
public:
NYql::IAutoParamBuilderPtr MakeBuilder() final {
return MakeIntrusive<TTestAutoParamBuilder>();
@@ -167,7 +172,7 @@ public:
};
inline NYql::TAstParseResult SqlToYqlWithMode(const TString& query, NSQLTranslation::ESqlMode mode = NSQLTranslation::ESqlMode::QUERY, size_t maxErrors = 10, const TString& provider = {},
- EDebugOutput debug = EDebugOutput::None, bool ansiLexer = false, NSQLTranslation::TTranslationSettings settings = {})
+ EDebugOutput debug = EDebugOutput::None, bool ansiLexer = false, NSQLTranslation::TTranslationSettings settings = {})
{
google::protobuf::Arena arena;
const auto service = provider ? provider : TString(NYql::YtProviderName);
@@ -188,8 +193,7 @@ inline NYql::TAstParseResult SqlToYqlWithMode(const TString& query, NSQLTranslat
NSQLTranslation::TTranslators translators(
nullptr,
nullptr,
- NSQLTranslationPG::MakeTranslator()
- );
+ NSQLTranslationPG::MakeTranslator());
auto res = SqlToYql(translators, query, settings);
if (debug == EDebugOutput::ToCerr) {
@@ -214,11 +218,9 @@ inline void VisitAstNodes(const NYql::TAstNode& root, const TAstNodeVisitFunc& v
}
}
-
inline TMaybe<const NYql::TAstNode*> MaybeGetQuotedValue(const NYql::TAstNode& node) {
const bool isQuotedList =
- node.IsListOfSize(2) && node.GetChild(0)->IsAtom()
- && node.GetChild(0)->GetContent() == "quote";
+ node.IsListOfSize(2) && node.GetChild(0)->IsAtom() && node.GetChild(0)->GetContent() == "quote";
if (isQuotedList) {
return node.GetChild(1);
}
diff --git a/yql/essentials/sql/pg/utils.cpp b/yql/essentials/sql/pg/utils.cpp
index 5a7aff14980..78fa3e85330 100644
--- a/yql/essentials/sql/pg/utils.cpp
+++ b/yql/essentials/sql/pg/utils.cpp
@@ -7,4 +7,4 @@ TString NormalizeName(TStringBuf name) {
return NYql::NormalizeName(name);
}
-}
+} // namespace NSQLTranslationPG
diff --git a/yql/essentials/sql/pg/utils.h b/yql/essentials/sql/pg/utils.h
index e1c25cdbf75..e4d1b5b572d 100644
--- a/yql/essentials/sql/pg/utils.h
+++ b/yql/essentials/sql/pg/utils.h
@@ -5,4 +5,4 @@ namespace NSQLTranslationPG {
TString NormalizeName(TStringBuf name);
-}
+} // namespace NSQLTranslationPG
diff --git a/yql/essentials/sql/pg_dummy/pg_sql_dummy.cpp b/yql/essentials/sql/pg_dummy/pg_sql_dummy.cpp
index 02cafe876b5..6a85a42bda6 100644
--- a/yql/essentials/sql/pg_dummy/pg_sql_dummy.cpp
+++ b/yql/essentials/sql/pg_dummy/pg_sql_dummy.cpp
@@ -38,7 +38,7 @@ NSQLTranslation::TTranslatorPtr MakeTranslator() {
return NSQLTranslation::MakeDummyTranslator("pg");
}
-} // NSQLTranslationPG
+} // namespace NSQLTranslationPG
namespace NYql {
namespace NCommon {
@@ -88,7 +88,7 @@ TString PgValueCoerce(const NUdf::TUnboxedValuePod& value, ui32 pgTypeId, i32 ty
}
void WriteYsonValuePg(NResult::TYsonResultWriter& writer, const NUdf::TUnboxedValuePod& value, NKikimr::NMiniKQL::TPgType* type,
- const TVector<ui32>* structPositions) {
+ const TVector<ui32>* structPositions) {
Y_UNUSED(writer);
Y_UNUSED(value);
Y_UNUSED(type);
@@ -152,7 +152,7 @@ extern "C" void WriteSkiffPgValue(NKikimr::NMiniKQL::TPgType* type, const NKikim
}
} // namespace NCommon
-} // NYql
+} // namespace NYql
namespace NKikimr {
namespace NMiniKQL {
@@ -206,31 +206,31 @@ ui64 PgValueSize(const TPgType* type, const NUdf::TUnboxedValuePod& value) {
}
void PGPackImpl(bool stable, const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf) {
- Y_UNUSED(stable);
- Y_UNUSED(type);
- Y_UNUSED(value);
- Y_UNUSED(buf);
- throw yexception() << "PG types are not supported";
+ Y_UNUSED(stable);
+ Y_UNUSED(type);
+ Y_UNUSED(value);
+ Y_UNUSED(buf);
+ throw yexception() << "PG types are not supported";
}
void PGPackImpl(bool stable, const TPgType* type, const NUdf::TUnboxedValuePod& value, NKikimr::NMiniKQL::TPagedBuffer& buf) {
- Y_UNUSED(stable);
- Y_UNUSED(type);
- Y_UNUSED(value);
- Y_UNUSED(buf);
- throw yexception() << "PG types are not supported";
+ Y_UNUSED(stable);
+ Y_UNUSED(type);
+ Y_UNUSED(value);
+ Y_UNUSED(buf);
+ throw yexception() << "PG types are not supported";
}
NUdf::TUnboxedValue PGUnpackImpl(const TPgType* type, TStringBuf& buf) {
- Y_UNUSED(type);
- Y_UNUSED(buf);
- throw yexception() << "PG types are not supported";
+ Y_UNUSED(type);
+ Y_UNUSED(buf);
+ throw yexception() << "PG types are not supported";
}
NUdf::TUnboxedValue PGUnpackImpl(const TPgType* type, NDetails::TChunkedInputBuffer& buf) {
- Y_UNUSED(type);
- Y_UNUSED(buf);
- throw yexception() << "PG types are not supported";
+ Y_UNUSED(type);
+ Y_UNUSED(buf);
+ throw yexception() << "PG types are not supported";
}
void EncodePresortPGValue(TPgType* type, const NUdf::TUnboxedValue& value, TVector<ui8>& output) {
@@ -248,13 +248,13 @@ NUdf::TUnboxedValue DecodePresortPGValue(TPgType* type, TStringBuf& input, TVect
}
void* PgInitializeContext(const std::string_view& contextType) {
- Y_UNUSED(contextType);
- return nullptr;
+ Y_UNUSED(contextType);
+ return nullptr;
}
void PgDestroyContext(const std::string_view& contextType, void* ctx) {
- Y_UNUSED(contextType);
- Y_UNUSED(ctx);
+ Y_UNUSED(contextType);
+ Y_UNUSED(ctx);
}
NUdf::IHash::TPtr MakePgHash(const NMiniKQL::TPgType* type) {
@@ -327,7 +327,7 @@ bool ParsePgIntervalModifier(const TString& str, i32& ret) {
return false;
}
-class TPgDummyBuilder : public NUdf::IPgBuilder {
+class TPgDummyBuilder: public NUdf::IPgBuilder {
public:
NUdf::TUnboxedValue ValueFromText(ui32 typeId, const NUdf::TStringRef& value, NUdf::TStringValue& error) const override {
Y_UNUSED(typeId);
@@ -400,13 +400,13 @@ bool HasPgKernel(ui32 procOid) {
return false;
}
-std::function<NKikimr::NMiniKQL::IComputationNode* (NKikimr::NMiniKQL::TCallable&,
- const NKikimr::NMiniKQL::TComputationNodeFactoryContext&)> GetPgFactory()
+std::function<NKikimr::NMiniKQL::IComputationNode*(NKikimr::NMiniKQL::TCallable&,
+ const NKikimr::NMiniKQL::TComputationNodeFactoryContext&)>
+GetPgFactory()
{
- return [] (
- NKikimr::NMiniKQL::TCallable& callable,
- const NKikimr::NMiniKQL::TComputationNodeFactoryContext& ctx
- ) -> NKikimr::NMiniKQL::IComputationNode* {
+ return [](
+ NKikimr::NMiniKQL::TCallable& callable,
+ const NKikimr::NMiniKQL::TComputationNodeFactoryContext& ctx) -> NKikimr::NMiniKQL::IComputationNode* {
Y_UNUSED(callable);
Y_UNUSED(ctx);
return nullptr;
@@ -428,7 +428,7 @@ IOptimizerNew* MakePgOptimizerNew(IProviderContext& pctx, TExprContext& ctx, con
ythrow yexception() << "PgJoinSearch does nothing";
}
-} // NYql
+} // namespace NYql
namespace NKikimr::NPg {
@@ -549,12 +549,12 @@ TString GetPostgresServerVersionStr() {
namespace NYql {
namespace NCommon {
- std::shared_ptr<void> CreateMemoryArenaContext() {
- throw yexception() << "PG types are not supported";
- }
+std::shared_ptr<void> CreateMemoryArenaContext() {
+ throw yexception() << "PG types are not supported";
}
+} // namespace NCommon
-ui64 HexEncode(const char *src, size_t len, char *dst) {
+ui64 HexEncode(const char* src, size_t len, char* dst) {
Y_UNUSED(src);
Y_UNUSED(len);
Y_UNUSED(dst);
@@ -566,9 +566,8 @@ std::unique_ptr<IYtColumnConverter> BuildPgTopLevelColumnReader(std::unique_ptr<
throw yexception() << "PG types are not supported";
}
-
std::unique_ptr<IYsonComplexTypeReader> BuildPgYsonColumnReader(const NUdf::TPgTypeDescription& /* desc */) {
throw yexception() << "PG types are not supported";
}
-} // NYql
+} // namespace NYql
diff --git a/yql/essentials/sql/settings/partitioning.cpp b/yql/essentials/sql/settings/partitioning.cpp
index 2075e51027b..b3fa96a6c39 100644
--- a/yql/essentials/sql/settings/partitioning.cpp
+++ b/yql/essentials/sql/settings/partitioning.cpp
@@ -35,7 +35,7 @@ TString ParsePartitionedByBinding(const TString& name, const TString& value, TVe
return {};
}
-}
+} // namespace
TString ExtractBindingInfo(const TTranslationSettings& settings, const TString& binding, TBindingInfo& result) {
auto pit = settings.Bindings.find(binding);
@@ -94,4 +94,4 @@ TString ExtractBindingInfo(const TTranslationSettings& settings, const TString&
return {};
}
-} // namespace NSQLTranslation
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/settings/partitioning.h b/yql/essentials/sql/settings/partitioning.h
index 082890ae153..de9258e895f 100644
--- a/yql/essentials/sql/settings/partitioning.h
+++ b/yql/essentials/sql/settings/partitioning.h
@@ -6,14 +6,14 @@
#include <util/generic/vector.h>
namespace NSQLTranslation {
- struct TBindingInfo {
- TString ClusterType;
- TString Cluster;
- TString Path;
- TString Schema;
- TMap<TString, TVector<TString>> Attributes;
- };
+struct TBindingInfo {
+ TString ClusterType;
+ TString Cluster;
+ TString Path;
+ TString Schema;
+ TMap<TString, TVector<TString>> Attributes;
+};
- // returns error message if any
- TString ExtractBindingInfo(const TTranslationSettings& settings, const TString& binding, TBindingInfo& result);
-} // namespace NSQLTranslation
+// returns error message if any
+TString ExtractBindingInfo(const TTranslationSettings& settings, const TString& binding, TBindingInfo& result);
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/settings/translation_settings.cpp b/yql/essentials/sql/settings/translation_settings.cpp
index af15c8e0c58..be1434d9bb9 100644
--- a/yql/essentials/sql/settings/translation_settings.cpp
+++ b/yql/essentials/sql/settings/translation_settings.cpp
@@ -9,135 +9,135 @@
#include <util/system/env.h>
namespace {
- bool InTestEnvironment() {
- return GetEnv("YQL_LOCAL_ENVIRONMENT") || GetEnv("YA_TEST_RUNNER");
+bool InTestEnvironment() {
+ return GetEnv("YQL_LOCAL_ENVIRONMENT") || GetEnv("YA_TEST_RUNNER");
+}
+
+using namespace NSQLTranslation;
+class TAlwaysDiallowPolicy: public ISqlFeaturePolicy {
+public:
+ TAlwaysDiallowPolicy() = default;
+ bool Allow() const override {
+ return false;
}
+};
- using namespace NSQLTranslation;
- class TAlwaysDiallowPolicy : public ISqlFeaturePolicy {
- public:
- TAlwaysDiallowPolicy() = default;
- bool Allow() const override {
- return false;
- }
- };
+class TAlwaysAllowPolicy: public ISqlFeaturePolicy {
+public:
+ TAlwaysAllowPolicy() = default;
+ bool Allow() const override {
+ return true;
+ }
+};
+} // namespace
- class TAlwaysAllowPolicy : public ISqlFeaturePolicy {
- public:
- TAlwaysAllowPolicy() = default;
- bool Allow() const override {
- return true;
- }
- };
+namespace NSQLTranslation {
+ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::MakeAlwaysDisallow() {
+ return new TAlwaysDiallowPolicy;
}
-namespace NSQLTranslation {
- ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::MakeAlwaysDisallow() {
- return new TAlwaysDiallowPolicy;
- }
+ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::MakeAlwaysAllow() {
+ return new TAlwaysAllowPolicy;
+}
- ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::MakeAlwaysAllow() {
- return new TAlwaysAllowPolicy;
- }
+ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::Make(bool allow) {
+ return allow ? MakeAlwaysAllow() : MakeAlwaysDisallow();
+}
+
+TTranslationSettings::TTranslationSettings()
+ : ModuleMapping({{"core", "/lib/yql/core.yqls"}})
+ , BindingsMode(EBindingsMode::ENABLED)
+ , Mode(ESqlMode::QUERY)
+ , MaxErrors(SQL_MAX_PARSER_ERRORS)
+ , EndOfQueryCommit(true)
+ , EnableGenericUdfs(true)
+ , SyntaxVersion(1)
+ , AnsiLexer(false)
+ , Antlr4Parser(true)
+ , PgParser(false)
+ , InferSyntaxVersion(false)
+ , V0Behavior(EV0Behavior::Disable)
+ , V0ForceDisable(InTestEnvironment())
+ , PGDisable(false)
+ , WarnOnV0(true)
+ , TestAntlr4(false)
+ , V0WarnAsError(ISqlFeaturePolicy::MakeAlwaysDisallow())
+ , DqDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
+ , BlockDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
+ , AssumeYdbOnClusterWithSlash(false)
+{
+}
- ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::Make(bool allow) {
- return allow ? MakeAlwaysAllow() : MakeAlwaysDisallow();
+bool ParseTranslationSettings(const TString& query, TTranslationSettings& settings, NYql::TIssues& issues) {
+ if (!NYql::IsUtf8(query)) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, 0), NYql::TIssuesIds::DEFAULT_ERROR, "Invalid UTF8 input"));
+ return false;
}
- TTranslationSettings::TTranslationSettings()
- : ModuleMapping({{"core", "/lib/yql/core.yqls"}})
- , BindingsMode(EBindingsMode::ENABLED)
- , Mode(ESqlMode::QUERY)
- , MaxErrors(SQL_MAX_PARSER_ERRORS)
- , EndOfQueryCommit(true)
- , EnableGenericUdfs(true)
- , SyntaxVersion(1)
- , AnsiLexer(false)
- , Antlr4Parser(true)
- , PgParser(false)
- , InferSyntaxVersion(false)
- , V0Behavior(EV0Behavior::Disable)
- , V0ForceDisable(InTestEnvironment())
- , PGDisable(false)
- , WarnOnV0(true)
- , TestAntlr4(false)
- , V0WarnAsError(ISqlFeaturePolicy::MakeAlwaysDisallow())
- , DqDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
- , BlockDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
- , AssumeYdbOnClusterWithSlash(false)
- {}
-
-
- bool ParseTranslationSettings(const TString& query, TTranslationSettings& settings, NYql::TIssues& issues) {
- if (!NYql::IsUtf8(query)) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, 0), NYql::TIssuesIds::DEFAULT_ERROR, "Invalid UTF8 input"));
- return false;
- }
+ TSplitDelimiters lineDelimiters("\n\r");
+ TDelimitersSplit linesSplit(query, lineDelimiters);
+ auto lineIterator = linesSplit.Iterator();
+ auto lineNumber = 0;
- TSplitDelimiters lineDelimiters("\n\r");
- TDelimitersSplit linesSplit(query, lineDelimiters);
- auto lineIterator = linesSplit.Iterator();
- auto lineNumber = 0;
+ while (!lineIterator.Eof()) {
+ const TString& line = lineIterator.NextString();
+ ++lineNumber;
- while (!lineIterator.Eof()) {
- const TString& line = lineIterator.NextString();
- ++lineNumber;
+ TVector<TStringBuf> parts;
+ TSetDelimiter<const char> partsDelimiters(" \t");
+ Split(line, partsDelimiters, parts);
- TVector<TStringBuf> parts;
- TSetDelimiter<const char> partsDelimiters(" \t");
- Split(line, partsDelimiters, parts);
+ if (parts.empty()) {
+ continue;
+ }
- if (parts.empty()) {
- continue;
- }
+ if (!parts[0].StartsWith("--!")) {
+ break;
+ }
- if (!parts[0].StartsWith("--!")) {
- break;
- }
+ if (parts.size() > 1) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Bad translation settings format"));
+ return false;
+ }
- if (parts.size() > 1) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
- "Bad translation settings format"));
- return false;
- }
+ auto value = TString(parts[0].SubString(3, TString::npos));
+ if (value.empty()) {
+ continue;
+ }
- auto value = TString(parts[0].SubString(3, TString::npos));
- if (value.empty()) {
- continue;
- }
+ if ((value == "syntax_v0" || value == "syntax_v1") && !settings.InferSyntaxVersion) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Explicit syntax version is not allowed"));
+ return false;
+ }
- if ((value == "syntax_v0" || value == "syntax_v1") && !settings.InferSyntaxVersion) {
+ if (value == "syntax_v0") {
+ if (settings.V0ForceDisable || settings.V0Behavior == NSQLTranslation::EV0Behavior::Disable) {
issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
- "Explicit syntax version is not allowed"));
+ "V0 syntax is disabled"));
return false;
}
- if (value == "syntax_v0") {
- if (settings.V0ForceDisable || settings.V0Behavior == NSQLTranslation::EV0Behavior::Disable) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
- "V0 syntax is disabled"));
- return false;
- }
-
- settings.SyntaxVersion = 0;
- } else if (value == "syntax_v1") {
- settings.SyntaxVersion = 1;
- } else if (value == "ansi_lexer") {
- settings.AnsiLexer = true;
- } else if (value == "antlr4_parser") {
- settings.Antlr4Parser = true;
- } else if (value == "antlr3_parser") {
- settings.Antlr4Parser = false;
- } else if (value == "syntax_pg") {
- settings.PgParser = true;
- } else {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
- TStringBuilder() << "Unknown SQL translation setting: " << value));
- return false;
- }
+ settings.SyntaxVersion = 0;
+ } else if (value == "syntax_v1") {
+ settings.SyntaxVersion = 1;
+ } else if (value == "ansi_lexer") {
+ settings.AnsiLexer = true;
+ } else if (value == "antlr4_parser") {
+ settings.Antlr4Parser = true;
+ } else if (value == "antlr3_parser") {
+ settings.Antlr4Parser = false;
+ } else if (value == "syntax_pg") {
+ settings.PgParser = true;
+ } else {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
+ TStringBuilder() << "Unknown SQL translation setting: " << value));
+ return false;
}
-
- return true;
}
-} // namespace NSQLTranslation
+ return true;
+}
+
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/settings/translation_settings.h b/yql/essentials/sql/settings/translation_settings.h
index 1cbda9394ea..3fd97f110cb 100644
--- a/yql/essentials/sql/settings/translation_settings.h
+++ b/yql/essentials/sql/settings/translation_settings.h
@@ -10,131 +10,130 @@
#include <util/generic/vector.h>
namespace google::protobuf {
- class Arena;
-}
+class Arena;
+} // namespace google::protobuf
namespace NYql {
- class TIssues;
- class IAutoParamBuilderFactory;
-}
+class TIssues;
+class IAutoParamBuilderFactory;
+} // namespace NYql
namespace NSQLTranslation {
- constexpr const size_t SQL_MAX_PARSER_ERRORS = 100;
-
- enum class ESqlMode {
- QUERY = 0,
- LIMITED_VIEW = 1,
- LIBRARY = 2,
- SUBQUERY = 3,
- DISCOVERY = 4,
- };
-
- enum class EBindingsMode {
- // raise error
- DISABLED,
- // classic support for bindings
- ENABLED,
- // bindings.my_binding -> current_cluster.my_binding + raise warning
- DROP_WITH_WARNING,
- // bindings.my_binding -> current_cluster.my_binding
- DROP
- };
-
- inline bool IsQueryMode(NSQLTranslation::ESqlMode mode) {
- return mode == NSQLTranslation::ESqlMode::QUERY || mode == NSQLTranslation::ESqlMode::DISCOVERY;
- }
-
- using TIncrementMonCounterFunction = std::function<void(const TString&, const TString&)>;
-
- // persisted
- enum class EV0Behavior : ui32 {
- Silent = 0,
- Report,
- Disable
- };
-
- class ISqlFeaturePolicy : public TThrRefBase {
- public:
- virtual ~ISqlFeaturePolicy() = default;
- virtual bool Allow() const = 0;
-
- using TPtr = TIntrusivePtr<ISqlFeaturePolicy>;
-
- static TPtr MakeAlwaysDisallow();
-
- static TPtr MakeAlwaysAllow();
-
- static TPtr Make(bool allow);
- };
-
- struct TTableBindingSettings {
- TString ClusterType;
- THashMap<TString, TString> Settings;
- };
-
- struct TTranslationSettings
- {
- TTranslationSettings();
- google::protobuf::Arena* Arena = nullptr;
-
- NYql::TLangVersion LangVer = NYql::MinLangVersion;
- NYql::EBackportCompatibleFeaturesMode BackportMode = NYql::EBackportCompatibleFeaturesMode::None;
- THashMap<TString, TString> ClusterMapping;
- TString PathPrefix;
- // keys (cluster name) should be normalized
- THashMap<TString, TString> ClusterPathPrefixes;
- THashMap<TString, TString> ModuleMapping;
- THashSet<TString> Libraries;
- THashSet<TString> Flags;
-
- EBindingsMode BindingsMode;
- THashMap<TString, TTableBindingSettings> Bindings;
- bool SaveWorldDependencies = false;
-
- // each (name, type) entry in this map is equivalent to
- // DECLARE $name AS type;
- // NOTE: DECLARE statement in SQL text overrides entry in DeclaredNamedExprs
- TMap<TString, TString> DeclaredNamedExprs;
-
- ESqlMode Mode;
- TString DefaultCluster;
- TIncrementMonCounterFunction IncrementCounter;
- size_t MaxErrors;
- bool EndOfQueryCommit;
- TString File;
- bool EnableGenericUdfs;
- ui16 SyntaxVersion;
- bool AnsiLexer;
- bool Antlr4Parser;
- bool PgParser;
- bool InferSyntaxVersion;
- EV0Behavior V0Behavior;
- bool V0ForceDisable;
- bool PGDisable;
- bool WarnOnV0;
- bool TestAntlr4;
- ISqlFeaturePolicy::TPtr V0WarnAsError;
- ISqlFeaturePolicy::TPtr DqDefaultAuto;
- ISqlFeaturePolicy::TPtr BlockDefaultAuto;
- bool AssumeYdbOnClusterWithSlash;
- TString DynamicClusterProvider;
- TString FileAliasPrefix;
-
- TVector<ui32> PgParameterTypeOids;
- bool AutoParametrizeEnabled = false;
- bool AutoParametrizeValuesStmt = false;
-
- TGUCSettings::TPtr GUCSettings = std::make_shared<TGUCSettings>();
- bool UnicodeLiterals = false;
-
- TMaybe<TString> ApplicationName;
- bool PgSortNulls = false;
- NYql::IAutoParamBuilderFactory* AutoParamBuilderFactory = nullptr;
- bool EmitReadsForExists = false;
- bool AlwaysAllowExports = false;
- bool IsReplay = false;
- };
-
- bool ParseTranslationSettings(const TString& query, NSQLTranslation::TTranslationSettings& settings, NYql::TIssues& issues);
-
-} // namespace NSQLTranslation
+constexpr const size_t SQL_MAX_PARSER_ERRORS = 100;
+
+enum class ESqlMode {
+ QUERY = 0,
+ LIMITED_VIEW = 1,
+ LIBRARY = 2,
+ SUBQUERY = 3,
+ DISCOVERY = 4,
+};
+
+enum class EBindingsMode {
+ // raise error
+ DISABLED,
+ // classic support for bindings
+ ENABLED,
+ // bindings.my_binding -> current_cluster.my_binding + raise warning
+ DROP_WITH_WARNING,
+ // bindings.my_binding -> current_cluster.my_binding
+ DROP
+};
+
+inline bool IsQueryMode(NSQLTranslation::ESqlMode mode) {
+ return mode == NSQLTranslation::ESqlMode::QUERY || mode == NSQLTranslation::ESqlMode::DISCOVERY;
+}
+
+using TIncrementMonCounterFunction = std::function<void(const TString&, const TString&)>;
+
+// persisted
+enum class EV0Behavior: ui32 {
+ Silent = 0,
+ Report,
+ Disable
+};
+
+class ISqlFeaturePolicy: public TThrRefBase {
+public:
+ virtual ~ISqlFeaturePolicy() = default;
+ virtual bool Allow() const = 0;
+
+ using TPtr = TIntrusivePtr<ISqlFeaturePolicy>;
+
+ static TPtr MakeAlwaysDisallow();
+
+ static TPtr MakeAlwaysAllow();
+
+ static TPtr Make(bool allow);
+};
+
+struct TTableBindingSettings {
+ TString ClusterType;
+ THashMap<TString, TString> Settings;
+};
+
+struct TTranslationSettings {
+ TTranslationSettings();
+ google::protobuf::Arena* Arena = nullptr;
+
+ NYql::TLangVersion LangVer = NYql::MinLangVersion;
+ NYql::EBackportCompatibleFeaturesMode BackportMode = NYql::EBackportCompatibleFeaturesMode::None;
+ THashMap<TString, TString> ClusterMapping;
+ TString PathPrefix;
+ // keys (cluster name) should be normalized
+ THashMap<TString, TString> ClusterPathPrefixes;
+ THashMap<TString, TString> ModuleMapping;
+ THashSet<TString> Libraries;
+ THashSet<TString> Flags;
+
+ EBindingsMode BindingsMode;
+ THashMap<TString, TTableBindingSettings> Bindings;
+ bool SaveWorldDependencies = false;
+
+ // each (name, type) entry in this map is equivalent to
+ // DECLARE $name AS type;
+ // NOTE: DECLARE statement in SQL text overrides entry in DeclaredNamedExprs
+ TMap<TString, TString> DeclaredNamedExprs;
+
+ ESqlMode Mode;
+ TString DefaultCluster;
+ TIncrementMonCounterFunction IncrementCounter;
+ size_t MaxErrors;
+ bool EndOfQueryCommit;
+ TString File;
+ bool EnableGenericUdfs;
+ ui16 SyntaxVersion;
+ bool AnsiLexer;
+ bool Antlr4Parser;
+ bool PgParser;
+ bool InferSyntaxVersion;
+ EV0Behavior V0Behavior;
+ bool V0ForceDisable;
+ bool PGDisable;
+ bool WarnOnV0;
+ bool TestAntlr4;
+ ISqlFeaturePolicy::TPtr V0WarnAsError;
+ ISqlFeaturePolicy::TPtr DqDefaultAuto;
+ ISqlFeaturePolicy::TPtr BlockDefaultAuto;
+ bool AssumeYdbOnClusterWithSlash;
+ TString DynamicClusterProvider;
+ TString FileAliasPrefix;
+
+ TVector<ui32> PgParameterTypeOids;
+ bool AutoParametrizeEnabled = false;
+ bool AutoParametrizeValuesStmt = false;
+
+ TGUCSettings::TPtr GUCSettings = std::make_shared<TGUCSettings>();
+ bool UnicodeLiterals = false;
+
+ TMaybe<TString> ApplicationName;
+ bool PgSortNulls = false;
+ NYql::IAutoParamBuilderFactory* AutoParamBuilderFactory = nullptr;
+ bool EmitReadsForExists = false;
+ bool AlwaysAllowExports = false;
+ bool IsReplay = false;
+};
+
+bool ParseTranslationSettings(const TString& query, NSQLTranslation::TTranslationSettings& settings, NYql::TIssues& issues);
+
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/settings/translator.cpp b/yql/essentials/sql/settings/translator.cpp
index 92e8c011b89..913db127ad6 100644
--- a/yql/essentials/sql/settings/translator.cpp
+++ b/yql/essentials/sql/settings/translator.cpp
@@ -4,11 +4,12 @@ namespace NSQLTranslation {
namespace {
-class TDummyTranslator : public ITranslator {
+class TDummyTranslator: public ITranslator {
public:
TDummyTranslator(const TString& name)
: Name_(name)
- {}
+ {
+ }
NSQLTranslation::ILexer::TPtr MakeLexer(const NSQLTranslation::TTranslationSettings& settings) final {
Y_UNUSED(settings);
@@ -16,7 +17,7 @@ public:
}
NYql::TAstParseResult TextToAst(const TString& query, const NSQLTranslation::TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
+ NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) final {
Y_UNUSED(query);
Y_UNUSED(settings);
Y_UNUSED(warningRules);
@@ -25,7 +26,7 @@ public:
}
google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
- NYql::TIssues& issues, size_t maxErrors, const TTranslationSettings& settings) final {
+ NYql::TIssues& issues, size_t maxErrors, const TTranslationSettings& settings) final {
Y_UNUSED(query);
Y_UNUSED(queryName);
Y_UNUSED(issues);
@@ -35,7 +36,7 @@ public:
}
NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
- const TSQLHints& hints, const TTranslationSettings& settings) final {
+ const TSQLHints& hints, const TTranslationSettings& settings) final {
Y_UNUSED(query);
Y_UNUSED(protoAst);
Y_UNUSED(hints);
@@ -44,7 +45,7 @@ public:
}
TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
+ NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) final {
Y_UNUSED(query);
Y_UNUSED(settings);
Y_UNUSED(warningRules);
@@ -61,10 +62,10 @@ private:
const TString Name_;
};
-}
+} // namespace
TTranslatorPtr MakeDummyTranslator(const TString& name) {
return MakeIntrusive<TDummyTranslator>(name);
}
-} // namespace NSQLTranslation
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/settings/translator.h b/yql/essentials/sql/settings/translator.h
index aa8ef5ac5ee..f637931ca71 100644
--- a/yql/essentials/sql/settings/translator.h
+++ b/yql/essentials/sql/settings/translator.h
@@ -8,23 +8,23 @@
namespace NSQLTranslation {
-class ITranslator : public TThrRefBase {
+class ITranslator: public TThrRefBase {
public:
virtual ~ITranslator() = default;
virtual ILexer::TPtr MakeLexer(const TTranslationSettings& settings) = 0;
virtual NYql::TAstParseResult TextToAst(const TString& query, const TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) = 0;
+ NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo) = 0;
virtual google::protobuf::Message* TextToMessage(const TString& query, const TString& queryName,
- NYql::TIssues& issues, size_t maxErrors, const TTranslationSettings& settings) = 0;
+ NYql::TIssues& issues, size_t maxErrors, const TTranslationSettings& settings) = 0;
virtual NYql::TAstParseResult TextAndMessageToAst(const TString& query, const google::protobuf::Message& protoAst,
- const TSQLHints& hints, const TTranslationSettings& settings) = 0;
+ const TSQLHints& hints, const TTranslationSettings& settings) = 0;
virtual TVector<NYql::TAstParseResult> TextToManyAst(const TString& query, const TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) = 0;
+ NYql::TWarningRules* warningRules, TVector<NYql::TStmtParseInfo>* stmtParseInfo) = 0;
};
using TTranslatorPtr = TIntrusivePtr<ITranslator>;
TTranslatorPtr MakeDummyTranslator(const TString& name);
-} // namespace NSQLTranslation
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/sql.cpp b/yql/essentials/sql/sql.cpp
index cf7c91bc844..52bece76135 100644
--- a/yql/essentials/sql/sql.cpp
+++ b/yql/essentials/sql/sql.cpp
@@ -7,216 +7,217 @@
namespace NSQLTranslation {
- NYql::TAstParseResult SqlToYql(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
- NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo, TTranslationSettings* effectiveSettings)
- {
- NYql::TAstParseResult result;
- TTranslationSettings parsedSettings(settings);
+NYql::TAstParseResult SqlToYql(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
+ NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo, TTranslationSettings* effectiveSettings)
+{
+ NYql::TAstParseResult result;
+ TTranslationSettings parsedSettings(settings);
+
+ if (!ParseTranslationSettings(query, parsedSettings, result.Issues)) {
+ return result;
+ }
+ if (effectiveSettings) {
+ *effectiveSettings = parsedSettings;
+ }
- if (!ParseTranslationSettings(query, parsedSettings, result.Issues)) {
- return result;
- }
- if (effectiveSettings) {
- *effectiveSettings = parsedSettings;
- }
+ google::protobuf::Arena arena;
+ if (!parsedSettings.Arena) {
+ parsedSettings.Arena = &arena;
+ }
- google::protobuf::Arena arena;
- if (!parsedSettings.Arena) {
- parsedSettings.Arena = &arena;
- }
+ if (!parsedSettings.DeclaredNamedExprs.empty() && !parsedSettings.PgParser && parsedSettings.SyntaxVersion != 1) {
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Externally declared named expressions not supported in V0 syntax"));
+ return result;
+ }
- if (!parsedSettings.DeclaredNamedExprs.empty() && !parsedSettings.PgParser && parsedSettings.SyntaxVersion != 1) {
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "Externally declared named expressions not supported in V0 syntax"));
- return result;
- }
+ if (parsedSettings.PgParser && parsedSettings.PGDisable) {
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "PG syntax is disabled"));
+ return result;
+ }
- if (parsedSettings.PgParser && parsedSettings.PGDisable) {
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "PG syntax is disabled"));
- return result;
- }
-
- if (parsedSettings.PgParser) {
- return translators.PG->TextToAst(query, parsedSettings, warningRules, stmtParseInfo);
- }
-
- switch (parsedSettings.SyntaxVersion) {
- case 0:
- if (settings.V0ForceDisable || parsedSettings.V0Behavior == EV0Behavior::Disable) {
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "V0 syntax is disabled"));
- return result;
- }
-
- if (parsedSettings.AnsiLexer) {
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "Ansi lexer is not supported in V0 syntax"));
- return result;
- }
-
- return translators.V0->TextToAst(query, parsedSettings, warningRules, nullptr);
- case 1:
- return translators.V1->TextToAst(query, parsedSettings, warningRules, nullptr);
- default:
+ if (parsedSettings.PgParser) {
+ return translators.PG->TextToAst(query, parsedSettings, warningRules, stmtParseInfo);
+ }
+
+ switch (parsedSettings.SyntaxVersion) {
+ case 0:
+ if (settings.V0ForceDisable || parsedSettings.V0Behavior == EV0Behavior::Disable) {
result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
+ "V0 syntax is disabled"));
return result;
- }
+ }
+
+ if (parsedSettings.AnsiLexer) {
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Ansi lexer is not supported in V0 syntax"));
+ return result;
+ }
+
+ return translators.V0->TextToAst(query, parsedSettings, warningRules, nullptr);
+ case 1:
+ return translators.V1->TextToAst(query, parsedSettings, warningRules, nullptr);
+ default:
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
+ return result;
+ }
+}
+
+google::protobuf::Message* SqlAST(const TTranslators& translators, const TString& query, const TString& queryName, NYql::TIssues& issues,
+ size_t maxErrors, const TTranslationSettings& settings, ui16* actualSyntaxVersion)
+{
+ TTranslationSettings parsedSettings(settings);
+ if (!ParseTranslationSettings(query, parsedSettings, issues)) {
+ return nullptr;
}
- google::protobuf::Message* SqlAST(const TTranslators& translators, const TString& query, const TString& queryName, NYql::TIssues& issues,
- size_t maxErrors, const TTranslationSettings& settings, ui16* actualSyntaxVersion)
- {
- TTranslationSettings parsedSettings(settings);
- if (!ParseTranslationSettings(query, parsedSettings, issues)) {
- return nullptr;
- }
-
- if (actualSyntaxVersion) {
- *actualSyntaxVersion = parsedSettings.SyntaxVersion;
- }
-
- switch (parsedSettings.SyntaxVersion) {
- case 0:
- if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "V0 syntax is disabled"));
- return nullptr;
- }
-
- if (parsedSettings.AnsiLexer) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "Ansi lexer is not supported in V0 syntax"));
- return nullptr;
- }
-
- return translators.V0->TextToMessage(query, queryName, issues, maxErrors, settings);
- case 1:
- return translators.V1->TextToMessage(query, queryName, issues, maxErrors, parsedSettings);
- default:
+ if (actualSyntaxVersion) {
+ *actualSyntaxVersion = parsedSettings.SyntaxVersion;
+ }
+
+ switch (parsedSettings.SyntaxVersion) {
+ case 0:
+ if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "V0 syntax is disabled"));
+ return nullptr;
+ }
+
+ if (parsedSettings.AnsiLexer) {
issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
+ "Ansi lexer is not supported in V0 syntax"));
return nullptr;
- }
+ }
+
+ return translators.V0->TextToMessage(query, queryName, issues, maxErrors, settings);
+ case 1:
+ return translators.V1->TextToMessage(query, queryName, issues, maxErrors, parsedSettings);
+ default:
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
+ return nullptr;
}
+}
- ILexer::TPtr SqlLexer(const TTranslators& translators, const TString& query, NYql::TIssues& issues, const TTranslationSettings& settings, ui16* actualSyntaxVersion)
- {
- TTranslationSettings parsedSettings(settings);
- if (!ParseTranslationSettings(query, parsedSettings, issues)) {
- return {};
- }
-
- if (actualSyntaxVersion) {
- *actualSyntaxVersion = parsedSettings.SyntaxVersion;
- }
-
- switch (parsedSettings.SyntaxVersion) {
- case 0:
- if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "V0 syntax is disabled"));
- return {};
- }
-
- if (parsedSettings.AnsiLexer) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "Ansi lexer is not supported in V0 syntax"));
- return {};
- }
-
- return translators.V0->MakeLexer(parsedSettings);
- case 1:
- return translators.V1->MakeLexer(parsedSettings);
- default:
+ILexer::TPtr SqlLexer(const TTranslators& translators, const TString& query, NYql::TIssues& issues, const TTranslationSettings& settings, ui16* actualSyntaxVersion)
+{
+ TTranslationSettings parsedSettings(settings);
+ if (!ParseTranslationSettings(query, parsedSettings, issues)) {
+ return {};
+ }
+
+ if (actualSyntaxVersion) {
+ *actualSyntaxVersion = parsedSettings.SyntaxVersion;
+ }
+
+ switch (parsedSettings.SyntaxVersion) {
+ case 0:
+ if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
+ "V0 syntax is disabled"));
return {};
- }
- }
-
- NYql::TAstParseResult SqlASTToYql(const TTranslators& translators, const TString& query,
- const google::protobuf::Message& protoAst, const TSQLHints& hints, const TTranslationSettings& settings) {
- NYql::TAstParseResult result;
- switch (settings.SyntaxVersion) {
- case 0:
- if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "V0 syntax is disabled"));
- return result;
- }
-
- if (settings.AnsiLexer) {
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "Ansi lexer is not supported in V0 syntax"));
- return result;
- }
-
- return translators.V0->TextAndMessageToAst(query, protoAst, hints, settings);
- case 1:
- return translators.V1->TextAndMessageToAst(query, protoAst, hints, settings);
- default:
- result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- TStringBuilder() << "Unknown SQL syntax version: " << settings.SyntaxVersion));
- return result;
- }
- }
-
- TVector<NYql::TAstParseResult> SqlToAstStatements(const TTranslators& translators, const TString& query,
- const TTranslationSettings& settings, NYql::TWarningRules* warningRules, ui16* actualSyntaxVersion,
- TVector<NYql::TStmtParseInfo>* stmtParseInfo)
- {
- TVector<NYql::TAstParseResult> result;
- NYql::TIssues issues;
- TTranslationSettings parsedSettings(settings);
- google::protobuf::Arena arena;
- if (!parsedSettings.Arena) {
- parsedSettings.Arena = &arena;
- }
-
- if (!ParseTranslationSettings(query, parsedSettings, issues)) {
- return {};
- }
+ }
- if (actualSyntaxVersion) {
- *actualSyntaxVersion = parsedSettings.SyntaxVersion;
- }
+ if (parsedSettings.AnsiLexer) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Ansi lexer is not supported in V0 syntax"));
+ return {};
+ }
- if (!parsedSettings.DeclaredNamedExprs.empty() && !parsedSettings.PgParser && parsedSettings.SyntaxVersion != 1) {
+ return translators.V0->MakeLexer(parsedSettings);
+ case 1:
+ return translators.V1->MakeLexer(parsedSettings);
+ default:
issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "Externally declared named expressions not supported in V0 syntax"));
+ TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
return {};
- }
+ }
+}
+
+NYql::TAstParseResult SqlASTToYql(const TTranslators& translators, const TString& query,
+ const google::protobuf::Message& protoAst, const TSQLHints& hints, const TTranslationSettings& settings) {
+ NYql::TAstParseResult result;
+ switch (settings.SyntaxVersion) {
+ case 0:
+ if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "V0 syntax is disabled"));
+ return result;
+ }
- if (parsedSettings.PgParser && parsedSettings.PGDisable) {
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "PG syntax is disabled"));
+ if (settings.AnsiLexer) {
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Ansi lexer is not supported in V0 syntax"));
+ return result;
+ }
+
+ return translators.V0->TextAndMessageToAst(query, protoAst, hints, settings);
+ case 1:
+ return translators.V1->TextAndMessageToAst(query, protoAst, hints, settings);
+ default:
+ result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ TStringBuilder() << "Unknown SQL syntax version: " << settings.SyntaxVersion));
return result;
- }
+ }
+}
+
+TVector<NYql::TAstParseResult> SqlToAstStatements(const TTranslators& translators, const TString& query,
+ const TTranslationSettings& settings, NYql::TWarningRules* warningRules, ui16* actualSyntaxVersion,
+ TVector<NYql::TStmtParseInfo>* stmtParseInfo)
+{
+ TVector<NYql::TAstParseResult> result;
+ NYql::TIssues issues;
+ TTranslationSettings parsedSettings(settings);
+ google::protobuf::Arena arena;
+ if (!parsedSettings.Arena) {
+ parsedSettings.Arena = &arena;
+ }
- if (parsedSettings.PgParser) {
- return translators.PG->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
- }
+ if (!ParseTranslationSettings(query, parsedSettings, issues)) {
+ return {};
+ }
- switch (parsedSettings.SyntaxVersion) {
- case 0:
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- "V0 syntax is disabled"));
- return translators.V0->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
- case 1:
- return translators.V1->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
- default:
- issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
- TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
- return {};
- }
+ if (actualSyntaxVersion) {
+ *actualSyntaxVersion = parsedSettings.SyntaxVersion;
+ }
+
+ if (!parsedSettings.DeclaredNamedExprs.empty() && !parsedSettings.PgParser && parsedSettings.SyntaxVersion != 1) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "Externally declared named expressions not supported in V0 syntax"));
+ return {};
+ }
+
+ if (parsedSettings.PgParser && parsedSettings.PGDisable) {
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "PG syntax is disabled"));
+ return result;
+ }
+
+ if (parsedSettings.PgParser) {
+ return translators.PG->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
+ }
+
+ switch (parsedSettings.SyntaxVersion) {
+ case 0:
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ "V0 syntax is disabled"));
+ return translators.V0->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
+ case 1:
+ return translators.V1->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
+ default:
+ issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
+ TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
+ return {};
}
+}
- TTranslators::TTranslators(TTranslatorPtr v0, TTranslatorPtr v1, TTranslatorPtr pg)
- : V0(v0 ? v0 : MakeDummyTranslator("v0"))
- , V1(v1 ? v1 : MakeDummyTranslator("v1"))
- , PG(pg ? pg : MakeDummyTranslator("pg"))
- {}
+TTranslators::TTranslators(TTranslatorPtr v0, TTranslatorPtr v1, TTranslatorPtr pg)
+ : V0(v0 ? v0 : MakeDummyTranslator("v0"))
+ , V1(v1 ? v1 : MakeDummyTranslator("v1"))
+ , PG(pg ? pg : MakeDummyTranslator("pg"))
+{
+}
-} // namespace NSQLTranslation
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/sql.h b/yql/essentials/sql/sql.h
index ebeca9629cf..981f94e8293 100644
--- a/yql/essentials/sql/sql.h
+++ b/yql/essentials/sql/sql.h
@@ -11,25 +11,25 @@
namespace NSQLTranslation {
- struct TTranslators {
- TTranslatorPtr const V0;
- TTranslatorPtr const V1;
- TTranslatorPtr const PG;
+struct TTranslators {
+ TTranslatorPtr const V0;
+ TTranslatorPtr const V1;
+ TTranslatorPtr const PG;
- TTranslators(TTranslatorPtr v0, TTranslatorPtr v1, TTranslatorPtr pg);
- };
+ TTranslators(TTranslatorPtr v0, TTranslatorPtr v1, TTranslatorPtr pg);
+};
- NYql::TAstParseResult SqlToYql(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
- NYql::TWarningRules* warningRules = nullptr, NYql::TStmtParseInfo* stmtParseInfo = nullptr,
- TTranslationSettings* effectiveSettings = nullptr);
+NYql::TAstParseResult SqlToYql(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
+ NYql::TWarningRules* warningRules = nullptr, NYql::TStmtParseInfo* stmtParseInfo = nullptr,
+ TTranslationSettings* effectiveSettings = nullptr);
- google::protobuf::Message* SqlAST(const TTranslators& translators, const TString& query, const TString& queryName, NYql::TIssues& issues, size_t maxErrors,
- const TTranslationSettings& settings = {}, ui16* actualSyntaxVersion = nullptr);
+google::protobuf::Message* SqlAST(const TTranslators& translators, const TString& query, const TString& queryName, NYql::TIssues& issues, size_t maxErrors,
+ const TTranslationSettings& settings = {}, ui16* actualSyntaxVersion = nullptr);
- ILexer::TPtr SqlLexer(const TTranslators& translators, const TString& query, NYql::TIssues& issues, const TTranslationSettings& settings = {}, ui16* actualSyntaxVersion = nullptr);
+ILexer::TPtr SqlLexer(const TTranslators& translators, const TString& query, NYql::TIssues& issues, const TTranslationSettings& settings = {}, ui16* actualSyntaxVersion = nullptr);
- NYql::TAstParseResult SqlASTToYql(const TTranslators& translators, const TString& query, const google::protobuf::Message& protoAst, const TSQLHints& hints, const TTranslationSettings& settings);
+NYql::TAstParseResult SqlASTToYql(const TTranslators& translators, const TString& query, const google::protobuf::Message& protoAst, const TSQLHints& hints, const TTranslationSettings& settings);
- TVector<NYql::TAstParseResult> SqlToAstStatements(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
- NYql::TWarningRules* warningRules = nullptr, ui16* actualSyntaxVersion = nullptr, TVector<NYql::TStmtParseInfo>* stmtParseInfo = nullptr);
-} // namespace NSQLTranslation
+TVector<NYql::TAstParseResult> SqlToAstStatements(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
+ NYql::TWarningRules* warningRules = nullptr, ui16* actualSyntaxVersion = nullptr, TVector<NYql::TStmtParseInfo>* stmtParseInfo = nullptr);
+} // namespace NSQLTranslation
diff --git a/yql/essentials/sql/v0/lexer/ya.make b/yql/essentials/sql/v0/lexer/ya.make
index 70d2b1cfdad..52f6f60648c 100644
--- a/yql/essentials/sql/v0/lexer/ya.make
+++ b/yql/essentials/sql/v0/lexer/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(SKIP_YQL_STYLE_CPP)
+
PEERDIR(
yql/essentials/core/issue/protos
yql/essentials/parser/proto_ast/gen/v0
diff --git a/yql/essentials/sql/v0/ut/ya.make b/yql/essentials/sql/v0/ut/ya.make
index 164d3f3e536..e5abc3af1e0 100644
--- a/yql/essentials/sql/v0/ut/ya.make
+++ b/yql/essentials/sql/v0/ut/ya.make
@@ -1,5 +1,7 @@
UNITTEST_FOR(yql/essentials/sql/v0)
+ENABLE(SKIP_YQL_STYLE_CPP)
+
SRCS(
sql_ut.cpp
)
diff --git a/yql/essentials/sql/v0/ya.make b/yql/essentials/sql/v0/ya.make
index 381f3fa77b1..073efebd9ec 100644
--- a/yql/essentials/sql/v0/ya.make
+++ b/yql/essentials/sql/v0/ya.make
@@ -1,5 +1,7 @@
LIBRARY()
+ENABLE(SKIP_YQL_STYLE_CPP)
+
PEERDIR(
library/cpp/charset/lite
library/cpp/enumbitset
diff --git a/yql/essentials/sql/v1/complete/ya.make b/yql/essentials/sql/v1/complete/ya.make
index 8df41ab8013..b0b5ee4be21 100644
--- a/yql/essentials/sql/v1/complete/ya.make
+++ b/yql/essentials/sql/v1/complete/ya.make
@@ -1,7 +1,5 @@
LIBRARY()
-ENABLE(YQL_STYLE_CPP)
-
SRCS(
configuration.cpp
name_mapping.cpp
diff --git a/yql/essentials/sql/v1/format/ya.make b/yql/essentials/sql/v1/format/ya.make
index 0ee8aed6a85..7893a42c53c 100644
--- a/yql/essentials/sql/v1/format/ya.make
+++ b/yql/essentials/sql/v1/format/ya.make
@@ -1,7 +1,5 @@
LIBRARY()
-ENABLE(YQL_STYLE_CPP)
-
SRCS(
sql_format.cpp
)
diff --git a/yql/essentials/sql/v1/highlight/ya.make b/yql/essentials/sql/v1/highlight/ya.make
index 79baad0d9e2..103f1908aa0 100644
--- a/yql/essentials/sql/v1/highlight/ya.make
+++ b/yql/essentials/sql/v1/highlight/ya.make
@@ -1,5 +1,3 @@
-ENABLE(YQL_STYLE_CPP)
-
LIBRARY()
SRCS(
diff --git a/yql/essentials/sql/v1/lexer/ya.make b/yql/essentials/sql/v1/lexer/ya.make
index d56156f2280..6462ced1991 100644
--- a/yql/essentials/sql/v1/lexer/ya.make
+++ b/yql/essentials/sql/v1/lexer/ya.make
@@ -1,7 +1,5 @@
LIBRARY()
-ENABLE(YQL_STYLE_CPP)
-
PEERDIR(
yql/essentials/core/issue/protos
yql/essentials/sql/settings
diff --git a/yql/essentials/sql/v1/perf/ya.make b/yql/essentials/sql/v1/perf/ya.make
index d3a2b8a83aa..dad0eeaee68 100644
--- a/yql/essentials/sql/v1/perf/ya.make
+++ b/yql/essentials/sql/v1/perf/ya.make
@@ -1,7 +1,5 @@
PROGRAM()
-ENABLE(YQL_STYLE_CPP)
-
SRCS(
parse.cpp
)
diff --git a/yql/essentials/sql/v1/proto_parser/ya.make b/yql/essentials/sql/v1/proto_parser/ya.make
index 256a3091aec..0fbe9f45469 100644
--- a/yql/essentials/sql/v1/proto_parser/ya.make
+++ b/yql/essentials/sql/v1/proto_parser/ya.make
@@ -1,7 +1,5 @@
LIBRARY()
-ENABLE(YQL_STYLE_CPP)
-
PEERDIR(
yql/essentials/utils
yql/essentials/parser/proto_ast/collect_issues
diff --git a/yql/essentials/sql/v1/reflect/ya.make b/yql/essentials/sql/v1/reflect/ya.make
index 865257529e8..1843aabf19b 100644
--- a/yql/essentials/sql/v1/reflect/ya.make
+++ b/yql/essentials/sql/v1/reflect/ya.make
@@ -1,7 +1,5 @@
LIBRARY()
-ENABLE(YQL_STYLE_CPP)
-
SRCS(
sql_reflect.cpp
)
diff --git a/yql/essentials/sql/v1/ya.make b/yql/essentials/sql/v1/ya.make
index b3d0eac4c96..0e89d150bf8 100644
--- a/yql/essentials/sql/v1/ya.make
+++ b/yql/essentials/sql/v1/ya.make
@@ -1,7 +1,5 @@
LIBRARY()
-ENABLE(YQL_STYLE_CPP)
-
PEERDIR(
library/cpp/charset/lite
library/cpp/enumbitset