(query: sql_ast::Query, context: &mut Context)
| 688 | } |
| 689 | |
| 690 | fn query_to_set_expr(query: sql_ast::Query, context: &mut Context) -> Box<SetExpr> { |
| 691 | let is_simple = query.with.is_none() |
| 692 | && query.order_by.is_none() |
| 693 | && query.limit_clause.is_none() |
| 694 | && query.fetch.is_none() |
| 695 | && query.locks.is_empty(); |
| 696 | |
| 697 | if is_simple { |
| 698 | return query.body; |
| 699 | } |
| 700 | |
| 701 | // Query is not simple, so we need to wrap it. |
| 702 | // |
| 703 | // Some engines (like SQLite) do not support subqueries between simple parentheses, so we keep |
| 704 | // the general `SELECT * FROM (query)` by default. |
| 705 | // |
| 706 | // Some engines (like Postgres) may need the subquery directly as-is or between parentheses |
| 707 | // to properly match columns for syntaxes like `UNION`, `EXCEPT`, and `INTERSECT`. |
| 708 | // Incidentally, the parenthesis syntax `(query)` allows for complex queries. |
| 709 | let set_expr = if context.dialect.prefers_subquery_parentheses_shorthand() { |
| 710 | SetExpr::Query(query.into()) |
| 711 | } else { |
| 712 | SetExpr::Select(Box::new(Select { |
| 713 | projection: vec![SelectItem::Wildcard( |
| 714 | sql_ast::WildcardAdditionalOptions::default(), |
| 715 | )], |
| 716 | from: vec![TableWithJoins { |
| 717 | relation: TableFactor::Derived { |
| 718 | lateral: false, |
| 719 | subquery: Box::new(query), |
| 720 | alias: Some(simple_table_alias(sql_ast::Ident::new( |
| 721 | context.anchor.table_name.gen(), |
| 722 | ))), |
| 723 | sample: None, |
| 724 | }, |
| 725 | joins: vec![], |
| 726 | }], |
| 727 | ..default_select() |
| 728 | })) |
| 729 | }; |
| 730 | |
| 731 | Box::new(set_expr) |
| 732 | } |
| 733 | |
| 734 | fn count_tables(transforms: &[Transform]) -> usize { |
| 735 | let mut count = 0; |
no test coverage detected