From 70fed2d15db1672285848fe51821d96e5ed87191 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 5 Jul 2026 01:33:33 -0600 Subject: [PATCH] fix --- judge/sql_runner.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/judge/sql_runner.py b/judge/sql_runner.py index 21f30f8..e193230 100644 --- a/judge/sql_runner.py +++ b/judge/sql_runner.py @@ -256,6 +256,15 @@ def _display_value(v): return v +def _query_result_columns(names, tables): + """给查询结果的列名标上类型:按列名回查数据表的声明类型,与数据表展示同源(如 VARCHAR(20))。 + + 表达式/聚合列(COUNT(*)、别名等)在数据表里无同名列,类型留空(前端隐藏)。 + """ + col_types = {c["name"]: c["type"] for t in tables for c in t["columns"]} + return [{"name": name, "type": col_types.get(name, "")} for name in names] + + def _dump_display_tables(conn, only=None): """按建表顺序 dump 用户表的原始行用于展示(区别于 _dump_tables 的归一化判题态)。 @@ -301,12 +310,12 @@ def build_display(init_sql, ref_sql, mode, *, memory_limit_mb=64): for stmt in split_statements(ref_sql): cursor = conn.execute(stmt) if cursor.description is not None: - columns = [d[0] for d in cursor.description] + names = [d[0] for d in cursor.description] rows = cursor.fetchmany(ROW_LIMIT + 1) if len(rows) > ROW_LIMIT: raise SQLCaseError(JudgeStatus.SYSTEM_ERROR, f"标准答案结果超过 {ROW_LIMIT} 行") expected = { - "columns": columns, + "columns": _query_result_columns(names, tables), "rows": [[_display_value(v) for v in row] for row in rows[:DISPLAY_ROW_LIMIT]], "total_rows": len(rows), "truncated": len(rows) > DISPLAY_ROW_LIMIT,