Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions ccflow/examples/tpch/data_generators.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,10 @@ def get_table(self, table: TPCHTable) -> pl.DataFrame:
return pl.from_arrow(tbl_arrow)

def get_answer(self, query_id: int) -> pa.Table:
row = self._conn.query(f"SELECT answer FROM tpch_answers() WHERE scale_factor={self.scale_factor} AND query_nr={query_id}").fetchone()
if not row:
rows = self._conn.query(f"SELECT answer FROM tpch_answers() WHERE scale_factor={self.scale_factor} AND query_nr={query_id}").fetchall()
if not rows:
raise ValueError(f"No TPC-H answer found for scale_factor={self.scale_factor}, query_nr={query_id}")
return pc.read_csv(io.BytesIO(row[0].encode("utf-8")), parse_options=pc.ParseOptions(delimiter="|"))
return pc.read_csv(io.BytesIO(rows[0][0].encode("utf-8")), parse_options=pc.ParseOptions(delimiter="|"))


class TPCHTableProvider(CallableModel):
Expand Down
19 changes: 19 additions & 0 deletions ccflow/tests/utils/test_tokenize.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,25 @@ def f(self):

assert compute_behavior_token(A) == compute_behavior_token(B)

def test_skips_annotate_methods(self):
"""PEP 649 __annotate__/__annotate_func__ are skipped (injected here to run pre-3.14)."""

def _annotate(fmt):
return {"x": int}

class A:
__annotate__ = _annotate
__annotate_func__ = _annotate

def f(self):
return 1

class B:
def f(self):
return 1

assert compute_behavior_token(A) == compute_behavior_token(B)


def _helper_add(x):
return x + 1
Expand Down
5 changes: 5 additions & 0 deletions ccflow/utils/tokenize.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,11 @@ def compute_cache_token(*, data_values: Iterable[Any] = (), behavior_classes: It
"__get_pydantic_core_schema__",
"__get_pydantic_json_schema__",
"model_post_init",
# PEP 649: the auto-generated __annotate__ closure is PYTHONHASHSEED-sensitive,
# which would make the behavior token differ between processes. Annotations are
# already captured through other paths, so skipping these is lossless.
"__annotate__",
"__annotate_func__",
}
)

Expand Down
Loading