@@ -4581,3 +4581,131 @@ 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 ( ) {
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_negative_cases ( ) {
4650
+ // Test invalid syntax that should fail
4651
+ let invalid_sqls = [
4652
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)" ,
4653
+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)" ,
4654
+ "SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))" ,
4655
+ ] ;
4656
+
4657
+ for sql in invalid_sqls {
4658
+ let result = snowflake ( ) . parse_sql_statements ( sql) ;
4659
+ assert ! ( result. is_err( ) , "Expected error for invalid SQL: {}" , sql) ;
4660
+ }
4661
+ }
4662
+
4663
+ #[ test]
4664
+ fn test_semantic_view_ast_structure ( ) {
4665
+ // Test that we correctly parse into the expected AST structure
4666
+ let sql = r#"SELECT * FROM SEMANTIC_VIEW(
4667
+ my_model
4668
+ DIMENSIONS DATE_PART('year', date_col), region_name
4669
+ METRICS orders.revenue, orders.count
4670
+ WHERE active = true
4671
+ ) AS model_alias"# ;
4672
+
4673
+ let stmt = snowflake ( ) . parse_sql_statements ( sql) . unwrap ( ) ;
4674
+ match & stmt[ 0 ] {
4675
+ Statement :: Query ( q) => {
4676
+ if let SetExpr :: Select ( select) = q. body . as_ref ( ) {
4677
+ if let Some ( TableWithJoins { relation, .. } ) = select. from . first ( ) {
4678
+ match relation {
4679
+ TableFactor :: SemanticView {
4680
+ name,
4681
+ dimensions,
4682
+ metrics,
4683
+ facts,
4684
+ where_clause,
4685
+ alias,
4686
+ } => {
4687
+ assert_eq ! ( name. to_string( ) , "my_model" ) ;
4688
+ assert_eq ! ( dimensions. len( ) , 2 ) ;
4689
+ assert_eq ! ( dimensions[ 0 ] . to_string( ) , "DATE_PART('year', date_col)" ) ;
4690
+ assert_eq ! ( dimensions[ 1 ] . to_string( ) , "region_name" ) ;
4691
+ assert_eq ! ( metrics. len( ) , 2 ) ;
4692
+ assert_eq ! ( metrics[ 0 ] . to_string( ) , "orders.revenue" ) ;
4693
+ assert_eq ! ( metrics[ 1 ] . to_string( ) , "orders.count" ) ;
4694
+ assert ! ( facts. is_empty( ) ) ;
4695
+ assert ! ( where_clause. is_some( ) ) ;
4696
+ assert_eq ! ( where_clause. as_ref( ) . unwrap( ) . to_string( ) , "active = true" ) ;
4697
+ assert ! ( alias. is_some( ) ) ;
4698
+ assert_eq ! ( alias. as_ref( ) . unwrap( ) . name. value, "model_alias" ) ;
4699
+ }
4700
+ _ => panic ! ( "Expected SemanticView table factor" ) ,
4701
+ }
4702
+ } else {
4703
+ panic ! ( "Expected table in FROM clause" ) ;
4704
+ }
4705
+ } else {
4706
+ panic ! ( "Expected SELECT statement" ) ;
4707
+ }
4708
+ }
4709
+ _ => panic ! ( "Expected Query statement" ) ,
4710
+ }
4711
+ }
0 commit comments