github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/sqlparse/sqlparser/dbtype_test.go (about) 1 package sqlparser 2 3 import ( 4 "errors" 5 "testing" 6 7 _ "github.com/go-sql-driver/mysql" 8 _ "github.com/jackc/pgx/v4/stdlib" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestConvertDBType(t *testing.T) { 13 const q0 = "select `name` from `user` where `min` >= ? and name like 'abc?' order by age" 14 const q1 = `select "name" from "user" where "min" >= $1 and "name" like 'abc?' order by "age"` 15 const q2 = `select count(*) as "cnt" from "user" where "min" >= $1 and "name" like 'abc?'` 16 17 r, err := Kingbase.Convert(q0) 18 assert.Nil(t, err) 19 assert.NotNil(t, r) 20 assert.Equal(t, q1, r.ConvertQuery()) 21 22 const q00 = `select * from user where name in (?, ?)` 23 r, err = Kingbase.Convert(q00) 24 assert.Nil(t, err) 25 q, _ := r.PickArgs([]interface{}{"a", "b", "c"}) 26 assert.Equal(t, `select * from "user" where "name" in ($1, $2, $3)`, q) 27 28 v := &Paging{PageSeq: 1, PageSize: 20, RowsCount: CreateCountingQuery} 29 r, err = Kingbase.Convert(q0, WithPaging(v)) 30 assert.Nil(t, err) 31 assert.Equal(t, q1+" limit $2 offset $3", r.ConvertQuery()) 32 assert.Equal(t, q2, r.CountingQuery) 33 assert.Equal(t, []interface{}{20, 0}, r.ExtraArgs) 34 35 const q3 = `insert into t (a, b, c, d, e, f,g) values(?, ?, ?, ?, ?, ?,?) on duplicate key update a=values(a), b=values(b), c=values(c),d=values(c)` 36 37 r, err = Kingbase.Convert(q3) 38 assert.True(t, errors.Is(err, ErrSyntax)) 39 40 // 在占位符数量与字段数量不匹配时,自动调整占位符数量 41 const q40 = `insert into t (a, b, c) values(?,?)` 42 const q41 = `insert into "t"("a", "b", "c") values ($1, $2, $3)` 43 r, err = Kingbase.Convert(q40) 44 assert.Nil(t, err) 45 assert.Equal(t, q41, r.ConvertQuery()) 46 // 在占位符数量与字段数量不匹配时,自动调整占位符数量 47 const q50 = `insert into t (a, b, c) values(?,?,?,?)` 48 r, err = Kingbase.Convert(q50) 49 assert.Nil(t, err) 50 assert.Equal(t, ByPlaceholder, r.BindMode) 51 assert.Equal(t, q41, r.ConvertQuery()) 52 53 const q60 = `insert into t (a, b, c) values(':a', ':b', ':c')` 54 const q62 = `insert into t (a, b, c) values(:a, :b, :c)` 55 const q63 = `insert into t (a, b, c) values(:?)` 56 const q61 = `insert into "t"("a", "b", "c") values ($1, $2, $3)` 57 r, err = Kingbase.Convert(q60) 58 assert.Nil(t, err) 59 assert.Equal(t, []string{"a", "b", "c"}, r.VarNames) 60 assert.Equal(t, q61, r.ConvertQuery()) 61 62 r, err = Kingbase.Convert(q62) 63 assert.Nil(t, err) 64 assert.Equal(t, []string{"a", "b", "c"}, r.VarNames) 65 assert.Equal(t, ByName, r.BindMode) 66 assert.Equal(t, q61, r.ConvertQuery()) 67 68 r, err = Kingbase.Convert(q63) 69 assert.Nil(t, err) 70 assert.Equal(t, []string{"a", "b", "c"}, r.VarNames) 71 assert.Equal(t, ByName, r.BindMode) 72 assert.Equal(t, q61, r.ConvertQuery()) 73 74 const q70 = `insert into t (a, b, c) values(':2', ':1', ':3')` // b,a,c 75 r, err = Kingbase.Convert(q70) 76 assert.Nil(t, err) 77 assert.Equal(t, []int{2, 1, 3}, r.VarPoses) 78 assert.Equal(t, q61, r.ConvertQuery()) 79 80 const q71 = `insert into t (a, b, c) values(:1, :2, :3)` 81 r, err = Kingbase.Convert(q71) 82 assert.Nil(t, err) 83 assert.Equal(t, []int{1, 2, 3}, r.VarPoses) 84 assert.Equal(t, BySeq, r.BindMode) 85 assert.Equal(t, q61, r.ConvertQuery()) 86 87 const q72 = `insert into t (a, b, c) values(:?, :?, :?)` 88 r, err = Kingbase.Convert(q72) 89 assert.Nil(t, err) 90 assert.Equal(t, []string{"a", "b", "c"}, r.VarNames) 91 assert.Equal(t, ByName, r.BindMode) 92 assert.Equal(t, q61, r.ConvertQuery()) 93 94 const q73 = `update t set a = :?, b = :? where c > :? and d = :?` 95 const q74 = `update "t" set "a" = $1, "b" = $2 where "c" > $3 and "d" = $4` 96 r, err = Kingbase.Convert(q73) 97 assert.Nil(t, err) 98 assert.Equal(t, []string{"a", "b", "c", "d"}, r.VarNames) 99 assert.Equal(t, ByName, r.BindMode) 100 assert.Equal(t, q74, r.ConvertQuery()) 101 }