@@ -4581,3 +4581,131 @@ fn test_drop_constraints() {
45814581 snowflake ( ) . verified_stmt ( "ALTER TABLE tbl DROP FOREIGN KEY k1 RESTRICT" ) ;
45824582 snowflake ( ) . verified_stmt ( "ALTER TABLE tbl DROP CONSTRAINT c1 CASCADE" ) ;
45834583}
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