@@ -177,3 +177,141 @@ func TestIntDiv(t *testing.T) {
177177 })
178178 }
179179}
180+
181+ // Results:
182+ // BenchmarkDivInt-16 10000 695805 ns/op
183+ func BenchmarkDivInt (b * testing.B ) {
184+ require := require .New (b )
185+ ctx := sql .NewEmptyContext ()
186+ div := NewDiv (
187+ NewLiteral (1 , types .Int64 ),
188+ NewLiteral (3 , types .Int64 ),
189+ )
190+ var res interface {}
191+ var err error
192+ for i := 0 ; i < b .N ; i ++ {
193+ res , err = div .Eval (ctx , nil )
194+ require .NoError (err )
195+ }
196+ if dec , ok := res .(decimal.Decimal ); ok {
197+ res = dec .StringFixed (dec .Exponent () * - 1 )
198+ }
199+ exp := "0.3333"
200+ if res != exp {
201+ b .Logf ("Expected %v, got %v" , exp , res )
202+ }
203+ }
204+
205+ // Results:
206+ // BenchmarkDivFloat-16 10000 695044 ns/op
207+ func BenchmarkDivFloat (b * testing.B ) {
208+ require := require .New (b )
209+ ctx := sql .NewEmptyContext ()
210+ div := NewDiv (
211+ NewLiteral (1.0 , types .Float64 ),
212+ NewLiteral (3.0 , types .Float64 ),
213+ )
214+ var res interface {}
215+ var err error
216+ for i := 0 ; i < b .N ; i ++ {
217+ res , err = div .Eval (ctx , nil )
218+ require .NoError (err )
219+ }
220+ exp := 1.0 / 3.0
221+ if res != exp {
222+ b .Logf ("Expected %v, got %v" , exp , res )
223+ }
224+ }
225+
226+ // Results:
227+ // BenchmarkDivHighScaleDecimals-16 10000 694577 ns/op
228+ func BenchmarkDivHighScaleDecimals (b * testing.B ) {
229+ require := require .New (b )
230+ ctx := sql .NewEmptyContext ()
231+ div := NewDiv (
232+ NewLiteral (decimal .NewFromFloat (0.123456789 ), types .MustCreateDecimalType (types .DecimalTypeMaxPrecision , types .DecimalTypeMaxScale )),
233+ NewLiteral (decimal .NewFromFloat (0.987654321 ), types .MustCreateDecimalType (types .DecimalTypeMaxPrecision , types .DecimalTypeMaxScale )),
234+ )
235+ var res interface {}
236+ var err error
237+ for i := 0 ; i < b .N ; i ++ {
238+ res , err = div .Eval (ctx , nil )
239+ require .NoError (err )
240+ }
241+ if dec , ok := res .(decimal.Decimal ); ok {
242+ res = dec .StringFixed (dec .Exponent () * - 1 )
243+ }
244+ exp := "0.124999998860937500014238281250"
245+ if res != exp {
246+ b .Logf ("Expected %v, got %v" , exp , res )
247+ }
248+ }
249+
250+ // Results:
251+ // BenchmarkDivManyInts-16 10000 1151316 ns/op
252+ func BenchmarkDivManyInts (b * testing.B ) {
253+ require := require .New (b )
254+ var div sql.Expression = NewLiteral (1 , types .Int64 )
255+ for i := 2 ; i < 10 ; i ++ {
256+ div = NewDiv (div , NewLiteral (int64 (i ), types .Int64 ))
257+ }
258+ ctx := sql .NewEmptyContext ()
259+ var res interface {}
260+ var err error
261+ for i := 0 ; i < b .N ; i ++ {
262+ res , err = div .Eval (ctx , nil )
263+ require .NoError (err )
264+ }
265+ if dec , ok := res .(decimal.Decimal ); ok {
266+ res = dec .StringFixed (dec .Exponent () * - 1 )
267+ }
268+ exp := "0.000002755731922398589054232804"
269+ if res != exp {
270+ b .Logf ("Expected %v, got %v" , exp , res )
271+ }
272+ }
273+
274+ // Results:
275+ // BenchmarkManyFloats-16 4322 618849 ns/op
276+ func BenchmarkManyFloats (b * testing.B ) {
277+ require := require .New (b )
278+ ctx := sql .NewEmptyContext ()
279+ var div sql.Expression = NewLiteral (1.0 , types .Float64 )
280+ for i := 2 ; i < 10 ; i ++ {
281+ div = NewDiv (div , NewLiteral (float64 (i ), types .Float64 ))
282+ }
283+ var res interface {}
284+ var err error
285+ for i := 0 ; i < b .N ; i ++ {
286+ res , err = div .Eval (ctx , nil )
287+ require .NoError (err )
288+ }
289+ exp := 1.0 / 2.0 / 3.0 / 4.0 / 5.0 / 6.0 / 7.0 / 8.0 / 9.0
290+ if res != exp {
291+ b .Logf ("Expected %v, got %v" , exp , res )
292+ }
293+ }
294+
295+ // Results:
296+ // BenchmarkDivManyDecimals-16 5721 699095 ns/op
297+ func BenchmarkDivManyDecimals (b * testing.B ) {
298+ require := require .New (b )
299+ var div sql.Expression = NewLiteral (decimal .NewFromInt (int64 (1 )), types.DecimalType_ {})
300+ for i := 2 ; i < 10 ; i ++ {
301+ div = NewDiv (div , NewLiteral (decimal .NewFromInt (int64 (i )), types.DecimalType_ {}))
302+ }
303+ ctx := sql .NewEmptyContext ()
304+ var res interface {}
305+ var err error
306+ for i := 0 ; i < b .N ; i ++ {
307+ res , err = div .Eval (ctx , nil )
308+ require .NoError (err )
309+ }
310+ if dec , ok := res .(decimal.Decimal ); ok {
311+ res = dec .StringFixed (dec .Exponent () * - 1 )
312+ }
313+ exp := "0.000002755731922398589054232804"
314+ if res != exp {
315+ b .Logf ("Expected %v, got %v" , exp , res )
316+ }
317+ }
0 commit comments