@@ -560,6 +560,122 @@ def test_timezone_none_use_tz_false(self):
560
560
connection .init_connection_state ()
561
561
562
562
563
+ def check_numpy ():
564
+ """Check if numpy is installed."""
565
+
566
+ try :
567
+ import numpy as _
568
+ except ImportError :
569
+ return False
570
+
571
+ return True
572
+
573
+ class ColumnarTestCase (TransactionTestCase ):
574
+ available_apps = ["backends" ]
575
+ databases = {"default" , "s2r1" }
576
+
577
+ def test_columnar_query (self ):
578
+ sql = """
579
+ SELECT number, number*2, number*3, number*4, number*5
580
+ FROM system.numbers
581
+ LIMIT 10
582
+ """
583
+ with connections ["s2r1" ].cursor () as cursorWrapper :
584
+ cursorWrapper .cursor .columnar = True
585
+ cursorWrapper .execute (sql )
586
+ self .assertEqual (
587
+ cursorWrapper .fetchall (),
588
+ [
589
+ (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ),
590
+ (0 , 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 ),
591
+ (0 , 3 , 6 , 9 , 12 , 15 , 18 , 21 , 24 , 27 ),
592
+ (0 , 4 , 8 , 12 , 16 , 20 , 24 , 28 , 32 , 36 ),
593
+ (0 , 5 , 10 , 15 , 20 , 25 , 30 , 35 , 40 , 45 ),
594
+ ],
595
+ )
596
+
597
+ cursorWrapper .execute (sql )
598
+ self .assertEqual (
599
+ cursorWrapper .fetchmany (2 ),
600
+ [
601
+ (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ),
602
+ (0 , 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 ),
603
+ ],
604
+ )
605
+
606
+ actual_results = [
607
+ r
608
+ for results in iter (lambda : cursorWrapper .fetchmany (2 ), [])
609
+ for r in results
610
+ ]
611
+ self .assertEqual (
612
+ actual_results ,
613
+ [
614
+ (0 , 3 , 6 , 9 , 12 , 15 , 18 , 21 , 24 , 27 ),
615
+ (0 , 4 , 8 , 12 , 16 , 20 , 24 , 28 , 32 , 36 ),
616
+ (0 , 5 , 10 , 15 , 20 , 25 , 30 , 35 , 40 , 45 ),
617
+ ],
618
+ )
619
+
620
+ cursorWrapper .execute (sql )
621
+ self .assertEqual (
622
+ cursorWrapper .fetchone (),
623
+ (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ),
624
+ )
625
+ cursorWrapper .cursor .columnar = False
626
+
627
+
628
+ @unittest .skipUnless (check_numpy (), "numpy is not installed" )
629
+ def test_use_numpy_query (self ):
630
+ sql = """
631
+ SELECT toDateTime32('2022-01-01 01:00:05', 'UTC'), number, number*2.5
632
+ FROM system.numbers
633
+ LIMIT 3
634
+ """
635
+ import numpy as np
636
+
637
+ with connections ["s2r1" ].cursor () as cursorWrapper :
638
+ cursorWrapper .cursor .columnar = True
639
+ cursorWrapper .cursor .use_numpy = True
640
+ cursorWrapper .execute (sql )
641
+ np .testing .assert_equal (
642
+ cursorWrapper .fetchall (),
643
+ [
644
+ np .array ([np .datetime64 ('2022-01-01T01:00:05' ), np .datetime64 ('2022-01-01T01:00:05' ), np .datetime64 ('2022-01-01T01:00:05' )], dtype = 'datetime64[s]' ),
645
+ np .array ([0 , 1 , 2 ], dtype = np .uint64 ),
646
+ np .array ([0 , 2.5 , 5.0 ], dtype = np .float64 )
647
+ ],
648
+ )
649
+
650
+ cursorWrapper .execute (sql )
651
+ np .testing .assert_equal (
652
+ cursorWrapper .fetchmany (2 ),
653
+ [
654
+ np .array ([np .datetime64 ('2022-01-01T01:00:05' ), np .datetime64 ('2022-01-01T01:00:05' ), np .datetime64 ('2022-01-01T01:00:05' )], dtype = 'datetime64[s]' ),
655
+ np .array ([0 , 1 , 2 ], dtype = np .uint64 ),
656
+ ],
657
+ )
658
+
659
+ actual_results = [
660
+ r
661
+ for results in iter (lambda : cursorWrapper .fetchmany (2 ), [])
662
+ for r in results
663
+ ]
664
+ np .testing .assert_equal (
665
+ actual_results ,
666
+ [
667
+ np .array ([0 , 2.5 , 5 ], dtype = np .float64 ),
668
+ ],
669
+ )
670
+
671
+ cursorWrapper .execute (sql )
672
+ np .testing .assert_equal (
673
+ cursorWrapper .fetchone (),
674
+ np .array ([np .datetime64 ('2022-01-01T01:00:05' ), np .datetime64 ('2022-01-01T01:00:05' ), np .datetime64 ('2022-01-01T01:00:05' )], dtype = 'datetime64[s]' ),
675
+ )
676
+ cursorWrapper .cursor .columnar = False
677
+ cursorWrapper .cursor .use_numpy = False
678
+
563
679
# These tests aren't conditional because it would require differentiating
564
680
# between MySQL+InnoDB and MySQL+MYISAM (something we currently can't do).
565
681
class FkConstraintsTests (TransactionTestCase ):
0 commit comments