mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-01 00:21:29 +08:00
🐛 fix(export): 兼容换行 SELECT 查询导出
- SELECT/WITH 只读判断支持关键字后换行 - 覆盖多表 JOIN 查询结果导出场景 Fixes #583
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user