|
12 | 12 | import static org.mockito.Mockito.when; |
13 | 13 |
|
14 | 14 | import java.util.Arrays; |
15 | | -import java.util.UUID; |
16 | 15 | import lombok.AllArgsConstructor; |
17 | 16 | import lombok.Getter; |
18 | 17 | import org.antlr.v4.runtime.CommonTokenStream; |
@@ -577,11 +576,111 @@ void testSecurityLakeQueries() { |
577 | 576 | } |
578 | 577 |
|
579 | 578 | @Test |
580 | | - void testValidateFlintExtensionQuery() { |
| 579 | + void testValidateFlintExtensionQuery_safeQuery() { |
| 580 | + when(mockedProvider.getValidatorForDatasource(any())) |
| 581 | + .thenReturn(new S3GlueSQLGrammarElementValidator()); |
| 582 | + assertDoesNotThrow( |
| 583 | + () -> |
| 584 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 585 | + "CREATE MATERIALIZED VIEW mv AS select * from table WITH (auto_refresh = false)", |
| 586 | + DataSourceType.S3GLUE)); |
| 587 | + } |
| 588 | + |
| 589 | + @Test |
| 590 | + void testValidateFlintExtensionQuery_blocksTransformInMV() { |
| 591 | + when(mockedProvider.getValidatorForDatasource(any())) |
| 592 | + .thenReturn(new S3GlueSQLGrammarElementValidator()); |
| 593 | + assertThrows( |
| 594 | + IllegalArgumentException.class, |
| 595 | + () -> |
| 596 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 597 | + "CREATE MATERIALIZED VIEW mv AS SELECT TRANSFORM(id) USING 'cmd' AS x FROM tbl" |
| 598 | + + " WITH (auto_refresh = false)", |
| 599 | + DataSourceType.S3GLUE)); |
| 600 | + } |
| 601 | + |
| 602 | + @Test |
| 603 | + void testValidateFlintExtensionQuery_blocksReflectInMV() { |
| 604 | + when(mockedProvider.getValidatorForDatasource(any())) |
| 605 | + .thenReturn(new S3GlueSQLGrammarElementValidator()); |
| 606 | + assertThrows( |
| 607 | + IllegalArgumentException.class, |
| 608 | + () -> |
| 609 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 610 | + "CREATE MATERIALIZED VIEW mv AS SELECT reflect('java.lang.System', 'getenv'," |
| 611 | + + " 'PATH') FROM tbl WITH (auto_refresh = false)", |
| 612 | + DataSourceType.S3GLUE)); |
| 613 | + } |
| 614 | + |
| 615 | + @Test |
| 616 | + void testValidateFlintExtensionQuery_nonMVStatementsPass() { |
| 617 | + assertDoesNotThrow( |
| 618 | + () -> |
| 619 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 620 | + "DROP MATERIALIZED VIEW mv", DataSourceType.S3GLUE)); |
| 621 | + assertDoesNotThrow( |
| 622 | + () -> |
| 623 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 624 | + "REFRESH MATERIALIZED VIEW mv", DataSourceType.S3GLUE)); |
| 625 | + assertDoesNotThrow( |
| 626 | + () -> |
| 627 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 628 | + "CREATE SKIPPING INDEX ON tbl (col VALUE_SET)", DataSourceType.S3GLUE)); |
| 629 | + } |
| 630 | + |
| 631 | + @Test |
| 632 | + void testValidateFlintExtensionQuery_mvWithWindowFunction() { |
| 633 | + when(mockedProvider.getValidatorForDatasource(any())) |
| 634 | + .thenReturn(new S3GlueSQLGrammarElementValidator()); |
| 635 | + assertDoesNotThrow( |
| 636 | + () -> |
| 637 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 638 | + "CREATE MATERIALIZED VIEW ds.default.mv AS SELECT window.start AS `start.time`," |
| 639 | + + " COUNT(*) AS count FROM ds.default.http_logs WHERE status != 200" |
| 640 | + + " GROUP BY window(`@timestamp`, '1 Minutes')" |
| 641 | + + " WITH (auto_refresh = true, refresh_interval = '1 Minutes'," |
| 642 | + + " checkpoint_location = 's3://bucket/checkpoint'," |
| 643 | + + " watermark_delay = '10 Minutes')", |
| 644 | + DataSourceType.S3GLUE)); |
| 645 | + } |
| 646 | + |
| 647 | + @Test |
| 648 | + void testValidateFlintExtensionQuery_mvWithTumbleFunction() { |
| 649 | + when(mockedProvider.getValidatorForDatasource(any())) |
| 650 | + .thenReturn(new S3GlueSQLGrammarElementValidator()); |
| 651 | + assertDoesNotThrow( |
| 652 | + () -> |
| 653 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 654 | + "CREATE MATERIALIZED VIEW ds.default.mv AS SELECT window.start AS `start.time`," |
| 655 | + + " COUNT(*) AS count FROM ds.default.http_logs WHERE status != 200" |
| 656 | + + " GROUP BY TUMBLE(`@timestamp`, '6 Hours')" |
| 657 | + + " WITH (auto_refresh = false)", |
| 658 | + DataSourceType.S3GLUE)); |
| 659 | + } |
| 660 | + |
| 661 | + @Test |
| 662 | + void testValidateFlintExtensionQuery_mvWithHopFunction() { |
| 663 | + when(mockedProvider.getValidatorForDatasource(any())) |
| 664 | + .thenReturn(new S3GlueSQLGrammarElementValidator()); |
| 665 | + assertDoesNotThrow( |
| 666 | + () -> |
| 667 | + sqlQueryValidator.validateFlintExtensionQuery( |
| 668 | + "CREATE MATERIALIZED VIEW ds.default.mv AS SELECT window.start AS `start.time`," |
| 669 | + + " COUNT(*) AS count FROM ds.default.http_logs" |
| 670 | + + " GROUP BY HOP(`@timestamp`, '5 Minutes', '10 Minutes')" |
| 671 | + + " WITH (auto_refresh = false)", |
| 672 | + DataSourceType.S3GLUE)); |
| 673 | + } |
| 674 | + |
| 675 | + @Test |
| 676 | + void testValidateFlintExtensionQuery_coveringIndexPass() { |
581 | 677 | assertDoesNotThrow( |
582 | 678 | () -> |
583 | 679 | sqlQueryValidator.validateFlintExtensionQuery( |
584 | | - UUID.randomUUID().toString(), DataSourceType.SECURITY_LAKE)); |
| 680 | + "CREATE INDEX idx ON ds.default.http_logs (status, day, clientip)" |
| 681 | + + " WITH (auto_refresh = true, refresh_interval = '5 minute'," |
| 682 | + + " checkpoint_location = 's3://bucket/checkpoint')", |
| 683 | + DataSourceType.S3GLUE)); |
585 | 684 | } |
586 | 685 |
|
587 | 686 | @Test |
|
0 commit comments