Skip to content

Commit 5a2a168

Browse files
committed
fix: wrap columns 'proallargtypes' and 'proargtypes' to split string into string array (#354)
1 parent ee1139f commit 5a2a168

File tree

3 files changed

+42
-21
lines changed

3 files changed

+42
-21
lines changed

catalog/internal_macro.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ type MacroDefinition struct {
77
DDL string
88
}
99

10-
var SchemaNameMyListContains string = "__sys__"
11-
var MacroNameMyListContains string = "my_list_contains"
10+
var (
11+
SchemaNameSYS string = "__sys__"
12+
MacroNameMyListContains string = "my_list_contains"
13+
14+
MacroNameMySplitListStr string = "my_split_list_str"
15+
)
1216

1317
type InternalMacro struct {
1418
Schema string
@@ -76,7 +80,7 @@ var InternalMacros = []InternalMacro{
7680
},
7781
},
7882
{
79-
Schema: SchemaNameMyListContains,
83+
Schema: SchemaNameSYS,
8084
Name: MacroNameMyListContains,
8185
IsTableMacro: false,
8286
Definitions: []MacroDefinition{
@@ -91,4 +95,15 @@ var InternalMacros = []InternalMacro{
9195
},
9296
},
9397
},
98+
{
99+
Schema: SchemaNameSYS,
100+
Name: MacroNameMySplitListStr,
101+
IsTableMacro: false,
102+
Definitions: []MacroDefinition{
103+
{
104+
Params: []string{"l"},
105+
DDL: `regexp_split_to_array(l::VARCHAR, '[{},\s]+')`,
106+
},
107+
},
108+
},
94109
}

pgserver/in_place_handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,11 @@ var selectionConversions = []SelectionConversion{
237237
needConvert: func(query *ConvertedStatement) bool {
238238
sqlStr := RemoveComments(query.String)
239239
// TODO(sean): Evaluate the conditions by iterating over the AST.
240-
return getTypeCastRegex().MatchString(sqlStr)
240+
return getSimpleStringMatchingRegex().MatchString(sqlStr)
241241
},
242242
doConvert: func(h *ConnectionHandler, query *ConvertedStatement) error {
243243
sqlStr := RemoveComments(query.String)
244-
sqlStr = ConvertTypeCast(sqlStr)
244+
sqlStr = SimpleStrReplacement(sqlStr)
245245
query.String = sqlStr
246246
return nil
247247
},

pgserver/stmt.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -310,36 +310,42 @@ func getPgAnyOpRegex() *regexp.Regexp {
310310
// Replace the operator 'ANY' with a function call.
311311
func ConvertAnyOp(sql string) string {
312312
re := getPgAnyOpRegex()
313-
return re.ReplaceAllString(sql, catalog.SchemaNameMyListContains+"."+catalog.MacroNameMyListContains+"($2, $1)")
313+
return re.ReplaceAllString(sql, catalog.SchemaNameSYS+"."+catalog.MacroNameMyListContains+"($2, $1)")
314314
}
315315

316316
var (
317-
typeCastRegex *regexp.Regexp
318-
initTypeCastRegex sync.Once
317+
simpleStrMatchingRegex *regexp.Regexp
318+
initSimpleStrMatchingRegex sync.Once
319319
)
320320

321+
// TODO(sean): This is a temporary solution. We need to find a better way to handle type cast conversion and column conversion. e.g. Iterating the AST with a visitor pattern.
321322
// The Key must be in lowercase. Because the key used for value retrieval is in lowercase.
322-
var typeCastConversion = map[string]string{
323+
var simpleStringsConversion = map[string]string{
324+
// type cast conversion
323325
"::regclass": "::varchar",
324-
"::regtype": "::integer",
326+
"::regtype": "::varchar",
327+
328+
// column conversion
329+
"proallargtypes": catalog.SchemaNameSYS + "." + catalog.MacroNameMySplitListStr + "(proallargtypes)",
330+
"proargtypes": catalog.SchemaNameSYS + "." + catalog.MacroNameMySplitListStr + "(proargtypes)",
325331
}
326332

327333
// This function will return a regex that matches all type casts in the query.
328-
func getTypeCastRegex() *regexp.Regexp {
329-
initTypeCastRegex.Do(func() {
330-
var typeCasts []string
331-
for typeCast := range typeCastConversion {
332-
typeCasts = append(typeCasts, regexp.QuoteMeta(typeCast))
334+
func getSimpleStringMatchingRegex() *regexp.Regexp {
335+
initSimpleStrMatchingRegex.Do(func() {
336+
var simpleStrings []string
337+
for simpleString := range simpleStringsConversion {
338+
simpleStrings = append(simpleStrings, regexp.QuoteMeta(simpleString))
333339
}
334-
typeCastRegex = regexp.MustCompile(`(?i)(` + strings.Join(typeCasts, "|") + `)`)
340+
simpleStrMatchingRegex = regexp.MustCompile(`(?i)(` + strings.Join(simpleStrings, "|") + `)`)
335341
})
336-
return typeCastRegex
342+
return simpleStrMatchingRegex
337343
}
338344

339-
// This function will replace all type casts in the query with the corresponding type cast in the typeCastConversion map.
340-
func ConvertTypeCast(sql string) string {
341-
return getTypeCastRegex().ReplaceAllStringFunc(sql, func(m string) string {
342-
return typeCastConversion[strings.ToLower(m)]
345+
// This function will replace all type casts in the query with the corresponding type cast in the simpleStringsConversion map.
346+
func SimpleStrReplacement(sql string) string {
347+
return getSimpleStringMatchingRegex().ReplaceAllStringFunc(sql, func(m string) string {
348+
return simpleStringsConversion[strings.ToLower(m)]
343349
})
344350
}
345351

0 commit comments

Comments
 (0)