Skip to content

Commit 4dd8235

Browse files
Fix loop for ctas table with multiple indexes (#97)
* Fix multiple indexes syntax Signed-off-by: VasylRatushniuk <vasylrat@gmail.com> * Add index tests Signed-off-by: VasylRatushniuk <vasylrat@gmail.com> * Add description to tests Signed-off-by: VasylRatushniuk <vasylrat@gmail.com> * Fix test Signed-off-by: VasylRatushniuk <vasylrat@gmail.com> * Add row to changelog file Signed-off-by: VasylRatushniuk <vasylrat@gmail.com> --------- Signed-off-by: VasylRatushniuk <vasylrat@gmail.com>
1 parent 505d6a0 commit 4dd8235

3 files changed

Lines changed: 91 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Fixed
1111
- `get_catalog` macro (#89)
12+
- Multiple indexes issue (#97)
1213

1314
## [1.11.0] - 2025-10-16
1415

dbt/include/starrocks/macros/materializations/models/table.sql

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@
2323
{{ sql_header if sql_header is not none }}
2424

2525
create table {{ relation.include(database=False) }}
26-
{%- if indexs is not none -%}
27-
{%- for index in indexs -%}
28-
{%- set columns = index.get('columns') -%}
29-
(
30-
INDEX idx_{{ columns | replace(" ", "") | replace(",", "_") }} ({{ columns }}) USING BITMAP
31-
)
32-
{%- endfor -%}
26+
{%- if indexs is not none %} (
27+
{%- for index in indexs %}
28+
{%- set columns = index.get('columns') %}
29+
INDEX idx_{{ columns | replace(" ", "") | replace(",", "_") }} ({{ columns }}) USING BITMAP{{ "," if not loop.last }}
30+
{%- endfor %}
31+
)
3332
{%- endif -%}
3433

3534
{%- if is_external -%}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import pytest
2+
from dbt.tests.util import run_dbt
3+
import logging as log
4+
5+
single_index_model = """
6+
{{ config(
7+
materialized='table',
8+
engine='OLAP',
9+
distributed_by=['id'],
10+
indexs=[{'columns': 'name'}]
11+
) }}
12+
select 1 as id, 'test' as name
13+
"""
14+
15+
multiple_indexes_model = """
16+
{{ config(
17+
materialized='table',
18+
engine='OLAP',
19+
distributed_by=['id'],
20+
indexs=[
21+
{'columns': 'name'},
22+
{'columns': 'email'},
23+
{'columns': 'status'}
24+
]
25+
) }}
26+
select 1 as id, 'test' as name, 'test@example.com' as email, 'active' as status
27+
"""
28+
29+
multiple_columns_index_model = """
30+
{{ config(
31+
materialized='table',
32+
engine='OLAP',
33+
distributed_by=['id'],
34+
indexs=[{'columns': 'name, email'}]
35+
) }}
36+
select 1 as id, 'test' as name, 'test@example.com' as email
37+
"""
38+
39+
class TestSingleIndex:
40+
"""Test that a single index is created correctly with proper naming and BITMAP type."""
41+
42+
@pytest.fixture(scope="class")
43+
def models(self):
44+
return {"single_index.sql": single_index_model}
45+
46+
def test_single_index(self, project):
47+
results = run_dbt(["run"])
48+
assert len(results) == 1
49+
50+
relation = results[0].node.relation_name
51+
result = project.run_sql(f"SHOW CREATE TABLE {relation}", fetch="one")[1]
52+
assert "INDEX idx_name" in result
53+
assert "USING BITMAP" in result
54+
55+
56+
class TestMultipleIndexes:
57+
"""Test that multiple indexes are created without trailing commas and all indexes are present."""
58+
59+
@pytest.fixture(scope="class")
60+
def models(self):
61+
return {"multiple_indexes.sql": multiple_indexes_model}
62+
63+
def test_multiple_indexes(self, project):
64+
results = run_dbt(["run"])
65+
assert len(results) == 1
66+
67+
relation = results[0].node.relation_name
68+
result = project.run_sql(f"SHOW CREATE TABLE {relation}", fetch="one")[1]
69+
assert "INDEX idx_name" in result
70+
assert "INDEX idx_email" in result
71+
assert "INDEX idx_status" in result
72+
assert result.count("USING BITMAP") == 3
73+
74+
75+
class TestMultipleColumnsIndex:
76+
"""Test that creating an index with multiple columns fails as expected (not supported)."""
77+
78+
@pytest.fixture(scope="class")
79+
def models(self):
80+
return {"multiple_columns_index.sql": multiple_columns_index_model}
81+
82+
def test_multiple_columns_index(self, project):
83+
results = run_dbt(["run"], expect_pass=False)
84+
assert "index can only apply to a single column" in results.results[0].message

0 commit comments

Comments
 (0)