@@ -66,7 +66,7 @@ func testExecQuery(t *testing.T, query string, args []interface{}) {
6666}
6767
6868// testGetRows runs a statement and returns the rows as [][]interface{}
69- func testGetRows (t * testing.T , stmt * sql.Stmt , args []interface {}) ([][]interface {}, error ) {
69+ func testGetRows (t testing.TB , stmt * sql.Stmt , args []interface {}) ([][]interface {}, error ) {
7070 // get rows
7171 ctx , cancel := context .WithTimeout (context .Background (), TestContextTimeout )
7272 defer cancel ()
468468 _ , err = stmt .ExecContext (ctx )
469469 cancel ()
470470 expected := "ORA-01013"
471- if err == nil || len (err .Error ()) < len (expected ) || err .Error ()[: len ( expected )] != expected {
471+ if err == nil || len (err .Error ()) < len (expected ) || ! strings . Contains ( err .Error (), expected ) {
472472 t .Fatalf ("stmt exec - expected: %v - received: %v" , expected , err )
473473 }
474474
488488 ctx , cancel = context .WithTimeout (context .Background (), 200 * time .Millisecond )
489489 _ , err = stmt .QueryContext (ctx )
490490 cancel ()
491- if err == nil || len (err .Error ()) < len (expected ) || err .Error ()[: len ( expected )] != expected {
491+ if err == nil || len (err .Error ()) < len (expected ) || ! strings . Contains ( err .Error (), expected ) {
492492 t .Fatalf ("stmt query - expected: %v - received: %v" , expected , err )
493493 }
494494
@@ -1475,6 +1475,104 @@ func benchmarkPrefetchSelect(b *testing.B, prefetchRows int64, prefetchMemory in
14751475 }
14761476}
14771477
1478+ // TestSelectParallelWithStatementCaching checks parallel select from dual but with statement caching enabled
1479+ func TestSelectParallelWithStatementCaching (t * testing.T ) {
1480+ if TestDisableDatabase {
1481+ t .SkipNow ()
1482+ }
1483+ db := testGetDB ("?stmt_cache_size=100" )
1484+ if db == nil {
1485+ t .Fatal ("db is null" )
1486+ }
1487+
1488+ var waitGroup sync.WaitGroup
1489+ waitGroup .Add (50 )
1490+
1491+ for i := 0 ; i < 50 ; i ++ {
1492+ go func (num int ) {
1493+ defer waitGroup .Done ()
1494+
1495+ selectNumFromDual (t , db , float64 (num ))
1496+ }(i )
1497+ }
1498+
1499+ waitGroup .Wait ()
1500+ }
1501+
1502+ // selectNumFromDual will execute a "select :1 from dual" where the parameter is the num param of this function
1503+ func selectNumFromDual (t testing.TB , db * sql.DB , num float64 ) {
1504+ ctx , cancel := context .WithTimeout (context .Background (), TestContextTimeout )
1505+ stmt , err := db .PrepareContext (ctx , "select :1 from dual" )
1506+ cancel ()
1507+ if err != nil {
1508+ t .Fatal ("prepare error:" , err )
1509+ }
1510+ defer func () {
1511+ if stmt != nil {
1512+ err := stmt .Close ()
1513+ if err != nil {
1514+ t .Fatal ("stmt close error:" , err )
1515+ }
1516+ }
1517+ }()
1518+
1519+ var result [][]interface {}
1520+ result , err = testGetRows (t , stmt , []interface {}{num })
1521+ if err != nil {
1522+ t .Fatal ("get rows error:" , err )
1523+ }
1524+ if result == nil {
1525+ t .Fatal ("result is nil" )
1526+ }
1527+ if len (result ) != 1 {
1528+ t .Fatal ("len result not equal to 1" )
1529+ }
1530+ if len (result [0 ]) != 1 {
1531+ t .Fatal ("len result[0] not equal to 1" )
1532+ }
1533+ data , ok := result [0 ][0 ].(float64 )
1534+ if ! ok {
1535+ t .Fatal ("result not float64" )
1536+ }
1537+ if data != num {
1538+ t .Fatal ("result not equal to:" , num )
1539+ }
1540+ }
1541+
1542+ func BenchmarkSelectNoCaching (b * testing.B ) {
1543+ if TestDisableDatabase || TestDisableDestructive {
1544+ b .SkipNow ()
1545+ }
1546+ for i := 0 ; i < b .N ; i ++ {
1547+ selectNumFromDual (b , TestDB , float64 (i ))
1548+ }
1549+ }
1550+
1551+ func BenchmarkSelectWithCaching (b * testing.B ) {
1552+ b .StopTimer ()
1553+
1554+ if TestDisableDatabase || TestDisableDestructive {
1555+ b .SkipNow ()
1556+ }
1557+
1558+ db := testGetDB ("?stmt_cache_size=100" )
1559+ if db == nil {
1560+ b .Fatal ("db is null" )
1561+ }
1562+
1563+ defer func () {
1564+ err := db .Close ()
1565+ if err != nil {
1566+ b .Fatal ("db close error:" , err )
1567+ }
1568+ }()
1569+
1570+ b .StartTimer ()
1571+ for i := 0 ; i < b .N ; i ++ {
1572+ selectNumFromDual (b , db , float64 (i ))
1573+ }
1574+ }
1575+
14781576func BenchmarkPrefetchR0M32768 (b * testing.B ) {
14791577 b .StopTimer ()
14801578
0 commit comments