From f488eea592d7803ca42073ae67632bd2c398c808 Mon Sep 17 00:00:00 2001 From: leostimpfle Date: Tue, 30 Jun 2026 17:22:41 +0200 Subject: [PATCH 1/3] Close #468 --- src/duckdb_py/pyrelation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/duckdb_py/pyrelation.cpp b/src/duckdb_py/pyrelation.cpp index 23040a53..e6cd0a30 100644 --- a/src/duckdb_py/pyrelation.cpp +++ b/src/duckdb_py/pyrelation.cpp @@ -1551,7 +1551,7 @@ unique_ptr DuckDBPyRelation::Query(const string &view_name, co if (statement.type == StatementType::SELECT_STATEMENT) { auto select_statement = unique_ptr_cast(std::move(parser.statements[0])); auto query_relation = make_shared_ptr(rel->context->GetContext(), std::move(select_statement), - sql_query, "query_relation"); + "query_relation_" + StringUtil::GenerateRandomName(16), sql_query); return DeriveRelation(std::move(query_relation)); } else if (IsDescribeStatement(statement)) { auto query = PragmaShow(view_name); From a24ecfe4ed196a2cec5d56f3cfd5304b505c31a7 Mon Sep 17 00:00:00 2001 From: leostimpfle Date: Tue, 30 Jun 2026 18:04:52 +0200 Subject: [PATCH 2/3] Add test for query chaining with alias --- tests/fast/relational_api/test_rapi_query.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/fast/relational_api/test_rapi_query.py b/tests/fast/relational_api/test_rapi_query.py index 25f8c323..2fa34436 100644 --- a/tests/fast/relational_api/test_rapi_query.py +++ b/tests/fast/relational_api/test_rapi_query.py @@ -38,6 +38,19 @@ def test_query_chain(self, steps): result = rel.execute() assert len(result.fetchall()) == amount + def test_query_chain_using_alias(self): + # Test query chaining using DuckDBPyRelation.alias + con = duckdb.connect() + con.execute("CREATE TABLE raw (yr INT, facility VARCHAR, val DOUBLE)") + con.execute("INSERT INTO raw VALUES (2020, 'F001', 1.0), (2021, 'F001', 2.0)") + data = con.sql("SELECT * FROM raw") + step1 = data.query(data.alias, f"SELECT *, val * 2 AS val_doubled FROM {data.alias}") + step2 = step1.query(step1.alias, f"SELECT *, val_doubled + 1 AS val_incremented FROM {step1.alias}") + assert step2.fetchall() == [ + (2020, "F001", 1.0, 2.0, 3.0), + (2021, "F001", 2.0, 4.0, 5.0), + ] + @pytest.mark.parametrize("input", [[5, 4, 3], [], [1000]]) def test_query_table(self, tbl_table, input): con = duckdb.default_connection() From 50d1f00dcd7c71b79a211f0aa28129c0f4620c45 Mon Sep 17 00:00:00 2001 From: Evert Lammerts Date: Wed, 1 Jul 2026 13:36:27 +0200 Subject: [PATCH 3/3] fix format --- src/duckdb_py/pyrelation.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/duckdb_py/pyrelation.cpp b/src/duckdb_py/pyrelation.cpp index e6cd0a30..29f6c7e6 100644 --- a/src/duckdb_py/pyrelation.cpp +++ b/src/duckdb_py/pyrelation.cpp @@ -1550,8 +1550,9 @@ unique_ptr DuckDBPyRelation::Query(const string &view_name, co auto &statement = *parser.statements[0]; if (statement.type == StatementType::SELECT_STATEMENT) { auto select_statement = unique_ptr_cast(std::move(parser.statements[0])); - auto query_relation = make_shared_ptr(rel->context->GetContext(), std::move(select_statement), - "query_relation_" + StringUtil::GenerateRandomName(16), sql_query); + auto query_relation = + make_shared_ptr(rel->context->GetContext(), std::move(select_statement), + "query_relation_" + StringUtil::GenerateRandomName(16), sql_query); return DeriveRelation(std::move(query_relation)); } else if (IsDescribeStatement(statement)) { auto query = PragmaShow(view_name);