Skip to content

Commit 4d62fbe

Browse files
[2.13] Close prepared SQL-statements after use. (#1108)
* [2.13] Close prepared SQL-statements after use. * Wrap close statements in a closure-defer pattern.
1 parent 2039ffd commit 4d62fbe

2 files changed

Lines changed: 104 additions & 56 deletions

File tree

pkg/sqlcache/store/store.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ func (s *Store) updateExternalInfo(tx db.TxClient, key string, externalUpdateInf
170170
)
171171
getStmt := s.Prepare(rawGetStmt)
172172
rows, err := s.QueryForRows(s.ctx, getStmt, labelDep.SourceLabelName)
173+
getStmt.Close()
173174
if err != nil {
174175
if !isDBError(err) {
175176
logrus.Infof("Error getting external info for table %s, key %s: %v", labelDep.TargetGVK, key, err)
@@ -193,8 +194,12 @@ func (s *Store) updateExternalInfo(tx db.TxClient, key string, externalUpdateInf
193194
}
194195
rawStmt := fmt.Sprintf(`UPDATE "%s_fields" SET "%s" = ? WHERE key = ?`,
195196
labelDep.SourceGVK, labelDep.TargetFinalFieldName)
196-
preparedStmt := s.Prepare(rawStmt)
197-
_, err = tx.Stmt(preparedStmt).Exec(finalTargetValue, sourceKey)
197+
err = func() error {
198+
preparedStmt := s.Prepare(rawStmt)
199+
defer preparedStmt.Close()
200+
_, err := tx.Stmt(preparedStmt).Exec(finalTargetValue, sourceKey)
201+
return err
202+
}()
198203
if err != nil {
199204
logrus.Infof("Error running %s(%s, %s): %s", rawStmt, finalTargetValue, sourceKey, err)
200205
continue
@@ -214,8 +219,11 @@ func (s *Store) updateExternalInfo(tx db.TxClient, key string, externalUpdateInf
214219
nonLabelDep.TargetFinalFieldName)
215220
// TODO: Try to fold the two blocks together
216221

217-
getStmt := s.Prepare(rawGetStmt)
218-
rows, err := s.QueryForRows(s.ctx, getStmt)
222+
rows, err := func() (db.Rows, error) {
223+
getStmt := s.Prepare(rawGetStmt)
224+
defer getStmt.Close()
225+
return s.QueryForRows(s.ctx, getStmt)
226+
}()
219227
if err != nil {
220228
if !isDBError(err) {
221229
logrus.Infof("Error getting external info for table %s, key %s: %v", nonLabelDep.TargetGVK, key, err)
@@ -239,8 +247,12 @@ func (s *Store) updateExternalInfo(tx db.TxClient, key string, externalUpdateInf
239247
}
240248
rawStmt := fmt.Sprintf(`UPDATE "%s_fields" SET "%s" = ? WHERE key = ?`,
241249
nonLabelDep.SourceGVK, nonLabelDep.TargetFinalFieldName)
242-
preparedStmt := s.Prepare(rawStmt)
243-
_, err = tx.Stmt(preparedStmt).Exec(finalTargetValue, sourceKey)
250+
err = func() error {
251+
preparedStmt := s.Prepare(rawStmt)
252+
defer preparedStmt.Close()
253+
_, err := tx.Stmt(preparedStmt).Exec(finalTargetValue, sourceKey)
254+
return err
255+
}()
244256
if err != nil {
245257
logrus.Infof("Error running %s(%s, %s): %s", rawStmt, finalTargetValue, sourceKey, err)
246258
continue
@@ -260,8 +272,11 @@ func (s *Store) updateExternalInfo(tx db.TxClient, key string, externalUpdateInf
260272
func (s *Store) overrideCheck(finalFieldName, sourceGVK, sourceKey, finalTargetValue string) (bool, error) {
261273
rawGetValueStmt := fmt.Sprintf(`SELECT f."%s" FROM "%s_fields" f WHERE f.key = ?`,
262274
finalFieldName, sourceGVK)
263-
getValueStmt := s.Prepare(rawGetValueStmt)
264-
rows, err := s.QueryForRows(s.ctx, getValueStmt, sourceKey)
275+
rows, err := func() (db.Rows, error) {
276+
getValueStmt := s.Prepare(rawGetValueStmt)
277+
defer getValueStmt.Close()
278+
return s.QueryForRows(s.ctx, getValueStmt, sourceKey)
279+
}()
265280
if err != nil {
266281
logrus.Debugf("Checking the field, got error %s", err)
267282
return false, err

pkg/sqlcache/store/store_test.go

Lines changed: 81 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ func TestAddWithOneUpdate(t *testing.T) {
784784
t.Run(test.description, func(t *testing.T) {
785785
c, txC := SetupMockDB(t)
786786
stmts := NewMockStmt(gomock.NewController(t))
787+
preparedStmt := NewMockStmt(gomock.NewController(t))
787788
store := SetupStoreWithExternalDependencies(t, c, test.updateExternal, test.updateSelf)
788789

789790
c.EXPECT().Serialize(testObject, false).Return(testObjectSerialized, nil)
@@ -799,39 +800,45 @@ func TestAddWithOneUpdate(t *testing.T) {
799800
LEFT OUTER JOIN "_v1_Namespace_labels" lt1 ON f.key = lt1.key
800801
JOIN "management.cattle.io_v3_Project_fields" ex2 ON lt1.value = ex2."metadata.name"
801802
WHERE lt1.label = ? AND f."spec.displayName" != ex2."spec.displayName"`
802-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt))
803+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt)).Return(preparedStmt)
803804
args1 := []any{"field.cattle.io/projectId"}
804-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1)
805+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1)
806+
preparedStmt.EXPECT().Close()
805807
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"lego.cattle.io/fields1", "moose1"}}, nil)
806808
// Override check:
807809
rawStmt2 := `SELECT f."spec.displayName" FROM "_v1_Namespace_fields" f WHERE f.key = ?`
808-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2))
809-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), gomock.Any())
810+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2)).Return(preparedStmt)
811+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, gomock.Any())
812+
preparedStmt.EXPECT().Close()
810813
c.EXPECT().ReadStrings(gomock.Any())
811814

812815
rawStmt2a := `UPDATE "_v1_Namespace_fields" SET "spec.displayName" = ? WHERE key = ?`
813-
c.EXPECT().Prepare(rawStmt2a)
814-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
816+
c.EXPECT().Prepare(rawStmt2a).Return(preparedStmt)
817+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
818+
preparedStmt.EXPECT().Close()
815819
stmts.EXPECT().Exec("moose1", "lego.cattle.io/fields1")
816820

817821
rawStmt3 := `SELECT DISTINCT f.key, ex2."spec.projectName" FROM "_v1_Pods_fields" f
818822
JOIN "provisioner.cattle.io_v3_Cluster_fields" ex2 ON f."field.cattle.io/fixer" = ex2."metadata.name"
819823
WHERE f."spec.projectName" != ex2."spec.projectName"`
820-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3))
824+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3)).Return(preparedStmt)
821825
args2 := []any{}
822-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args2)
826+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args2)
827+
preparedStmt.EXPECT().Close()
823828

824829
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"lego.cattle.io/fields2", "moose2"}}, nil)
825830
// Override check:
826831
rawStmt2 = `SELECT f."spec.projectName" FROM "_v1_Pods_fields" f WHERE f.key = ?`
827-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2))
828-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), gomock.Any())
832+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2)).Return(preparedStmt)
833+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, gomock.Any())
834+
preparedStmt.EXPECT().Close()
829835
c.EXPECT().ReadStrings(gomock.Any())
830836

831837
rawStmt4 := `UPDATE "_v1_Pods_fields" SET "spec.projectName" = ? WHERE key = ?`
832-
c.EXPECT().Prepare(rawStmt4)
833-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
838+
c.EXPECT().Prepare(rawStmt4).Return(preparedStmt)
839+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
834840
stmts.EXPECT().Exec("moose2", "lego.cattle.io/fields2")
841+
preparedStmt.EXPECT().Close()
835842

836843
err := store.Add(testObject)
837844
assert.Nil(t, err)
@@ -850,6 +857,7 @@ func TestAddWithExternalUpdates(t *testing.T) {
850857
tests = append(tests, testCase{description: "Add with no DB client errors", test: func(t *testing.T) {
851858
c, txC := SetupMockDB(t)
852859
stmts := NewMockStmt(gomock.NewController(t))
860+
preparedStmt := NewMockStmt(gomock.NewController(t))
853861
store := SetupStoreWithExternalDependencies(t, c, true, false)
854862

855863
c.EXPECT().Serialize(testObject, false).Return(testObjectSerialized, nil)
@@ -865,41 +873,50 @@ func TestAddWithExternalUpdates(t *testing.T) {
865873
LEFT OUTER JOIN "_v1_Namespace_labels" lt1 ON f.key = lt1.key
866874
JOIN "management.cattle.io_v3_Project_fields" ex2 ON lt1.value = ex2."metadata.name"
867875
WHERE lt1.label = ? AND f."spec.displayName" != ex2."spec.displayName"`
868-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt))
876+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt)).Return(preparedStmt)
869877
args1 := []any{"field.cattle.io/projectId"}
870-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1)
878+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1)
879+
preparedStmt.EXPECT().Close()
871880
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"lego.cattle.io/fields1", "moose1"}}, nil)
872881

882+
// Override check:
873883
rawStmt1b := `SELECT f."spec.displayName" FROM "_v1_Namespace_fields" f WHERE f.key = ?`
874-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt1b))
884+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt1b)).Return(preparedStmt)
875885
args1b := []any{"lego.cattle.io/fields1"}
876-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1b)
886+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1b)
887+
preparedStmt.EXPECT().Close()
877888
c.EXPECT().ReadStrings(gomock.Any()).Return([]string{"flipper"}, nil)
878889

879890
rawStmt2 := `UPDATE "_v1_Namespace_fields" SET "spec.displayName" = ? WHERE key = ?`
880-
c.EXPECT().Prepare(rawStmt2)
881-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
891+
c.EXPECT().Prepare(rawStmt2).Return(preparedStmt)
892+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
893+
preparedStmt.EXPECT().Close()
882894
stmts.EXPECT().Exec("moose1", "lego.cattle.io/fields1")
883895

884896
rawStmt3 := `SELECT DISTINCT f.key, ex2."spec.projectName"
885897
FROM "_v1_Pods_fields" f JOIN "provisioner.cattle.io_v3_Cluster_fields" ex2
886898
ON f."field.cattle.io/fixer" = ex2."metadata.name"
887899
WHERE f."spec.projectName" != ex2."spec.projectName"`
888-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3))
900+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3)).Return(preparedStmt)
889901
args2 := []any{}
890-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args2)
902+
c.EXPECT().QueryForRows(gomock.Any(),
903+
preparedStmt, args2)
904+
preparedStmt.EXPECT().Close()
891905
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"lego.cattle.io/fields2", "moose2"}}, nil)
892906

907+
// Override check:
893908
rawStmt3b := `SELECT f."spec.projectName" FROM "_v1_Pods_fields" f WHERE f.key = ?`
894-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3b))
909+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3b)).Return(preparedStmt)
895910
args3b := []any{"lego.cattle.io/fields2"}
896-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args3b)
911+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args3b)
912+
preparedStmt.EXPECT().Close()
897913
c.EXPECT().ReadStrings(gomock.Any()).Return([]string{"snorkel"}, nil)
898914

899915
rawStmt4 := `UPDATE "_v1_Pods_fields" SET "spec.projectName" = ? WHERE key = ?`
900-
c.EXPECT().Prepare(rawStmt4)
901-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
916+
c.EXPECT().Prepare(rawStmt4).Return(preparedStmt)
917+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
902918
stmts.EXPECT().Exec("moose2", "lego.cattle.io/fields2")
919+
preparedStmt.EXPECT().Close()
903920

904921
err := store.Add(testObject)
905922
assert.Nil(t, err)
@@ -925,6 +942,7 @@ func TestAddWithSelfUpdates(t *testing.T) {
925942
tests = append(tests, testCase{description: "Add with no DB client errors", test: func(t *testing.T) {
926943
c, txC := SetupMockDB(t)
927944
stmts := NewMockStmt(gomock.NewController(t))
945+
preparedStmt := NewMockStmt(gomock.NewController(t))
928946
store := SetupStoreWithExternalDependencies(t, c, false, true)
929947

930948
c.EXPECT().Serialize(testObject, false).Return(testObjectSerialized, nil)
@@ -940,41 +958,49 @@ func TestAddWithSelfUpdates(t *testing.T) {
940958
LEFT OUTER JOIN "_v1_Namespace_labels" lt1 ON f.key = lt1.key
941959
JOIN "management.cattle.io_v3_Project_fields" ex2 ON lt1.value = ex2."metadata.name"
942960
WHERE lt1.label = ? AND f."spec.displayName" != ex2."spec.displayName"`
943-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt))
961+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt)).Return(preparedStmt)
944962
args1 := []any{"field.cattle.io/projectId"}
945-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1)
963+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1)
964+
preparedStmt.EXPECT().Close()
946965
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"lego.cattle.io/fields1", "moose1"}}, nil)
947966

967+
// Override check:
948968
rawStmt1b := `SELECT f."spec.displayName" FROM "_v1_Namespace_fields" f WHERE f.key = ?`
949-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt1b))
969+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt1b)).Return(preparedStmt)
950970
args1b := []any{"lego.cattle.io/fields1"}
951-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1b)
971+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1b)
972+
preparedStmt.EXPECT().Close()
952973
c.EXPECT().ReadStrings(gomock.Any()).Return([]string{"flipper"}, nil)
953974

954975
rawStmt2 := `UPDATE "_v1_Namespace_fields" SET "spec.displayName" = ? WHERE key = ?`
955-
c.EXPECT().Prepare(rawStmt2)
956-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
976+
c.EXPECT().Prepare(rawStmt2).Return(preparedStmt)
977+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
978+
preparedStmt.EXPECT().Close()
957979
stmts.EXPECT().Exec("moose1", "lego.cattle.io/fields1")
958980

959981
rawStmt3 := `SELECT DISTINCT f.key, ex2."spec.projectName"
960982
FROM "_v1_Pods_fields" f JOIN "provisioner.cattle.io_v3_Cluster_fields" ex2
961983
ON f."field.cattle.io/fixer" = ex2."metadata.name"
962984
WHERE f."spec.projectName" != ex2."spec.projectName"`
963-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3))
985+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3)).Return(preparedStmt)
964986
args2 := []any{}
965-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args2)
987+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args2)
988+
preparedStmt.EXPECT().Close()
966989
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"field.cattle.io/fixer", "moose1"}}, nil)
967990

991+
// Override check:
968992
rawStmt3b := `SELECT f."spec.projectName" FROM "_v1_Pods_fields" f WHERE f.key = ?`
969-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3b))
993+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3b)).Return(preparedStmt)
970994
args3b := []any{"field.cattle.io/fixer"}
971-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args3b)
995+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args3b)
996+
preparedStmt.EXPECT().Close()
972997
c.EXPECT().ReadStrings(gomock.Any()).Return([]string{"snorkel"}, nil)
973998

974999
rawStmt4 := `UPDATE "_v1_Pods_fields" SET "spec.projectName" = ? WHERE key = ?`
975-
c.EXPECT().Prepare(rawStmt4)
976-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
1000+
c.EXPECT().Prepare(rawStmt4).Return(preparedStmt)
1001+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
9771002
stmts.EXPECT().Exec("moose1", "field.cattle.io/fixer")
1003+
preparedStmt.EXPECT().Close()
9781004

9791005
err := store.Add(testObject)
9801006
assert.Nil(t, err)
@@ -1000,6 +1026,7 @@ func TestAddWithBothUpdates(t *testing.T) {
10001026
tests = append(tests, testCase{description: "Update both external and self", test: func(t *testing.T) {
10011027
c, txC := SetupMockDB(t)
10021028
stmts := NewMockStmt(gomock.NewController(t))
1029+
preparedStmt := NewMockStmt(gomock.NewController(t))
10031030
store := SetupStoreWithExternalDependencies(t, c, true, true)
10041031

10051032
rawStmt := `SELECT DISTINCT f.key, ex2."spec.displayName" FROM "_v1_Namespace_fields" f
@@ -1027,38 +1054,44 @@ func TestAddWithBothUpdates(t *testing.T) {
10271054
t.Fail()
10281055
}
10291056
})
1030-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt))
1057+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt)).Return(preparedStmt)
10311058
args1 := []any{"field.cattle.io/projectId"}
1032-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1)
1059+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1)
1060+
preparedStmt.EXPECT().Close()
10331061
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"lego.cattle.io/fields1", "moose1"}}, nil)
10341062
// Override check:
10351063
rawStmt2 := `SELECT f."spec.displayName" FROM "_v1_Namespace_fields" f WHERE f.key = ?`
1036-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2))
1064+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2)).Return(preparedStmt)
10371065
args1b := []any{"lego.cattle.io/fields1"}
1038-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args1b)
1066+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args1b)
1067+
preparedStmt.EXPECT().Close()
10391068
c.EXPECT().ReadStrings(gomock.Any())
10401069

10411070
rawStmt2a := `UPDATE "_v1_Namespace_fields" SET "spec.displayName" = ? WHERE key = ?`
1042-
c.EXPECT().Prepare(rawStmt2a)
1043-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
1071+
c.EXPECT().Prepare(rawStmt2a).Return(preparedStmt)
1072+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
1073+
preparedStmt.EXPECT().Close()
10441074
stmts.EXPECT().Exec("moose1", "lego.cattle.io/fields1")
10451075

1046-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3))
1076+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt3)).Return(preparedStmt)
10471077
args2 := []any{}
1048-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args2)
1078+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args2)
1079+
preparedStmt.EXPECT().Close()
10491080

10501081
c.EXPECT().ReadStrings2(gomock.Any()).Return([][]string{{"field.cattle.io/fixer", "moose1"}}, nil)
10511082
// Override check:
10521083
rawStmt2 = `SELECT f."spec.projectName" FROM "_v1_Pods_fields" f WHERE f.key = ?`
1053-
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2))
1084+
c.EXPECT().Prepare(WSIgnoringMatcher(rawStmt2)).Return(preparedStmt)
10541085
args3b := []any{"field.cattle.io/fixer"}
1055-
c.EXPECT().QueryForRows(gomock.Any(), gomock.Any(), args3b)
1086+
c.EXPECT().QueryForRows(gomock.Any(), preparedStmt, args3b)
1087+
preparedStmt.EXPECT().Close()
10561088
c.EXPECT().ReadStrings(gomock.Any())
10571089

10581090
rawStmt4 := `UPDATE "_v1_Pods_fields" SET "spec.projectName" = ? WHERE key = ?`
1059-
c.EXPECT().Prepare(rawStmt4)
1060-
txC.EXPECT().Stmt(gomock.Any()).Return(stmts)
1091+
c.EXPECT().Prepare(rawStmt4).Return(preparedStmt)
1092+
txC.EXPECT().Stmt(preparedStmt).Return(stmts)
10611093
stmts.EXPECT().Exec("moose1", "field.cattle.io/fixer")
1094+
preparedStmt.EXPECT().Close()
10621095
// And again for the other object
10631096
}
10641097

0 commit comments

Comments
 (0)