@@ -30,6 +30,7 @@ package sqlite3
30
30
#endif
31
31
#include <stdlib.h>
32
32
#include <string.h>
33
+ #include <ctype.h>
33
34
34
35
#ifdef __CYGWIN__
35
36
# include <errno.h>
@@ -90,6 +91,16 @@ _sqlite3_exec(sqlite3* db, const char* pcmd, long long* rowid, long long* change
90
91
return rv;
91
92
}
92
93
94
+ static const char *
95
+ _trim_leading_spaces(const char *str) {
96
+ if (str) {
97
+ while (isspace(*str)) {
98
+ str++;
99
+ }
100
+ }
101
+ return str;
102
+ }
103
+
93
104
#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
94
105
extern int _sqlite3_step_blocking(sqlite3_stmt *stmt);
95
106
extern int _sqlite3_step_row_blocking(sqlite3_stmt* stmt, long long* rowid, long long* changes);
@@ -110,7 +121,11 @@ _sqlite3_step_row_internal(sqlite3_stmt* stmt, long long* rowid, long long* chan
110
121
static int
111
122
_sqlite3_prepare_v2_internal(sqlite3 *db, const char *zSql, int nBytes, sqlite3_stmt **ppStmt, const char **pzTail)
112
123
{
113
- return _sqlite3_prepare_v2_blocking(db, zSql, nBytes, ppStmt, pzTail);
124
+ int rv = _sqlite3_prepare_v2_blocking(db, zSql, nBytes, ppStmt, pzTail);
125
+ if (pzTail) {
126
+ *pzTail = _trim_leading_spaces(*pzTail);
127
+ }
128
+ return rv;
114
129
}
115
130
116
131
#else
@@ -133,7 +148,11 @@ _sqlite3_step_row_internal(sqlite3_stmt* stmt, long long* rowid, long long* chan
133
148
static int
134
149
_sqlite3_prepare_v2_internal(sqlite3 *db, const char *zSql, int nBytes, sqlite3_stmt **ppStmt, const char **pzTail)
135
150
{
136
- return sqlite3_prepare_v2(db, zSql, nBytes, ppStmt, pzTail);
151
+ int rv = sqlite3_prepare_v2(db, zSql, nBytes, ppStmt, pzTail);
152
+ if (pzTail) {
153
+ *pzTail = _trim_leading_spaces(*pzTail);
154
+ }
155
+ return rv;
137
156
}
138
157
#endif
139
158
@@ -858,25 +877,34 @@ func (c *SQLiteConn) Exec(query string, args []driver.Value) (driver.Result, err
858
877
}
859
878
860
879
func (c * SQLiteConn ) exec (ctx context.Context , query string , args []driver.NamedValue ) (driver.Result , error ) {
880
+ pquery := C .CString (query )
881
+ op := pquery // original pointer
882
+ defer C .free (unsafe .Pointer (op ))
883
+
884
+ var stmtArgs []driver.NamedValue
885
+ var tail * C.char
886
+ s := new (SQLiteStmt ) // escapes to the heap so reuse it
887
+ defer s .finalize ()
861
888
start := 0
862
889
for {
863
- s , err := c .prepare (ctx , query )
864
- if err != nil {
865
- return nil , err
890
+ * s = SQLiteStmt {c : c } // reset
891
+ rv := C ._sqlite3_prepare_v2_internal (c .db , pquery , C .int (- 1 ), & s .s , & tail )
892
+ if rv != C .SQLITE_OK {
893
+ return nil , c .lastError ()
866
894
}
895
+
867
896
var res driver.Result
868
- if s .(* SQLiteStmt ).s != nil {
869
- stmtArgs := make ([]driver.NamedValue , 0 , len (args ))
897
+ if s .s != nil {
870
898
na := s .NumInput ()
871
899
if len (args )- start < na {
872
- s .Close ()
900
+ s .finalize ()
873
901
return nil , fmt .Errorf ("not enough args to execute query: want %d got %d" , na , len (args ))
874
902
}
875
903
// consume the number of arguments used in the current
876
904
// statement and append all named arguments not
877
905
// contained therein
878
906
if len (args [start :start + na ]) > 0 {
879
- stmtArgs = append (stmtArgs , args [start :start + na ]... )
907
+ stmtArgs = append (stmtArgs [: 0 ] , args [start :start + na ]... )
880
908
for i := range args {
881
909
if (i < start || i >= na ) && args [i ].Name != "" {
882
910
stmtArgs = append (stmtArgs , args [i ])
@@ -886,23 +914,23 @@ func (c *SQLiteConn) exec(ctx context.Context, query string, args []driver.Named
886
914
stmtArgs [i ].Ordinal = i + 1
887
915
}
888
916
}
889
- res , err = s .(* SQLiteStmt ).exec (ctx , stmtArgs )
917
+ var err error
918
+ res , err = s .exec (ctx , stmtArgs )
890
919
if err != nil && err != driver .ErrSkip {
891
- s .Close ()
920
+ s .finalize ()
892
921
return nil , err
893
922
}
894
923
start += na
895
924
}
896
- tail := s .(* SQLiteStmt ).t
897
- s .Close ()
898
- if tail == "" {
925
+ s .finalize ()
926
+ if tail == nil || * tail == '\000' {
899
927
if res == nil {
900
928
// https://github.com/mattn/go-sqlite3/issues/963
901
929
res = & SQLiteResult {0 , 0 }
902
930
}
903
931
return res , nil
904
932
}
905
- query = tail
933
+ pquery = tail
906
934
}
907
935
}
908
936
@@ -919,22 +947,29 @@ func (c *SQLiteConn) Query(query string, args []driver.Value) (driver.Rows, erro
919
947
}
920
948
921
949
func (c * SQLiteConn ) query (ctx context.Context , query string , args []driver.NamedValue ) (driver.Rows , error ) {
950
+ pquery := C .CString (query )
951
+ op := pquery // original pointer
952
+ defer C .free (unsafe .Pointer (op ))
953
+
954
+ var stmtArgs []driver.NamedValue
955
+ var tail * C.char
956
+ s := new (SQLiteStmt ) // escapes to the heap so reuse it
922
957
start := 0
923
958
for {
924
- stmtArgs := make ([]driver. NamedValue , 0 , len ( args ))
925
- s , err := c . prepare ( ctx , query )
926
- if err != nil {
927
- return nil , err
959
+ * s = SQLiteStmt { c : c , cls : true } // reset
960
+ rv := C . _sqlite3_prepare_v2_internal ( c . db , pquery , C . int ( - 1 ), & s . s , & tail )
961
+ if rv != C . SQLITE_OK {
962
+ return nil , c . lastError ()
928
963
}
929
- s .( * SQLiteStmt ). cls = true
964
+
930
965
na := s .NumInput ()
931
966
if len (args )- start < na {
932
967
return nil , fmt .Errorf ("not enough args to execute query: want %d got %d" , na , len (args )- start )
933
968
}
934
969
// consume the number of arguments used in the current
935
970
// statement and append all named arguments not contained
936
971
// therein
937
- stmtArgs = append (stmtArgs , args [start :start + na ]... )
972
+ stmtArgs = append (stmtArgs [: 0 ] , args [start :start + na ]... )
938
973
for i := range args {
939
974
if (i < start || i >= na ) && args [i ].Name != "" {
940
975
stmtArgs = append (stmtArgs , args [i ])
@@ -943,19 +978,18 @@ func (c *SQLiteConn) query(ctx context.Context, query string, args []driver.Name
943
978
for i := range stmtArgs {
944
979
stmtArgs [i ].Ordinal = i + 1
945
980
}
946
- rows , err := s .( * SQLiteStmt ). query (ctx , stmtArgs )
981
+ rows , err := s .query (ctx , stmtArgs )
947
982
if err != nil && err != driver .ErrSkip {
948
- s .Close ()
983
+ s .finalize ()
949
984
return rows , err
950
985
}
951
986
start += na
952
- tail := s .(* SQLiteStmt ).t
953
- if tail == "" {
987
+ if tail == nil || * tail == '\000' {
954
988
return rows , nil
955
989
}
956
990
rows .Close ()
957
- s .Close ()
958
- query = tail
991
+ s .finalize ()
992
+ pquery = tail
959
993
}
960
994
}
961
995
@@ -1818,8 +1852,11 @@ func (c *SQLiteConn) prepare(ctx context.Context, query string) (driver.Stmt, er
1818
1852
return nil , c .lastError ()
1819
1853
}
1820
1854
var t string
1821
- if tail != nil && * tail != '\000' {
1822
- t = strings .TrimSpace (C .GoString (tail ))
1855
+ if tail != nil && * tail != 0 {
1856
+ n := int (uintptr (unsafe .Pointer (tail ))) - int (uintptr (unsafe .Pointer (pquery )))
1857
+ if 0 <= n && n < len (query ) {
1858
+ t = strings .TrimSpace (query [n :])
1859
+ }
1823
1860
}
1824
1861
ss := & SQLiteStmt {c : c , s : s , t : t }
1825
1862
runtime .SetFinalizer (ss , (* SQLiteStmt ).Close )
@@ -1913,6 +1950,13 @@ func (s *SQLiteStmt) Close() error {
1913
1950
return nil
1914
1951
}
1915
1952
1953
+ func (s * SQLiteStmt ) finalize () {
1954
+ if s .s != nil {
1955
+ C .sqlite3_finalize (s .s )
1956
+ s .s = nil
1957
+ }
1958
+ }
1959
+
1916
1960
// NumInput return a number of parameters.
1917
1961
func (s * SQLiteStmt ) NumInput () int {
1918
1962
return int (C .sqlite3_bind_parameter_count (s .s ))
0 commit comments