From 038ecc8b70c116abe9acda69b3ce851e9ea1e97d Mon Sep 17 00:00:00 2001 From: Syngnat Date: Sat, 27 Jun 2026 16:41:35 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(export):=20=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=8D=A2=E8=A1=8C=20SELECT=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SELECT/WITH 只读判断支持关键字后换行 - 覆盖多表 JOIN 查询结果导出场景 Fixes #583 --- internal/app/methods_file.go | 16 +++++++++++++++- internal/app/methods_file_export_test.go | 6 ++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/app/methods_file.go b/internal/app/methods_file.go index a56e7cf..b2942ad 100644 --- a/internal/app/methods_file.go +++ b/internal/app/methods_file.go @@ -18,6 +18,7 @@ import ( "strconv" "strings" "time" + "unicode" "GoNavi-Wails/internal/connection" "GoNavi-Wails/internal/db" @@ -3619,7 +3620,20 @@ func looksLikeSelectOrWith(sql string) bool { return false } lower := strings.ToLower(trimmed) - return strings.HasPrefix(lower, "select ") || strings.HasPrefix(lower, "with ") || lower == "select" || lower == "with" + return hasLeadingReadonlySQLKeyword(lower, "select") || hasLeadingReadonlySQLKeyword(lower, "with") +} + +func hasLeadingReadonlySQLKeyword(sql string, keyword string) bool { + if sql == keyword { + return true + } + if !strings.HasPrefix(sql, keyword) { + return false + } + if len(sql) <= len(keyword) { + return true + } + return unicode.IsSpace(rune(sql[len(keyword)])) } func escapeSQLLiteral(value string) string { diff --git a/internal/app/methods_file_export_test.go b/internal/app/methods_file_export_test.go index 7b264d4..c6f0e22 100644 --- a/internal/app/methods_file_export_test.go +++ b/internal/app/methods_file_export_test.go @@ -650,13 +650,15 @@ func TestLooksLikeSelectOrWith_AllowsInnerJoinQueryAfterLeadingComments(t *testi query := ` -- query result export /* generated by query editor */ -SELECT o.id, c.name +SELECT + o.id, + c.name FROM orders o INNER JOIN customers c ON c.id = o.customer_id ` if !looksLikeSelectOrWith(query) { - t.Fatalf("带前置注释的 INNER JOIN 查询应允许导出,query=%q", query) + t.Fatalf("SELECT 换行后的 INNER JOIN 查询应允许导出,query=%q", query) } }