Skip to content

Commit

Permalink
Fix "dbt found two resources" error with multiple snapshot blocks in …
Browse files Browse the repository at this point in the history
…one file (#4773)

* Fix handling of multiple snapshot blocks in partial parsing

* Update tests for partial parsing snapshots
  • Loading branch information
gshank committed Mar 16, 2022
1 parent 2748e4b commit 7e30990
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 6 deletions.
7 changes: 7 additions & 0 deletions .changes/unreleased/Fixes-20220316-143959.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
kind: Fixes
body: Fix partial parsing bug with multiple snapshot blocks
time: 2022-03-16T14:39:59.16756-04:00
custom:
Author: gshank
Issue: "4771"
PR: "4773"
10 changes: 5 additions & 5 deletions core/dbt/parser/partial.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,10 +272,10 @@ def update_mssat_in_saved(self, new_source_file, old_source_file):
if self.already_scheduled_for_parsing(old_source_file):
return

# These files only have one node.
unique_id = None
# These files only have one node except for snapshots
unique_ids = []
if old_source_file.nodes:
unique_id = old_source_file.nodes[0]
unique_ids = old_source_file.nodes
else:
# It's not clear when this would actually happen.
# Logging in case there are other associated errors.
Expand All @@ -286,7 +286,7 @@ def update_mssat_in_saved(self, new_source_file, old_source_file):
self.deleted_manifest.files[file_id] = old_source_file
self.saved_files[file_id] = deepcopy(new_source_file)
self.add_to_pp_files(new_source_file)
if unique_id:
for unique_id in unique_ids:
self.remove_node_in_saved(new_source_file, unique_id)

def remove_node_in_saved(self, source_file, unique_id):
Expand Down Expand Up @@ -358,7 +358,7 @@ def remove_mssat_file(self, source_file):
if not source_file.nodes:
fire_event(PartialParsingMissingNodes(file_id=source_file.file_id))
return
# There is generally only 1 node for SQL files, except for macros
# There is generally only 1 node for SQL files, except for macros and snapshots
for unique_id in source_file.nodes:
self.remove_node_in_saved(source_file, unique_id)
self.schedule_referencing_nodes_for_parsing(unique_id)
Expand Down
14 changes: 14 additions & 0 deletions test/integration/068_partial_parsing_tests/test-files/snapshot.sql
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,17 @@ select * from {{ ref('orders') }}

{% endsnapshot %}

{% snapshot orders2_snapshot %}

{{
config(
target_schema=schema,
strategy='check',
unique_key='id',
check_cols=['order_date'],
)
}}

select * from {{ ref('orders') }}

{% endsnapshot %}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
- add a comment
{% snapshot orders_snapshot %}

{{
Expand All @@ -8,7 +9,22 @@
check_cols=['status'],
)
}}

select * from {{ ref('orders') }}

{% endsnapshot %}

{% snapshot orders2_snapshot %}

{{
config(
target_schema=schema,
strategy='check',
unique_key='id',
check_cols=['order_date'],
)
}}

select * from {{ ref('orders') }}

{% endsnapshot %}
Original file line number Diff line number Diff line change
Expand Up @@ -503,10 +503,12 @@ def test_postgres_pp_snapshots(self):
manifest = get_manifest()
snapshot_id = 'snapshot.test.orders_snapshot'
self.assertIn(snapshot_id, manifest.nodes)
snapshot2_id = 'snapshot.test.orders2_snapshot'
self.assertIn(snapshot2_id, manifest.nodes)

# run snapshot
results = self.run_dbt(["--partial-parse", "snapshot"])
self.assertEqual(len(results), 1)
self.assertEqual(len(results), 2)

# modify snapshot
self.copy_file('test-files/snapshot2.sql', 'snapshots/snapshot.sql')
Expand Down

0 comments on commit 7e30990

Please sign in to comment.