Skip to content

Commit 9b65b48

Browse files
thegreymattergforsyth
authored andcommitted
fix(snowflake): fix creating table in a different database
1 parent d1e7112 commit 9b65b48

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

ibis/backends/snowflake/__init__.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,16 @@ def create_table(
653653
if temp:
654654
create_stmt += " TEMPORARY"
655655

656-
ident = self._quote(name)
657-
create_stmt += f" TABLE {ident}"
656+
if database is None:
657+
ident = sg.table(name, quoted=True)
658+
catalog = db = database
659+
else:
660+
db = sg.parse_one(database, into=sg.exp.Table, read=self.name)
661+
catalog = db.db
662+
db = db.name
663+
ident = sg.table(name, db=db, catalog=catalog, quoted=True)
664+
665+
create_stmt += f" TABLE {ident.sql(self.name)}"
658666

659667
if schema is not None:
660668
schema_sql = ", ".join(
@@ -682,16 +690,22 @@ def create_table(
682690
with self.begin() as con:
683691
con.exec_driver_sql(create_stmt)
684692

685-
return self.table(name, schema=database)
693+
return self.table(name, schema=db, database=catalog)
686694

687695
def drop_table(
688-
self, name: str, database: str | None = None, force: bool = False
696+
self,
697+
name: str,
698+
database: str | None = None,
699+
schema: str | None = None,
700+
force: bool = False,
689701
) -> None:
690-
name = self._quote(name)
691-
# TODO: handle database quoting
692-
if database is not None:
693-
name = f"{database}.{name}"
694-
drop_stmt = "DROP TABLE" + (" IF EXISTS" * force) + f" {name}"
702+
"""Drop a table from Snowflake."""
703+
drop_stmt = sg.exp.Drop(
704+
kind="TABLE",
705+
this=sg.table(name, db=schema, catalog=database, quoted=True),
706+
exists=force,
707+
).sql(self.name)
708+
695709
with self.begin() as con:
696710
con.exec_driver_sql(drop_stmt)
697711

ibis/backends/snowflake/tests/test_client.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ def test_cross_db_access(con, temp_db, temp_schema):
5151
assert t.execute().empty
5252

5353

54+
def test_cross_db_create_table(con, temp_db, temp_schema):
55+
table_name = gen_name("tmp_table")
56+
data = pd.DataFrame({"key": list("abc"), "value": [[1], [2], [3]]})
57+
table = con.create_table(table_name, data, database=f"{temp_db}.{temp_schema}")
58+
queried_table = con.table(table_name, schema=f"{temp_db}.{temp_schema}")
59+
60+
tm.assert_frame_equal(table.execute(), data)
61+
tm.assert_frame_equal(queried_table.execute(), data)
62+
63+
5464
@pytest.fixture(scope="session")
5565
def simple_con():
5666
return ibis.connect(_get_url())

0 commit comments

Comments
 (0)