@@ -4613,3 +4613,129 @@ fn test_drop_constraints() {
46134613 snowflake ( ) . verified_stmt ( "ALTER TABLE tbl DROP FOREIGN KEY k1 RESTRICT" ) ;
46144614 snowflake ( ) . verified_stmt ( "ALTER TABLE tbl DROP CONSTRAINT c1 CASCADE" ) ;
46154615}
4616+
4617+ #[ test]
4618+ fn test_semantic_view_all_variants_should_pass ( ) {
4619+ let test_cases = [
4620+ ( "SELECT * FROM SEMANTIC_VIEW(model)" , None ) ,
4621+ (
4622+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1, dim2)" ,
4623+ None ,
4624+ ) ,
4625+ (
4626+ "SELECT * FROM SEMANTIC_VIEW(model METRICS met1, met2)" ,
4627+ None ,
4628+ ) ,
4629+ (
4630+ "SELECT * FROM SEMANTIC_VIEW(model FACTS fact1, fact2)" ,
4631+ None ,
4632+ ) ,
4633+ (
4634+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)" ,
4635+ None ,
4636+ ) ,
4637+ (
4638+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)" ,
4639+ None ,
4640+ ) ,
4641+ (
4642+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1) AS sv" ,
4643+ None ,
4644+ ) ,
4645+ (
4646+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS DATE_PART('year', col))" ,
4647+ None ,
4648+ ) ,
4649+ (
4650+ "SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)" ,
4651+ None ,
4652+ ) ,
4653+ // We can parse in any order bu will always produce a result in a fixed order.
4654+ (
4655+ "SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)" ,
4656+ Some ( "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)" ) ,
4657+ ) ,
4658+ (
4659+ "SELECT * FROM SEMANTIC_VIEW(model METRICS met1 DIMENSIONS dim1)" ,
4660+ Some ( "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)" ) ,
4661+ ) ,
4662+ (
4663+ "SELECT * FROM SEMANTIC_VIEW(model FACTS fact1 DIMENSIONS dim1)" ,
4664+ Some ( "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 FACTS fact1)" ) ,
4665+ ) ,
4666+ ] ;
4667+
4668+ for ( input_sql, expected_sql) in test_cases {
4669+ if let Some ( expected) = expected_sql {
4670+ // Test that non-canonical order gets normalized
4671+ let parsed = snowflake ( ) . parse_sql_statements ( input_sql) . unwrap ( ) ;
4672+ let formatted = parsed[ 0 ] . to_string ( ) ;
4673+ assert_eq ! ( formatted, expected) ;
4674+ } else {
4675+ snowflake ( ) . verified_stmt ( input_sql) ;
4676+ }
4677+ }
4678+ }
4679+
4680+ #[ test]
4681+ fn test_semantic_view_invalid_queries_should_fail ( ) {
4682+ let invalid_sqls = [
4683+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)" ,
4684+ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)" ,
4685+ "SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))" ,
4686+ ] ;
4687+
4688+ for sql in invalid_sqls {
4689+ let result = snowflake ( ) . parse_sql_statements ( sql) ;
4690+ assert ! ( result. is_err( ) , "Expected error for invalid SQL: {}" , sql) ;
4691+ }
4692+ }
4693+
4694+ #[ test]
4695+ fn test_semantic_view_ast_structure ( ) {
4696+ let sql = r#"SELECT * FROM SEMANTIC_VIEW(
4697+ my_model
4698+ DIMENSIONS DATE_PART('year', date_col), region_name
4699+ METRICS orders.revenue, orders.count
4700+ WHERE active = true
4701+ ) AS model_alias"# ;
4702+
4703+ let stmt = snowflake ( ) . parse_sql_statements ( sql) . unwrap ( ) ;
4704+ match & stmt[ 0 ] {
4705+ Statement :: Query ( q) => {
4706+ if let SetExpr :: Select ( select) = q. body . as_ref ( ) {
4707+ if let Some ( TableWithJoins { relation, .. } ) = select. from . first ( ) {
4708+ match relation {
4709+ TableFactor :: SemanticView {
4710+ name,
4711+ dimensions,
4712+ metrics,
4713+ facts,
4714+ where_clause,
4715+ alias,
4716+ } => {
4717+ assert_eq ! ( name. to_string( ) , "my_model" ) ;
4718+ assert_eq ! ( dimensions. len( ) , 2 ) ;
4719+ assert_eq ! ( dimensions[ 0 ] . to_string( ) , "DATE_PART('year', date_col)" ) ;
4720+ assert_eq ! ( dimensions[ 1 ] . to_string( ) , "region_name" ) ;
4721+ assert_eq ! ( metrics. len( ) , 2 ) ;
4722+ assert_eq ! ( metrics[ 0 ] . to_string( ) , "orders.revenue" ) ;
4723+ assert_eq ! ( metrics[ 1 ] . to_string( ) , "orders.count" ) ;
4724+ assert ! ( facts. is_empty( ) ) ;
4725+ assert ! ( where_clause. is_some( ) ) ;
4726+ assert_eq ! ( where_clause. as_ref( ) . unwrap( ) . to_string( ) , "active = true" ) ;
4727+ assert ! ( alias. is_some( ) ) ;
4728+ assert_eq ! ( alias. as_ref( ) . unwrap( ) . name. value, "model_alias" ) ;
4729+ }
4730+ _ => panic ! ( "Expected SemanticView table factor" ) ,
4731+ }
4732+ } else {
4733+ panic ! ( "Expected table in FROM clause" ) ;
4734+ }
4735+ } else {
4736+ panic ! ( "Expected SELECT statement" ) ;
4737+ }
4738+ }
4739+ _ => panic ! ( "Expected Query statement" ) ,
4740+ }
4741+ }
0 commit comments