@@ -4581,3 +4581,129 @@ fn test_drop_constraints() {
4581
4581
snowflake ( ) . verified_stmt ( "ALTER TABLE tbl DROP FOREIGN KEY k1 RESTRICT" ) ;
4582
4582
snowflake ( ) . verified_stmt ( "ALTER TABLE tbl DROP CONSTRAINT c1 CASCADE" ) ;
4583
4583
}
4584
+
4585
+ #[ test]
4586
+ fn test_semantic_view_all_variants_should_pass ( ) {
4587
+ let test_cases = [
4588
+ ( "SELECT * FROM SEMANTIC_VIEW(model)" , None ) ,
4589
+ (
4590
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1, dim2)" ,
4591
+ None ,
4592
+ ) ,
4593
+ (
4594
+ "SELECT * FROM SEMANTIC_VIEW(model METRICS met1, met2)" ,
4595
+ None ,
4596
+ ) ,
4597
+ (
4598
+ "SELECT * FROM SEMANTIC_VIEW(model FACTS fact1, fact2)" ,
4599
+ None ,
4600
+ ) ,
4601
+ (
4602
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)" ,
4603
+ None ,
4604
+ ) ,
4605
+ (
4606
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)" ,
4607
+ None ,
4608
+ ) ,
4609
+ (
4610
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1) AS sv" ,
4611
+ None ,
4612
+ ) ,
4613
+ (
4614
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS DATE_PART('year', col))" ,
4615
+ None ,
4616
+ ) ,
4617
+ (
4618
+ "SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)" ,
4619
+ None ,
4620
+ ) ,
4621
+ // We can parse in any order bu will always produce a result in a fixed order.
4622
+ (
4623
+ "SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)" ,
4624
+ Some ( "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)" ) ,
4625
+ ) ,
4626
+ (
4627
+ "SELECT * FROM SEMANTIC_VIEW(model METRICS met1 DIMENSIONS dim1)" ,
4628
+ Some ( "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)" ) ,
4629
+ ) ,
4630
+ (
4631
+ "SELECT * FROM SEMANTIC_VIEW(model FACTS fact1 DIMENSIONS dim1)" ,
4632
+ Some ( "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 FACTS fact1)" ) ,
4633
+ ) ,
4634
+ ] ;
4635
+
4636
+ for ( input_sql, expected_sql) in test_cases {
4637
+ if let Some ( expected) = expected_sql {
4638
+ // Test that non-canonical order gets normalized
4639
+ let parsed = snowflake ( ) . parse_sql_statements ( input_sql) . unwrap ( ) ;
4640
+ let formatted = parsed[ 0 ] . to_string ( ) ;
4641
+ assert_eq ! ( formatted, expected) ;
4642
+ } else {
4643
+ snowflake ( ) . verified_stmt ( input_sql) ;
4644
+ }
4645
+ }
4646
+ }
4647
+
4648
+ #[ test]
4649
+ fn test_semantic_view_invalid_queries_should_fail ( ) {
4650
+ let invalid_sqls = [
4651
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)" ,
4652
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)" ,
4653
+ "SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))" ,
4654
+ ] ;
4655
+
4656
+ for sql in invalid_sqls {
4657
+ let result = snowflake ( ) . parse_sql_statements ( sql) ;
4658
+ assert ! ( result. is_err( ) , "Expected error for invalid SQL: {}" , sql) ;
4659
+ }
4660
+ }
4661
+
4662
+ #[ test]
4663
+ fn test_semantic_view_ast_structure ( ) {
4664
+ let sql = r#"SELECT * FROM SEMANTIC_VIEW(
4665
+ my_model
4666
+ DIMENSIONS DATE_PART('year', date_col), region_name
4667
+ METRICS orders.revenue, orders.count
4668
+ WHERE active = true
4669
+ ) AS model_alias"# ;
4670
+
4671
+ let stmt = snowflake ( ) . parse_sql_statements ( sql) . unwrap ( ) ;
4672
+ match & stmt[ 0 ] {
4673
+ Statement :: Query ( q) => {
4674
+ if let SetExpr :: Select ( select) = q. body . as_ref ( ) {
4675
+ if let Some ( TableWithJoins { relation, .. } ) = select. from . first ( ) {
4676
+ match relation {
4677
+ TableFactor :: SemanticView {
4678
+ name,
4679
+ dimensions,
4680
+ metrics,
4681
+ facts,
4682
+ where_clause,
4683
+ alias,
4684
+ } => {
4685
+ assert_eq ! ( name. to_string( ) , "my_model" ) ;
4686
+ assert_eq ! ( dimensions. len( ) , 2 ) ;
4687
+ assert_eq ! ( dimensions[ 0 ] . to_string( ) , "DATE_PART('year', date_col)" ) ;
4688
+ assert_eq ! ( dimensions[ 1 ] . to_string( ) , "region_name" ) ;
4689
+ assert_eq ! ( metrics. len( ) , 2 ) ;
4690
+ assert_eq ! ( metrics[ 0 ] . to_string( ) , "orders.revenue" ) ;
4691
+ assert_eq ! ( metrics[ 1 ] . to_string( ) , "orders.count" ) ;
4692
+ assert ! ( facts. is_empty( ) ) ;
4693
+ assert ! ( where_clause. is_some( ) ) ;
4694
+ assert_eq ! ( where_clause. as_ref( ) . unwrap( ) . to_string( ) , "active = true" ) ;
4695
+ assert ! ( alias. is_some( ) ) ;
4696
+ assert_eq ! ( alias. as_ref( ) . unwrap( ) . name. value, "model_alias" ) ;
4697
+ }
4698
+ _ => panic ! ( "Expected SemanticView table factor" ) ,
4699
+ }
4700
+ } else {
4701
+ panic ! ( "Expected table in FROM clause" ) ;
4702
+ }
4703
+ } else {
4704
+ panic ! ( "Expected SELECT statement" ) ;
4705
+ }
4706
+ }
4707
+ _ => panic ! ( "Expected Query statement" ) ,
4708
+ }
4709
+ }
0 commit comments