@@ -3529,7 +3529,8 @@ Y_UNIT_TEST_SUITE(KqpPg) {
35293529 SELECT * FROM PgTable WHERE key = 'a';
35303530 )" );
35313531 auto result = db.ExecuteQuery (query, NYdb::NQuery::TTxControl::BeginTx ().CommitTx (), settings).ExtractValueSync ();
3532- UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
3532+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::PRECONDITION_FAILED, result.GetIssues ().ToString ());
3533+ UNIT_ASSERT (result.GetIssues ().ToString ().Contains (" invalid input syntax for type integer: \" a\" " ));
35333534 }
35343535 }
35353536
@@ -3608,6 +3609,127 @@ Y_UNIT_TEST_SUITE(KqpPg) {
36083609 UNIT_ASSERT (result.GetIssues ().ToString ().Contains (" invalid byte sequence for encoding \" UTF8\" : 0x00" ));
36093610 }
36103611 }
3612+
3613+ Y_UNIT_TEST (NoSelectFullScan) {
3614+ NKikimrConfig::TAppConfig appConfig;
3615+ appConfig.MutableTableServiceConfig ()->SetEnablePreparedDdl (true );
3616+ auto setting = NKikimrKqp::TKqpSetting ();
3617+ auto serverSettings = TKikimrSettings ()
3618+ .SetAppConfig (appConfig)
3619+ .SetKqpSettings ({setting});
3620+ TKikimrRunner kikimr (serverSettings.SetWithSampleTables (false ));
3621+ auto db = kikimr.GetQueryClient ();
3622+ auto settings = NYdb::NQuery::TExecuteQuerySettings ().Syntax (NYdb::NQuery::ESyntax::Pg);
3623+ {
3624+ auto result = db.ExecuteQuery (R"(
3625+ CREATE TABLE pgbench_accounts(aid int not null,bid int,abalance int,filler char(84), primary key (aid))
3626+ )" , NYdb::NQuery::TTxControl::NoTx (), settings).ExtractValueSync ();
3627+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
3628+ }
3629+ {
3630+ auto result = db.ExecuteQuery (R"(
3631+ INSERT INTO pgbench_accounts (aid, bid, abalance, filler) VALUES
3632+ (1, 1, 10, ' '::char),
3633+ (2, 1, 20, ' '::char),
3634+ (3, 1, 30, ' '::char),
3635+ (4, 1, 40, '
3636+ '::char),
3637+ (5, 1, 50, ' '::char),
3638+ (6, 1, 60, ' '::char),
3639+ (7, 1, 70, ' '::char),
3640+ (8, 1, 80, ' '::char),
3641+ (9, 1, 90, ' '::char),
3642+ (10, 1, 100, ' '::char)
3643+ )" , NYdb::NQuery::TTxControl::BeginTx ().CommitTx (), settings).ExtractValueSync ();
3644+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
3645+ }
3646+ {
3647+ auto tc = kikimr.GetTableClient ();
3648+ TStreamExecScanQuerySettings settings;
3649+ settings.Explain (true );
3650+ auto it = tc.StreamExecuteScanQuery (R"(
3651+ --!syntax_pg
3652+ SELECT abalance FROM pgbench_accounts WHERE aid = 7 OR aid = 3 ORDER BY abalance;
3653+ )" , settings).GetValueSync ();
3654+
3655+ UNIT_ASSERT_C (it.IsSuccess (), it.GetIssues ().ToString ());
3656+
3657+ auto res = CollectStreamResult (it);
3658+ UNIT_ASSERT (res.PlanJson );
3659+
3660+ NJson::TJsonValue plan;
3661+ NJson::ReadJsonTree (*res.PlanJson , &plan, true );
3662+ UNIT_ASSERT (ValidatePlanNodeIds (plan));
3663+
3664+ auto fullScan = FindPlanNodeByKv (plan, " Node Type" , " Filter-TableFullScan" );
3665+ UNIT_ASSERT_C (!fullScan.IsDefined (), " got fullscan, expected lookup" );
3666+ auto lookup = FindPlanNodeByKv (plan, " Node Type" , " TableLookup" );
3667+ UNIT_ASSERT_C (lookup.IsDefined (), " no Table Lookup in plan" );
3668+ }
3669+ {
3670+ auto result = db.ExecuteQuery (R"(
3671+ SELECT abalance FROM pgbench_accounts WHERE aid = 7 OR aid = 3 ORDER BY abalance;
3672+ )" , NYdb::NQuery::TTxControl::BeginTx ().CommitTx (), settings).ExtractValueSync ();
3673+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
3674+ CompareYson (R"( [
3675+ ["30"];["70"]
3676+ ])" , FormatResultSetYson (result.GetResultSet (0 )));
3677+ }
3678+ {
3679+ auto tc = kikimr.GetTableClient ();
3680+ TStreamExecScanQuerySettings settings;
3681+ settings.Explain (true );
3682+ auto it = tc.StreamExecuteScanQuery (R"(
3683+ --!syntax_pg
3684+ SELECT abalance FROM pgbench_accounts WHERE aid = 7 OR aid < 3 ORDER BY abalance;
3685+ )" , settings).GetValueSync ();
3686+
3687+ UNIT_ASSERT_C (it.IsSuccess (), it.GetIssues ().ToString ());
3688+
3689+ auto res = CollectStreamResult (it);
3690+ UNIT_ASSERT (res.PlanJson );
3691+ Cerr << res.PlanJson << Endl;
3692+
3693+ NJson::TJsonValue plan;
3694+ NJson::ReadJsonTree (*res.PlanJson , &plan, true );
3695+ UNIT_ASSERT (ValidatePlanNodeIds (plan));
3696+
3697+ auto fullScan = FindPlanNodeByKv (plan, " Node Type" , " Filter-TableFullScan" );
3698+ UNIT_ASSERT_C (!fullScan.IsDefined (), " got fullscan, expected lookup" );
3699+ auto lookup = FindPlanNodeByKv (plan, " Node Type" , " TableRangeScan" );
3700+ UNIT_ASSERT_C (lookup.IsDefined (), " no Table Range Scan in plan" );
3701+ }
3702+ {
3703+ auto tc = kikimr.GetTableClient ();
3704+ TStreamExecScanQuerySettings settings;
3705+ settings.Explain (true );
3706+ auto it = tc.StreamExecuteScanQuery (R"(
3707+ --!syntax_pg
3708+ SELECT abalance FROM pgbench_accounts WHERE aid > 4 AND aid < 3;
3709+ )" , settings).GetValueSync ();
3710+
3711+ UNIT_ASSERT_C (it.IsSuccess (), it.GetIssues ().ToString ());
3712+
3713+ auto res = CollectStreamResult (it);
3714+ UNIT_ASSERT (res.PlanJson );
3715+ Cerr << res.PlanJson << Endl;
3716+ NJson::TJsonValue plan;
3717+ NJson::ReadJsonTree (*res.PlanJson , &plan, true );
3718+ UNIT_ASSERT (ValidatePlanNodeIds (plan));
3719+
3720+ auto fullScan = FindPlanNodeByKv (plan, " Node Type" , " Filter-TableFullScan" );
3721+ UNIT_ASSERT_C (!fullScan.IsDefined (), " got fullscan, expected lookup" );
3722+ auto lookup = FindPlanNodeByKv (plan, " Node Type" , " TableRangeScan" );
3723+ UNIT_ASSERT_C (lookup.IsDefined (), " no Table Range Scan in plan" );
3724+ }
3725+ {
3726+ auto result = db.ExecuteQuery (R"(
3727+ SELECT abalance FROM pgbench_accounts WHERE aid > 4 AND aid < 3;
3728+ )" , NYdb::NQuery::TTxControl::BeginTx ().CommitTx (), settings).ExtractValueSync ();
3729+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
3730+ CompareYson (R"( [])" , FormatResultSetYson (result.GetResultSet (0 )));
3731+ }
3732+ }
36113733}
36123734
36133735} // namespace NKqp
0 commit comments