From 9514d5f9e677e0c94d3d4e48d4f08c649f092d9a Mon Sep 17 00:00:00 2001 From: jasonchuan Date: Tue, 6 Feb 2024 10:54:40 +0800 Subject: [PATCH] let limit and offset use bind parameter (#6806) * let limit and offset use bind parameter * format * format limt_test * try again * fix test case fro connpool * adding driverName for postgres ,if not to do so, the stmt vars will be added a wrong one called pgx.QueryExecModeSimpleProtocol , causing the SQL with limit problem need 1 parameter ,but given two. * delete trunk files * restore the test_test.go * restore test_test.go * driver/postgres->v1.5.5 * change postgres version rollback to 1.5.4 --------- Co-authored-by: chenchuan Co-authored-by: jason_chuan --- clause/limit.go | 6 ++---- clause/limit_test.go | 30 ++++++++++++++++++++---------- tests/connpool_test.go | 10 +++++----- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/clause/limit.go b/clause/limit.go index abda00551..3edde4346 100644 --- a/clause/limit.go +++ b/clause/limit.go @@ -1,7 +1,5 @@ package clause -import "strconv" - // Limit limit clause type Limit struct { Limit *int @@ -17,14 +15,14 @@ func (limit Limit) Name() string { func (limit Limit) Build(builder Builder) { if limit.Limit != nil && *limit.Limit >= 0 { builder.WriteString("LIMIT ") - builder.WriteString(strconv.Itoa(*limit.Limit)) + builder.AddVar(builder, *limit.Limit) } if limit.Offset > 0 { if limit.Limit != nil && *limit.Limit >= 0 { builder.WriteByte(' ') } builder.WriteString("OFFSET ") - builder.WriteString(strconv.Itoa(limit.Offset)) + builder.AddVar(builder, limit.Offset) } } diff --git a/clause/limit_test.go b/clause/limit_test.go index a9fd4e24a..96a7e7e6e 100644 --- a/clause/limit_test.go +++ b/clause/limit_test.go @@ -22,43 +22,53 @@ func TestLimit(t *testing.T) { Limit: &limit10, Offset: 20, }}, - "SELECT * FROM `users` LIMIT 10 OFFSET 20", nil, + "SELECT * FROM `users` LIMIT ? OFFSET ?", + []interface{}{limit10, 20}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Limit: &limit0}}, - "SELECT * FROM `users` LIMIT 0", nil, + "SELECT * FROM `users` LIMIT ?", + []interface{}{limit0}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Limit: &limit0}, clause.Limit{Offset: 0}}, - "SELECT * FROM `users` LIMIT 0", nil, + "SELECT * FROM `users` LIMIT ?", + []interface{}{limit0}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Offset: 20}}, - "SELECT * FROM `users` OFFSET 20", nil, + "SELECT * FROM `users` OFFSET ?", + []interface{}{20}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Offset: 20}, clause.Limit{Offset: 30}}, - "SELECT * FROM `users` OFFSET 30", nil, + "SELECT * FROM `users` OFFSET ?", + []interface{}{30}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Offset: 20}, clause.Limit{Limit: &limit10}}, - "SELECT * FROM `users` LIMIT 10 OFFSET 20", nil, + "SELECT * FROM `users` LIMIT ? OFFSET ?", + []interface{}{limit10, 20}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Limit: &limit10, Offset: 20}, clause.Limit{Offset: 30}}, - "SELECT * FROM `users` LIMIT 10 OFFSET 30", nil, + "SELECT * FROM `users` LIMIT ? OFFSET ?", + []interface{}{limit10, 30}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Limit: &limit10, Offset: 20}, clause.Limit{Offset: 30}, clause.Limit{Offset: -10}}, - "SELECT * FROM `users` LIMIT 10", nil, + "SELECT * FROM `users` LIMIT ?", + []interface{}{limit10}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Limit: &limit10, Offset: 20}, clause.Limit{Offset: 30}, clause.Limit{Limit: &limitNeg10}}, - "SELECT * FROM `users` OFFSET 30", nil, + "SELECT * FROM `users` OFFSET ?", + []interface{}{30}, }, { []clause.Interface{clause.Select{}, clause.From{}, clause.Limit{Limit: &limit10, Offset: 20}, clause.Limit{Offset: 30}, clause.Limit{Limit: &limit50}}, - "SELECT * FROM `users` LIMIT 50 OFFSET 30", nil, + "SELECT * FROM `users` LIMIT ? OFFSET ?", + []interface{}{limit50, 30}, }, } diff --git a/tests/connpool_test.go b/tests/connpool_test.go index e0e1c7710..21a2bad03 100644 --- a/tests/connpool_test.go +++ b/tests/connpool_test.go @@ -102,13 +102,13 @@ func TestConnPoolWrapper(t *testing.T) { expect: []string{ "SELECT VERSION()", "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`birthday`,`company_id`,`manager_id`,`active`) VALUES (?,?,?,?,?,?,?,?,?)", - "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1", + "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT ?", "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`birthday`,`company_id`,`manager_id`,`active`) VALUES (?,?,?,?,?,?,?,?,?)", - "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1", - "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1", + "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT ?", + "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT ?", "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`birthday`,`company_id`,`manager_id`,`active`) VALUES (?,?,?,?,?,?,?,?,?)", - "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1", - "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1", + "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT ?", + "SELECT * FROM `users` WHERE name = ? AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT ?", }, }