@@ -1591,6 +1591,78 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) {
1591
1591
UNIT_ASSERT_STRING_CONTAINS (queryExecutionOperation.GetIssues ().ToString (), " \" /Root/external_table\" is expected to be external data source" );
1592
1592
}
1593
1593
}
1594
+
1595
+ Y_UNIT_TEST (QueryWithNoDataInS3) {
1596
+ const TString externalDataSourceName = " tpc_h_s3_storage_connection" ;
1597
+ const TString bucket = " test_bucket_no_data" ;
1598
+
1599
+ Aws::S3::S3Client s3Client = MakeS3Client ();
1600
+ CreateBucket (bucket, s3Client);
1601
+ // Uncomment if you want to compare with query with data
1602
+ // UploadObject(bucket, "l/l", R"json({"l_extendedprice": 0.0, "l_discount": 1.0, "l_partkey": 1})json", s3Client);
1603
+ // UploadObject(bucket, "p/p", R"json({"p_partkey": 1, "p_type": "t"})json", s3Client);
1604
+
1605
+ auto kikimr = MakeKikimrRunner (NYql::IHTTPGateway::Make ());
1606
+ auto client = kikimr->GetQueryClient ();
1607
+
1608
+ {
1609
+ const TString query = fmt::format (R"sql(
1610
+ CREATE EXTERNAL DATA SOURCE `{external_source}` WITH (
1611
+ SOURCE_TYPE="ObjectStorage",
1612
+ LOCATION="{location}",
1613
+ AUTH_METHOD="NONE"
1614
+ );
1615
+ )sql" ,
1616
+ " external_source" _a = externalDataSourceName,
1617
+ " location" _a = GetBucketLocation (bucket)
1618
+ );
1619
+ auto result = client.ExecuteQuery (query, TTxControl::NoTx ()).GetValueSync ();
1620
+ UNIT_ASSERT_C (result.GetStatus () == NYdb::EStatus::SUCCESS, result.GetIssues ().ToString ());
1621
+ }
1622
+
1623
+ {
1624
+ // YQ-2750
1625
+ const TString query = fmt::format (R"sql(
1626
+ $border = Date("1994-08-01");
1627
+ select
1628
+ 100.00 * sum(case
1629
+ when StartsWith(p.p_type, 'PROMO')
1630
+ then l.l_extendedprice * (1 - l.l_discount)
1631
+ else 0
1632
+ end) / sum(l.l_extendedprice * (1 - l.l_discount)) as promo_revenue
1633
+ from
1634
+ {external_source}.`l/` with ( schema (
1635
+ l_extendedprice double,
1636
+ l_discount double,
1637
+ l_partkey int64,
1638
+ l_shipdate date
1639
+ ),
1640
+ format = "json_each_row"
1641
+ ) as l
1642
+ join
1643
+ {external_source}.`p/` with ( schema (
1644
+ p_partkey int64,
1645
+ p_type string
1646
+ ),
1647
+ format = "json_each_row"
1648
+ ) as p
1649
+ on
1650
+ l.l_partkey = p.p_partkey
1651
+ where
1652
+ cast(l.l_shipdate as timestamp) >= $border
1653
+ and cast(l.l_shipdate as timestamp) < ($border + Interval("P31D"));
1654
+ )sql" ,
1655
+ " external_source" _a = externalDataSourceName
1656
+ );
1657
+ auto result = client.ExecuteQuery (query, TTxControl::BeginTx ().CommitTx ()).GetValueSync ();
1658
+ UNIT_ASSERT_C (result.GetStatus () == NYdb::EStatus::SUCCESS, result.GetIssues ().ToString ());
1659
+ auto rs = result.GetResultSetParser (0 );
1660
+ UNIT_ASSERT_VALUES_EQUAL (rs.RowsCount (), 1 );
1661
+ rs.TryNextRow ();
1662
+ TMaybe<double > sum = rs.ColumnParser (0 ).GetOptionalDouble ();
1663
+ UNIT_ASSERT (!sum);
1664
+ }
1665
+ }
1594
1666
}
1595
1667
1596
1668
} // namespace NKikimr::NKqp
0 commit comments