-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Inline limit in SQL sent from
dbt show
(#8641)
- Loading branch information
1 parent
76a276c
commit 515beb9
Showing
7 changed files
with
143 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
kind: Fixes | ||
body: 'update dbt show to include limit in DWH query ' | ||
time: 2023-09-13T15:39:24.591805+01:00 | ||
custom: | ||
Author: michelleark | ||
Issue: 8496, 8417 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
{% macro get_show_sql(compiled_code, sql_header, limit) -%} | ||
{%- set sql_header = sql_header -%} | ||
{{ sql_header if sql_header is not none }} | ||
{%- if sql_header -%} | ||
{{ sql_header }} | ||
{%- endif -%} | ||
{%- if limit is not none -%} | ||
{{ get_limit_subquery_sql(compiled_code, limit) }} | ||
{%- else -%} | ||
{{ compiled_code }} | ||
{%- endif -%} | ||
{% endmacro %} | ||
|
||
{% macro get_limit_subquery_sql(sql, limit) %} | ||
{{ adapter.dispatch('get_limit_subquery_sql', 'dbt')(sql, limit) }} | ||
{% endmacro %} | ||
|
||
{% macro default__get_limit_subquery_sql(sql, limit) %} | ||
select * | ||
from ( | ||
{{ sql }} | ||
) as model_limit_subq | ||
limit {{ limit }} | ||
{% endmacro %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
models__sql_header = """ | ||
{% call set_sql_header(config) %} | ||
set session time zone '{{ var("timezone", "Europe/Paris") }}'; | ||
{%- endcall %} | ||
select current_setting('timezone') as timezone | ||
""" | ||
|
||
models__ephemeral_model = """ | ||
{{ config(materialized = 'ephemeral') }} | ||
select | ||
coalesce(sample_num, 0) + 10 as col_deci | ||
from {{ ref('sample_model') }} | ||
""" | ||
|
||
models__second_ephemeral_model = """ | ||
{{ config(materialized = 'ephemeral') }} | ||
select | ||
col_deci + 100 as col_hundo | ||
from {{ ref('ephemeral_model') }} | ||
""" | ||
|
||
models__sample_model = """ | ||
select * from {{ ref('sample_seed') }} | ||
""" | ||
|
||
seeds__sample_seed = """sample_num,sample_bool | ||
1,true | ||
2,false | ||
3,true | ||
4,false | ||
5,true | ||
6,false | ||
7,true | ||
""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import pytest | ||
from dbt.tests.util import run_dbt | ||
|
||
from dbt.tests.adapter.dbt_show.fixtures import ( | ||
models__sql_header, | ||
models__ephemeral_model, | ||
models__second_ephemeral_model, | ||
models__sample_model, | ||
seeds__sample_seed, | ||
) | ||
|
||
|
||
# -- Below we define base classes for tests you import based on if your adapter supports dbt show or not -- | ||
class BaseShowLimit: | ||
@pytest.fixture(scope="class") | ||
def models(self): | ||
return { | ||
"sample_model.sql": models__sample_model, | ||
"ephemeral_model.sql": models__ephemeral_model, | ||
} | ||
|
||
@pytest.fixture(scope="class") | ||
def seeds(self): | ||
return {"sample_seed.csv": seeds__sample_seed} | ||
|
||
@pytest.mark.parametrize( | ||
"args,expected", | ||
[ | ||
([], 5), # default limit | ||
(["--limit", 3], 3), # fetch 3 rows | ||
(["--limit", -1], 7), # fetch all rows | ||
], | ||
) | ||
def test_limit(self, project, args, expected): | ||
run_dbt(["build"]) | ||
dbt_args = ["show", "--inline", models__second_ephemeral_model, *args] | ||
results = run_dbt(dbt_args) | ||
assert len(results.results[0].agate_table) == expected | ||
# ensure limit was injected in compiled_code when limit specified in command args | ||
limit = results.args.get("limit") | ||
if limit > 0: | ||
assert f"limit {limit}" in results.results[0].node.compiled_code | ||
|
||
|
||
class BaseShowSqlHeader: | ||
@pytest.fixture(scope="class") | ||
def models(self): | ||
return { | ||
"sql_header.sql": models__sql_header, | ||
} | ||
|
||
def test_sql_header(self, project): | ||
run_dbt(["build", "--vars", "timezone: Asia/Kolkata"]) | ||
run_dbt(["show", "--select", "sql_header", "--vars", "timezone: Asia/Kolkata"]) | ||
|
||
|
||
class TestPostgresShowSqlHeader(BaseShowSqlHeader): | ||
pass | ||
|
||
|
||
class TestPostgresShowLimit(BaseShowLimit): | ||
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters