Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ydb/core/kqp/provider/yql_kikimr_datasink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -886,6 +886,7 @@ class TKikimrDataSink : public TDataProviderBase
.ObjectId().Build(key.GetObjectId())
.TypeId().Build(key.GetObjectType())
.Features(settings.Features)
.ResetFeatures(settings.ResetFeatures)
.Done()
.Ptr();
} else if (mode == "dropObject" || mode == "dropObjectIfExists") {
Expand Down
3 changes: 2 additions & 1 deletion ydb/core/kqp/provider/yql_kikimr_expr_nodes.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@
{"Index": 1, "Name": "DataSink", "Type": "TKiDataSink"},
{"Index": 2, "Name": "ObjectId", "Type": "TCoAtom"},
{"Index": 3, "Name": "TypeId", "Type": "TCoAtom"},
{"Index": 4, "Name": "Features", "Type": "TCoNameValueTupleList"}
{"Index": 4, "Name": "Features", "Type": "TCoNameValueTupleList"},
{"Index": 5, "Name": "ResetFeatures", "Type": "TCoAtomList"}
]
},
{
Expand Down
40 changes: 24 additions & 16 deletions ydb/library/yql/providers/common/provider/yql_provider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ TWriteRoleSettings ParseWriteRoleSettings(TExprList node, TExprContext& ctx) {
return ret;
}

TWritePermissionSettings ParseWritePermissionsSettings(NNodes::TExprList node, TExprContext&) {
TWritePermissionSettings ParseWritePermissionsSettings(TExprList node, TExprContext&) {
TMaybeNode<TCoAtomList> permissions;
TMaybeNode<TCoAtomList> paths;
TMaybeNode<TCoAtomList> roleNames;
Expand Down Expand Up @@ -546,7 +546,8 @@ TWritePermissionSettings ParseWritePermissionsSettings(NNodes::TExprList node, T

TWriteObjectSettings ParseWriteObjectSettings(TExprList node, TExprContext& ctx) {
TMaybeNode<TCoAtom> mode;
TMaybe<NNodes::TCoNameValueTupleList> kvFeatures;
TMaybe<TCoNameValueTupleList> kvFeatures;
TMaybe<TCoAtomList> resetFeatures;
for (auto child : node) {
if (auto maybeTuple = child.Maybe<TCoNameValueTuple>()) {
auto tuple = maybeTuple.Cast();
Expand All @@ -556,20 +557,27 @@ TWriteObjectSettings ParseWriteObjectSettings(TExprList node, TExprContext& ctx)
YQL_ENSURE(tuple.Value().Maybe<TCoAtom>());
mode = tuple.Value().Cast<TCoAtom>();
} else if (name == "features") {
auto maybeFeatures = tuple.Value().Maybe<NNodes::TCoNameValueTupleList>();
auto maybeFeatures = tuple.Value().Maybe<TCoNameValueTupleList>();
Y_ABORT_UNLESS(maybeFeatures);
kvFeatures = maybeFeatures.Cast();
} else if (name == "resetFeatures") {
auto maybeFeatures = tuple.Value().Maybe<TCoAtomList>();
Y_ABORT_UNLESS(maybeFeatures);
resetFeatures = maybeFeatures.Cast();
}
}
}
if (!kvFeatures) {
kvFeatures = Build<TCoNameValueTupleList>(ctx, node.Pos()).Done();
}
TWriteObjectSettings ret(std::move(mode), std::move(*kvFeatures));
if (!resetFeatures) {
resetFeatures = Build<TCoAtomList>(ctx, node.Pos()).Done();
}
TWriteObjectSettings ret(std::move(mode), std::move(*kvFeatures), std::move(*resetFeatures));
return ret;
}

TCommitSettings ParseCommitSettings(NNodes::TCoCommit node, TExprContext& ctx) {
TCommitSettings ParseCommitSettings(TCoCommit node, TExprContext& ctx) {
if (!node.Settings()) {
return TCommitSettings(Build<TCoNameValueTupleList>(ctx, node.Pos()).Done());
}
Expand Down Expand Up @@ -605,7 +613,7 @@ TCommitSettings ParseCommitSettings(NNodes::TCoCommit node, TExprContext& ctx) {
return ret;
}

TPgObjectSettings ParsePgObjectSettings(NNodes::TExprList node, TExprContext&) {
TPgObjectSettings ParsePgObjectSettings(TExprList node, TExprContext&) {
TMaybeNode<TCoAtom> mode;
TMaybeNode<TCoAtom> ifExists;
for (auto child : node) {
Expand Down Expand Up @@ -1116,7 +1124,7 @@ void WriteStream(NYson::TYsonWriter& writer, const TExprNode* node, const TExprN
writer.OnEndMap();
}

void WriteStreams(NYson::TYsonWriter& writer, TStringBuf name, const NNodes::TCoLambda& lambda) {
void WriteStreams(NYson::TYsonWriter& writer, TStringBuf name, const TCoLambda& lambda) {
writer.OnKeyedItem(name);
writer.OnBeginList();
WriteStream(writer, lambda.Body().Raw(), lambda.Args().Size() > 0 ? lambda.Args().Arg(0).Raw() : nullptr);
Expand Down Expand Up @@ -1422,8 +1430,8 @@ namespace {
} //namespace

bool TransformPgSetItemOption(
const TCoPgSelect& pgSelect,
TStringBuf optionName,
const TCoPgSelect& pgSelect,
TStringBuf optionName,
std::function<void(const TExprBase&)> lambda
) {
bool applied = false;
Expand Down Expand Up @@ -1459,16 +1467,16 @@ TExprNode::TPtr GetSetItemOptionValue(const TExprBase& setItemOption) {
return nullptr;
}

bool NeedToRenamePgSelectColumns(const TCoPgSelect& pgSelect) {
bool NeedToRenamePgSelectColumns(const TCoPgSelect& pgSelect) {
auto fill = NCommon::GetSetItemOption(pgSelect, "fill_target_columns");
return fill && !NCommon::GetSetItemOptionValue(TExprBase(fill));
}

bool RenamePgSelectColumns(
const TCoPgSelect& node,
const TCoPgSelect& node,
TExprNode::TPtr& output,
TMaybe<TVector<TString>> tableColumnOrder,
TExprContext& ctx,
TMaybe<TVector<TString>> tableColumnOrder,
TExprContext& ctx,
TTypeAnnotationContext& types) {

bool hasValues = (bool)GetSetItemOption(node, "values");
Expand All @@ -1491,8 +1499,8 @@ bool RenamePgSelectColumns(
if (selectorColumnOrder->size() > insertColumnOrder.size()) {
ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), TStringBuilder() << Sprintf(
"%s have %zu columns, INSERT INTO expects: %zu",
optionName.Data(),
selectorColumnOrder->size(),
optionName.Data(),
selectorColumnOrder->size(),
insertColumnOrder.size()
)));
return false;
Expand Down Expand Up @@ -1541,7 +1549,7 @@ bool RenamePgSelectColumns(
.Body(structBuilder.Done().Ptr())
.Build()
.Done().Ptr();

fill->ChangeChildrenInplace({
fill->Child(0),
Build<TCoAtom>(ctx, node.Pos())
Expand Down
16 changes: 9 additions & 7 deletions ydb/library/yql/providers/common/provider/yql_provider.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,12 @@ struct TWritePermissionSettings {
struct TWriteObjectSettings {
NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
NNodes::TCoNameValueTupleList Features;
TWriteObjectSettings(NNodes::TMaybeNode<NNodes::TCoAtom>&& mode, NNodes::TCoNameValueTupleList&& kvFeatures)
NNodes::TCoAtomList ResetFeatures;
TWriteObjectSettings(NNodes::TMaybeNode<NNodes::TCoAtom>&& mode, NNodes::TCoNameValueTupleList&& kvFeatures, NNodes::TCoAtomList&& resetFeatures)
: Mode(std::move(mode))
, Features(std::move(kvFeatures)) {

, Features(std::move(kvFeatures))
, ResetFeatures(std::move(resetFeatures))
{
}
};

Expand Down Expand Up @@ -193,8 +195,8 @@ bool ValidateDateTimeFormatName(std::string_view formatName, TExprContext& ctx);
bool ValidateTimestampFormatName(std::string_view formatName, TExprContext& ctx);

bool TransformPgSetItemOption(
const NNodes::TCoPgSelect& pgSelect,
TStringBuf optionName,
const NNodes::TCoPgSelect& pgSelect,
TStringBuf optionName,
std::function<void(const NNodes::TExprBase&)> lambda
);

Expand All @@ -207,8 +209,8 @@ bool NeedToRenamePgSelectColumns(const NNodes::TCoPgSelect& pgSelect);
bool RenamePgSelectColumns(
const NNodes::TCoPgSelect& node,
TExprNode::TPtr& output,
TMaybe<TVector<TString>> tableColumnOrder,
TExprContext& ctx,
TMaybe<TVector<TString>> tableColumnOrder,
TExprContext& ctx,
TTypeAnnotationContext& types);
} // namespace NCommon
} // namespace NYql
22 changes: 22 additions & 0 deletions ydb/library/yql/sql/v1/SQLv1.g.in
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ sql_stmt_core:
| import_stmt
| export_stmt
| alter_table_stmt
| alter_external_table_stmt
| do_stmt
| define_action_or_subquery_stmt
| if_stmt
Expand All @@ -48,6 +49,7 @@ sql_stmt_core:
| alter_object_stmt
| drop_object_stmt
| create_external_data_source_stmt
| alter_external_data_source_stmt
| drop_external_data_source_stmt
| create_replication_stmt
| drop_replication_stmt
Expand Down Expand Up @@ -572,6 +574,16 @@ create_external_data_source_stmt: CREATE EXTERNAL DATA SOURCE (IF NOT EXISTS)? o
with_table_settings
;

alter_external_data_source_stmt: ALTER EXTERNAL DATA SOURCE object_ref
alter_external_data_source_action (COMMA alter_external_data_source_action)*
;
alter_external_data_source_action:
alter_table_set_table_setting_uncompat
| alter_table_set_table_setting_compat
| alter_table_reset_table_setting
//| alter_table_rename_to // TODO
;

drop_external_data_source_stmt: DROP EXTERNAL DATA SOURCE (IF EXISTS)? object_ref;

create_view_stmt: CREATE VIEW object_ref
Expand Down Expand Up @@ -649,6 +661,16 @@ alter_table_action:
| alter_table_rename_index_to
;

alter_external_table_stmt: ALTER EXTERNAL TABLE simple_table_ref alter_external_table_action (COMMA alter_external_table_action)*;
alter_external_table_action:
alter_table_add_column
| alter_table_drop_column
| alter_table_set_table_setting_uncompat
| alter_table_set_table_setting_compat
| alter_table_reset_table_setting
//| alter_table_rename_to // TODO
;

alter_table_store_stmt: ALTER TABLESTORE object_ref alter_table_store_action (COMMA alter_table_store_action)*;
alter_table_store_action:
alter_table_add_column
Expand Down
81 changes: 74 additions & 7 deletions ydb/library/yql/sql/v1/format/sql_format.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -700,8 +700,8 @@ friend struct TStaticData;
case TRule_sql_stmt_core::kAltSqlStmtCore12: // declare
case TRule_sql_stmt_core::kAltSqlStmtCore13: // import
case TRule_sql_stmt_core::kAltSqlStmtCore14: // export
case TRule_sql_stmt_core::kAltSqlStmtCore30: // drop external data source
case TRule_sql_stmt_core::kAltSqlStmtCore32: // drop replication
case TRule_sql_stmt_core::kAltSqlStmtCore32: // drop external data source
case TRule_sql_stmt_core::kAltSqlStmtCore34: // drop replication
return true;
case TRule_sql_stmt_core::kAltSqlStmtCore3: { // named nodes
const auto& stmt = msg.GetAlt_sql_stmt_core3().GetRule_named_nodes_stmt1();
Expand All @@ -710,15 +710,15 @@ friend struct TStaticData;
}
break;
}
case TRule_sql_stmt_core::kAltSqlStmtCore16: { // do
const auto& stmt = msg.GetAlt_sql_stmt_core16().GetRule_do_stmt1();
case TRule_sql_stmt_core::kAltSqlStmtCore17: { // do
const auto& stmt = msg.GetAlt_sql_stmt_core17().GetRule_do_stmt1();
if (stmt.GetBlock2().HasAlt1()) {
return true;
}
break;
}
case TRule_sql_stmt_core::kAltSqlStmtCore18: // if
case TRule_sql_stmt_core::kAltSqlStmtCore19: // for
case TRule_sql_stmt_core::kAltSqlStmtCore19: // if
case TRule_sql_stmt_core::kAltSqlStmtCore20: // for
return false;
default:
break;
Expand Down Expand Up @@ -1146,6 +1146,25 @@ friend struct TStaticData;
VisitAllFields(TRule_alter_table_store_stmt::GetDescriptor(), msg);
}

void VisitAlterExternalTable(const TRule_alter_external_table_stmt& msg) {
PosFromToken(msg.GetToken1());
NewLine();
VisitKeyword(msg.GetToken1());
VisitKeyword(msg.GetToken2());
VisitKeyword(msg.GetToken3());
Visit(msg.GetRule_simple_table_ref4());
NewLine();
PushCurrentIndent();
Visit(msg.GetRule_alter_external_table_action5());
for (auto& b : msg.GetBlock6()) {
Visit(b.GetToken1());
NewLine();
Visit(b.GetRule_alter_external_table_action2());
}

PopCurrentIndent();
}

void VisitDo(const TRule_do_stmt& msg) {
PosFromToken(msg.GetToken1());
NewLine();
Expand Down Expand Up @@ -1408,6 +1427,27 @@ friend struct TStaticData;
VisitAllFields(TRule_create_external_data_source_stmt::GetDescriptor(), msg);
}

void VisitAlterExternalDataSource(const TRule_alter_external_data_source_stmt& msg) {
PosFromToken(msg.GetToken1());
NewLine();
VisitToken(msg.GetToken1());
VisitToken(msg.GetToken2());
VisitToken(msg.GetToken3());
VisitToken(msg.GetToken4());
Visit(msg.GetRule_object_ref5());

NewLine();
PushCurrentIndent();
Visit(msg.GetRule_alter_external_data_source_action6());
for (const auto& action : msg.GetBlock7()) {
Visit(action.GetToken1()); // comma
NewLine();
Visit(action.GetRule_alter_external_data_source_action2());
}

PopCurrentIndent();
}

void VisitDropExternalDataSource(const TRule_drop_external_data_source_stmt& msg) {
PosFromToken(msg.GetToken1());
NewLine();
Expand Down Expand Up @@ -2282,6 +2322,30 @@ friend struct TStaticData;
PopCurrentIndent();
}

void VisitWithTableSettingsExpr(const TRule_with_table_settings& msg) {
VisitKeyword(msg.GetToken1());
Visit(msg.GetToken2());

const bool needIndent = msg.Block4Size() > 0; // more then one setting
if (needIndent) {
NewLine();
PushCurrentIndent();
Visit(msg.GetRule_table_settings_entry3()); // first setting

for (const auto& entry : msg.GetBlock4()) {
Visit(entry.GetToken1()); // comma
NewLine();
Visit(entry.GetRule_table_settings_entry2()); // other settings
}
PopCurrentIndent();
NewLine();
} else {
Visit(msg.GetRule_table_settings_entry3());
}

Visit(msg.GetToken5());
}

void VisitExpr(const TRule_expr& msg) {
if (msg.HasAlt_expr2()) {
Visit(msg.GetAlt_expr2());
Expand Down Expand Up @@ -2567,6 +2631,7 @@ TStaticData::TStaticData()
{TRule_exists_expr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitExistsExpr)},
{TRule_case_expr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitCaseExpr)},
{TRule_when_expr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitWhenExpr)},
{TRule_with_table_settings::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitWithTableSettingsExpr)},

{TRule_expr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitExpr)},
{TRule_or_subexpr::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitOrSubexpr)},
Expand Down Expand Up @@ -2596,6 +2661,7 @@ TStaticData::TStaticData()
{TRule_import_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitImport)},
{TRule_export_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitExport)},
{TRule_alter_table_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAlterTable)},
{TRule_alter_external_table_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAlterExternalTable)},
{TRule_do_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitDo)},
{TRule_define_action_or_subquery_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAction)},
{TRule_if_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitIf)},
Expand All @@ -2611,6 +2677,7 @@ TStaticData::TStaticData()
{TRule_alter_object_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAlterObject)},
{TRule_drop_object_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitDropObject)},
{TRule_create_external_data_source_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitCreateExternalDataSource)},
{TRule_alter_external_data_source_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAlterExternalDataSource)},
{TRule_drop_external_data_source_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitDropExternalDataSource)},
{TRule_create_replication_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitCreateAsyncReplication)},
{TRule_drop_replication_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitDropAsyncReplication)},
Expand All @@ -2633,7 +2700,7 @@ TStaticData::TStaticData()
{TRule_in_unary_casual_subexpr::GetDescriptor(), MakeObfuscatingFunctor(&TObfuscatingVisitor::VisitInUnaryCasualSubexpr)},
})
{
// ensure that all statements has a visitor
// ensure that all statements have a visitor
auto coreDescr = TRule_sql_stmt_core::GetDescriptor();
for (int i = 0; i < coreDescr->field_count(); ++i) {
const NProtoBuf::FieldDescriptor* fd = coreDescr->field(i);
Expand Down
Loading