feat: 新增 BooleanFunctionLookup 支持函数式操作符
- sqlgen: 新增 BooleanFunctionLookup,生成 FUNC(LHS, RHS) 格式,优先级高于 BooleanOperatorLookup - dialect/duckdb: 使用 regexp_matches 替代 ~ 实现部分匹配,等价于 MySQL REGEXP - sqlgen/expression_sql_generator_test: 补充 BooleanFunctionLookup 测试用例,修正 encode_error 前缀 - sqlgen/sql_dialect_options_test: 验证 BooleanFunctionLookup 默认为 nil - dialect/duckdb_test: 新增 regexp_matches SQL 生成测试
This commit is contained in:
@@ -127,8 +127,8 @@ func (esgs *expressionSQLGeneratorSuite) TestGenerate_UnsupportedType() {
|
||||
type strct struct{}
|
||||
esgs.assertCases(
|
||||
sqlgen.NewExpressionSQLGenerator("test", sqlgen.DefaultDialectOptions()),
|
||||
expressionTestCase{val: strct{}, err: "dbv2_encode_error: Unable to encode value {}"},
|
||||
expressionTestCase{val: strct{}, err: "dbv2_encode_error: Unable to encode value {}", isPrepared: true},
|
||||
expressionTestCase{val: strct{}, err: "db_encode_error: Unable to encode value {}"},
|
||||
expressionTestCase{val: strct{}, err: "db_encode_error: Unable to encode value {}", isPrepared: true},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -624,6 +624,24 @@ func (esgs *expressionSQLGeneratorSuite) TestGenerate_BooleanExpression() {
|
||||
expressionTestCase{val: ident.NotILike("a%"), err: "db: boolean operator 'notilike' not supported"},
|
||||
expressionTestCase{val: ident.NotILike(re), err: "db: boolean operator 'regexpnotilike' not supported"},
|
||||
)
|
||||
|
||||
// BooleanFunctionLookup 生成 FUNC(LHS, RHS) 格式,优先级高于 BooleanOperatorLookup
|
||||
opts2 := sqlgen.DefaultDialectOptions()
|
||||
opts2.BooleanFunctionLookup = map[exp.BooleanOperation][]byte{
|
||||
exp.RegexpLikeOp: []byte("regexp_matches"),
|
||||
exp.RegexpILikeOp: []byte("regexp_matches"),
|
||||
}
|
||||
esgs.assertCases(
|
||||
sqlgen.NewExpressionSQLGenerator("test", opts2),
|
||||
// 函数调用格式
|
||||
expressionTestCase{val: ident.Like(re), sql: `regexp_matches("a", '[ab]')`},
|
||||
expressionTestCase{val: ident.Like(re), sql: `regexp_matches("a", ?)`, isPrepared: true, args: []interface{}{"[ab]"}},
|
||||
expressionTestCase{val: ident.ILike(re), sql: `regexp_matches("a", '[ab]')`},
|
||||
expressionTestCase{val: ident.ILike(re), sql: `regexp_matches("a", ?)`, isPrepared: true, args: []interface{}{"[ab]"}},
|
||||
// 未在 BooleanFunctionLookup 中的操作符仍走中缀格式
|
||||
expressionTestCase{val: ident.Eq(1), sql: `("a" = 1)`},
|
||||
expressionTestCase{val: ident.NotLike(re), sql: `("a" !~ '[ab]')`},
|
||||
)
|
||||
}
|
||||
|
||||
func (esgs *expressionSQLGeneratorSuite) TestGenerate_BitwiseExpression() {
|
||||
|
||||
Reference in New Issue
Block a user