pytrilogy 0.0.2.7__tar.gz → 0.0.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pytrilogy might be problematic. Click here for more details.

Files changed (105) hide show
  1. {pytrilogy-0.0.2.7/pytrilogy.egg-info → pytrilogy-0.0.2.8}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/__init__.py +1 -1
  4. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/enums.py +1 -0
  5. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/models.py +10 -2
  6. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/base.py +37 -11
  7. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/common.py +15 -3
  8. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/presto.py +2 -1
  9. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/LICENSE.md +0 -0
  10. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/README.md +0 -0
  11. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pyproject.toml +0 -0
  12. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/SOURCES.txt +0 -0
  13. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/dependency_links.txt +0 -0
  14. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/entry_points.txt +0 -0
  15. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/requires.txt +0 -0
  16. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/top_level.txt +0 -0
  17. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/setup.cfg +0 -0
  18. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/setup.py +0 -0
  19. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_datatypes.py +0 -0
  20. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_declarations.py +0 -0
  21. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_derived_concepts.py +0 -0
  22. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_discovery_nodes.py +0 -0
  23. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_environment.py +0 -0
  24. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_functions.py +0 -0
  25. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_imports.py +0 -0
  26. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_metadata.py +0 -0
  27. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_models.py +0 -0
  28. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_multi_join_assignments.py +0 -0
  29. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_parsing.py +0 -0
  30. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_partial_handling.py +0 -0
  31. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_query_processing.py +0 -0
  32. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_select.py +0 -0
  33. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_statements.py +0 -0
  34. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_undefined_concept.py +0 -0
  35. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_where_clause.py +0 -0
  36. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/compiler.py +0 -0
  37. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/constants.py +0 -0
  38. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/__init__.py +0 -0
  39. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/constants.py +0 -0
  40. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/env_processor.py +0 -0
  41. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/environment_helpers.py +0 -0
  42. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/ergonomics.py +0 -0
  43. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/exceptions.py +0 -0
  44. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/functions.py +0 -0
  45. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/graph_models.py +0 -0
  46. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/internal.py +0 -0
  47. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimization.py +0 -0
  48. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/__init__.py +0 -0
  49. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/base_optimization.py +0 -0
  50. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/inline_constant.py +0 -0
  51. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/inline_datasource.py +0 -0
  52. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  53. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/__init__.py +0 -0
  54. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  55. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/graph_utils.py +0 -0
  56. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/__init__.py +0 -0
  57. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  58. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/common.py +0 -0
  59. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  60. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/group_node.py +0 -0
  61. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  62. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  63. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  64. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  65. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/select_node.py +0 -0
  66. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  67. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/window_node.py +0 -0
  68. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/__init__.py +0 -0
  69. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/base_node.py +0 -0
  70. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/filter_node.py +0 -0
  71. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/group_node.py +0 -0
  72. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/merge_node.py +0 -0
  73. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  74. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  75. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/window_node.py +0 -0
  76. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/utility.py +0 -0
  77. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/query_processor.py +0 -0
  78. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/__init__.py +0 -0
  79. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/bigquery.py +0 -0
  80. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/config.py +0 -0
  81. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/duckdb.py +0 -0
  82. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/enums.py +0 -0
  83. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/postgres.py +0 -0
  84. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/snowflake.py +0 -0
  85. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/sql_server.py +0 -0
  86. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/engine.py +0 -0
  87. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/executor.py +0 -0
  88. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/__init__.py +0 -0
  89. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/base_hook.py +0 -0
  90. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/graph_hook.py +0 -0
  91. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/query_debugger.py +0 -0
  92. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/metadata/__init__.py +0 -0
  93. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parser.py +0 -0
  94. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/__init__.py +0 -0
  95. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/common.py +0 -0
  96. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/config.py +0 -0
  97. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/exceptions.py +0 -0
  98. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/helpers.py +0 -0
  99. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/parse_engine.py +0 -0
  100. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/render.py +0 -0
  101. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/trilogy.lark +0 -0
  102. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/py.typed +0 -0
  103. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/scripts/__init__.py +0 -0
  104. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/scripts/trilogy.py +0 -0
  105. {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.7
3
+ Version: 0.0.2.8
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.7
3
+ Version: 0.0.2.8
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -4,6 +4,6 @@ from trilogy.executor import Executor
4
4
  from trilogy.parser import parse
5
5
  from trilogy.constants import CONFIG
6
6
 
7
- __version__ = "0.0.2.7"
7
+ __version__ = "0.0.2.8"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -123,6 +123,7 @@ class FunctionType(Enum):
123
123
  MAP_ACCESS = "map_access"
124
124
  ATTR_ACCESS = "attr_access"
125
125
  STRUCT = "struct"
126
+ ARRAY = "array"
126
127
 
127
128
  # TEXT AND MAYBE MORE
128
129
  SPLIT = "split"
@@ -2066,6 +2066,7 @@ class Datasource(Namespaced, BaseModel):
2066
2066
  class UnnestJoin(BaseModel):
2067
2067
  concept: Concept
2068
2068
  alias: str = "unnest"
2069
+ rendering_required: bool = True
2069
2070
 
2070
2071
  def __hash__(self):
2071
2072
  return (self.alias + self.concept.address).__hash__()
@@ -2460,10 +2461,17 @@ class CTE(BaseModel):
2460
2461
  for join in self.joins
2461
2462
  if not isinstance(join, Join)
2462
2463
  or (
2463
- join.right_cte.name != removed_cte
2464
- and join.left_cte.name != removed_cte
2464
+ isinstance(join, Join)
2465
+ and (
2466
+ join.right_cte.name != removed_cte
2467
+ and join.left_cte.name != removed_cte
2468
+ )
2465
2469
  )
2466
2470
  ]
2471
+ for join in self.joins:
2472
+ if isinstance(join, UnnestJoin) and join.concept == concept:
2473
+ join.rendering_required = False
2474
+
2467
2475
  self.parent_ctes = [
2468
2476
  x for x in self.parent_ctes if x.name != removed_cte
2469
2477
  ]
@@ -51,7 +51,7 @@ from trilogy.core.models import (
51
51
  MergeStatementV2,
52
52
  )
53
53
  from trilogy.core.query_processor import process_query, process_persist
54
- from trilogy.dialect.common import render_join
54
+ from trilogy.dialect.common import render_join, render_unnest
55
55
  from trilogy.hooks.base_hook import BaseHook
56
56
  from trilogy.core.enums import UnnestMode
57
57
 
@@ -128,6 +128,7 @@ FUNCTION_MAP = {
128
128
  FunctionType.UNNEST: lambda x: f"unnest({x[0]})",
129
129
  FunctionType.ATTR_ACCESS: lambda x: f"""{x[0]}.{x[1].replace("'", "")}""",
130
130
  FunctionType.STRUCT: lambda x: f"{{{', '.join(struct_arg(x))}}}",
131
+ FunctionType.ARRAY: lambda x: f"[{', '.join(x)}]",
131
132
  # math
132
133
  FunctionType.ADD: lambda x: f"{x[0]} + {x[1]}",
133
134
  FunctionType.SUBTRACT: lambda x: f"{x[0]} - {x[1]}",
@@ -466,7 +467,7 @@ class BaseDialect:
466
467
  elif isinstance(e, MapWrapper):
467
468
  return f"MAP {{{','.join([f'{self.render_expr(k, cte=cte, cte_map=cte_map)}:{self.render_expr(v, cte=cte, cte_map=cte_map)}' for k, v in e.items()])}}}"
468
469
  elif isinstance(e, list):
469
- return f"[{','.join([self.render_expr(x, cte=cte, cte_map=cte_map) for x in e])}]"
470
+ return f"{self.FUNCTION_MAP[FunctionType.ARRAY]([self.render_expr(x, cte=cte, cte_map=cte_map) for x in e])}"
470
471
  elif isinstance(e, DataType):
471
472
  return str(e.value)
472
473
  elif isinstance(e, DatePart):
@@ -480,8 +481,12 @@ class BaseDialect:
480
481
  raise ValueError(f"Unable to render type {type(e)} {e}")
481
482
 
482
483
  def render_cte(self, cte: CTE):
483
- if self.UNNEST_MODE in (UnnestMode.CROSS_APPLY, UnnestMode.CROSS_JOIN):
484
- # for a cross apply, derviation happens in the join
484
+ if self.UNNEST_MODE in (
485
+ UnnestMode.CROSS_APPLY,
486
+ UnnestMode.CROSS_JOIN,
487
+ UnnestMode.CROSS_JOIN_ALIAS,
488
+ ):
489
+ # for a cross apply, derivation happens in the join
485
490
  # so we only use the alias to select
486
491
  select_columns = [
487
492
  self.render_concept_sql(c, cte)
@@ -499,17 +504,38 @@ class BaseDialect:
499
504
  for c in cte.output_columns
500
505
  if c.address not in [y.address for y in cte.hidden_concepts]
501
506
  ]
502
- if cte.quote_address:
503
- source = f"{self.QUOTE_CHARACTER}{cte.base_name}{self.QUOTE_CHARACTER}"
507
+ source: str | None = cte.base_name
508
+ if not cte.render_from_clause:
509
+ if len(cte.joins) > 0:
510
+ if cte.join_derived_concepts and self.UNNEST_MODE in (
511
+ UnnestMode.CROSS_JOIN_ALIAS,
512
+ UnnestMode.CROSS_JOIN,
513
+ UnnestMode.CROSS_APPLY,
514
+ ):
515
+ source = f"{render_unnest(self.UNNEST_MODE, self.QUOTE_CHARACTER, cte.join_derived_concepts[0], self.render_concept_sql, cte)}"
516
+ # direct - eg DUCK DB - can be directly selected inline
517
+ elif cte.join_derived_concepts and self.UNNEST_MODE == UnnestMode.DIRECT:
518
+ source = None
519
+ else:
520
+ raise SyntaxError("CTE has joins but no from clause")
521
+ else:
522
+ source = None
523
+ else:
524
+ if cte.quote_address:
525
+ source = f"{self.QUOTE_CHARACTER}{cte.base_name}{self.QUOTE_CHARACTER}"
526
+ else:
527
+ source = cte.base_name
528
+ if cte.base_name != cte.base_alias:
529
+ source = f"{source} as {cte.base_alias}"
530
+ if not cte.render_from_clause:
531
+ final_joins = []
504
532
  else:
505
- source = cte.base_name
506
- if cte.base_name != cte.base_alias:
507
- source = f"{source} as {cte.base_alias}"
533
+ final_joins = cte.joins or []
508
534
  return CompiledCTE(
509
535
  name=cte.name,
510
536
  statement=self.SQL_TEMPLATE.render(
511
537
  select_columns=select_columns,
512
- base=(f"{source}" if cte.render_from_clause else None),
538
+ base=f"{source}" if source else None,
513
539
  grain=cte.grain,
514
540
  limit=cte.limit,
515
541
  # some joins may not need to be rendered
@@ -524,7 +550,7 @@ class BaseDialect:
524
550
  cte,
525
551
  self.UNNEST_MODE,
526
552
  )
527
- for join in (cte.joins or [])
553
+ for join in final_joins
528
554
  ]
529
555
  if j
530
556
  ],
@@ -9,6 +9,18 @@ def null_wrapper(lval: str, rval: str, concept: Concept) -> str:
9
9
  return f"{lval} = {rval}"
10
10
 
11
11
 
12
+ def render_unnest(
13
+ unnest_mode: UnnestMode,
14
+ quote_character: str,
15
+ concept: Concept,
16
+ render_func: Callable[[Concept, CTE, bool], str],
17
+ cte: CTE,
18
+ ):
19
+ if unnest_mode == UnnestMode.CROSS_JOIN:
20
+ return f"{render_func(concept, cte, False)} as {quote_character}{concept.safe_address}{quote_character}"
21
+ return f"{render_func(concept, cte, False)} as unnest_wrapper ({quote_character}{concept.safe_address}{quote_character})"
22
+
23
+
12
24
  def render_join(
13
25
  join: Join | InstantiatedUnnestJoin,
14
26
  quote_character: str,
@@ -25,10 +37,10 @@ def render_join(
25
37
  if not cte:
26
38
  raise ValueError("must provide a cte to build an unnest joins")
27
39
  if unnest_mode == UnnestMode.CROSS_JOIN:
28
- return f"CROSS JOIN {render_func(join.concept, cte, False)} as {quote_character}{join.concept.safe_address}{quote_character}"
40
+ return f"CROSS JOIN {render_unnest(unnest_mode, quote_character, join.concept, render_func, cte)}"
29
41
  if unnest_mode == UnnestMode.CROSS_JOIN_ALIAS:
30
- return f"CROSS JOIN {render_func(join.concept, cte, False)} as array_unnest ({quote_character}{join.concept.safe_address}{quote_character})"
31
- return f"FULL JOIN {render_func(join.concept, cte, False)} as unnest_wrapper({quote_character}{join.concept.safe_address}{quote_character})"
42
+ return f"CROSS JOIN {render_unnest(unnest_mode, quote_character, join.concept, render_func, cte)}"
43
+ return f"FULL JOIN {render_unnest(unnest_mode, quote_character, join.concept, render_func, cte)}"
32
44
  left_name = join.left_name
33
45
  right_name = join.right_name
34
46
  right_base = join.right_ref
@@ -33,6 +33,7 @@ FUNCTION_MAP = {
33
33
  FunctionType.DATE_ADD: lambda x: f"DATE_ADD('{x[1]}', {x[2]}, {x[0]})",
34
34
  FunctionType.CURRENT_DATE: lambda x: "CURRENT_DATE",
35
35
  FunctionType.CURRENT_DATETIME: lambda x: "CURRENT_TIMESTAMP",
36
+ FunctionType.ARRAY: lambda x: f"ARRAY[{', '.join(x)}]",
36
37
  }
37
38
 
38
39
  FUNCTION_GRAIN_MATCH_MAP = {
@@ -86,7 +87,7 @@ class PrestoDialect(BaseDialect):
86
87
  QUOTE_CHARACTER = '"'
87
88
  SQL_TEMPLATE = SQL_TEMPLATE
88
89
  DATATYPE_MAP = {**BaseDialect.DATATYPE_MAP, DataType.NUMERIC: "DECIMAL"}
89
- UNNEST_MODE = UnnestMode.CROSS_JOIN
90
+ UNNEST_MODE = UnnestMode.CROSS_JOIN_ALIAS
90
91
 
91
92
 
92
93
  class TrinoDialect(PrestoDialect):
File without changes
File without changes
File without changes
File without changes
File without changes