@@ -189,3 +189,83 @@ def test_duckdb_valid_schema_names_accepted(schema):
189189 # Should not raise
190190 columns = adapter .get_columns ("orders" , schema = schema )
191191 assert len (columns ) >= 1
192+
193+
194+ def test_duckdb_adapter_init_sql ():
195+ """Test that init_sql statements run after connecting."""
196+ adapter = DuckDBAdapter (
197+ ":memory:" ,
198+ init_sql = ["CREATE TABLE setup_test (id INT, name VARCHAR)" ],
199+ )
200+ result = adapter .execute ("SELECT * FROM setup_test" )
201+ assert result .fetchall () == []
202+
203+ # Verify columns were created
204+ columns = adapter .get_columns ("setup_test" )
205+ col_names = {c ["column_name" ] for c in columns }
206+ assert col_names == {"id" , "name" }
207+
208+
209+ def test_duckdb_adapter_init_sql_multiple_statements ():
210+ """Test multiple init_sql statements execute in order."""
211+ adapter = DuckDBAdapter (
212+ ":memory:" ,
213+ init_sql = [
214+ "CREATE TABLE t1 (x INT)" ,
215+ "INSERT INTO t1 VALUES (42)" ,
216+ "CREATE TABLE t2 AS SELECT x * 2 AS doubled FROM t1" ,
217+ ],
218+ )
219+ result = adapter .execute ("SELECT doubled FROM t2" )
220+ assert result .fetchone ()[0 ] == 84
221+
222+
223+ def test_duckdb_adapter_init_sql_none ():
224+ """Test that init_sql=None is fine (no-op)."""
225+ adapter = DuckDBAdapter (":memory:" , init_sql = None )
226+ result = adapter .execute ("SELECT 1" )
227+ assert result .fetchone ()[0 ] == 1
228+
229+
230+ def test_duckdb_adapter_from_url_with_init_sql ():
231+ """Test from_url passes init_sql through."""
232+ adapter = DuckDBAdapter .from_url (
233+ "duckdb:///:memory:" ,
234+ init_sql = ["CREATE TABLE url_test (val INT)" ],
235+ )
236+ result = adapter .execute ("SELECT COUNT(*) FROM url_test" )
237+ assert result .fetchone ()[0 ] == 0
238+
239+
240+ def test_duckdb_adapter_from_url_init_sql_in_query_params ():
241+ """Test init_sql can be passed via URL query parameters."""
242+ adapter = DuckDBAdapter .from_url ("duckdb:///:memory:?init_sql=CREATE+TABLE+qs_test+(id+INT)" )
243+ result = adapter .execute ("SELECT COUNT(*) FROM qs_test" )
244+ assert result .fetchone ()[0 ] == 0
245+
246+
247+ def test_duckdb_adapter_from_url_param_overrides_query ():
248+ """Test that explicit init_sql parameter overrides URL query params."""
249+ adapter = DuckDBAdapter .from_url (
250+ "duckdb:///:memory:?init_sql=CREATE+TABLE+url_table+(id+INT)" ,
251+ init_sql = ["CREATE TABLE param_table (id INT)" ],
252+ )
253+ # param_table should exist (from explicit param)
254+ result = adapter .execute ("SELECT COUNT(*) FROM param_table" )
255+ assert result .fetchone ()[0 ] == 0
256+
257+ # url_table should NOT exist (overridden)
258+ with pytest .raises (Exception ):
259+ adapter .execute ("SELECT COUNT(*) FROM url_table" )
260+
261+
262+ def test_duckdb_semantic_layer_init_sql ():
263+ """Test init_sql flows through SemanticLayer constructor."""
264+ from sidemantic import SemanticLayer
265+
266+ layer = SemanticLayer (
267+ connection = "duckdb:///:memory:" ,
268+ init_sql = ["CREATE TABLE layer_test (id INT)" ],
269+ )
270+ result = layer .adapter .execute ("SELECT COUNT(*) FROM layer_test" )
271+ assert result .fetchone ()[0 ] == 0
0 commit comments