@@ -5444,6 +5444,199 @@ R"([[#;#;["Primary1"];[41u]];[["Secondary2"];[2u];["Primary2"];[42u]];[["Seconda
54445444 UNIT_ASSERT_VALUES_EQUAL (NYdb::FormatResultSetYson (result.GetResultSet (0 )), R"( [[[100u];[101u]];[[200u];[201u]]])" );
54455445 }
54465446 }
5447+
5448+ Y_UNIT_TEST_TWIN (JoinWithNonPKColumnsInPredicate, UseStreamJoin) {
5449+ NKikimrConfig::TAppConfig appConfig;
5450+ appConfig.MutableTableServiceConfig ()->SetEnableKqpDataQueryStreamIdxLookupJoin (UseStreamJoin);
5451+ auto setting = NKikimrKqp::TKqpSetting ();
5452+ auto serverSettings = TKikimrSettings ()
5453+ .SetKqpSettings ({setting})
5454+ .SetAppConfig (appConfig);
5455+ TKikimrRunner kikimr (serverSettings);
5456+ auto db = kikimr.GetTableClient ();
5457+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
5458+
5459+ { // create tables
5460+ const TString createTableSql = R"(
5461+ CREATE TABLE `Root/tab1` (
5462+ id Text NOT NULL,
5463+ dst_ident Text,
5464+ exec_dt Timestamp,
5465+ PRIMARY KEY(id),
5466+ INDEX ix_exec_dt GLOBAL ON (exec_dt)
5467+ );
5468+ CREATE TABLE `Root/tab2` (
5469+ id Text NOT NULL,
5470+ int_ref Text,
5471+ ext_ref Text,
5472+ send_dttm Timestamp,
5473+ PRIMARY KEY(id),
5474+ INDEX ix_int_ref GLOBAL ON (int_ref),
5475+ INDEX ix_ext_ref GLOBAL ON (ext_ref),
5476+ INDEX ix_send_dttm GLOBAL ON (send_dttm)
5477+ );
5478+
5479+ CREATE TABLE `Root/tab3` (
5480+ id Text NOT NULL,
5481+ dst_ident Text,
5482+ exec_dt Timestamp,
5483+ PRIMARY KEY(id),
5484+ INDEX ix_exec_dt GLOBAL ON (exec_dt)
5485+ );
5486+
5487+ CREATE TABLE `Root/tab4` (
5488+ id Text NOT NULL,
5489+ int_ref Text,
5490+ ext_ref Text,
5491+ good_sign Text,
5492+ send_dttm Timestamp,
5493+ PRIMARY KEY(id),
5494+ INDEX ix_int_ref GLOBAL ON (int_ref),
5495+ INDEX ix_ext_ref GLOBAL ON (ext_ref),
5496+ INDEX ix_send_dttm GLOBAL ON (send_dttm)
5497+ );
5498+
5499+ CREATE TABLE `Root/tab5` (
5500+ t5_id Text NOT NULL,
5501+ t5_coll Text,
5502+ t5_exec_dt Timestamp,
5503+ PRIMARY KEY(t5_id),
5504+ INDEX ix_exec_dt GLOBAL ON (t5_exec_dt),
5505+ INDEX ix_ref_coll GLOBAL ON (t5_coll)
5506+ );
5507+
5508+ CREATE TABLE `Root/tab6` (
5509+ t6_id Text NOT NULL,
5510+ t6_coll Text NOT NULL,
5511+ t6_link_type Text,
5512+ PRIMARY KEY(t6_id, t6_coll),
5513+ INDEX ix_magic GLOBAL ON (t6_id, t6_link_type)
5514+ );
5515+ )" ;
5516+
5517+ auto result = session.ExecuteSchemeQuery (createTableSql).GetValueSync ();
5518+ UNIT_ASSERT_C (result.GetIssues ().Empty (), result.GetIssues ().ToString ());
5519+ UNIT_ASSERT_VALUES_EQUAL (result.GetStatus (), EStatus::SUCCESS);
5520+ }
5521+
5522+ { // fill tables
5523+ const TString upsertSql (Q_ (R"(
5524+ UPSERT INTO `Root/tab1` (id, dst_ident, exec_dt) VALUES
5525+ ('t1-0'u, 'id-1'u, Timestamp('2024-12-03T01:00:00.000000Z')),
5526+ ('t1-1'u, 'id-2'u, Timestamp('2024-12-03T02:00:00.000000Z')),
5527+ ('t1-2'u, 'id-3'u, Timestamp('2024-12-03T03:00:00.000000Z'));
5528+
5529+ UPSERT INTO `Root/tab2` (id, int_ref, ext_ref, send_dttm) VALUES
5530+ ('t2-0'u, 't1-0'u, 'id-1'u, Timestamp('2024-12-03T01:01:00.000000Z')),
5531+ ('t2-1'u, 't1-0'u, null, Timestamp('2024-12-03T02:01:00.000000Z')),
5532+ ('t2-2'u, 't1-0'u, null, Timestamp('2024-12-03T02:01:00.000000Z')),
5533+ ('t2-3'u, 't1-1'u, 'id-2'u, Timestamp('2024-12-03T03:01:00.000000Z')),
5534+ ('t2-4'u, 't1-1'u, null, Timestamp('2024-12-03T04:01:00.000000Z')),
5535+ ('t2-5'u, 't1-1'u, null, Timestamp('2024-12-03T05:01:00.000000Z')),
5536+ ('t2-6'u, 't1-2'u, 'id-3'u, Timestamp('2024-12-03T06:01:00.000000Z')),
5537+ ('t2-7'u, 't1-2'u, null, Timestamp('2024-12-03T07:01:00.000000Z')),
5538+ ('t2-8'u, 't1-2'u, null, Timestamp('2024-12-03T08:01:00.000000Z')),
5539+ ('t2-9'u, 't1-2'u, null, Timestamp('2024-12-03T09:01:00.000000Z'));
5540+
5541+ UPSERT INTO `Root/tab3` (id, dst_ident, exec_dt) VALUES
5542+ ('t1-0'u, 'id-1'u, Timestamp('2024-12-03T01:00:00.000000Z')),
5543+ ('t1-1'u, 'id-2'u, Timestamp('2024-12-03T02:00:00.000000Z')),
5544+ ('t1-2'u, 'id-3'u, Timestamp('2024-12-03T03:00:00.000000Z'));
5545+
5546+ UPSERT INTO `Root/tab4` (id, int_ref, ext_ref, good_sign, send_dttm) VALUES
5547+ ('t2-0'u, 't1-0'u, 'id-1'u, 'GOOD'u, Timestamp('2024-12-03T01:01:00.000000Z')),
5548+ ('t2-1'u, 't1-0'u, null, 'BAD'u, Timestamp('2024-12-03T02:01:00.000000Z')),
5549+ ('t2-2'u, 't1-0'u, null, 'BAD'u, Timestamp('2024-12-03T02:01:00.000000Z')),
5550+ ('t2-3'u, 't1-1'u, 'id-2'u, 'GOOD'u, Timestamp('2024-12-03T03:01:00.000000Z')),
5551+ ('t2-4'u, 't1-1'u, null, 'BAD'u, Timestamp('2024-12-03T04:01:00.000000Z')),
5552+ ('t2-5'u, 't1-1'u, null, 'BAD'u, Timestamp('2024-12-03T05:01:00.000000Z')),
5553+ ('t2-6'u, 't1-2'u, 'id-3'u, 'GOOD'u, Timestamp('2024-12-03T06:01:00.000000Z')),
5554+ ('t2-7'u, 't1-2'u, null, 'BAD'u, Timestamp('2024-12-03T07:01:00.000000Z')),
5555+ ('t2-8'u, 't1-2'u, null, 'BAD'u, Timestamp('2024-12-03T08:01:00.000000Z')),
5556+ ('t2-9'u, 't1-2'u, null, 'BAD'u, Timestamp('2024-12-03T09:01:00.000000Z'));
5557+
5558+ UPSERT INTO `Root/tab5` (t5_id, t5_coll, t5_exec_dt) VALUES
5559+ ('k00'u, null, Timestamp('2024-12-03T01:00:00.000000Z')),
5560+ ('k01'u, null, Timestamp('2024-12-03T02:00:00.000000Z')),
5561+ ('k02'u, null, Timestamp('2024-12-03T03:00:00.000000Z')),
5562+ ('k10'u, 'c00'u, Timestamp('2024-12-03T08:00:00.000000Z'));
5563+
5564+ UPSERT INTO `Root/tab6` (t6_id, t6_coll, t6_link_type) VALUES
5565+ ('k00'u, 'c00'u, 'l00'u),
5566+ ('k01'u, 'c00'u, 'l00'u),
5567+ ('k02'u, 'c00'u, 'l00'u);
5568+ )" ));
5569+
5570+ auto result = session.ExecuteDataQuery (upsertSql, TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx ()).ExtractValueSync ();
5571+ UNIT_ASSERT (result.IsSuccess ());
5572+ }
5573+
5574+ { // join with data column req.ext_ref in predicate
5575+ const TString joinSql (Q1_ (R"(
5576+ $sys_date = DateTime("2024-12-03T00:00:00Z");
5577+ $ival = DateTime::IntervalFromDays(1);
5578+ SELECT req.id, doc.id, req.int_ref, doc.dst_ident, req.ext_ref
5579+ FROM `Root/tab1` VIEW ix_exec_dt AS doc
5580+ LEFT JOIN `Root/tab2` VIEW ix_int_ref req
5581+ ON doc.id = req.int_ref AND doc.dst_ident = req.ext_ref
5582+ WHERE doc.exec_dt >= $sys_date and doc.exec_dt <$sys_date + $ival
5583+ AND doc.id='t1-1'u;
5584+ )" ));
5585+
5586+ auto result = session.ExecuteDataQuery (joinSql, TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx ()).ExtractValueSync ();
5587+ UNIT_ASSERT (result.IsSuccess ());
5588+ CompareYson (R"( [
5589+ [["t2-3"];"t1-1";["t1-1"];["id-2"];["id-2"]]
5590+ ])" , FormatResultSetYson (result.GetResultSet (0 )));
5591+ }
5592+
5593+ { // join with data column req.ext_ref in predicate
5594+ const TString joinSql (Q1_ (R"(
5595+ $sys_date = DateTime("2024-12-03T00:00:00Z");
5596+ $ival = DateTime::IntervalFromDays(1);
5597+ SELECT doc.id, req.id, doc.dst_ident, req.ext_ref, req.good_sign
5598+ FROM `Root/tab3` VIEW ix_exec_dt AS doc
5599+ LEFT JOIN (
5600+ SELECT id, int_ref, ext_ref, good_sign
5601+ FROM `Root/tab4` VIEW ix_int_ref
5602+ WHERE good_sign='GOOD'u
5603+ ) AS req
5604+ ON doc.id = req.int_ref AND doc.dst_ident = req.ext_ref
5605+ WHERE doc.exec_dt >= $sys_date and doc.exec_dt <$sys_date + $ival
5606+ AND doc.id='t1-1'u;
5607+ )" ));
5608+
5609+ auto result = session.ExecuteDataQuery (joinSql, TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx ()).ExtractValueSync ();
5610+ UNIT_ASSERT (result.IsSuccess ());
5611+ CompareYson (R"( [
5612+ ["t1-1";["t2-3"];["id-2"];["id-2"];["GOOD"]]
5613+ ])" , FormatResultSetYson (result.GetResultSet (0 )));
5614+ }
5615+
5616+ { // join with secondary index column in predicate
5617+ const TString joinSql (Q1_ (R"(
5618+ SELECT * FROM (
5619+ SELECT t5.*, t6.*, t5owner.t5_id as owner_id
5620+ FROM (SELECT 'l00'u AS link_type) AS cond1
5621+ CROSS JOIN `Root/tab5` AS t5
5622+ LEFT JOIN `Root/tab6` VIEW ix_magic AS t6
5623+ ON t5.t5_id=t6.t6_id AND t6.t6_link_type=cond1.link_type
5624+ LEFT JOIN `Root/tab5` VIEW ix_ref_coll AS t5owner
5625+ ON t6.t6_coll=t5owner.t5_coll
5626+ ) WHERE t5_exec_dt BETWEEN DateTime('2024-12-03T00:00:00Z') AND DateTime('2024-12-05T00:00:00Z')
5627+ ORDER BY t5_id, t6_id, owner_id;
5628+ )" ));
5629+
5630+ auto result = session.ExecuteDataQuery (joinSql, TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx ()).ExtractValueSync ();
5631+ UNIT_ASSERT (result.IsSuccess ());
5632+ CompareYson (R"( [
5633+ [["k10"];#;[1733187600000000u];"k00";["c00"];["k00"];["l00"]];
5634+ [["k10"];#;[1733191200000000u];"k01";["c00"];["k01"];["l00"]];
5635+ [["k10"];#;[1733194800000000u];"k02";["c00"];["k02"];["l00"]];
5636+ [#;["c00"];[1733212800000000u];"k10";#;#;#]
5637+ ])" , FormatResultSetYson (result.GetResultSet (0 )));
5638+ }
5639+ }
54475640}
54485641
54495642}
0 commit comments