sqlmesh 0.213.1.dev1__py3-none-any.whl → 0.227.2.dev4__py3-none-any.whl
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.
- sqlmesh/__init__.py +12 -2
- sqlmesh/_version.py +2 -2
- sqlmesh/cli/main.py +0 -44
- sqlmesh/cli/project_init.py +11 -2
- sqlmesh/core/_typing.py +1 -0
- sqlmesh/core/audit/definition.py +8 -2
- sqlmesh/core/config/__init__.py +1 -1
- sqlmesh/core/config/connection.py +17 -5
- sqlmesh/core/config/dbt.py +13 -0
- sqlmesh/core/config/janitor.py +12 -0
- sqlmesh/core/config/loader.py +7 -0
- sqlmesh/core/config/model.py +2 -0
- sqlmesh/core/config/root.py +3 -0
- sqlmesh/core/console.py +81 -3
- sqlmesh/core/constants.py +1 -1
- sqlmesh/core/context.py +69 -26
- sqlmesh/core/dialect.py +3 -0
- sqlmesh/core/engine_adapter/_typing.py +2 -0
- sqlmesh/core/engine_adapter/base.py +322 -22
- sqlmesh/core/engine_adapter/base_postgres.py +17 -1
- sqlmesh/core/engine_adapter/bigquery.py +146 -7
- sqlmesh/core/engine_adapter/clickhouse.py +17 -13
- sqlmesh/core/engine_adapter/databricks.py +33 -2
- sqlmesh/core/engine_adapter/fabric.py +10 -29
- sqlmesh/core/engine_adapter/mixins.py +142 -48
- sqlmesh/core/engine_adapter/mssql.py +15 -4
- sqlmesh/core/engine_adapter/mysql.py +2 -2
- sqlmesh/core/engine_adapter/postgres.py +9 -3
- sqlmesh/core/engine_adapter/redshift.py +4 -0
- sqlmesh/core/engine_adapter/risingwave.py +1 -0
- sqlmesh/core/engine_adapter/shared.py +6 -0
- sqlmesh/core/engine_adapter/snowflake.py +82 -11
- sqlmesh/core/engine_adapter/spark.py +14 -10
- sqlmesh/core/engine_adapter/trino.py +4 -2
- sqlmesh/core/environment.py +2 -0
- sqlmesh/core/janitor.py +181 -0
- sqlmesh/core/lineage.py +1 -0
- sqlmesh/core/linter/definition.py +13 -13
- sqlmesh/core/linter/rules/builtin.py +29 -0
- sqlmesh/core/macros.py +35 -13
- sqlmesh/core/model/common.py +2 -0
- sqlmesh/core/model/definition.py +82 -28
- sqlmesh/core/model/kind.py +66 -2
- sqlmesh/core/model/meta.py +108 -4
- sqlmesh/core/node.py +101 -1
- sqlmesh/core/plan/builder.py +18 -10
- sqlmesh/core/plan/common.py +199 -2
- sqlmesh/core/plan/definition.py +25 -6
- sqlmesh/core/plan/evaluator.py +75 -113
- sqlmesh/core/plan/explainer.py +90 -8
- sqlmesh/core/plan/stages.py +42 -21
- sqlmesh/core/renderer.py +78 -32
- sqlmesh/core/scheduler.py +102 -22
- sqlmesh/core/selector.py +137 -9
- sqlmesh/core/signal.py +64 -1
- sqlmesh/core/snapshot/__init__.py +2 -0
- sqlmesh/core/snapshot/definition.py +146 -34
- sqlmesh/core/snapshot/evaluator.py +689 -124
- sqlmesh/core/state_sync/__init__.py +0 -1
- sqlmesh/core/state_sync/base.py +55 -33
- sqlmesh/core/state_sync/cache.py +12 -7
- sqlmesh/core/state_sync/common.py +216 -111
- sqlmesh/core/state_sync/db/environment.py +6 -4
- sqlmesh/core/state_sync/db/facade.py +42 -24
- sqlmesh/core/state_sync/db/interval.py +27 -7
- sqlmesh/core/state_sync/db/migrator.py +34 -16
- sqlmesh/core/state_sync/db/snapshot.py +177 -169
- sqlmesh/core/table_diff.py +2 -2
- sqlmesh/core/test/context.py +2 -0
- sqlmesh/core/test/definition.py +14 -9
- sqlmesh/dbt/adapter.py +22 -16
- sqlmesh/dbt/basemodel.py +75 -56
- sqlmesh/dbt/builtin.py +116 -12
- sqlmesh/dbt/column.py +17 -5
- sqlmesh/dbt/common.py +19 -5
- sqlmesh/dbt/context.py +14 -1
- sqlmesh/dbt/loader.py +61 -9
- sqlmesh/dbt/manifest.py +174 -16
- sqlmesh/dbt/model.py +183 -85
- sqlmesh/dbt/package.py +16 -1
- sqlmesh/dbt/profile.py +3 -3
- sqlmesh/dbt/project.py +12 -7
- sqlmesh/dbt/seed.py +6 -1
- sqlmesh/dbt/source.py +13 -1
- sqlmesh/dbt/target.py +25 -6
- sqlmesh/dbt/test.py +36 -5
- sqlmesh/migrations/v0000_baseline.py +95 -0
- sqlmesh/migrations/v0061_mysql_fix_blob_text_type.py +5 -7
- sqlmesh/migrations/v0062_add_model_gateway.py +5 -1
- sqlmesh/migrations/v0063_change_signals.py +5 -3
- sqlmesh/migrations/v0064_join_when_matched_strings.py +5 -3
- sqlmesh/migrations/v0065_add_model_optimize.py +5 -1
- sqlmesh/migrations/v0066_add_auto_restatements.py +8 -3
- sqlmesh/migrations/v0067_add_tsql_date_full_precision.py +5 -1
- sqlmesh/migrations/v0068_include_unrendered_query_in_metadata_hash.py +5 -1
- sqlmesh/migrations/v0069_update_dev_table_suffix.py +5 -3
- sqlmesh/migrations/v0070_include_grains_in_metadata_hash.py +5 -1
- sqlmesh/migrations/v0071_add_dev_version_to_intervals.py +9 -5
- sqlmesh/migrations/v0072_add_environment_statements.py +5 -3
- sqlmesh/migrations/v0073_remove_symbolic_disable_restatement.py +5 -3
- sqlmesh/migrations/v0074_add_partition_by_time_column_property.py +5 -1
- sqlmesh/migrations/v0075_remove_validate_query.py +5 -3
- sqlmesh/migrations/v0076_add_cron_tz.py +5 -1
- sqlmesh/migrations/v0077_fix_column_type_hash_calculation.py +5 -1
- sqlmesh/migrations/v0078_warn_if_non_migratable_python_env.py +5 -3
- sqlmesh/migrations/v0079_add_gateway_managed_property.py +10 -5
- sqlmesh/migrations/v0080_add_batch_size_to_scd_type_2_models.py +5 -1
- sqlmesh/migrations/v0081_update_partitioned_by.py +5 -3
- sqlmesh/migrations/v0082_warn_if_incorrectly_duplicated_statements.py +5 -3
- sqlmesh/migrations/v0083_use_sql_for_scd_time_data_type_data_hash.py +5 -1
- sqlmesh/migrations/v0084_normalize_quote_when_matched_and_merge_filter.py +5 -1
- sqlmesh/migrations/v0085_deterministic_repr.py +5 -3
- sqlmesh/migrations/v0086_check_deterministic_bug.py +5 -3
- sqlmesh/migrations/v0087_normalize_blueprint_variables.py +5 -3
- sqlmesh/migrations/v0088_warn_about_variable_python_env_diffs.py +5 -3
- sqlmesh/migrations/v0089_add_virtual_environment_mode.py +5 -1
- sqlmesh/migrations/v0090_add_forward_only_column.py +9 -5
- sqlmesh/migrations/v0091_on_additive_change.py +5 -1
- sqlmesh/migrations/v0092_warn_about_dbt_data_type_diff.py +5 -3
- sqlmesh/migrations/v0093_use_raw_sql_in_fingerprint.py +5 -1
- sqlmesh/migrations/v0094_add_dev_version_and_fingerprint_columns.py +123 -0
- sqlmesh/migrations/v0095_warn_about_dbt_raw_sql_diff.py +49 -0
- sqlmesh/migrations/v0096_remove_plan_dags_table.py +13 -0
- sqlmesh/migrations/v0097_add_dbt_name_in_node.py +9 -0
- sqlmesh/migrations/{v0060_move_audits_to_model.py → v0098_add_dbt_node_info_in_node.py} +33 -16
- sqlmesh/migrations/v0099_add_last_altered_to_intervals.py +25 -0
- sqlmesh/migrations/v0100_add_grants_and_grants_target_layer.py +9 -0
- sqlmesh/utils/__init__.py +8 -1
- sqlmesh/utils/cache.py +5 -1
- sqlmesh/utils/connection_pool.py +2 -1
- sqlmesh/utils/dag.py +65 -10
- sqlmesh/utils/date.py +8 -1
- sqlmesh/utils/errors.py +8 -0
- sqlmesh/utils/jinja.py +54 -4
- sqlmesh/utils/pydantic.py +6 -6
- sqlmesh/utils/windows.py +13 -3
- {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/METADATA +7 -10
- sqlmesh-0.227.2.dev4.dist-info/RECORD +370 -0
- sqlmesh_dbt/cli.py +70 -7
- sqlmesh_dbt/console.py +14 -6
- sqlmesh_dbt/operations.py +103 -24
- sqlmesh_dbt/selectors.py +39 -1
- web/client/dist/assets/{Audits-Ucsx1GzF.js → Audits-CBiYyyx-.js} +1 -1
- web/client/dist/assets/{Banner-BWDzvavM.js → Banner-DSRbUlO5.js} +1 -1
- web/client/dist/assets/{ChevronDownIcon-D2VL13Ah.js → ChevronDownIcon-MK_nrjD_.js} +1 -1
- web/client/dist/assets/{ChevronRightIcon-DWGYbf1l.js → ChevronRightIcon-CLWtT22Q.js} +1 -1
- web/client/dist/assets/{Content-DdHDZM3I.js → Content-BNuGZN5l.js} +1 -1
- web/client/dist/assets/{Content-Bikfy8fh.js → Content-CSHJyW0n.js} +1 -1
- web/client/dist/assets/{Data-CzAJH7rW.js → Data-C1oRDbLx.js} +1 -1
- web/client/dist/assets/{DataCatalog-BJF11g8f.js → DataCatalog-HXyX2-_j.js} +1 -1
- web/client/dist/assets/{Editor-s0SBpV2y.js → Editor-BDyfpUuw.js} +1 -1
- web/client/dist/assets/{Editor-DgLhgKnm.js → Editor-D0jNItwC.js} +1 -1
- web/client/dist/assets/{Errors-D0m0O1d3.js → Errors-BfuFLcPi.js} +1 -1
- web/client/dist/assets/{FileExplorer-CEv0vXkt.js → FileExplorer-BR9IE3he.js} +1 -1
- web/client/dist/assets/{Footer-BwzXn8Ew.js → Footer-CgBEtiAh.js} +1 -1
- web/client/dist/assets/{Header-6heDkEqG.js → Header-DSqR6nSO.js} +1 -1
- web/client/dist/assets/{Input-obuJsD6k.js → Input-B-oZ6fGO.js} +1 -1
- web/client/dist/assets/Lineage-DYQVwDbD.js +1 -0
- web/client/dist/assets/{ListboxShow-HM9_qyrt.js → ListboxShow-BE5-xevs.js} +1 -1
- web/client/dist/assets/{ModelLineage-zWdKo0U2.js → ModelLineage-DkIFAYo4.js} +1 -1
- web/client/dist/assets/{Models-Bcu66SRz.js → Models-D5dWr8RB.js} +1 -1
- web/client/dist/assets/{Page-BWEEQfIt.js → Page-C-XfU5BR.js} +1 -1
- web/client/dist/assets/{Plan-C4gXCqlf.js → Plan-ZEuTINBq.js} +1 -1
- web/client/dist/assets/{PlusCircleIcon-CVDO651q.js → PlusCircleIcon-DVXAHG8_.js} +1 -1
- web/client/dist/assets/{ReportErrors-BT6xFwAr.js → ReportErrors-B7FEPzMB.js} +1 -1
- web/client/dist/assets/{Root-ryJoBK4h.js → Root-8aZyhPxF.js} +1 -1
- web/client/dist/assets/{SearchList-DB04sPb9.js → SearchList-W_iT2G82.js} +1 -1
- web/client/dist/assets/{SelectEnvironment-CUYcXUu6.js → SelectEnvironment-C65jALmO.js} +1 -1
- web/client/dist/assets/{SourceList-Doo_9ZGp.js → SourceList-DSLO6nVJ.js} +1 -1
- web/client/dist/assets/{SourceListItem-D5Mj7Dly.js → SourceListItem-BHt8d9-I.js} +1 -1
- web/client/dist/assets/{SplitPane-qHmkD1qy.js → SplitPane-CViaZmw6.js} +1 -1
- web/client/dist/assets/{Tests-DH1Z74ML.js → Tests-DhaVt5t1.js} +1 -1
- web/client/dist/assets/{Welcome-DqUJUNMF.js → Welcome-DvpjH-_4.js} +1 -1
- web/client/dist/assets/context-BctCsyGb.js +71 -0
- web/client/dist/assets/{context-Dr54UHLi.js → context-DFNeGsFF.js} +1 -1
- web/client/dist/assets/{editor-DYIP1yQ4.js → editor-CcO28cqd.js} +1 -1
- web/client/dist/assets/{file-DarlIDVi.js → file-CvJN3aZO.js} +1 -1
- web/client/dist/assets/{floating-ui.react-dom-BH3TFvkM.js → floating-ui.react-dom-CjE-JNW1.js} +1 -1
- web/client/dist/assets/{help-Bl8wqaQc.js → help-DuPhjipa.js} +1 -1
- web/client/dist/assets/{index-D1sR7wpN.js → index-C-dJH7yZ.js} +1 -1
- web/client/dist/assets/{index-O3mjYpnE.js → index-Dj0i1-CA.js} +2 -2
- web/client/dist/assets/{plan-CehRrJUG.js → plan-BTRSbjKn.js} +1 -1
- web/client/dist/assets/{popover-CqgMRE0G.js → popover-_Sf0yvOI.js} +1 -1
- web/client/dist/assets/{project-6gxepOhm.js → project-BvSOI8MY.js} +1 -1
- web/client/dist/index.html +1 -1
- sqlmesh/integrations/llm.py +0 -56
- sqlmesh/migrations/v0001_init.py +0 -60
- sqlmesh/migrations/v0002_remove_identify.py +0 -5
- sqlmesh/migrations/v0003_move_batch_size.py +0 -34
- sqlmesh/migrations/v0004_environmnent_add_finalized_at.py +0 -23
- sqlmesh/migrations/v0005_create_seed_table.py +0 -24
- sqlmesh/migrations/v0006_change_seed_hash.py +0 -5
- sqlmesh/migrations/v0007_env_table_info_to_kind.py +0 -99
- sqlmesh/migrations/v0008_create_intervals_table.py +0 -38
- sqlmesh/migrations/v0009_remove_pre_post_hooks.py +0 -62
- sqlmesh/migrations/v0010_seed_hash_batch_size.py +0 -5
- sqlmesh/migrations/v0011_add_model_kind_name.py +0 -63
- sqlmesh/migrations/v0012_update_jinja_expressions.py +0 -86
- sqlmesh/migrations/v0013_serde_using_model_dialects.py +0 -87
- sqlmesh/migrations/v0014_fix_dev_intervals.py +0 -14
- sqlmesh/migrations/v0015_environment_add_promoted_snapshot_ids.py +0 -26
- sqlmesh/migrations/v0016_fix_windows_path.py +0 -59
- sqlmesh/migrations/v0017_fix_windows_seed_path.py +0 -55
- sqlmesh/migrations/v0018_rename_snapshot_model_to_node.py +0 -53
- sqlmesh/migrations/v0019_add_env_suffix_target.py +0 -28
- sqlmesh/migrations/v0020_remove_redundant_attributes_from_dbt_models.py +0 -80
- sqlmesh/migrations/v0021_fix_table_properties.py +0 -62
- sqlmesh/migrations/v0022_move_project_to_model.py +0 -54
- sqlmesh/migrations/v0023_fix_added_models_with_forward_only_parents.py +0 -65
- sqlmesh/migrations/v0024_replace_model_kind_name_enum_with_value.py +0 -55
- sqlmesh/migrations/v0025_fix_intervals_and_missing_change_category.py +0 -117
- sqlmesh/migrations/v0026_remove_dialect_from_seed.py +0 -55
- sqlmesh/migrations/v0027_minute_interval_to_five.py +0 -57
- sqlmesh/migrations/v0028_add_plan_dags_table.py +0 -29
- sqlmesh/migrations/v0029_generate_schema_types_using_dialect.py +0 -69
- sqlmesh/migrations/v0030_update_unrestorable_snapshots.py +0 -65
- sqlmesh/migrations/v0031_remove_dbt_target_fields.py +0 -65
- sqlmesh/migrations/v0032_add_sqlmesh_version.py +0 -25
- sqlmesh/migrations/v0033_mysql_fix_blob_text_type.py +0 -45
- sqlmesh/migrations/v0034_add_default_catalog.py +0 -367
- sqlmesh/migrations/v0035_add_catalog_name_override.py +0 -22
- sqlmesh/migrations/v0036_delete_plan_dags_bug_fix.py +0 -14
- sqlmesh/migrations/v0037_remove_dbt_is_incremental_macro.py +0 -61
- sqlmesh/migrations/v0038_add_expiration_ts_to_snapshot.py +0 -73
- sqlmesh/migrations/v0039_include_environment_in_plan_dag_spec.py +0 -68
- sqlmesh/migrations/v0040_add_previous_finalized_snapshots.py +0 -26
- sqlmesh/migrations/v0041_remove_hash_raw_query_attribute.py +0 -59
- sqlmesh/migrations/v0042_trim_indirect_versions.py +0 -66
- sqlmesh/migrations/v0043_fix_remove_obsolete_attributes_in_plan_dags.py +0 -61
- sqlmesh/migrations/v0044_quote_identifiers_in_model_attributes.py +0 -5
- sqlmesh/migrations/v0045_move_gateway_variable.py +0 -70
- sqlmesh/migrations/v0046_add_batch_concurrency.py +0 -8
- sqlmesh/migrations/v0047_change_scd_string_to_column.py +0 -5
- sqlmesh/migrations/v0048_drop_indirect_versions.py +0 -59
- sqlmesh/migrations/v0049_replace_identifier_with_version_in_seeds_table.py +0 -57
- sqlmesh/migrations/v0050_drop_seeds_table.py +0 -11
- sqlmesh/migrations/v0051_rename_column_descriptions.py +0 -65
- sqlmesh/migrations/v0052_add_normalize_name_in_environment_naming_info.py +0 -28
- sqlmesh/migrations/v0053_custom_model_kind_extra_attributes.py +0 -5
- sqlmesh/migrations/v0054_fix_trailing_comments.py +0 -5
- sqlmesh/migrations/v0055_add_updated_ts_unpaused_ts_ttl_ms_unrestorable_to_snapshot.py +0 -132
- sqlmesh/migrations/v0056_restore_table_indexes.py +0 -118
- sqlmesh/migrations/v0057_add_table_format.py +0 -5
- sqlmesh/migrations/v0058_add_requirements.py +0 -26
- sqlmesh/migrations/v0059_add_physical_version.py +0 -5
- sqlmesh-0.213.1.dev1.dist-info/RECORD +0 -421
- web/client/dist/assets/Lineage-D0Hgdz2v.js +0 -1
- web/client/dist/assets/context-DgX0fp2E.js +0 -68
- {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/WHEEL +0 -0
- {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/entry_points.txt +0 -0
- {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/licenses/LICENSE +0 -0
- {sqlmesh-0.213.1.dev1.dist-info → sqlmesh-0.227.2.dev4.dist-info}/top_level.txt +0 -0
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"""Trim irrelevant attributes from indirect versions."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from sqlglot import exp
|
|
6
|
-
|
|
7
|
-
from sqlmesh.utils.migration import index_text_type
|
|
8
|
-
from sqlmesh.utils.migration import blob_text_type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
12
|
-
import pandas as pd
|
|
13
|
-
|
|
14
|
-
engine_adapter = state_sync.engine_adapter
|
|
15
|
-
schema = state_sync.schema
|
|
16
|
-
snapshots_table = "_snapshots"
|
|
17
|
-
if schema:
|
|
18
|
-
snapshots_table = f"{schema}.{snapshots_table}"
|
|
19
|
-
|
|
20
|
-
new_snapshots = []
|
|
21
|
-
|
|
22
|
-
for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
|
|
23
|
-
exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
|
|
24
|
-
snapshots_table
|
|
25
|
-
),
|
|
26
|
-
quote_identifiers=True,
|
|
27
|
-
):
|
|
28
|
-
parsed_snapshot = json.loads(snapshot)
|
|
29
|
-
for indirect_versions in parsed_snapshot["indirect_versions"].values():
|
|
30
|
-
for indirect_version in indirect_versions:
|
|
31
|
-
# Only keep version and change_category.
|
|
32
|
-
version = indirect_version.get("version")
|
|
33
|
-
change_category = indirect_version.get("change_category")
|
|
34
|
-
indirect_version.clear()
|
|
35
|
-
indirect_version["version"] = version
|
|
36
|
-
indirect_version["change_category"] = change_category
|
|
37
|
-
|
|
38
|
-
new_snapshots.append(
|
|
39
|
-
{
|
|
40
|
-
"name": name,
|
|
41
|
-
"identifier": identifier,
|
|
42
|
-
"version": version,
|
|
43
|
-
"snapshot": json.dumps(parsed_snapshot),
|
|
44
|
-
"kind_name": kind_name,
|
|
45
|
-
"expiration_ts": expiration_ts,
|
|
46
|
-
}
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
if new_snapshots:
|
|
50
|
-
engine_adapter.delete_from(snapshots_table, "TRUE")
|
|
51
|
-
|
|
52
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
53
|
-
blob_type = blob_text_type(engine_adapter.dialect)
|
|
54
|
-
|
|
55
|
-
engine_adapter.insert_append(
|
|
56
|
-
snapshots_table,
|
|
57
|
-
pd.DataFrame(new_snapshots),
|
|
58
|
-
target_columns_to_types={
|
|
59
|
-
"name": exp.DataType.build(index_type),
|
|
60
|
-
"identifier": exp.DataType.build(index_type),
|
|
61
|
-
"version": exp.DataType.build(index_type),
|
|
62
|
-
"snapshot": exp.DataType.build(blob_type),
|
|
63
|
-
"kind_name": exp.DataType.build(index_type),
|
|
64
|
-
"expiration_ts": exp.DataType.build("bigint"),
|
|
65
|
-
},
|
|
66
|
-
)
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"""Trim irrelevant attributes from the plan DAGs state."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from sqlglot import exp
|
|
6
|
-
|
|
7
|
-
from sqlmesh.utils.migration import index_text_type
|
|
8
|
-
from sqlmesh.utils.migration import blob_text_type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
12
|
-
import pandas as pd
|
|
13
|
-
|
|
14
|
-
engine_adapter = state_sync.engine_adapter
|
|
15
|
-
schema = state_sync.schema
|
|
16
|
-
plan_dags_table = "_plan_dags"
|
|
17
|
-
if schema:
|
|
18
|
-
plan_dags_table = f"{schema}.{plan_dags_table}"
|
|
19
|
-
|
|
20
|
-
new_dag_specs = []
|
|
21
|
-
|
|
22
|
-
for request_id, dag_id, dag_spec in engine_adapter.fetchall(
|
|
23
|
-
exp.select("request_id", "dag_id", "dag_spec").from_(plan_dags_table),
|
|
24
|
-
quote_identifiers=True,
|
|
25
|
-
):
|
|
26
|
-
parsed_dag_spec = json.loads(dag_spec)
|
|
27
|
-
for snapshot in parsed_dag_spec.get("new_snapshots", []):
|
|
28
|
-
snapshot["node"].pop("hash_raw_query", None)
|
|
29
|
-
|
|
30
|
-
for indirect_versions in snapshot.get("indirect_versions", {}).values():
|
|
31
|
-
for indirect_version in indirect_versions:
|
|
32
|
-
# Only keep version and change_category.
|
|
33
|
-
version = indirect_version.get("version")
|
|
34
|
-
change_category = indirect_version.get("change_category")
|
|
35
|
-
indirect_version.clear()
|
|
36
|
-
indirect_version["version"] = version
|
|
37
|
-
indirect_version["change_category"] = change_category
|
|
38
|
-
|
|
39
|
-
new_dag_specs.append(
|
|
40
|
-
{
|
|
41
|
-
"request_id": request_id,
|
|
42
|
-
"dag_id": dag_id,
|
|
43
|
-
"dag_spec": json.dumps(parsed_dag_spec),
|
|
44
|
-
}
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
if new_dag_specs:
|
|
48
|
-
engine_adapter.delete_from(plan_dags_table, "TRUE")
|
|
49
|
-
|
|
50
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
51
|
-
blob_type = blob_text_type(engine_adapter.dialect)
|
|
52
|
-
|
|
53
|
-
engine_adapter.insert_append(
|
|
54
|
-
plan_dags_table,
|
|
55
|
-
pd.DataFrame(new_dag_specs),
|
|
56
|
-
target_columns_to_types={
|
|
57
|
-
"request_id": exp.DataType.build(index_type),
|
|
58
|
-
"dag_id": exp.DataType.build(index_type),
|
|
59
|
-
"dag_spec": exp.DataType.build(blob_type),
|
|
60
|
-
},
|
|
61
|
-
)
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"""Move the gateway variable."""
|
|
2
|
-
|
|
3
|
-
import ast
|
|
4
|
-
import json
|
|
5
|
-
|
|
6
|
-
from sqlglot import exp
|
|
7
|
-
|
|
8
|
-
from sqlmesh.utils.migration import index_text_type
|
|
9
|
-
from sqlmesh.utils.migration import blob_text_type
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
13
|
-
import pandas as pd
|
|
14
|
-
|
|
15
|
-
engine_adapter = state_sync.engine_adapter
|
|
16
|
-
schema = state_sync.schema
|
|
17
|
-
snapshots_table = "_snapshots"
|
|
18
|
-
if schema:
|
|
19
|
-
snapshots_table = f"{schema}.{snapshots_table}"
|
|
20
|
-
|
|
21
|
-
migration_needed = False
|
|
22
|
-
new_snapshots = []
|
|
23
|
-
|
|
24
|
-
for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
|
|
25
|
-
exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
|
|
26
|
-
snapshots_table
|
|
27
|
-
),
|
|
28
|
-
quote_identifiers=True,
|
|
29
|
-
):
|
|
30
|
-
parsed_snapshot = json.loads(snapshot)
|
|
31
|
-
python_env = parsed_snapshot["node"].get("python_env")
|
|
32
|
-
if python_env:
|
|
33
|
-
gateway = python_env.pop("gateway", None)
|
|
34
|
-
if gateway is not None:
|
|
35
|
-
migration_needed = True
|
|
36
|
-
sqlmesh_vars = {"gateway": ast.literal_eval(gateway["payload"])}
|
|
37
|
-
python_env["__sqlmesh__vars__"] = {
|
|
38
|
-
"payload": repr(sqlmesh_vars),
|
|
39
|
-
"kind": "value",
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
new_snapshots.append(
|
|
43
|
-
{
|
|
44
|
-
"name": name,
|
|
45
|
-
"identifier": identifier,
|
|
46
|
-
"version": version,
|
|
47
|
-
"snapshot": json.dumps(parsed_snapshot),
|
|
48
|
-
"kind_name": kind_name,
|
|
49
|
-
"expiration_ts": expiration_ts,
|
|
50
|
-
}
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
if migration_needed and new_snapshots:
|
|
54
|
-
engine_adapter.delete_from(snapshots_table, "TRUE")
|
|
55
|
-
|
|
56
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
57
|
-
blob_type = blob_text_type(engine_adapter.dialect)
|
|
58
|
-
|
|
59
|
-
engine_adapter.insert_append(
|
|
60
|
-
snapshots_table,
|
|
61
|
-
pd.DataFrame(new_snapshots),
|
|
62
|
-
target_columns_to_types={
|
|
63
|
-
"name": exp.DataType.build(index_type),
|
|
64
|
-
"identifier": exp.DataType.build(index_type),
|
|
65
|
-
"version": exp.DataType.build(index_type),
|
|
66
|
-
"snapshot": exp.DataType.build(blob_type),
|
|
67
|
-
"kind_name": exp.DataType.build(index_type),
|
|
68
|
-
"expiration_ts": exp.DataType.build("bigint"),
|
|
69
|
-
},
|
|
70
|
-
)
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"""Drop the indirect_versions attribute in snapshots."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from sqlglot import exp
|
|
6
|
-
|
|
7
|
-
from sqlmesh.utils.migration import index_text_type
|
|
8
|
-
from sqlmesh.utils.migration import blob_text_type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
12
|
-
import pandas as pd
|
|
13
|
-
|
|
14
|
-
engine_adapter = state_sync.engine_adapter
|
|
15
|
-
schema = state_sync.schema
|
|
16
|
-
snapshots_table = "_snapshots"
|
|
17
|
-
if schema:
|
|
18
|
-
snapshots_table = f"{schema}.{snapshots_table}"
|
|
19
|
-
|
|
20
|
-
new_snapshots = []
|
|
21
|
-
|
|
22
|
-
for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
|
|
23
|
-
exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
|
|
24
|
-
snapshots_table
|
|
25
|
-
),
|
|
26
|
-
quote_identifiers=True,
|
|
27
|
-
):
|
|
28
|
-
parsed_snapshot = json.loads(snapshot)
|
|
29
|
-
parsed_snapshot.pop("indirect_versions", None)
|
|
30
|
-
|
|
31
|
-
new_snapshots.append(
|
|
32
|
-
{
|
|
33
|
-
"name": name,
|
|
34
|
-
"identifier": identifier,
|
|
35
|
-
"version": version,
|
|
36
|
-
"snapshot": json.dumps(parsed_snapshot),
|
|
37
|
-
"kind_name": kind_name,
|
|
38
|
-
"expiration_ts": expiration_ts,
|
|
39
|
-
}
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
if new_snapshots:
|
|
43
|
-
engine_adapter.delete_from(snapshots_table, "TRUE")
|
|
44
|
-
|
|
45
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
46
|
-
blob_type = blob_text_type(engine_adapter.dialect)
|
|
47
|
-
|
|
48
|
-
engine_adapter.insert_append(
|
|
49
|
-
snapshots_table,
|
|
50
|
-
pd.DataFrame(new_snapshots),
|
|
51
|
-
target_columns_to_types={
|
|
52
|
-
"name": exp.DataType.build(index_type),
|
|
53
|
-
"identifier": exp.DataType.build(index_type),
|
|
54
|
-
"version": exp.DataType.build(index_type),
|
|
55
|
-
"snapshot": exp.DataType.build(blob_type),
|
|
56
|
-
"kind_name": exp.DataType.build(index_type),
|
|
57
|
-
"expiration_ts": exp.DataType.build("bigint"),
|
|
58
|
-
},
|
|
59
|
-
)
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"""Use version instead of identifier in the seeds table."""
|
|
2
|
-
|
|
3
|
-
from sqlglot import exp
|
|
4
|
-
|
|
5
|
-
from sqlmesh.utils.migration import index_text_type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
9
|
-
engine_adapter = state_sync.engine_adapter
|
|
10
|
-
|
|
11
|
-
snapshots_table = "_snapshots"
|
|
12
|
-
seeds_table = "_seeds"
|
|
13
|
-
new_seeds_table = f"{seeds_table}_v49"
|
|
14
|
-
|
|
15
|
-
if state_sync.schema:
|
|
16
|
-
snapshots_table = f"{state_sync.schema}.{snapshots_table}"
|
|
17
|
-
seeds_table = f"{state_sync.schema}.{seeds_table}"
|
|
18
|
-
new_seeds_table = f"{state_sync.schema}.{new_seeds_table}"
|
|
19
|
-
|
|
20
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
21
|
-
|
|
22
|
-
engine_adapter.drop_table(new_seeds_table)
|
|
23
|
-
engine_adapter.create_state_table(
|
|
24
|
-
new_seeds_table,
|
|
25
|
-
{
|
|
26
|
-
"name": exp.DataType.build(index_type),
|
|
27
|
-
"version": exp.DataType.build(index_type),
|
|
28
|
-
"content": exp.DataType.build("text"),
|
|
29
|
-
},
|
|
30
|
-
primary_key=("name", "version"),
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
name_col = exp.column("name", table="seeds")
|
|
34
|
-
version_col = exp.column("version", table="snapshots")
|
|
35
|
-
query = (
|
|
36
|
-
exp.select(
|
|
37
|
-
name_col,
|
|
38
|
-
version_col,
|
|
39
|
-
exp.func("MAX", exp.column("content", table="seeds")).as_("content"),
|
|
40
|
-
)
|
|
41
|
-
.from_(exp.to_table(seeds_table).as_("seeds"))
|
|
42
|
-
.join(
|
|
43
|
-
exp.to_table(snapshots_table).as_("snapshots"),
|
|
44
|
-
on=exp.and_(
|
|
45
|
-
exp.column("name", table="seeds").eq(exp.column("name", table="snapshots")),
|
|
46
|
-
exp.column("identifier", table="seeds").eq(
|
|
47
|
-
exp.column("identifier", table="snapshots")
|
|
48
|
-
),
|
|
49
|
-
),
|
|
50
|
-
)
|
|
51
|
-
.where(exp.column("version", table="snapshots").is_(exp.null()).not_())
|
|
52
|
-
.group_by(name_col, version_col)
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
engine_adapter.insert_append(new_seeds_table, query)
|
|
56
|
-
engine_adapter.drop_table(seeds_table)
|
|
57
|
-
engine_adapter.rename_table(new_seeds_table, seeds_table)
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""Drop the seeds table."""
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
5
|
-
engine_adapter = state_sync.engine_adapter
|
|
6
|
-
|
|
7
|
-
seeds_table = "_seeds"
|
|
8
|
-
if state_sync.schema:
|
|
9
|
-
seeds_table = f"{state_sync.schema}.{seeds_table}"
|
|
10
|
-
|
|
11
|
-
engine_adapter.drop_table(seeds_table)
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"""Rename the node attribute `column_descriptions_` to `column_descriptions` in snapshots."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from sqlglot import exp
|
|
6
|
-
|
|
7
|
-
from sqlmesh.utils.migration import index_text_type
|
|
8
|
-
from sqlmesh.utils.migration import blob_text_type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
12
|
-
import pandas as pd
|
|
13
|
-
|
|
14
|
-
engine_adapter = state_sync.engine_adapter
|
|
15
|
-
schema = state_sync.schema
|
|
16
|
-
snapshots_table = "_snapshots"
|
|
17
|
-
if schema:
|
|
18
|
-
snapshots_table = f"{schema}.{snapshots_table}"
|
|
19
|
-
|
|
20
|
-
new_snapshots = []
|
|
21
|
-
found_col_descriptions = False
|
|
22
|
-
|
|
23
|
-
for name, identifier, version, snapshot, kind_name, expiration_ts in engine_adapter.fetchall(
|
|
24
|
-
exp.select("name", "identifier", "version", "snapshot", "kind_name", "expiration_ts").from_(
|
|
25
|
-
snapshots_table
|
|
26
|
-
),
|
|
27
|
-
quote_identifiers=True,
|
|
28
|
-
):
|
|
29
|
-
parsed_snapshot = json.loads(snapshot)
|
|
30
|
-
|
|
31
|
-
if "column_descriptions_" in parsed_snapshot["node"]:
|
|
32
|
-
found_col_descriptions = True
|
|
33
|
-
parsed_snapshot["node"]["column_descriptions"] = parsed_snapshot["node"].pop(
|
|
34
|
-
"column_descriptions_"
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
new_snapshots.append(
|
|
38
|
-
{
|
|
39
|
-
"name": name,
|
|
40
|
-
"identifier": identifier,
|
|
41
|
-
"version": version,
|
|
42
|
-
"snapshot": json.dumps(parsed_snapshot),
|
|
43
|
-
"kind_name": kind_name,
|
|
44
|
-
"expiration_ts": expiration_ts,
|
|
45
|
-
}
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
if found_col_descriptions:
|
|
49
|
-
engine_adapter.delete_from(snapshots_table, "TRUE")
|
|
50
|
-
|
|
51
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
52
|
-
blob_type = blob_text_type(engine_adapter.dialect)
|
|
53
|
-
|
|
54
|
-
engine_adapter.insert_append(
|
|
55
|
-
snapshots_table,
|
|
56
|
-
pd.DataFrame(new_snapshots),
|
|
57
|
-
target_columns_to_types={
|
|
58
|
-
"name": exp.DataType.build(index_type),
|
|
59
|
-
"identifier": exp.DataType.build(index_type),
|
|
60
|
-
"version": exp.DataType.build(index_type),
|
|
61
|
-
"snapshot": exp.DataType.build(blob_type),
|
|
62
|
-
"kind_name": exp.DataType.build(index_type),
|
|
63
|
-
"expiration_ts": exp.DataType.build("bigint"),
|
|
64
|
-
},
|
|
65
|
-
)
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"""Add flag that controls whether environment names will be normalized."""
|
|
2
|
-
|
|
3
|
-
from sqlglot import exp
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
7
|
-
engine_adapter = state_sync.engine_adapter
|
|
8
|
-
environments_table = "_environments"
|
|
9
|
-
if state_sync.schema:
|
|
10
|
-
environments_table = f"{state_sync.schema}.{environments_table}"
|
|
11
|
-
|
|
12
|
-
alter_table_exp = exp.Alter(
|
|
13
|
-
this=exp.to_table(environments_table),
|
|
14
|
-
kind="TABLE",
|
|
15
|
-
actions=[
|
|
16
|
-
exp.ColumnDef(
|
|
17
|
-
this=exp.to_column("normalize_name"),
|
|
18
|
-
kind=exp.DataType.build("boolean"),
|
|
19
|
-
)
|
|
20
|
-
],
|
|
21
|
-
)
|
|
22
|
-
engine_adapter.execute(alter_table_exp)
|
|
23
|
-
|
|
24
|
-
state_sync.engine_adapter.update_table(
|
|
25
|
-
environments_table,
|
|
26
|
-
{"normalize_name": False},
|
|
27
|
-
where=exp.true(),
|
|
28
|
-
)
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"""Add updated_ts, unpaused_ts, ttl_ms, and unrestorable columns to the snapshots table."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from sqlglot import exp
|
|
6
|
-
|
|
7
|
-
from sqlmesh.utils.date import to_datetime, to_timestamp
|
|
8
|
-
from sqlmesh.utils.migration import index_text_type
|
|
9
|
-
from sqlmesh.utils.migration import blob_text_type
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def migrate(state_sync, **kwargs): # type: ignore
|
|
13
|
-
import pandas as pd
|
|
14
|
-
|
|
15
|
-
engine_adapter = state_sync.engine_adapter
|
|
16
|
-
schema = state_sync.schema
|
|
17
|
-
snapshots_table = "_snapshots"
|
|
18
|
-
if schema:
|
|
19
|
-
snapshots_table = f"{schema}.{snapshots_table}"
|
|
20
|
-
|
|
21
|
-
index_type = index_text_type(engine_adapter.dialect)
|
|
22
|
-
blob_type = blob_text_type(engine_adapter.dialect)
|
|
23
|
-
|
|
24
|
-
add_column_exps = [
|
|
25
|
-
exp.Alter(
|
|
26
|
-
this=exp.to_table(snapshots_table),
|
|
27
|
-
kind="TABLE",
|
|
28
|
-
actions=[
|
|
29
|
-
exp.ColumnDef(
|
|
30
|
-
this=exp.to_column(column_name),
|
|
31
|
-
kind=exp.DataType.build("bigint"),
|
|
32
|
-
)
|
|
33
|
-
],
|
|
34
|
-
)
|
|
35
|
-
for column_name in ["updated_ts", "unpaused_ts", "ttl_ms"]
|
|
36
|
-
] + [
|
|
37
|
-
exp.Alter(
|
|
38
|
-
this=exp.to_table(snapshots_table),
|
|
39
|
-
kind="TABLE",
|
|
40
|
-
actions=[
|
|
41
|
-
exp.ColumnDef(
|
|
42
|
-
this=exp.to_column("unrestorable"),
|
|
43
|
-
kind=exp.DataType.build("boolean"),
|
|
44
|
-
)
|
|
45
|
-
],
|
|
46
|
-
)
|
|
47
|
-
]
|
|
48
|
-
engine_adapter.execute(add_column_exps)
|
|
49
|
-
|
|
50
|
-
if engine_adapter.dialect == "databricks":
|
|
51
|
-
# Databricks will throw an error like:
|
|
52
|
-
# > databricks.sql.exc.ServerOperationError: [DELTA_UNSUPPORTED_DROP_COLUMN] DROP COLUMN is not supported for your Delta table.
|
|
53
|
-
# when we try to drop `expiration_ts` below unless we set delta.columnMapping.mode to 'name'
|
|
54
|
-
alter_table_exp = exp.Alter(
|
|
55
|
-
this=exp.to_table(snapshots_table),
|
|
56
|
-
kind="TABLE",
|
|
57
|
-
actions=[
|
|
58
|
-
exp.AlterSet(
|
|
59
|
-
expressions=[
|
|
60
|
-
exp.Properties(
|
|
61
|
-
expressions=[
|
|
62
|
-
exp.Property(
|
|
63
|
-
this=exp.Literal.string("delta.columnMapping.mode"),
|
|
64
|
-
value=exp.Literal.string("name"),
|
|
65
|
-
)
|
|
66
|
-
]
|
|
67
|
-
)
|
|
68
|
-
]
|
|
69
|
-
)
|
|
70
|
-
],
|
|
71
|
-
)
|
|
72
|
-
engine_adapter.execute(alter_table_exp)
|
|
73
|
-
|
|
74
|
-
drop_column_exp = exp.Alter(
|
|
75
|
-
this=exp.to_table(snapshots_table),
|
|
76
|
-
kind="TABLE",
|
|
77
|
-
actions=[exp.Drop(this=exp.to_column("expiration_ts"), kind="COLUMN")],
|
|
78
|
-
)
|
|
79
|
-
engine_adapter.execute(drop_column_exp)
|
|
80
|
-
|
|
81
|
-
new_snapshots = []
|
|
82
|
-
|
|
83
|
-
for name, identifier, version, snapshot, kind_name in engine_adapter.fetchall(
|
|
84
|
-
exp.select("name", "identifier", "version", "snapshot", "kind_name").from_(snapshots_table),
|
|
85
|
-
quote_identifiers=True,
|
|
86
|
-
):
|
|
87
|
-
parsed_snapshot = json.loads(snapshot)
|
|
88
|
-
updated_ts = parsed_snapshot.pop("updated_ts")
|
|
89
|
-
unpaused_ts = parsed_snapshot.pop("unpaused_ts", None)
|
|
90
|
-
ttl_ms = max(
|
|
91
|
-
to_timestamp(
|
|
92
|
-
parsed_snapshot["ttl"],
|
|
93
|
-
relative_base=to_datetime(updated_ts),
|
|
94
|
-
check_categorical_relative_expression=False,
|
|
95
|
-
)
|
|
96
|
-
- updated_ts,
|
|
97
|
-
0,
|
|
98
|
-
)
|
|
99
|
-
unrestorable = parsed_snapshot.pop("unrestorable", False)
|
|
100
|
-
|
|
101
|
-
new_snapshots.append(
|
|
102
|
-
{
|
|
103
|
-
"name": name,
|
|
104
|
-
"identifier": identifier,
|
|
105
|
-
"version": version,
|
|
106
|
-
"snapshot": json.dumps(parsed_snapshot),
|
|
107
|
-
"kind_name": kind_name,
|
|
108
|
-
"updated_ts": updated_ts,
|
|
109
|
-
"unpaused_ts": unpaused_ts,
|
|
110
|
-
"ttl_ms": ttl_ms,
|
|
111
|
-
"unrestorable": unrestorable,
|
|
112
|
-
}
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
if new_snapshots:
|
|
116
|
-
engine_adapter.delete_from(snapshots_table, "TRUE")
|
|
117
|
-
|
|
118
|
-
engine_adapter.insert_append(
|
|
119
|
-
snapshots_table,
|
|
120
|
-
pd.DataFrame(new_snapshots),
|
|
121
|
-
target_columns_to_types={
|
|
122
|
-
"name": exp.DataType.build(index_type),
|
|
123
|
-
"identifier": exp.DataType.build(index_type),
|
|
124
|
-
"version": exp.DataType.build(index_type),
|
|
125
|
-
"snapshot": exp.DataType.build(blob_type),
|
|
126
|
-
"kind_name": exp.DataType.build(index_type),
|
|
127
|
-
"updated_ts": exp.DataType.build("bigint"),
|
|
128
|
-
"unpaused_ts": exp.DataType.build("bigint"),
|
|
129
|
-
"ttl_ms": exp.DataType.build("bigint"),
|
|
130
|
-
"unrestorable": exp.DataType.build("boolean"),
|
|
131
|
-
},
|
|
132
|
-
)
|