@@ -1091,6 +1091,67 @@ func TestExecer(t *testing.T) {
10911091 }
10921092}
10931093
1094+ func TestExecDriverResult (t * testing.T ) {
1095+ setup := func (t * testing.T ) * sql.DB {
1096+ db , err := sql .Open ("sqlite3" , t .TempDir ()+ "/test.sqlite3" )
1097+ if err != nil {
1098+ t .Fatal ("Failed to open database:" , err )
1099+ }
1100+ if _ , err := db .Exec (`CREATE TABLE foo (id INTEGER PRIMARY KEY);` ); err != nil {
1101+ t .Fatal (err )
1102+ }
1103+ t .Cleanup (func () { db .Close () })
1104+ return db
1105+ }
1106+
1107+ test := func (t * testing.T , execStmt string , args ... any ) {
1108+ db := setup (t )
1109+ res , err := db .Exec (execStmt , args ... )
1110+ if err != nil {
1111+ t .Fatal (err )
1112+ }
1113+ rows , err := res .RowsAffected ()
1114+ if err != nil {
1115+ t .Fatal (err )
1116+ }
1117+ // We only return the changes from the last statement.
1118+ if rows != 1 {
1119+ t .Errorf ("RowsAffected got: %d want: %d" , rows , 1 )
1120+ }
1121+ id , err := res .LastInsertId ()
1122+ if err != nil {
1123+ t .Fatal (err )
1124+ }
1125+ if id != 3 {
1126+ t .Errorf ("LastInsertId got: %d want: %d" , id , 3 )
1127+ }
1128+ var count int64
1129+ err = db .QueryRow (`SELECT COUNT(*) FROM foo WHERE id IN (1, 2, 3);` ).Scan (& count )
1130+ if err != nil {
1131+ t .Fatal (err )
1132+ }
1133+ if count != 3 {
1134+ t .Errorf ("Expected count to be %d got: %d" , 3 , count )
1135+ }
1136+ }
1137+
1138+ t .Run ("NoArgs" , func (t * testing.T ) {
1139+ const stmt = `
1140+ INSERT INTO foo(id) VALUES(1);
1141+ INSERT INTO foo(id) VALUES(2);
1142+ INSERT INTO foo(id) VALUES(3);`
1143+ test (t , stmt )
1144+ })
1145+
1146+ t .Run ("WithArgs" , func (t * testing.T ) {
1147+ const stmt = `
1148+ INSERT INTO foo(id) VALUES(?);
1149+ INSERT INTO foo(id) VALUES(?);
1150+ INSERT INTO foo(id) VALUES(?);`
1151+ test (t , stmt , 1 , 2 , 3 )
1152+ })
1153+ }
1154+
10941155func TestQueryer (t * testing.T ) {
10951156 tempFilename := TempFilename (t )
10961157 defer os .Remove (tempFilename )
@@ -2114,6 +2175,10 @@ var tests = []testing.InternalTest{
21142175
21152176var benchmarks = []testing.InternalBenchmark {
21162177 {Name : "BenchmarkExec" , F : benchmarkExec },
2178+ {Name : "BenchmarkExecContext" , F : benchmarkExecContext },
2179+ {Name : "BenchmarkExecStep" , F : benchmarkExecStep },
2180+ {Name : "BenchmarkExecContextStep" , F : benchmarkExecContextStep },
2181+ {Name : "BenchmarkExecTx" , F : benchmarkExecTx },
21172182 {Name : "BenchmarkQuery" , F : benchmarkQuery },
21182183 {Name : "BenchmarkQueryContext" , F : benchmarkQueryContext },
21192184 {Name : "BenchmarkParams" , F : benchmarkParams },
@@ -2468,13 +2533,78 @@ func testExecEmptyQuery(t *testing.T) {
24682533
24692534// benchmarkExec is benchmark for exec
24702535func benchmarkExec (b * testing.B ) {
2536+ b .Run ("Params" , func (b * testing.B ) {
2537+ for i := 0 ; i < b .N ; i ++ {
2538+ if _ , err := db .Exec ("select ?;" , int64 (1 )); err != nil {
2539+ panic (err )
2540+ }
2541+ }
2542+ })
2543+ b .Run ("NoParams" , func (b * testing.B ) {
2544+ for i := 0 ; i < b .N ; i ++ {
2545+ if _ , err := db .Exec ("select 1;" ); err != nil {
2546+ panic (err )
2547+ }
2548+ }
2549+ })
2550+ }
2551+
2552+ func benchmarkExecContext (b * testing.B ) {
2553+ b .Run ("Params" , func (b * testing.B ) {
2554+ ctx , cancel := context .WithCancel (context .Background ())
2555+ defer cancel ()
2556+ for i := 0 ; i < b .N ; i ++ {
2557+ if _ , err := db .ExecContext (ctx , "select ?;" , int64 (1 )); err != nil {
2558+ panic (err )
2559+ }
2560+ }
2561+ })
2562+ b .Run ("NoParams" , func (b * testing.B ) {
2563+ ctx , cancel := context .WithCancel (context .Background ())
2564+ defer cancel ()
2565+ for i := 0 ; i < b .N ; i ++ {
2566+ if _ , err := db .ExecContext (ctx , "select 1;" ); err != nil {
2567+ panic (err )
2568+ }
2569+ }
2570+ })
2571+ }
2572+
2573+ func benchmarkExecTx (b * testing.B ) {
24712574 for i := 0 ; i < b .N ; i ++ {
2472- if _ , err := db .Exec ("select 1" ); err != nil {
2575+ tx , err := db .Begin ()
2576+ if err != nil {
2577+ panic (err )
2578+ }
2579+ if _ , err := tx .Exec ("select 1;" ); err != nil {
2580+ panic (err )
2581+ }
2582+ if err := tx .Commit (); err != nil {
24732583 panic (err )
24742584 }
24752585 }
24762586}
24772587
2588+ var largeSelectStmt = strings .Repeat ("select 1;\n " , 1_000 )
2589+
2590+ func benchmarkExecStep (b * testing.B ) {
2591+ for n := 0 ; n < b .N ; n ++ {
2592+ if _ , err := db .Exec (largeSelectStmt ); err != nil {
2593+ b .Fatal (err )
2594+ }
2595+ }
2596+ }
2597+
2598+ func benchmarkExecContextStep (b * testing.B ) {
2599+ ctx , cancel := context .WithCancel (context .Background ())
2600+ defer cancel ()
2601+ for n := 0 ; n < b .N ; n ++ {
2602+ if _ , err := db .ExecContext (ctx , largeSelectStmt ); err != nil {
2603+ b .Fatal (err )
2604+ }
2605+ }
2606+ }
2607+
24782608// benchmarkQuery is benchmark for query
24792609func benchmarkQuery (b * testing.B ) {
24802610 for i := 0 ; i < b .N ; i ++ {
0 commit comments