🐛 fix(export): 兼容换行 SELECT 查询导出

- SELECT/WITH 只读判断支持关键字后换行
- 覆盖多表 JOIN 查询结果导出场景

Fixes #583
This commit is contained in:
Syngnat
2026-06-27 16:41:35 +08:00
parent 3bfcd15dc0
commit 038ecc8b70
2 changed files with 19 additions and 3 deletions

View File

@@ -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 {

View File

@@ -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)
}
}