@@ -5972,6 +5972,120 @@ R"([[#;#;["Primary1"];[41u]];[["Secondary2"];[2u];["Primary2"];[42u]];[["Seconda
5972
5972
);
5973
5973
}
5974
5974
}
5975
+
5976
+ Y_UNIT_TEST_TWIN (IndexUpsert, Uniq) {
5977
+ auto setting = NKikimrKqp::TKqpSetting ();
5978
+ auto serverSettings = TKikimrSettings ().SetKqpSettings ({setting});
5979
+ TKikimrRunner kikimr (serverSettings);
5980
+
5981
+ auto client = kikimr.GetQueryClient ();
5982
+
5983
+ {
5984
+ const TString query (Q_ (std::format (R"(
5985
+ CREATE TABLE `/Root/TestTable` (
5986
+ a Int32,
5987
+ b Int32,
5988
+ PRIMARY KEY(a,b),
5989
+ INDEX ix_b GLOBAL {} SYNC ON (b)
5990
+ );
5991
+ )" , Uniq ? " UNIQUE" : " " )));
5992
+
5993
+ auto result = client.ExecuteQuery (
5994
+ query,
5995
+ NQuery::TTxControl::NoTx ())
5996
+ .ExtractValueSync ();
5997
+ UNIT_ASSERT (result.IsSuccess ());
5998
+ }
5999
+
6000
+ {
6001
+ const TString query (Q_ (R"(
6002
+ $v=[<|a:10,b:20|>,<|a:30,b:20|>];
6003
+ UPSERT INTO `/Root/TestTable` SELECT * FROM AS_TABLE($v);
6004
+ )" ));
6005
+
6006
+ auto result = client.ExecuteQuery (
6007
+ query,
6008
+ NQuery::TTxControl::NoTx ())
6009
+ .ExtractValueSync ();
6010
+ if (Uniq) {
6011
+ UNIT_ASSERT_C (!result.IsSuccess (), result.GetIssues ().ToString ());
6012
+ UNIT_ASSERT_STRING_CONTAINS_C (
6013
+ result.GetIssues ().ToString (),
6014
+ " Duplicated keys found." ,
6015
+ result.GetIssues ().ToString ());
6016
+ } else {
6017
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
6018
+ }
6019
+ }
6020
+
6021
+ {
6022
+ const TString query (Q_ (R"(
6023
+ $v=[<|a:10,b:20|>,<|a:10,b:20|>];
6024
+ UPSERT INTO `/Root/TestTable` SELECT * FROM AS_TABLE($v);
6025
+ )" ));
6026
+
6027
+ auto result = client.ExecuteQuery (
6028
+ query,
6029
+ NQuery::TTxControl::NoTx ())
6030
+ .ExtractValueSync ();
6031
+ if (Uniq) {
6032
+ UNIT_ASSERT_C (!result.IsSuccess (), result.GetIssues ().ToString ());
6033
+ UNIT_ASSERT_STRING_CONTAINS_C (
6034
+ result.GetIssues ().ToString (),
6035
+ " Duplicated keys found." ,
6036
+ result.GetIssues ().ToString ());
6037
+ } else {
6038
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
6039
+ }
6040
+ }
6041
+
6042
+ {
6043
+ const TString query (Q_ (R"(
6044
+ $v=[<|a:10,b:10|>,<|a:30,b:30|>];
6045
+ UPSERT INTO `/Root/TestTable` SELECT * FROM AS_TABLE($v);
6046
+ )" ));
6047
+
6048
+ auto result = client.ExecuteQuery (
6049
+ query,
6050
+ NQuery::TTxControl::NoTx ())
6051
+ .ExtractValueSync ();
6052
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
6053
+ }
6054
+
6055
+ {
6056
+ const TString query (Q_ (R"(
6057
+ $v=[<|a:20,b:10|>,<|a:20,b:30|>];
6058
+ UPSERT INTO `/Root/TestTable` SELECT * FROM AS_TABLE($v);
6059
+ )" ));
6060
+
6061
+ auto result = client.ExecuteQuery (
6062
+ query,
6063
+ NQuery::TTxControl::NoTx ())
6064
+ .ExtractValueSync ();
6065
+ if (Uniq) {
6066
+ UNIT_ASSERT_C (!result.IsSuccess (), result.GetIssues ().ToString ());
6067
+ UNIT_ASSERT_STRING_CONTAINS_C (
6068
+ result.GetIssues ().ToString (),
6069
+ " Conflict with existing key." ,
6070
+ result.GetIssues ().ToString ());
6071
+ } else {
6072
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
6073
+ }
6074
+ }
6075
+
6076
+ {
6077
+ const TString query (Q_ (R"(
6078
+ $v=[<|a:20,b:40|>,<|a:20,b:50|>];
6079
+ UPSERT INTO `/Root/TestTable` SELECT * FROM AS_TABLE($v);
6080
+ )" ));
6081
+
6082
+ auto result = client.ExecuteQuery (
6083
+ query,
6084
+ NQuery::TTxControl::NoTx ())
6085
+ .ExtractValueSync ();
6086
+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
6087
+ }
6088
+ }
5975
6089
}
5976
6090
5977
6091
}
0 commit comments