Skip to content

Commit e2dcb6d

Browse files
mimicodezhangleitao
andauthored
feat: support native SQL as custom fields (#1213)
* feat: support native SQL as custom fields * add comment * fix var name format * Renamed function NewFieldRaw() to NewUnsafeFieldRaw() --------- Co-authored-by: zhangleitao <[email protected]>
1 parent 1e1def8 commit e2dcb6d

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

field/export.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ func NewField(table, column string, opts ...Option) Field {
3232
return Field{expr: expr{col: toColumn(table, column, opts...)}}
3333
}
3434

35+
// NewUnsafeFieldRaw create new field by native sql
36+
//
37+
// Warning: Using NewUnsafeFieldRaw with raw SQL exposes your application to SQL injection vulnerabilities.
38+
// Always validate/sanitize inputs and prefer parameterized queries or NewField methods for field construction.
39+
// Use this low-level function only when absolutely necessary, and ensure any embedded values are properly escaped.
40+
func NewUnsafeFieldRaw(rawSQL string, vars ...interface{}) Field {
41+
return Field{expr: expr{e: clause.Expr{SQL: rawSQL, Vars: vars}}}
42+
}
43+
3544
// NewSerializer create new field2
3645
func NewSerializer(table, column string, opts ...Option) Serializer {
3746
return Serializer{expr: expr{col: toColumn(table, column, opts...)}}

field/export_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,56 @@ func TestExpr_Build(t *testing.T) {
8989
Expr: field.NewField("", "id").GroupConcat(),
9090
Result: "GROUP_CONCAT(`id`)",
9191
},
92+
{
93+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1"),
94+
Result: "if(column1=?,column2,column3)",
95+
ExpectedVars: []interface{}{"1"},
96+
},
97+
{
98+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").Eq(p),
99+
Result: "if(column1=?,column2,column3) = ?",
100+
ExpectedVars: []interface{}{"1", p},
101+
},
102+
{
103+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", field.NewField("", "new_id")).Eq(p),
104+
Result: "if(column1=`new_id`,column2,column3) = ?",
105+
ExpectedVars: []interface{}{p},
106+
},
107+
{
108+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").EqCol(field.NewField("", "new_id")),
109+
Result: "if(column1=?,column2,column3) = `new_id`",
110+
ExpectedVars: []interface{}{"1"},
111+
},
112+
{
113+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").EqCol(field.NewField("", "new_id").WithTable("tableB")),
114+
Result: "if(column1=?,column2,column3) = `tableB`.`new_id`",
115+
ExpectedVars: []interface{}{"1"},
116+
},
117+
{
118+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").IsNull(),
119+
Result: "if(column1=?,column2,column3) IS NULL",
120+
ExpectedVars: []interface{}{"1"},
121+
},
122+
{
123+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").GroupConcat(),
124+
Result: "GROUP_CONCAT(if(column1=?,column2,column3))",
125+
ExpectedVars: []interface{}{"1"},
126+
},
127+
{
128+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").Desc(),
129+
Result: "if(column1=?,column2,column3) DESC",
130+
ExpectedVars: []interface{}{"1"},
131+
},
132+
{
133+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").IfNull(p),
134+
Result: "IFNULL(if(column1=?,column2,column3),?)",
135+
ExpectedVars: []interface{}{"1", p},
136+
},
137+
{
138+
Expr: field.NewUnsafeFieldRaw("if(column1=?,column2,column3)", "1").As("column4"),
139+
Result: "if(column1=?,column2,column3) AS `column4`",
140+
ExpectedVars: []interface{}{"1"},
141+
},
92142
{
93143
Expr: field.Func.UnixTimestamp(),
94144
Result: "UNIX_TIMESTAMP()",

0 commit comments

Comments
 (0)