zmc
2023-10-12 ed135d79df12a2466b52dae1a82326941211dcc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
U
­ý°dÒã@sÆdZddlmZddlZddlmZddlZddlmZmZmZm    Z    ddl
m Z ddl m Z ddlZddlZddlZddlmZddlmmZdd    lmZmZddlZdd
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'm(Z)dd l*m+Z+m,Z,dd l-m.Z.dd l/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8zddl9Z9dZ:Wne;k
r\dZ:YnXddddœddddœddddœdœZ<ddœdd„Z=d d!d"œd#d$„Z>d!dd%œd&d'„Z?d(d)„Z@ddœd*d+„ZAd d,d-œd.d/„ZBd,dd0œd1d2„ZCd3d4œd5d6„ZDdd7œd8d9„ZEejFd:d;„ƒZGejFd<d=„ƒZHejFd>d?„ƒZIejFd@dA„ƒZJejFdBdC„ƒZKejFdDdE„ƒZLejFdFdG„ƒZMejFdHdI„ƒZNejFdJdK„ƒZOejFdLdM„ƒZPejFdNdO„ƒZQejFdPdQ„ƒZRejFdRdS„ƒZSejFdTdU„ƒZTejFdVdW„ƒZUejFdXdY„ƒZVejFdZd[„ƒZWdEdGgZXdIdKgZYdOdQdMgZZdUdWdSgZ[eXeYeZZ\eXeYe[Z]e\dYgZ^e]d[gZ_ej`jaej` bd\e^¡d]d^„ƒƒZcej`jaej` bd\e^¡d_d`„ƒƒZdej`jaej` bd\e^¡dadb„ƒƒZeej`jaej` bd\e^¡ej` bdcdddg¡dedf„ƒƒƒZfej`jaej` bd\e^¡ej` bdgdhdig¡djdk„ƒƒƒZgej`jaej` bd\e^¡dldm„ƒƒZhej`jaej` bd\e_¡dndo„ƒƒZiej`jaej` bd\e_¡dpdq„ƒƒZjej`jaej` bd\e]¡drds„ƒƒZkej`jaej` bd\e_¡dtdu„ƒƒZlej`jaej` bd\e]¡dvdw„ƒƒZmej`jaej` bd\e]¡dxdy„ƒƒZnej`jaej` bd\e\¡dzd{„ƒƒZoej`jaej` bd\eX¡d|d}„ƒƒZpej`jaej` bd\eX¡d~d„ƒƒZqej`jaej` bd\eY¡ej` bd€dd‚g¡dƒd„„ƒƒƒZrd…d†„Zsd‡dˆ„ZtGd‰dŠ„dŠƒZuGd‹dŒ„dŒeuƒZvGddŽ„dŽeuƒZwGdd„dƒZxGd‘d’„d’exƒZyej`jze: d“d”Gd•d–„d–eweyƒƒZ{Gd—d˜„d˜eveyƒZ|ej`jze: d“d”Gd™dš„dšewexƒƒZ}Gd›dœ„dœe}ƒZ~ej`jaGddž„dže}ƒƒZej`jaGdŸd „d e}ƒƒZ€Gd¡d¢„d¢evexƒZed£j‚eƒd£j‚ej„d£j‚e…d£j‚e†d¤j‚e‡d¥j‚eˆdƒd¦d§„ej‰d¨j‚eŠd©j‚i    Z‹dªd«„ZŒd°d¬d­„ZGd®d¯„d¯ƒZŽdS)±a·SQL io tests
 
The SQL tests are broken down in different classes:
 
- `PandasSQLTest`: base class with common methods for all test classes
- Tests for the public API (only tests with sqlite3)
    - `_TestSQLApi` base class
    - `TestSQLApi`: test the public API with sqlalchemy engine
    - `TestSQLiteFallbackApi`: test the public API with a sqlite DBAPI
      connection
- Tests for the different SQL flavors (flavor specific type conversions)
    - Tests for the sqlalchemy mode: `_TestSQLAlchemy` is the base class with
      common methods. The different tested flavors (sqlite3, MySQL,
      PostgreSQL) derive from the base class
    - Tests for the fallback mode (`TestSQLiteFallback`)
 
é)Ú annotationsN)Úclosing)ÚdateÚdatetimeÚtimeÚ    timedelta)ÚStringIO©ÚPath)Úlib)Úis_datetime64_dtypeÚis_datetime64tz_dtype)
Ú    DataFrameÚIndexÚ
MultiIndexÚSeriesÚ    TimestampÚconcatÚ
date_rangeÚisnaÚ to_datetimeÚ to_timedelta)ÚArrowStringArrayÚ StringArray)ÚVersion)Úsql)ÚSQLAlchemyEngineÚ SQLDatabaseÚSQLiteDatabaseÚ
get_engineÚpandasSQL_builderÚread_sql_queryÚread_sql_tableTFz1SELECT * FROM iris WHERE Name=? AND SepalLength=?z7SELECT * FROM iris WHERE `Name`=%s AND `SepalLength`=%sz7SELECT * FROM iris WHERE "Name"=%s AND "SepalLength"=%s)ÚsqliteÚmysqlÚ
postgresqlz]
                SELECT * FROM iris WHERE Name=:name AND SepalLength=:length
                zw
                SELECT * FROM iris WHERE
                `Name`=%(name)s AND `SepalLength`=%(length)s
                zw
                SELECT * FROM iris WHERE
                "Name"=%(name)s AND "SepalLength"=%(length)s
                z&SELECT * FROM iris WHERE Name LIKE '%'z(SELECT * FROM iris WHERE `Name` LIKE '%'z(SELECT * FROM iris WHERE "Name" LIKE '%')Úread_parametersÚread_named_parametersÚread_no_parameters_with_percentÚstr)Údialectc
Cspddlm}m}m}m}m}m}|dkr,|n|}|ƒ}|d||d|ƒ|d|ƒ|d|ƒ|d|ƒ|d    |d
ƒƒƒ}    |    S) Nr)ÚREALÚColumnÚFloatÚMetaDataÚStringÚTabler%ÚirisÚ SepalLengthÚ
SepalWidthZ PetalLengthZ
PetalWidthÚNameéÈ)Ú
sqlalchemyr+r,r-r.r/r0)
r*r+r,r-r.r/r0ÚdtypeÚmetadatar1©r9úOd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/tests/io/test_sql.pyÚiris_table_metadatams      ù    r;zsqlite3.Connectionr
)ÚconnÚ    iris_filec    CsT| ¡}d}| |¡|jdd(}t |¡}t|ƒd}| ||¡W5QRXdS)Nz³CREATE TABLE iris (
            "SepalLength" REAL,
            "SepalWidth" REAL,
            "PetalLength" REAL,
            "PetalWidth" REAL,
            "Name" TEXT
        )©Únewlinez&INSERT INTO iris VALUES(?, ?, ?, ?, ?))ÚcursorÚexecuteÚopenÚcsvÚreaderÚnextÚ executemany)r<r=ÚcurÚstmtÚcsvfilerDr9r9r:Úcreate_and_load_iris_sqlite3…s
 
rJ)r=r*c
sþddlm}ddlm}t|ƒ}|jddÈ}t |¡}t|ƒ‰‡fdd„|Dƒ}||ƒ     |¡}    t
||ƒr¸|  ¡>}|  ¡*|j |dd|j|d    | |    ¡W5QRXW5QRXn8|  ¡*|j |dd|j|d    | |    ¡W5QRXW5QRXdS)
Nr©Úinsert©ÚEnginer>csg|]}ttˆ|ƒƒ‘qSr9©ÚdictÚzip©Ú.0Úrow©Úheaderr9r:Ú
<listcomp>Ÿsz(create_and_load_iris.<locals>.<listcomp>T©Z
checkfirst©Úbind)r6rLÚsqlalchemy.enginerNr;rBrCrDrEÚvaluesÚ
isinstanceÚconnectÚbeginÚdropÚcreaterA)
r<r=r*rLrNr1rIrDÚparamsrHr9rUr:Úcreate_and_load_iris–s$  
 
 
 
  
 rcc
Cs¤d}t|tjƒr$| ¡}| |¡n|ddlm}ddlm}||ƒ}t||ƒr‚|     ¡$}| 
¡| |¡W5QRXW5QRXn| 
¡| |¡W5QRXdS)Nz+CREATE VIEW iris_view AS SELECT * FROM irisr©ÚtextrM) r]Úsqlite3Ú
Connectionr@rAr6rer[rNr^r_)r<rHrGrerNr9r9r:Úcreate_and_load_iris_view®s    
 
 
 
rhc CsÂddlm}m}m}m}m}m}m}m}|dkr4|n|}    |dkrD|n|}
|ƒ} |d| |d|ƒ|d|    ƒ|d|ƒ|d|ƒ|d    |ƒ|d
|ƒ|d |
ƒ|d |ƒ|d |
ƒƒ } |dkr¾|      |d|ddƒ¡| S)Nr)ÚTEXTÚBooleanr,ÚDateTimer-ÚIntegerr.r0r#ÚtypesÚTextColÚDateColÚ
IntDateColÚIntDateOnlyColÚFloatColÚIntColÚBoolColÚIntColWithNullÚBoolColWithNullr%Ú DateColWithTzT)Útimezone)
r6rirjr,rkr-rlr.r0Z append_column) r*rirjr,rkr-rlr.r0Z    date_typeZ    bool_typer8rmr9r9r:Útypes_table_metadataÁs(( õ ryz
list[dict])r<Ú
types_datacCs*| ¡}d}| |¡d}| ||¡dS)Na”CREATE TABLE types (
                    "TextCol" TEXT,
                    "DateCol" TEXT,
                    "IntDateCol" INTEGER,
                    "IntDateOnlyCol" INTEGER,
                    "FloatCol" REAL,
                    "IntCol" INTEGER,
                    "BoolCol" INTEGER,
                    "IntColWithNull" INTEGER,
                    "BoolColWithNull" INTEGER
                )zY
            INSERT INTO types
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)
            )r@rArF)r<rzrGrHr9r9r:Úcreate_and_load_types_sqlite3âs
 
r{)rzr*c
CsÂddlm}ddlm}t|ƒ}||ƒ |¡}t||ƒr†| ¡>}| ¡*|j    |dd|j
|d|  |¡W5QRXW5QRXn8| ¡*|j    |dd|j
|d|  |¡W5QRXdS)NrrKrMTrXrY) r6rLr[rNryr\r]r^r_r`rarA)r<rzr*rLrNrmrHr9r9r:Úcreate_and_load_typesøs  
 
 
  
 r|r©ÚframecCsP|jdj}|jd}t|tjƒs&t‚t |j    dddddg¡|j
dksLt‚dS)Nrçffffff@ç @çffffffö?皙™™™™É?ú Iris-setosa))é–é)ér…) ÚdtypesÚtypeÚilocÚ
issubclassÚnpÚfloatingÚAssertionErrorÚtmÚ equalContentsr\Úshape)r~ZpytyperTr9r9r:Úcheck_iris_frame s
 
r‘)Ú
table_namec
Csâd|›}t|tjƒr0| ¡}| |¡ ¡dSddlm}ddlm    }t|t
ƒršz:||ƒ}|  ¡ }|  |¡ ¡W5QR£W¢ SQRXW5|  ¡XnDt||ƒrÐ|  ¡}|  |¡ ¡W5QR£SQRXn|  |¡ ¡SdS)Nz SELECT count(*) AS count_1 FROM r)Ú create_enginerM)r]rfrgr@rAÚfetchoner6r“r[rNr)Údisposer^Úexec_driver_sqlZ
scalar_one)r<r’rHrGr“rNÚenginer9r9r:Ú
count_rowss 
 
 
( 
 
"r˜cCs|ddddƒ}t|ƒS)NÚioÚdatarCziris.csvr    )ÚdatapathÚ    iris_pathr9r9r:rœ+srœc Cs4ddddddddddd    œ
dd
d d dddddd d    œ
gS)NÚfirstú2000-01-03 00:00:00iwði’·2g333333$@éFz2000-01-01 00:00:00-08:00)
rnrorprqrrrsrtrurvrwú2000-01-04 00:00:00i'âPi\¸2z2000-06-01 00:00:00-07:00r9r9r9r9r:rz1s.ö öórzc
Cs2ddddddddddœ    }t|ƒ}|| ¡ |¡S)Nr)Úint64Úfloat)    rnrorprqrrrsrtrurv)rÚkeysÚastype)rzr‡Údfr9r9r:Útypes_data_frameOs÷ r¦cCs&dddddg}dddd    g}t||d
S) NÚindexÚAÚBÚCÚD)ržgNÿ\^ï?g9\›x`| @g%ÚTO׿gá(nIŽò¿)r gî}ÒCÄð?çc×^ÜV¥¿g~q"B¶Ä¿gˆ”æÐ4Ë?)ú2000-01-05 00:00:00gGà Í¿èß?ç2r¹eç?gˆŽ>ݦ4á¿gёöÙRŠõ?)ú2000-01-06 00:00:00gÔ?{mXìñ?ç$ôó­ùù?gnk3¥AÓm?g Ø
S«›å?©Úcolumns©r©r²ršr9r9r:Ú test_frame1`sêrµcCs"dddg}ddddg}t||dS)    Nr§r¨r©)ržiÿÿÿgZØÓÍÿ¿)r iãÿÿÿr¬)r­i Nr®)r¯i͏ûÿr°r±r³r´r9r9r:Ú test_frame3„s
ür¶c    
csÊt d¡}t d¡}|jdd|jjji|jjd}| |¡}|     d¡sRt
||dƒ|     d¡s||D]}|  d    ¡q`t ||dƒ|V|  ¡.}| ¡| d
¡}| |¡W5QRXW5QRX| ¡dS) Nr6Úpymysqlz*mysql+pymysql://root@localhost:3306/pandasÚ client_flag)Ú connect_argsÚ    poolclassr1r$rmrwú DROP TABLE IF EXISTS test_frame;)ÚpytestÚ importorskipr“Ú    constantsÚCLIENTÚMULTI_STATEMENTSÚpoolÚNullPoolÚinspectÚ    has_tablercÚpopr|r^r_rerAr•)    rœrzr6r·r—ÚinspÚentryr<rHr9r9r:Úmysql_pymysql_engines(
 
 ý
 
 
 
 
 
rÈc    cs| ¡ }|VW5QRXdS©N©r^)rÈr<r9r9r:Úmysql_pymysql_conn¨s
rËc
csªt d¡}t d¡|jd|jjd}| |¡}| d¡sFt||dƒ| d¡s\t||dƒ|V|     ¡.}| 
¡|  d¡}|  |¡W5QRXW5QRX|  ¡dS)    Nr6Úpsycopg2z=postgresql+psycopg2://postgres:postgres@localhost:5432/pandas©rºr1r%rmr»)r¼r½r“rÁrÂrÃrÄrcr|r^r_rerAr•)rœrzr6r—rÆr<rHr9r9r:Úpostgresql_psycopg2_engine®s"
 
þ
 
 
 
 
 
rÎc    cs| ¡ }|VW5QRXdSrÉrÊ)rÎr<r9r9r:Úpostgresql_psycopg2_connÃs
rÏc    cs,t d¡t ¡}d|VW5QRXdS)Nr6ú
sqlite:///)r¼r½rŽÚ ensure_clean©Únamer9r9r:Ú
sqlite_strÉs
 
rÔccs.t d¡}|j||jjd}|V| ¡dS)Nr6rÍ)r¼r½r“rÁrÂr•)rÔr6r—r9r9r:Ú sqlite_engineÐs
rÕc    cs| ¡ }|VW5QRXdSrÉrÊ)rÕr<r9r9r:Ú sqlite_connØs
rÖcCs,t d¡}| |¡}t||dƒ| ¡|S)Nr6r#)r¼r½r“rcr•)rÔrœr6r—r9r9r:Úsqlite_iris_strÞs
 
 
 r×cCst||dƒ|S)Nr#)rc)rÕrœr9r9r:Úsqlite_iris_engineçs rØc    cs| ¡ }|VW5QRXdSrÉrÊ)rØr<r9r9r:Úsqlite_iris_connís
rÙc
cs6t t d¡¡}| }|VW5QRXW5QRXdS©Nú:memory:)Ú
contextlibrrfr^)Z closing_connr<r9r9r:Úsqlite_buildinósrÝcCst||ƒ|SrÉ)rJ)rÝrœr9r9r:Úsqlite_buildin_irisús
rÞr<cCs | |¡}|jd|ddddS)NÚtestÚappendF©Ú    if_existsr§)ÚgetfixturevalueÚto_sql)r<rµÚrequestr9r9r:Útest_dataframe_to_sql"s
ræc    Cs’t d¡ttjdgddtjtdddƒgddtjtdƒgddtjdgd    dd
œƒ}| |¡}tj    t
d d |j d |dddW5QRXdS)NÚpyarrowrŸz int8[pyarrow]©r7éçútimestamp[ns][pyarrow]zduration[ns][pyarrow]Úazstring[pyarrow])ÚintrrÚstringzthe 'timedelta'©ÚmatchÚ
test_arrowÚreplaceFrá) r¼r½rÚpdÚarrayrrrãrŽÚassert_produces_warningÚ UserWarningrä©r<rår¥r9r9r:Ú"test_dataframe_to_sql_arrow_dtypes*s
 ÿúÿ
 
r÷cCsLt d¡tdtjtdddƒ|gddiƒ}| |¡}|jd|dd    d
dS) NrçrrérŸrêrèrðrñFrá)r¼r½rròrórrãrä)r<råZ nulls_fixturer¥r9r9r:Ú*test_dataframe_to_sql_arrow_dtypes_missing>s
ÿÿÿ
røÚmethodZmultic    CsZ| |¡}t|dd$}|j|d|d| d¡s6t‚W5QRXt|dƒt|ƒksVt‚dS)NT©Zneed_transactionÚ
test_frame©rù©rãr rärÄrr˜Úlen)r<rùrµråÚ    pandasSQLr9r9r:Ú test_to_sqlNs
 
rzmode, num_row_coef)rñrŸ)ràéc    Csn| |¡}t|dd4}|j|ddd|j|d|d| d¡sFt‚W5QRXt|dƒ|t|ƒksjt‚dS)NTrúrûÚfail©rârý)r<ÚmodeZ num_row_coefrµrårÿr9r9r:Útest_to_sql_existYs 
rc
Csr| |¡}t|ddR}|j|ddd| d¡s6t‚d}tjt|d|j|dddW5QRXW5QRXdS)NTrúrûrrz!Table 'test_frame' already existsrî)rãr rärÄrr¼ÚraisesÚ
ValueError)r<rµrårÿÚmsgr9r9r:Útest_to_sql_exist_failes
r    cCs\| |¡}td|ƒ}t|ƒt d|¡}t|ƒt d|¡}|jdksJt‚d|jksXt‚dS)NúSELECT * FROM irisúSELECT * FROM iris where 0=1©rr…r3)rãr!r‘ròÚread_sqlrrr²©r<råÚ
iris_framer9r9r:Útest_read_iris_queryrs
 
  rcCst| |¡}ttd|ddƒ}t|ƒttjd|ddƒ}t|ƒttjd|ddƒ}|jdksbt‚d|jkspt‚dS)Nr
é©Ú    chunksizer r r3)    rãrr!r‘ròr rrr²rr9r9r:Útest_read_iris_query_chunksizes
rc
Cs‚| |¡}ddlm}m}m}m}|ƒ}t|tƒr:||ƒn|}|d||d}t||ƒ|dddœd}    t    |    ƒt|tƒr~| 
¡dS)    Nr)r.r0r“Úselectr1)Z autoload_withrƒr©rÓÚlength©rb) rãr6r.r0r“rr]r)r!r‘r•)
r<rår.r0r“rr8Z autoload_conr1rr9r9r:Ú.test_read_iris_query_expression_with_parameterŒs
ÿ
rcCsVtd ¡D]\}}||kr q2q td|›dƒ‚| |¡}t||dd}t|ƒdS)Nr&z No part of z( found in SQL_STRINGS['read_parameters']©rƒrr)Ú SQL_STRINGSÚitemsÚKeyErrorrãr!r‘)r<råÚdbÚqueryrr9r9r:Ú*test_read_iris_query_string_with_parameter¢s
r cCs4| |¡}td|ƒ}t|ƒt d|¡}t|ƒdS©Nr1)rãr"r‘ròr rr9r9r:Útest_read_iris_table¯s
 
 
 r"cCsD| |¡}ttd|ddƒ}t|ƒttjd|ddƒ}t|ƒdS)Nr1rr)rãrr"r‘ròr rr9r9r:Útest_read_iris_table_chunksizeºs
 
r#c    sx| |¡}g‰‡fdd„}t|dd$}|j|d|d| d¡sFt‚W5QRXˆdgks^t‚t|dƒt|ƒkstt‚dS)Ncs2ˆ d¡‡fdd„|Dƒ}| |j ¡|¡dS)NrŸcsg|]}ttˆ|ƒƒ‘qSr9rOrR©r£r9r:rWÍsz8test_to_sql_callable.<locals>.sample.<locals>.<listcomp>)ràrAÚtablerL)Zpd_tabler<r£Ú    data_iterrš©Úcheckr$r:ÚsampleËs
z$test_to_sql_callable.<locals>.sampleTrúrûrürŸrý)r<rµrår)rÿr9r'r:Útest_to_sql_callableÄs
 r*cCsˆ| |¡}t d|¡}t|jjjtjƒs,t    ‚t|j
jjtj ƒsBt    ‚t|j jjtj ƒsXt    ‚t|j jjtjƒsnt    ‚t|jjjtjƒs„t    ‚dS©Nrm)rãrr"rŠrrr7rˆr‹rŒrrsÚintegerrtrurvrör9r9r:Útest_default_type_conversion×s
 r-c    
Csè| |¡}ddlm}ddlm}tdddgddd    gd
œƒ}|jd |d d d}||ƒ}t||ƒr–| ¡$}|     ¡| 
|¡W5QRXW5QRXn|     ¡| 
|¡W5QRXt   d|¡}t  ||¡t  d|¡}t  ||¡dS)NrrdrMrŸré皙™™™™¹?r‚g333333Ó?©rëÚbrûF©r§z}DROP PROCEDURE IF EXISTS get_testdb;
 
    CREATE PROCEDURE get_testdb ()
 
    BEGIN
        SELECT * FROM test_frame;
    ENDzCALL get_testdb();)rãr6rer[rNrrär]r^r_rArr!rŽÚassert_frame_equalr )    r<rårerNr¥ÚprocZ engine_connÚres1Úres2r9r9r:Útest_read_procedureês"
 
 
 
 
   r7Úexpected_countrzSuccess!cs„‡fdd„}| |¡}tddgddgddgd    œƒ}|jd
|d |d }tˆtƒs\|dksht‚n |ˆksht‚t d
|¡}t     ||¡dS) Nc     s–|j}| ¡~}tƒ}t |¡}| |¡| d¡d dd„|Dƒ¡}|jrb|j›d|j    ›}    n|j    }    d|    ›d|›d}
|j
|
|d    W5QRXˆS)
Nrz, cSsg|]}d|›d‘qS)ú"r9)rSÚkr9r9r:rW szVtest_copy_from_callable_insertion_method.<locals>.psql_insert_copy.<locals>.<listcomp>Ú.zCOPY z (z) FROM STDIN WITH CSV)rÚfile) Ú
connectionr@rrCÚwriterÚ    writerowsÚseekÚjoinÚschemarÓZ copy_expert) r%r<r£r&Z
dbapi_connrGZs_bufr>r²r’Z    sql_query©r8r9r:Úpsql_insert_copys
 
 
 
zBtest_copy_from_callable_insertion_method.<locals>.psql_insert_copyrŸrr/r‚rëÚn©Úcol1Úcol2Zcol3rûF)r§rù)
rãrrär]rìrrr"rŽr3)r<r8rårDÚexpectedÚ result_countÚresultr9rCr:Ú(test_copy_from_callable_insertion_methods 
ÿ
  rLc
CsDtjtdd,tjtddt d|¡W5QRXW5QRXdS)Nz+pandas.io.sql.execute requires a connectionrîúP`pandas.io.sql.execute` is deprecated and will be removed in the future version.úselect * from iris)r¼rÚ    TypeErrorrŽrôÚ FutureWarningrrA)rØr9r9r:Útest_execute_typeerror8s þrQc    Cs*tjtddt d|¡W5QRXdS)NrMrîrN)rŽrôrPrrA)rÞr9r9r:Útest_execute_deprecatedBs
þrRc@seZdZdd„ZdS)Ú    MixInBasec    CsŒt|dƒr|j ¡z | ¡}Wntjjtjfk
r>YnJX|>| |¡D]}|     ||¡qP| 
|¡D]}|  ||¡qlW5QRXdS)Nr<) Úhasattrr<Úcloser^r6ÚexcÚOperationalErrorrfÚ_get_all_viewsÚ    drop_viewÚ_get_all_tablesÚ
drop_table)Úselfr<ÚviewÚtblr9r9r:Úteardown_methodMs
 
 zMixInBase.teardown_methodN)Ú__name__Ú
__module__Ú __qualname__r_r9r9r9r:rSLsrSc@s4eZdZdd„Zdd„Zdd„Zdd„Zd    d
„Zd S) Ú SQLiteMixIncCs
t d¡SrÚ©rfr^©r\r9r9r:r^_szSQLiteMixIn.connectcCs"| dt |¡›¡| ¡dS©NzDROP TABLE IF EXISTS ©rArÚ_get_valid_sqlite_nameÚcommit©r\r’r<r9r9r:r[bszSQLiteMixIn.drop_tablecCs| d¡}dd„| ¡DƒS)Nz1SELECT name FROM sqlite_master WHERE type='table'cSsg|] }|d‘qS©rr9)rSr%r9r9r:rWhsz/SQLiteMixIn._get_all_tables.<locals>.<listcomp>©rAÚfetchall©r\r<Úcr9r9r:rZfs
zSQLiteMixIn._get_all_tablescCs"| dt |¡›¡| ¡dS©NzDROP VIEW IF EXISTS rg)r\Ú    view_namer<r9r9r:rYjszSQLiteMixIn.drop_viewcCs| d¡}dd„| ¡DƒS)Nz0SELECT name FROM sqlite_master WHERE type='view'cSsg|] }|d‘qSrkr9)rSr]r9r9r:rWpsz.SQLiteMixIn._get_all_views.<locals>.<listcomp>rlrnr9r9r:rXns
zSQLiteMixIn._get_all_viewsN)r`rarbr^r[rZrYrXr9r9r9r:rc^s
rcc@s@eZdZedd„ƒZdd„Zdd„Zdd„Zd    d
„Zd d „Z    d S)ÚSQLAlchemyMixIncCs|j ¡dSrÉ)r—r•©Úclsr9r9r:Úteardown_classtszSQLAlchemyMixIn.teardown_classcCs
|j ¡SrÉ)r—r^rer9r9r:r^xszSQLAlchemyMixIn.connectc    Cs<| ¡r| ¡ ¡| ¡t |¡ |¡W5QRXdSrÉ)Úin_transactionÚget_transactionÚrollbackr_rrr[rjr9r9r:r[{s 
zSQLAlchemyMixIn.drop_tablecCsddlm}||ƒ ¡S©Nr©rÃ)r6rÃZget_table_names©r\r<rÃr9r9r:rZs zSQLAlchemyMixIn._get_all_tablesc    CsL|jjj |¡}| ¡r$| ¡ ¡| ¡| d|›¡W5QRXdSrp)    r—r*Zidentifier_preparerZquote_identifierrvrwrxr_r–)r\rqr<Z quoted_viewr9r9r:rY†s
ÿ 
zSQLAlchemyMixIn.drop_viewcCsddlm}||ƒ ¡Sry)r6rÃZget_view_namesr{r9r9r:rXs zSQLAlchemyMixIn._get_all_viewsN)
r`rarbÚ classmethodrur^r[rZrYrXr9r9r9r:rrss
    rrc@sjeZdZdZdd„Zdd„Zdd„Zdd    „Zd
d „Zd d „Z    ddd„Z
dd„Z dd„Z dd„Z dd„ZdS)Ú PandasSQLTestzT
    Base class with common private methods for SQLAlchemy and fallback cases.
 
    cCs>| d|j¡t|jtjƒr*t|j|ƒnt|j||jƒdSr!)r[r<r]rfrgrJrcÚflavor)r\rœr9r9r:Úload_iris_data›szPandasSQLTest.load_iris_datacCs\|jdkr|D]}| d¡qt|jtjƒrHdd„|Dƒ}t|j|ƒnt|j||jƒdS)Nr%rwcSsg|]}t| ¡ƒ‘qSr9)Útupler\)rSrÇr9r9r:rW§sz1PandasSQLTest.load_types_data.<locals>.<listcomp>)r~rÅr]r<rfrgr{r|)r\rzrÇr9r9r:Úload_types_data¢s
 zPandasSQLTest.load_types_datacCs.td|j}d}|jj||d}t|ƒdS)Nr&rr©rr~rÿÚ
read_queryr‘©r\rrbrr9r9r:Ú_read_sql_iris_parameter¬sz&PandasSQLTest._read_sql_iris_parametercCs4td|j}dddœ}|jj||d}t|ƒdS)Nr'rƒrrrr‚r„r9r9r:Ú_read_sql_iris_named_parameter²s
z,PandasSQLTest._read_sql_iris_named_parametercCs*td|j}|jj|dd}t|ƒdS)Nr(rr‚)r\rrr9r9r:Ú(_read_sql_iris_no_parameter_with_percent¸sz6PandasSQLTest._read_sql_iris_no_parameter_with_percentcCs2| d|j¡|j |jdd…d¡dks.t‚dS)Nrµr)r[r<rÿrär‰r©r\rµr9r9r:Ú _to_sql_empty½szPandasSQLTest._to_sql_emptyÚautocKsr| d|j¡|jj|dfd|i|—Ždks0t‚|j d¡s@t‚t|ƒ}t|jdƒ}||ks`t‚| d|j¡dS)z `to_sql` with the `engine` paramrµr—éN)r[r<rÿrärrÄrþr˜)r\rµr—Z engine_kwargsÚ num_entriesÚnum_rowsr9r9r:Ú_to_sql_with_sql_engineÁs"ÿÿÿýÿ  z%PandasSQLTest._to_sql_with_sql_enginecCsV| d|j¡|j |d¡dks$t‚|j d¡}|jdddd|j_t     
||¡dS)NÚtest_frame_roundtripr‹ú"SELECT * FROM test_frame_roundtripÚlevel_0T©Zinplace) r[r<rÿrärrƒÚ    set_indexr§rÓrŽr3©r\rµrKr9r9r:Ú
_roundtripÕs  zPandasSQLTest._roundtripcCs.|j d¡}| ¡}t |dddddg¡dS©Nr
rr€rr‚rƒ)rÿrAr”rŽr)r\Ú iris_resultsrTr9r9r:Ú _execute_sqlás zPandasSQLTest._execute_sqlcCsPtjddgdddgdgd}|j |d¡dks2t‚| d¡}|dggksLt‚dS)    N©rŸçÍÌÌÌÌÌ@Zline1©rçø?Zline2r¨r©rª©r²r§Ztest_to_sql_saves_indexr)rÚ from_recordsrÿrärÚ_get_index_columns)r\r¥Úix_colsr9r9r:Ú_to_sql_save_indexçsÿ
z PandasSQLTest._to_sql_save_indexc    Cs$|j ¡@}d}t|jtƒr(| |¡nddlm}||ƒ}| |¡W5QRXGdd„dtƒ}d}t|jtƒr„ddlm}||ƒ}z,|j ¡}| |¡|dƒ‚W5QRXWn|k
rÄYnX|j     d¡}t
|ƒdksât ‚|j ¡}| |¡W5QRX|j     d¡}t
|ƒd    ks t ‚dS)
Nz'CREATE TABLE test_trans (A INT, B TEXT)rrdc@s eZdZdS)z7PandasSQLTest._transaction_test.<locals>.DummyExceptionN)r`rarbr9r9r9r:ÚDummyExceptionúsr¢z/INSERT INTO test_trans (A,B) VALUES (1, 'blah')ÚerrorzSELECT * FROM test_transrŸ) rÿZrun_transactionr]rrAr6reÚ    Exceptionrrƒrþr)r\ZtransrHrer¢Zins_sqlÚresr6r9r9r:Ú_transaction_testïs0       
   zPandasSQLTest._transaction_testN)rŠ)r`rarbÚ__doc__rrr…r†r‡r‰rŽr•r˜r¡r¦r9r9r9r:r}•s
 
 r}c
@s¢eZdZUdZdZded<ejdddd„ƒZd    d
„Z    d d „Z
d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zej d#d$d%d&g¡ej d'ejd(d)fejd*d+fejd(d)fejd*d+fg¡d,d-„ƒƒZd.d/„Zd0d1„Zd2d3„Zej d4d5d6d7d8d9d:g¡d;d<„ƒZ d=d>„Z!d?d@„Z"ej dAdBe#e$e#e$dCœg¡dDdE„ƒZ%dFdG„Z&dHdI„Z'dJdK„Z(dLdM„Z)dNdO„Z*dPdQ„Z+dRdS„Z,dTdU„Z-dVdW„Z.dBS)XÚ _TestSQLApiañ
    Base class to test the public API.
 
    From this two classes are derived to run these tests for both the
    sqlalchemy mode (`TestSQLApi`) and the fallback mode
    (`TestSQLiteFallbackApi`).  These tests are run with sqlite3. Specific
    tests for the different sql flavours are included in `_TestSQLAlchemy`.
 
    Notes:
    flavor can always be passed even in SQLAlchemy mode,
    should be correctly ignored.
 
    we don't use drop_table because that isn't part of the public api
 
    r#r)rT©ZautousecCs*| ¡|_| |¡| |¡| ¡dSrÉ)r^r<rrÚload_test_data_and_sql©r\rœrzr9r9r:Ú setup_method,s
 
 
z_TestSQLApi.setup_methodcCst|jƒdSrÉ)rhr<rer9r9r:rª3sz"_TestSQLApi.load_test_data_and_sqlcCst d|j¡}t|ƒdS)NzSELECT * FROM iris_view)rr!r<r‘©r\rr9r9r:Útest_read_sql_view6sz_TestSQLApi.test_read_sql_viewcCs8d}tj||jdd}t ||j¡}t t|ƒ|¡dS)Nz/SELECT * FROM iris_view WHERE SepalLength < 0.0r…r)rr!r<rŽr3r)r\rZ
with_batchZ without_batchr9r9r:Ú&test_read_sql_with_chunksize_no_result:sz2_TestSQLApi.test_read_sql_with_chunksize_no_resultcCs&t |d|j¡t d|j¡s"t‚dS)Nrµ)rrär<rÄrrˆr9r9r:r@sz_TestSQLApi.test_to_sqlc    Cs\tj|d|jddt d|j¡s&t‚d}tjt|dtj|d|jddW5QRXdS)NÚ test_frame2rrz"Table 'test_frame2' already existsrî)rrär<rÄrr¼rr©r\rµrr9r9r:Útest_to_sql_failDs
z_TestSQLApi.test_to_sql_failcCs^tj|d|jddtj|d|jddt d|j¡s:t‚t|ƒ}t|jdƒ}||ksZt‚dS)Nr¶rrrñ)rrär<rÄrrþr˜©r\rµrŒrr9r9r:Útest_to_sql_replaceLs  z_TestSQLApi.test_to_sql_replacecCsrtj|d|jdddkst‚tj|d|jdddks8t‚t d|j¡sJt‚dt|ƒ}t|jdƒ}||ksnt‚dS)NÚ test_frame4rrr‹ràr)rrär<rrÄrþr˜r³r9r9r:Útest_to_sql_appendWsÿ  z_TestSQLApi.test_to_sql_appendcCs2tj|d|jddt d|j¡}t ||¡dS)NZ test_frame5Fr2zSELECT * FROM test_frame5)rrär<r rŽr3)r\r¶rKr9r9r:Útest_to_sql_type_mappingesz$_TestSQLApi.test_to_sql_type_mappingcCsLttjddddd}tj|d|jddt d    |j¡}t |     ¡|¡dS)
Nr…r¡rèZseriesrÒZ test_seriesFr2zSELECT * FROM test_series)
rr‹Úarangerrär<r!rŽr3Úto_frame)r\ÚsÚs2r9r9r:Útest_to_sql_seriesksz_TestSQLApi.test_to_sql_seriescCs\tj|d|jdtjd|jd}|j|_|jddd|j t¡d|j_t     
||¡dS)Nr©Úconrr‘Tr’) rrär<r!r§r“r¤rìrÓrŽr3r”r9r9r:Útest_roundtripqs z_TestSQLApi.test_roundtripcCs6tj|d|jdddtjd|jd}t ||¡dS)NrFr)r¾r§rrr½)rrär<r!rŽr3r”r9r9r:Útest_roundtrip_chunksize|sûz$_TestSQLApi.test_roundtrip_chunksizec    CsDt |j¡}| d¡}W5QRX| ¡}t |dddddg¡dSr–)rr r<rAr”rŽr)r\Ú
pandas_sqlr—rTr9r9r:Útest_execute_sql‡sz_TestSQLApi.test_execute_sqlc    Csòt d|j¡}t|jjjtjƒr$t    ‚tjd|jdgd}t|jjjtjƒsNt    ‚|j 
¡t ddddddƒt ddddddƒgks€t    ‚tjd|jdd    id}t|jjjtjƒs¬t    ‚|j 
¡t ddddddƒt ddddddƒgksÞt    ‚tjd|jd
gd}t|j jjtjƒs
t    ‚|j  
¡t d d d dddƒt ddddddƒgks>t    ‚tjd|jd
did}t|j jjtjƒslt    ‚|j  
¡t d d d dddƒt ddddddƒgks t    ‚tjd|jddid}t|j jjtjƒsÎt    ‚|j  
¡t dƒt dƒgksît    ‚dS)NúSELECT * FROM typesro©Ú parse_datesiÐrŸr.rr‹ú%Y-%m-%d %H:%M:%SrpiÂé éiÝrºrqz%Y%m%dz
2010-10-10z
2010-12-12)rr!r<rŠror7rˆr‹Ú
datetime64rÚtolistrrprq©r\r¥r9r9r:Útest_date_parsingŽshÿþ
ýþ
ÿþ ÿþ ýþz_TestSQLApi.test_date_parsingr£ÚignoreÚraiseÚcoercezread_sql, text, moderÃ)r6Úfallbackrmr6cCs@|j|kr<| ddi¡}|||jdd|iid}t ||¡dS)Nrozdatetime64[ns]Úerrors)r¾rÅ)rr¤r<rŽr3)r\r rerr£r¦rIrKr9r9r:Útest_custom_dateparsing_errorÅs
ÿýz)_TestSQLApi.test_custom_dateparsing_errorcCsHtjd|jdddgd}t|jjjtjƒs.t    ‚t|j
jjtjƒsDt    ‚dS)NrÃrorp)Ú    index_colrÅ) rr!r<rŠr§r7rˆr‹rÉrrprËr9r9r:Útest_date_and_indexãsüz_TestSQLApi.test_date_and_indexc    Cstttddgddƒ ¡}t t¡| d|j¡}W5QRX|dksHt‚t     
d|j¡}t  |d|d  d¡¡dS)    Nz00:00:01z00:00:03ÚfoorÒÚtest_timedeltarzSELECT * FROM test_timedeltar¡) rrr¹rŽrôrõrär<rrr!Úassert_series_equalr])r\r¥rJrKr9r9r:rÖðs   z_TestSQLApi.test_timedeltac    CsHtdddgiƒ}d}tjt|d| d|j¡dks:t‚W5QRXdS)Nrëyð?ð?y@zComplex datatypes not supportedrîZ test_complex)rr¼rrrär<r)r\r¥rr9r9r:Útest_complex_raisesùsz_TestSQLApi.test_complex_raiseszindex_name,index_label,expected)NNr§)NÚ other_labelrÙ)Ú
index_nameNrÚ)rÚrÙrÙ)rNÚ0)NrrÛcCsTtdtdƒiƒ}||j_d}tj|d|j|dt ||j¡}|jd|ksPt    ‚dS)NrGr‹úSELECT * FROM test_index_labelÚtest_index_label©Ú index_labelr)
rÚranger§rÓrrär<r!r²r)r\rÚrßrIÚ
temp_framerr~r9r9r:Útest_to_sql_index_labelÿs z#_TestSQLApi.test_to_sql_index_labelc    Csªd}tdtdƒit ddg¡d}t |d|j¡}||ks>t‚t d|j¡}|j    dd    ks^t‚|j    d
d kspt‚tj|d|jd d dgd}||ks–t‚t d|j¡}|j    dd… 
¡d dgksÂt‚d dg|j _ tj|d|jd d}||ksît‚t d|j¡}|j    dd… 
¡d dgkst‚tj|d|jd ddgd}||ksDt‚t d|j¡}|j    dd… 
¡ddgksrt‚d}t jt|dtj|d|jd ddW5QRXdS)Nr‹rG)ZA0ÚA1)ZB0ZB1r2rÝrÜrr‘rŸZlevel_1rñr¨r©)rârßrrrªr«zALength of 'index_label' should match number of levels, which is 2rî)rràrZ from_productrrär<rr!r²rÊr§Únamesr¼rr)r\Zexpected_row_countrárKr~rr9r9r:Ú"test_to_sql_index_label_multiindexsb
 þ û  ÿ  û ûz._TestSQLApi.test_to_sql_index_label_multiindexcCsVtjddgdddgddgd}| d|j¡tjd|jddgd    }tj||d
d dS) Nr™r›r¨r©rªrÚtest_multiindex_roundtripz'SELECT * FROM test_multiindex_roundtrip©rÓT©Zcheck_index_type)rržrär<rr!rŽr3©r\r¥rKr9r9r:ræQsýÿz%_TestSQLApi.test_multiindex_roundtripr7N©r¨r©cCs^tddgddggddgd}| d|j¡d    ks2t‚| |¡}tjd
|j|d }t ||¡dS) Nç333333ó?g333333 @çffffff@g333333@r¨r©r±Útest_dtype_argumentrz$SELECT A, B FROM test_dtype_argument©r¾r7)    rrär<rr¤rr!rŽr3)r\r7r¥rIrKr9r9r:rí^s 
ÿz_TestSQLApi.test_dtype_argumentcCs4tddgddggddgd}tj|d|jdd    dS)
NrŸrr.r‹rr±Ztest_frame_integer_col_namesrñr)rrrär<rËr9r9r:Útest_integer_col_namesssz"_TestSQLApi.test_integer_col_namescCs"tj|d|jd}d|kst‚dS)Nrßr½ÚCREATE©rÚ
get_schemar<r©r\rµÚ
create_sqlr9r9r:Útest_get_schemawsz_TestSQLApi.test_get_schemacCs$tj|d|jdd}d|ks t‚dS)NrßÚpypi)r¾rBzCREATE TABLE pypi.rñrór9r9r:Útest_get_schema_with_schema{sz'_TestSQLApi.test_get_schema_with_schemacCsj|jdkrddlm}|}nd}tddgddgd    œƒ}tj|d
|jd |id }d |ksZt‚d|ksft‚dS)Nr6r)rlÚINTEGER皙™™™™ñ?rërš皙™™™™@r0rßr1rîrð)rr6rlrrròr<r)r\rlr7Z float_framerôr9r9r:Útest_get_schema_dtypes€s
 ÿ z"_TestSQLApi.test_get_schema_dtypescCsftddgddgdœƒ}tj|d|jdd}d    }||ks:t‚tj|d|jd
d gd}d }||ksbt‚dS) Nrùrëršrú)ÚCol1ZCol2rßrü)r¾r£z'CONSTRAINT test_pk PRIMARY KEY ("Col1")r¨r©z)CONSTRAINT test_pk PRIMARY KEY ("A", "B"))rrròr<r)r\rµr~rôZconstraint_sentencer9r9r:Útest_get_schema_keyss z _TestSQLApi.test_get_schema_keyscCsttj dd¡tdƒd}|jd|jddt d|j¡}tƒ}d    }ddddd
g}tjd|jdd D]0}t    ||gd d }t
|ƒ||ksŒt ‚|d7}qdt   ||¡|jdkrtƒ}d    }ddddd
g}tjd|jdd D]2}t    ||gd d }t
|ƒ||kst ‚|d7}qØt   ||¡dS)Nér…Zabcder±Ztest_chunksizeFr2zselect * from test_chunksizerrrT©Z ignore_indexrŸr6)rr‹ÚrandomZrandnÚlisträr<rr!rrþrrŽr3rr")r\r¥r5r6ÚiÚsizesÚchunkÚres3r9r9r:Útest_chunksize_readšs0ÿ
 
 
z_TestSQLApi.test_chunksize_readcCsdtdddgdddgdœƒ}| ¡}|d d¡|d<|jd    |jd
d t d |j¡}t ||¡dS) NrŸrr.z John P. Doez    Jane Dove)Z    person_idÚ person_namerÚcategoryÚtest_categoricalFr2zSELECT * FROM test_categorical)    rÚcopyr¤rär<rr!rŽr3)r\r¥Údf2r¥r9r9r:r    ¼sþÿz_TestSQLApi.test_categoricalcCs2tddgddggddgd}|jd|jd    d
dS) NrŸrr.r‹õér1r±Z test_unicodeFr2)rrär<rËr9r9r:Útest_unicode_column_nameÍsz$_TestSQLApi.test_unicode_column_namecCsLtdddgdtjdgdœƒ}|jd|jdd    t d
|j¡}t ||¡dS) NrrŸrr‚rìrêzd1187b08-4943-4c8d-a7f6Fr2z'SELECT * FROM `d1187b08-4943-4c8d-a7f6`)    rr‹Únanrär<rr!rŽr3©r\r¥r¥r9r9r:Útest_escaped_table_nameÒsz#_TestSQLApi.test_escaped_table_name)/r`rarbr§r~Ú__annotations__r¼Úfixturer¬rªr®r¯rr²r´r¶r·r¼r¿rÀrÂrÌÚmarkÚ parametrizerr r!r"rÒrÔrÖrØrârårærìr¢rírïrõr÷rûrýrr    r rr9r9r9r:r¨s‚
 
 
   7
 
ý
øþ      ôþ
9 üþ    
 "r¨zSQLAlchemy not installed©Úreasonc@sôeZdZdZdZdZedd„ƒZdd„Zdd    „Z    d
d „Z
d d „Z dd„Z dd„Z dd„Zej ddddddddddddd d!d"ee e¡jd#kr’d$nd%fg¡d&d'„ƒZej d(d)d*g¡d+d,„ƒZd-d.„Ze d/¡d0d1„ƒZd2d3„Zd4d5„Zd6d7„Zd8S)9Ú
TestSQLApizŸ
    Test the public API as it would be used directly
 
    Tests for `read_sql_table` are included here, as this is specific for the
    sqlalchemy mode.
 
    r#r6cCst d¡|_dS©Nzsqlite:///:memory:©r6r“r—rsr9r9r:Ú setup_classészTestSQLApi.setup_classcCs@t |d|j¡ddg}tjd|j|d}|j ¡|ks<t‚dS)Nrûr¨r©r±)rrär<r"r²rÊr)r\rµÚcolsrKr9r9r:Útest_read_table_columnsísz"TestSQLApi.test_read_table_columnscCs¨t |d|j¡tjd|jdd}|jjdgks4t‚tjd|jddgd}|jjddgks^t‚tjd|jddgddgd}|jjddgksŽt‚|j ¡ddgks¤t‚dS)    Nrûr§rçr¨r©rªr«)rÓr²)    rrär<r"r§rärr²rÊr”r9r9r:Útest_read_table_index_colõsÿz$TestSQLApi.test_read_table_index_colcCsTt d|j¡}t d|j¡}t ||¡t d|j¡}t d|j¡}t ||¡dS)Nr
r1)rr!r<r rŽr3r")r\Ú iris_frame1Ú iris_frame2r9r9r:Útest_read_sql_delegates  z!TestSQLApi.test_read_sql_delegatec CsÌddlm}ddlm}|dƒ|dƒg}|D]h}t|j|ƒrr|j ¡$}| ¡| |¡W5QRXW5QRXq,|j ¡|j |¡W5QRXq,t     
d¡"t   d|j¡t   d|j¡W5QRXdS)NrrdrMz,CREATE TABLE invalid (x INTEGER, y UNKNOWN);z0CREATE TABLE other_table (x INTEGER, y INTEGER);Z other_tablezSELECT * FROM other_table)r6rer[rNr]r<r^r_rArŽrôrr"r!)r\rerNZ
query_listrr<r9r9r:Útest_not_reflect_all_tabless  þ  
   z&TestSQLApi.test_not_reflect_all_tablesc    CsVtjtddt |j¡ dd¡W5QRXt d¡| d|j¡W5QRXdS)Nz¶The provided table name 'TABLE1' is not found exactly as such in the database after writing the table, possibly due to case sensitivity issues. Consider using lower case table names.rîZTABLE1ÚZ CaseSensitive)rŽrôrõrrr<Zcheck_case_sensitiverärˆr9r9r:Ú(test_warning_case_insensitive_table_name$sý z3TestSQLApi.test_warning_case_insensitive_table_namecCs6ddlm}|j |j¡}| d¡}dd„|Dƒ}|S)Nr)Ú
reflectionZtest_index_savedcSsg|] }|d‘qS©Z column_namesr9©rSrr9r9r:rW9sz1TestSQLApi._get_index_columns.<locals>.<listcomp>)r[r$Z    InspectorZ from_enginer<Ú get_indexes)r\Útbl_namer$rÆÚixsr9r9r:rŸ4s
 
zTestSQLApi._get_index_columnscCs\ddlm}tdtddgddiƒ}t |j¡}tjd||d    }t|j    j
dj |ƒsXt ‚dS)
Nr)Ú    TIMESTAMPrú2014-12-12 01:54ú2014-12-11 02:54T©ÚutcÚ    test_typer}) r6r*rrrrr<ÚSQLTabler]r%rorˆr)r\r*r¥rr%r9r9r:Útest_sqlalchemy_type_mapping<s ÿ z'TestSQLApi.test_sqlalchemy_type_mappingzinteger, expected)Zint8ÚSMALLINT)ZInt8r2)Zuint8r2)ZUInt8r2)Úint16r2)ZInt16r2)Zuint16rø)ZUInt16rø)Úint32rø)ZInt32rø)Zuint32ÚBIGINT)ZUInt32r5)r¡r5)ÚInt64r5r¡r5røcCsPtddgdg|d}t |j¡}tjd||d}t|jjjj    ƒ}||ksLt
‚dS)NrrŸrë©r²r7r/r}) rrrr<r0r)r%rorërˆr)r\r,rIr¥rr%rKr9r9r:Útest_sqlalchemy_integer_mappingHs
 z*TestSQLApi.test_sqlalchemy_integer_mappingr,Zuint64ZUInt64c    CsNtddgdg|d}t |j¡}tjtddtjd||dW5QRXdS)    NrrŸrër7z1Unsigned 64 bit integer datatype is not supportedrîr/r})rrrr<r¼rrr0)r\r,r¥rr9r9r:Ú(test_sqlalchemy_integer_overload_mappinges ÿz3TestSQLApi.test_sqlalchemy_integer_overload_mappingc        Cs‚t ¡L}d|}d}|j||dddt ||¡}t ||¡}d}t ||¡}W5QRXt ||¡t ||¡t ||¡dS)NrÐr1rñFrár
)rŽrÑrärr r"r!r3)    r\rµrÓÚdb_urir%r°r¶rrµr9r9r:Útest_database_uri_stringos
    z#TestSQLApi.test_database_uri_stringÚpg8000c    Cs.d}tjtddt d|¡W5QRXdS)Nz)postgresql+pg8000://user:pass@host/dbnamer<rîzselect * from table©r¼rÚ ImportErrorrr )r\r:r9r9r:Ú(test_pg8000_sqlalchemy_passthrough_error€sz3TestSQLApi.test_pg8000_sqlalchemy_passthrough_errorcCsHddlm}|dƒ}tj||jddid}t|dƒ}|dhksDt‚dS)Nrrdz#select * from iris where name=:namerÓzIris-versicolorrr4)r6rerr r<Úsetr)r\reZ    name_textÚiris_dfÚ    all_namesr9r9r:Útest_query_by_text_objˆs
  z!TestSQLApi.test_query_by_text_objcCshddlm}m}t|jƒ}||ƒ |jj|dƒk¡}tj    ||j
ddid}t |dƒ}|dhksdt ‚dS)Nr)Ú    bindparamrrÓrƒrr4) r6rDrr;r~Úwhereror4rr r<r@r)r\rDrr1Z name_selectrArBr9r9r:Útest_query_by_select_obj‘s 
 z#TestSQLApi.test_query_by_select_objcCsJtdddgdddgdœƒ}|jd|jd    d
t d|j¡}t ||¡dS) NrrŸrr.r‹r…)r¨z %_variationZtest_column_percentageFr2)rrär<rr"rŽr3rr9r9r:Útest_column_with_percentagežsz&TestSQLApi.test_column_with_percentageN)r`rarbr§r~rr|rrrr r!r#rŸr1r¼rrrìr‹r7rÓr8r9r;ÚtdZskip_if_installedr?rCrFrGr9r9r9r:rÜsP
     ñþ
    
    
     rc@szeZdZdZdZdZddd„Zdd„Zej    j
e d    d
d d „ƒZ ej    j
e d    d
d d„ƒZ dd„Zdd„Zdd„Zdd„ZdS)ÚTestSQLiteFallbackApiz9
    Test the public sqlite connection fallback API
 
    r#rÐrÛcCs
t |¡SrÉrd)r\Zdatabaser9r9r:r^±szTestSQLiteFallbackApi.connectc
Cs~t ¡`}t| |¡ƒ }tj|d|dddks4t‚W5QRXt| |¡ƒ}t d|¡}W5QRXW5QRXt ||¡dS)NZtest_frame3_legacyFr2r‹z!SELECT * FROM test_frame3_legacy;)    rŽrÑrr^rrärr!r3)r\r¶rÓr<rKr9r9r:Útest_sql_open_close´s
ÿÿ z)TestSQLiteFallbackApi.test_sql_open_closezSQLAlchemy is installedrc    Cs2d}d}tjt|dt d|¡W5QRXdS)Nzmysql://root@localhost/pandasz-Using URI string without sqlalchemy installedrîr
r=)r\r<rr9r9r:Útest_con_string_import_errorÄsz2TestSQLiteFallbackApi.test_con_string_import_errorc
CsNGdd„dƒ}t |dƒ¡(}t t¡t d|¡W5QRXW5QRXdS)Nc@s*eZdZddœdd„Zdd„Zdd„Zd    S)
z~TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnectionÚNone©Úreturnc_stj||Ž|_dSrÉ)rfrgr<)r\ÚargsÚkwargsr9r9r:Ú__init__Ðsz‡TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__init__cSs t|j|ƒSrÉ)Úgetattrr<)r\rÓr9r9r:Ú __getattr__ÓszŠTestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.__getattr__cSs|j ¡dSrÉ)r<rUrer9r9r:rUÖsz„TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installed.<locals>.MockSqliteConnection.closeN)r`rarbrQrSrUr9r9r9r:ÚMockSqliteConnectionÏsrTrÛzSELECT 1)rÜrrŽrôrõrr )r\rTr<r9r9r:ÚJtest_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installedËs
 z`TestSQLiteFallbackApi.test_con_unknown_dbapi2_class_does_not_error_without_sql_alchemy_installedc    CsZt d|j¡}t d|j¡}t ||¡d}tjtj|dt d|j¡W5QRXdS)Nr
z9Execution failed on sql 'iris': near "iris": syntax errorrîr1)    rr!r<r rŽr3r¼rÚ DatabaseError)r\rrrr9r9r:r Ýs  z,TestSQLiteFallbackApi.test_read_sql_delegatecCst |d¡}d|kst‚dS)Nrßrð)rròrrór9r9r:Útest_get_schema2æs z&TestSQLiteFallbackApi.test_get_schema2cCsJ| d¡D]*}| ¡d d¡|kr
| ¡dSq
td|›dƒ‚dS)NÚ
rr9rŸzColumn ú
 not found)ÚsplitÚstripr)r\rBÚcolumnÚcolr9r9r:Ú_get_sqlite_column_typeësz-TestSQLiteFallbackApi._get_sqlite_column_typecCsTtdtddgddiƒ}t |j¡}tjd||d}| ¡}| |d¡dksPt‚dS)    Nrr+r,Tr-r/r}r*)    rrrrr<Z SQLiteTableZ
sql_schemar^r)r\r¥rr%rBr9r9r:Útest_sqlite_type_mappingñsÿ z.TestSQLiteFallbackApi.test_sqlite_type_mappingN)rÛ)r`rarbr§r~rr^rJr¼rÚskipifÚSQLALCHEMY_INSTALLEDrKrUr rWr^r_r9r9r9r:rI¨s
 
 
    rIc@speZdZUdZded<edd„ƒZejdddd    „ƒZ    ed
d „ƒZ
ed d „ƒZ dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Z d8d9„Z!d:d;„Z"d<d=„Z#d>d?„Z$d@dA„Z%dBdC„Z&dDdE„Z'dFdG„Z(dHdI„Z)dJdK„Z*dLdM„Z+dNdO„Z,dPdQ„Z-ej. /dRdSe0j1gidSe0j1 gie0j1 gdTgdUœg¡dVdW„ƒZ2dXdY„Z3dZd[„Z4d\d]„Z5d^d_„Z6d`da„Z7dbdc„Z8ej. /dddedfg¡dgdh„ƒZ9ej. /dddedig¡djdk„ƒZ:ej. /dddedidfg¡dldm„ƒZ;dndoœdpdq„Z<dndoœdrds„Z=dtdu„Z>ej. /dve?j@dwg¡ej. /dddedfg¡dxdy„ƒƒZAdzS){Ú_TestSQLAlchemyz¶
    Base class for testing the sqlalchemy backend.
 
    Subclasses for specific database types are created below. Tests that
    deviate for each flavor are overwritten there.
 
    r)r~cCs| ¡| ¡dSrÉ)Ú setup_driverÚ setup_enginersr9r9r:r sz_TestSQLAlchemy.setup_classTr©cCsdz|j ¡|_t |j¡|_Wn,tjjk
rJt     
d|j ›d¡YnX|  |¡|  |¡dS)NzCan't connect to z server)r—r^r<rrrÿr6rVrWr¼Úskipr~rrr«r9r9r:r¬s 
z_TestSQLAlchemy.setup_methodcCs
tƒ‚dSrÉ©ÚNotImplementedErrorrsr9r9r:rcsz_TestSQLAlchemy.setup_drivercCs
tƒ‚dSrÉrfrsr9r9r:rdsz_TestSQLAlchemy.setup_enginecCs | ¡dSrÉ©r…rer9r9r:Útest_read_sql_parameter#sz'_TestSQLAlchemy.test_read_sql_parametercCs | ¡dSrÉ©r†rer9r9r:Útest_read_sql_named_parameter&sz-_TestSQLAlchemy.test_read_sql_named_parametercCs| |¡dSrÉ©r‰rˆr9r9r:Útest_to_sql_empty)sz!_TestSQLAlchemy.test_to_sql_emptyc    Cszddlm}| ¡}tddddgddddgdœƒ}tj|dd    }| |d
¡d ksVt‚W5QRX||ƒ}| d
¡svt‚dS) Nrrzçð?ç@ç@ç@©ZoneZtwoTrúrár‹)    r6rÃr^rrrrärrÄ©r\rÃZ    temp_connrárÿrÆr9r9r:Útest_create_table,s ÿz!_TestSQLAlchemy.test_create_tablecCs¤ddlm}| ¡}tddddgddddgdœƒ}t |¡}| |d¡d    ksPt‚||ƒ}| d¡sft‚|     d¡z | 
¡Wnt k
rYnX| d¡r t‚dS)
Nrrzrnrorprqrrrár‹) r6rÃr^rrrrärrÄr[Ú clear_cacheÚAttributeErrorrsr9r9r:Útest_drop_table9s ÿ
 
 z_TestSQLAlchemy.test_drop_tablecCs| |¡dSrÉ©r•rˆr9r9r:r¿Msz_TestSQLAlchemy.test_roundtripcCs | ¡dSrÉ©r˜rer9r9r:rÂPsz _TestSQLAlchemy.test_execute_sqlcCstjd|jd}t|ƒdS)Nr1r½)rr"r<r‘r­r9r9r:Útest_read_tableSsz_TestSQLAlchemy.test_read_tablecCs.tjd|jddgd}t |jjddg¡dS)Nr1r2)r¾r²)rr"r<rŽrr²r\r­r9r9r:rWs ÿz'_TestSQLAlchemy.test_read_table_columnsc    Cs2d}tjt|dtjd|jdW5QRXdS)Nz!Table this_doesnt_exist not foundrîZthis_doesnt_existr½)r¼rrrr"r<)r\rr9r9r:Útest_read_table_absent_raises]sz-_TestSQLAlchemy.test_read_table_absent_raisescCs~t d|j¡}t|jjjtjƒs$t    ‚t|j
jjtj ƒs:t    ‚t|j jjtj ƒsPt    ‚t|jjjtjƒsft    ‚t|jjjtƒszt    ‚dSr+)rr"r<rŠrrr7rˆr‹rŒrrsr,rtZbool_rurvÚobjectrËr9r9r:r-bs z,_TestSQLAlchemy.test_default_type_conversioncCsHtddgid}|jd|jdddks*t‚t d|j¡}t ||¡dS)NÚi64l)ršÚ test_bigintFr2rŸ)rrär<rrr"rŽr3rér9r9r:r~nsz_TestSQLAlchemy.test_bigintcCs(t d|j¡}t|jjjtjƒs$t    ‚dSr+©
rr"r<rŠror7rˆr‹rÉrrËr9r9r:Útest_default_date_loadvsz&_TestSQLAlchemy.test_default_date_loadcCs@dd„}td|jƒ}t|dƒs4|j tjjdd¡|j}t    |j
ƒsHt ‚td|jdgd}t|dƒsz|j tjjdd¡|j}t    |j
ƒsŽt ‚t |j jƒdks¢t ‚||jƒtttd|jd    d
ƒd d }|j}t    |j
ƒsÜt ‚t |j jƒdksðt ‚t d |j¡}|j}t    |j
ƒst ‚t |j|j¡t d |j¡}||jƒdS)NcSsšt|jƒr4|dtdƒkst‚|dtdƒks–t‚nbt|jƒr†t|jjƒdksRt‚tdddtdddg}t||j    d}t
  ||¡ntd|j›ƒ‚dS)    Nrz2000-01-01 08:00:00rŸz2000-06-01 07:00:00ÚUTC)ÚtzrÒz&DateCol loaded with incorrect type -> ) r r7rrr r)Údtr‚rrÓrŽr×)r]Z expected_datarIr9r9r:r(‚s
 
 
 
þ
ÿz:_TestSQLAlchemy.test_datetime_with_timezone.<locals>.checkzselect * from typesrwz&no column with datetime with time zonerrÄrrŸrTrÿrm)r!r<rTÚnodeÚ
add_markerr¼rÚxfailrwr r7rr)rƒr‚rrrr"rŽr×)r\rår(r¥r]rIr9r9r:Útest_datetime_with_timezone}sD! 
 ÿÿ
 ÿ
þz+_TestSQLAlchemy.test_datetime_with_timezonecCsÊtdtddddiƒ}|jd|jdddks0t‚|jd    krP|dj d
¡|d<n|dj d¡|d<t     
d|j¡}t   ||¡t      d |j¡}|jd krºt|jd tƒsªt‚t|dƒ|d<t   ||¡dS)Nr¨ú2013-01-01 09:00:00r.ú
US/Pacific©Úperiodsr‚Ztest_datetime_tzFr2r%rzSELECT * FROM test_datetime_tzr#©rr¨)rrrär<rr~rƒZ
tz_convertZ tz_localizerr"rŽr3r!r]Úlocr)r)r\rIrKr9r9r:Ú%test_datetime_with_timezone_roundtripÌsÿ
 
z5_TestSQLAlchemy.test_datetime_with_timezone_roundtripcCsdtdtdddƒidgd}|jd|jdddks4t‚t d|j¡}ttjgdgd}t     
||¡dS)    Nri'rŸrr2Ztest_datetime_obbFr±) rrrär<rrr"ròZNaTrŽr3)r\ršrKrIr9r9r:Útest_out_of_bounds_datetimeçs
z+_TestSQLAlchemy.test_out_of_bounds_datetimecCshtdddd d¡}tdtdƒi|d}|jd|jdd    dksBt‚tjd|jdd
}t    j
||d d dS) Nz
2018-01-01r…Z6H)r‹ÚfreqÚnumsr2Z    foo_tableZ    info_daterÞrçF)Z check_names) rZ
_with_freqrràrär<rrr"rŽr3)r\ÚdatesrIrKr9r9r:Ú"test_naive_datetimeindex_roundtripïs
z2_TestSQLAlchemy.test_naive_datetimeindex_roundtripcCsJt d|j¡}|jdkrtntj}t|jj    j
|ƒs6t ‚tjd|jdgd}t|jj    j
tjƒs`t ‚tjd|jddid}t|jj    j
tjƒsŒt ‚tjd|jdddiid}t|jj    j
tjƒs¼t ‚tjd|jdgd}t|j j    j
tjƒsæt ‚tjd|jddid}t|j j    j
tjƒst ‚tjd|jdd    diid}t|j j    j
tjƒsFt ‚dS)
Nrmr#rorÄrÆÚformatrprºÚunit) rr"r<r~r|r‹rÉrŠror7rˆrrp)r\r¥Ú expected_typer9r9r:rÌùs6ÿ
ý
ÿz!_TestSQLAlchemy.test_date_parsingcCsÂttdddt d¡dœƒ}| d|j¡dks2t‚t d|j¡}|j    ddd    }t
  ||¡t  d
|j¡}|j    ddd    }|j d kr²t|jd tƒs”t‚t|d ƒ|d <t
  ||¡n t
  ||¡dS)Nrˆr.©r‹rprêÚ test_datetimer§rŸ)ZaxisúSELECT * FROM test_datetimer#rŒr¨)rrr‹r¸rär<rrr"r`rŽr3r!r~r]rr)rrér9r9r:r˜sÿ 
z_TestSQLAlchemy.test_datetimecCsºttdddt d¡dœƒ}tj|jd<|jd|jdd    dksBt‚t     
d|j¡}t   ||¡t      d
|j¡}|jd krªt|jd tƒsˆt‚t|d dd|d <t   ||¡n t   ||¡dS)Nrˆr.r—rprê©rŸr¨r˜Fr2r™r#rŒr¨rÏ)rÑ)rrr‹r¸rrrär<rrr"rŽr3r!r~r]r)rrér9r9r:Útest_datetime_NaT.sÿ  
z!_TestSQLAlchemy.test_datetime_NaTcCslttdddƒtdddƒgdgd}|jd|jdddks<t‚td|jƒ}|d}t|dƒ}t ||¡dS)    NéÞrŸrrër±Ú    test_dateFr2)    rrrär<rr"rrŽr×)r\r¥r¥rKrIr9r9r:Útest_datetime_dateBs "  z"_TestSQLAlchemy.test_datetime_datecCsttdddƒtdddƒgdgd}|jd|jdd    d
ks<t‚td|jƒ}t ||¡|}tj|d |dd    d
ksrt‚t     d |¡}| 
d d„¡}t ||¡tj|d|jdd    d
ks´t‚|j dkræt     d|j¡}| 
dd„¡}t ||¡t d|j¡}t ||¡dS)Né    rrŸérër±Ú    test_timeFr2rZ
test_time2zSELECT * FROM test_time2cSs
| d¡S©Nz %H:%M:%S.%f©Ústrftime©Ú_r9r9r:Ú<lambda>Xóz4_TestSQLAlchemy.test_datetime_time.<locals>.<lambda>Z
test_time3r#zSELECT * FROM test_time3cSs
| d¡Sr¢r£r¥r9r9r:r§^r¨) rrrär<rr"rŽr3rr!Úapplymapr~)r\rÝr¥r¥rÖÚrefr9r9r:Útest_datetime_timeLs "    
 z"_TestSQLAlchemy.test_datetime_timecCshtdtjd}tdtjd}t||dœƒ}|jd|jdddksDt‚t     d|j¡}t
j ||dd    d
dS) Nirèg)Ús1r»Ztest_read_writeFr2rŸT)Z check_dtypeZ check_exact) rr‹r4Úfloat32rrär<rrr"rŽr3)r\r¬r»r¥r r9r9r:Útest_mixed_dtype_insertcs z'_TestSQLAlchemy.test_mixed_dtype_insertcCsntdddgdtjdgdœƒ}|jd|jdd    d
ks6t‚t d|j¡}t     ||¡t 
d |j¡}t     ||¡dS) NrrŸrr‚rìrêÚtest_nanFr2r.úSELECT * FROM test_nan) rr‹rrär<rrr"rŽr3r!rér9r9r:Útest_nan_numericos  z _TestSQLAlchemy.test_nan_numericcCsŒtdddgtjtjtjgdœƒ}|jd|jdddks:t‚t d|j¡}t     ||¡|d     
d
¡|d    <d|d    <t  d |j¡}t     ||¡dS) NrrŸrrêr¯Fr2r.r©r|r°) rr‹rrär<rrr"rŽr3r¤r!rér9r9r:Útest_nan_fullcolumn|s  z#_TestSQLAlchemy.test_nan_fullcolumncCsxtdddgddtjgdœƒ}|jd|jdd    d
ks6t‚d|jd <t d|j¡}t     
||¡t  d |j¡}t     
||¡dS) NrrŸrrër1rêr¯Fr2r.©rr©r°) rr‹rrär<rrrr"rŽr3r!rér9r9r:Útest_nan_string‹s
 z_TestSQLAlchemy.test_nan_stringcCs2ddlm}||jƒ}| |¡}dd„|Dƒ}|S)NrrzcSsg|] }|d‘qSr%r9r&r9r9r:rW¡sz6_TestSQLAlchemy._get_index_columns.<locals>.<listcomp>)r6rÃr<r')r\r(rÃrÆr)r9r9r:rŸ›s
 
 
z"_TestSQLAlchemy._get_index_columnscCs | ¡dSrÉ©r¡rer9r9r:Útest_to_sql_save_index¤sz&_TestSQLAlchemy.test_to_sql_save_indexcCs | ¡dSrÉ©r¦rer9r9r:Útest_transactions§sz!_TestSQLAlchemy.test_transactionsc    
Csæddlm}ddlm}d}tj|||jd}|jdd…}| ||j¡||ƒ}t    |j|ƒr”|j 
¡$}|  ¡|  |¡W5QRXW5QRXn"|j  ¡|j  |¡W5QRXt  ||j¡}tj||dd| ||j¡dS)NrrdrMÚtest_get_schema_create_tabler½Frè)r6rer[rNrròr<r‰r[r]r^r_rAr"rŽr3)    r\r¶rerNr^rôZ blank_test_dfr<Z returned_dfr9r9r:r¹ªs     
  z,_TestSQLAlchemy.test_get_schema_create_tablec     Cs¨ddlm}m}ddlm}ddg}ddg}t||d}| d    |j¡d
ksNt‚|jd |jd|id d
kslt‚|ƒ}|j    |jd |j
d j dj }t ||ƒs t‚d}    tjt|    d|jd|jdtid W5QRX|jd|jd|dƒid d
ksöt‚|j    |jd |j
dj dj }t ||ƒs&t‚|jdks6t‚|jd|j|d d
ksRt‚|j    |jd |j
dj dj }
|j
dj dj } t |
|ƒs”t‚t | |ƒs¤t‚dS)Nr)rir/©r.r¨r©©gš™™™™™é?T©gÍÌÌÌÌÌì?Nr±Ú
dtype_testrÚ dtype_test2rèrYz&The type of B is not a SQLAlchemy typerîr£Z dtype_test3é
Úsingle_dtype_test)r6rir/Úsqlalchemy.schemar.rrär<rÚreflectÚtablesr²rˆr]r¼rrr)r) r\rir/r.rršr¥ÚmetaZsqltyperZsqltypeaZsqltypebr9r9r:Ú
test_dtypeÂs2   "z_TestSQLAlchemy.test_dtypec Csddlm}m}m}m}ddlm}tddgƒttdddƒdgƒtddgdd    td
dgƒd œ}t    |ƒ}d }| 
||j ¡d ks€t ‚t  ||j ¡}    |ƒ}
|
j|j d|jdkr°|n|} |
j|j} t| dj| ƒsÔt ‚t| dj|ƒsèt ‚t| dj|ƒsüt ‚t| dj|ƒst ‚dS)Nr)rjrkr-rlrºTéÜr…rŸr|rèrù©ÚBoolÚDateÚIntr-Únotna_dtype_testrrYr$rÈrÉrÊr-)r6rjrkr-rlrÁr.rrrrär<rrr"rÂr~rÃr²r]rˆ) r\rjrkr-rlr.rr¥r^r¦rÄZmy_typeÚcol_dictr9r9r:Útest_notna_dtypeås& 
 
ü z _TestSQLAlchemy.test_notna_dtypec
    Csnddlm}m}m}ddlm}d}tt|gddt|gddt|gddtdgd    dtdgd
dd œƒ}|jd |j    d dd|ddiddks’t
‚t   d |j    ¡}t  |djdd¡t  |djdd¡ksÐt
‚|ƒ}|j|j    d|jd j}    t|    djƒt|    djƒkst
‚t|    dj|ƒs(t
‚t|    dj|ƒs>t
‚t|    dj|ƒsTt
‚t|    dj|ƒsjt
‚dS)Nr)Ú
BigIntegerr-rlrºgñYÉBÊÀó?r­rèÚfloat64r…r4r¡)Úf32Úf64Ú
f64_as_f32Úi32r}Z test_dtypesFrñrÒé)Z    precision)r§râr7rŸrÑérYrÐrÓr})r6rÎr-rlrÁr.rrrär<rrr"r‹Úroundr‰rÂrÃr²r)rˆr])
r\rÎr-rlr.ÚVr¥r¥rÄrÌr9r9r:Útest_double_precision    s>      ûÿ  ûùÿ
0 "z%_TestSQLAlchemy.test_double_precisioncsjddlm‰dd„‰dd„‰‡‡fdd„‰‡‡fd    d
„}td dd d giƒ d |j¡dks\t‚||jƒdS)NrrMcSsd}tj||dS)Nz'SELECT test_foo_data FROM test_foo_datar½)rr!)r=rr9r9r:Ú test_select4    szC_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_selectcSs|jd|dddS)NÚ test_foo_datarà)rÓr¾râ)rä)r=ršr9r9r:Ú test_append8    szC_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_appendcsˆ|ƒ}ˆ||ƒdSrÉr9)r<Zfoo_data)rÛrÙr9r:Útest_connectable;    szH_TestSQLAlchemy.test_connectable_issue_example.<locals>.test_connectablec
sHt|ˆƒr<| ¡"}| ¡ˆ|ƒW5QRXW5QRXnˆ|ƒdSrÉ)r]r^r_)Z connectabler<)rNrÜr9r:ÚmainA    s
 
 
 
z<_TestSQLAlchemy.test_connectable_issue_example.<locals>.mainrÚrŸrr.)r[rNrrär<r)r\rÝr9)rNrÛrÜrÙr:Útest_connectable_issue_example/    s     ÿÿz._TestSQLAlchemy.test_connectable_issue_exampleÚinputrÕÚbar)rÕÚinfe0c    Cs¼t|ƒ}|jdkr„t d¡}t|jƒtdƒkrRd|jkrRtjjdd}|j     
|¡d}tj t |d|j d    |jd
d W5QRXn4|j d    |jd
d d ksžt‚t d    |j¡}t ||¡dS) Nr$r·z1.0.3rázGH 36465rzinf cannot be used with MySQLrîZfoobarFr2rŸ)rr~r¼r½rÚ __version__r²rr†r„r…rrrär<rrr"rŽZ assert_equal)r\rßrår¥r·rrr¥r9r9r:Útest_to_sql_with_negative_npinfO    s
 
ÿþ z/_TestSQLAlchemy.test_to_sql_with_negative_npinfc
sÒddlm‰m‰m‰m}ddlm}m}d}td|giƒ}|ƒ}G‡‡‡fdd„d|ƒ}||j    ƒZ}| 
¡F|  ¡}    |j   |    ¡| ||d¡| ¡tj||jƒ|    d    }
W5QRXW5QRXt |
|¡dS)
Nr)r,rlÚUnicoder)ÚSessionÚdeclarative_basez Hello, World!Úspamcs6eZdZdZddgiZ””ddZ””dƒddZd    S)
z7_TestSQLAlchemy.test_temporary_table.<locals>.TemporaryZ    temp_testÚprefixesÚ    TEMPORARYT©Z primary_keyr F)ZnullableN)r`rarbÚ __tablename__Z__table_args__Úidrçr9©r,rlrär9r:Ú    Temporary~    s
 rî)rç)rr¾)r6r,rlrärÚsqlalchemy.ormrårærr<r_r=Z    __table__raÚaddÚflushrr!rçrŽr3) r\rråræZ    test_datarIZBaserîÚsessionr<r¥r9rír:Útest_temporary_tablen    s 
 (z$_TestSQLAlchemy.test_temporary_tablec    Cs.d}tjt|d| |d¡W5QRXdS)Nz*engine must be one of 'auto', 'sqlalchemy'rîZ
bad_engine)r¼rrrŽr±r9r9r:Útest_invalid_engineŽ    sz#_TestSQLAlchemy.test_invalid_enginec    Cs&t dd¡| |¡W5QRXdS)Nú io.sql.enginer6©ròÚoption_contextrŽrˆr9r9r:Útest_options_sqlalchemy“    sz'_TestSQLAlchemy.test_options_sqlalchemyc    Cs&t dd¡| |¡W5QRXdS)NrõrŠrörˆr9r9r:Útest_options_auto˜    sz!_TestSQLAlchemy.test_options_autoc    CsŽttdƒtƒst‚t dd¡*ttdƒtƒs2t‚ttdƒtƒsDt‚W5QRXt dd¡*ttdƒtƒsnt‚ttdƒtƒs€t‚W5QRXdS)Nr6rõrŠ)r]rrrròr÷rer9r9r:Útest_options_get_engine    sz'_TestSQLAlchemy.test_options_get_enginecCsdSrÉr9rer9r9r:Ú"test_get_engine_auto_error_message¨    sz2_TestSQLAlchemy.test_get_engine_auto_error_messageÚfuncr r!c        CsÈd}| ¡}|j||jdddt d|¡"tt|ƒd|›|j|d}W5QRX| ||¡}t ||¡t d|¡Ftt|ƒd|›|j|dd    }| ||¡}|D]}t ||¡q¨W5QRXdS)
NrßFrñ©r§râúmode.string_storageúSelect * from ©Ú dtype_backendr.©rr©    Údtype_backend_datarär<ròr÷rRÚdtype_backend_expectedrŽr3©    r\Ústring_storagerürr%r¥rKrIÚiteratorr9r9r:Útest_read_sql_dtype_backend®    s*ÿ  ü z+_TestSQLAlchemy.test_read_sql_dtype_backendr"c        Cs¼d}| ¡}|j||jdddt d|¡tt|ƒ||j|d}W5QRX| ||¡}t ||¡t d|¡@tt|ƒ||j|dd}| ||¡}|D]}t ||¡qœW5QRXdS)    NrßFrñrýrþrr.rrrr9r9r:Ú!test_read_sql_dtype_backend_tableÇ    s"   ü z1_TestSQLAlchemy.test_read_sql_dtype_backend_tablec    CsXd}| ¡}|j||jdddd}tjt|dtt|ƒ||jddW5QRXdS)    NrßFrñrýzPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.rîÚnumpyr)rrär<r¼rrrRrò)r\rür%r¥rr9r9r:Ú)test_read_sql_invalid_dtype_backend_tableÞ    sÿz9_TestSQLAlchemy.test_read_sql_invalid_dtype_backend_tablerrMc Csnttdtjdgddtdddgddtdtjdgddtdd    dgddd
d dgd
d d
gd d dgd d dgdœƒS)NrŸr.r6rèrrœç@ÚFloat64roTFrër1ro©rër1roÚdÚeÚfÚgÚh)rrr‹rrer9r9r:rë    søÿz"_TestSQLAlchemy.dtype_backend_datac
s&|dkr@ttjdddgtjdƒ}ttjddtjgtjdƒ}n2t d¡‰tˆ dddg¡ƒ}tˆ dddg¡ƒ}t    t
dtj dgd    dt
dd
dgd    dt
d tj d gd dt
d dd gd dt
ddtjgddt
dddgdd||dœƒ‰|dkr"t d¡‰ddl m ‰t    ‡‡‡fdd„ˆjDƒƒ‰ˆS)NÚpythonrër1rorèrçrŸr.r6rrœr rroTFÚbooleanrr)ÚArrowExtensionArraycs$i|]}|ˆˆjˆ|ddƒ“qS)T)Z from_pandas)ró)rSr]©rr¥Úpar9r:Ú
<dictcomp>
sÿz:_TestSQLAlchemy.dtype_backend_expected.<locals>.<dictcomp>)rr‹róZobject_ròZNAr¼r½rrrrZ pandas.arraysrr²)r\ÚstoragerZ string_arrayZstring_array_nar9rr:rù    s4
øÿ
 
 þÿz&_TestSQLAlchemy.dtype_backend_expectedcCsbdddœ}tddgd |¡}| ¡}|jd|jdd    d
td |j|d d D]}t ||¡qLdS)Nr¡r|r0rër1r±rßFrñrýzSELECT * FROM testrŸ)r7r)rr¤r
rär<r!rŽr3)r\r‡r¥rIrKr9r9r:Útest_chunksize_empty_dtypes
s
ü
z+_TestSQLAlchemy.test_chunksize_empty_dtypesrÚnumpy_nullablecCs˜d}tdddgddœƒ}|j||jddd    tt|ƒd
|›|jd tji|d }ttdddgtjd tdddg|dkszdndd dœƒ}t     ||¡dS)NrßrŸrr.r…r0Frñrýrÿrë)r7rrèrr¡r6)
rrär<rRròr‹rÏrrŽr3)r\rürr%r¥rKrIr9r9r:Útest_read_sql_dtype-
s$üþþÿ    z#_TestSQLAlchemy.test_read_sql_dtypeN)Br`rarbr§rr|rr¼rr¬rcrdrirkrmrtrwr¿rÂrzrr{r-r~r€r‡rŽrr“rÌr˜r›ržr«r®r±r²r´rŸr¶r¸r¹rÅrÍrØrÞrrr‹Úinfrãrórôrørùrúrûr    r
r rrrr Z
no_defaultrr9r9r9r:rbs†
 
 
 
    
 
  O
 
      #- (þ
  
 
 
%rbcs|eZdZdZdZedd„ƒZedd„ƒZdd„Zd    d
„Z    d d „Z
d d„Z ddœ‡fdd„ Z e j dddg¡dd„ƒZ‡ZS)ÚTestSQLiteAlchemyzL
    Test the sqlalchemy backend against an in-memory sqlite database.
 
    r#cCst d¡|_dSrrrsr9r9r:rdO
szTestSQLiteAlchemy.setup_enginecCs
d|_dSrÉ)Údriverrsr9r9r:rcS
szTestSQLiteAlchemy.setup_drivercCs€t d|j¡}t|jjjtjƒs$t    ‚t|j
jjtj ƒs:t    ‚t|j jjtj ƒsPt    ‚t|j jjtjƒsft    ‚t|jjjtjƒs|t    ‚dSr+)rr"r<rŠrrr7rˆr‹rŒrrsr,rtrurvrËr9r9r:r-X
s z.TestSQLiteAlchemy.test_default_type_conversioncCs(t d|j¡}t|jjjtjƒr$t    ‚dSr+rrËr9r9r:r€g
sz(TestSQLiteAlchemy.test_default_date_loadc    CsVtdddgidd}|jd|jdddks.t‚t d¡t d|j¡W5QRXdS)    NrërŸrr¡rèZtest_bigintwarningFr2)rrär<rrŽrôrr"rËr9r9r:Útest_bigint_warningm
s z%TestSQLiteAlchemy.test_bigint_warningc        sðddlm‰m‰m‰ddlm}m}|ƒ}G‡‡‡fdd„d|ƒ}|j ¡|j     
|j¡W5QRX||jd}|ƒX}t ddgdd    gd
œƒ}|j d |jd d ddks¬t ‚| ¡| |j|j¡}t |ƒ}W5QRXt|jƒddgksìt ‚dS)Nr©r,rlr/)ræÚ sessionmakercs(eZdZdZ””ddZ””dƒƒZdS)z>TestSQLiteAlchemy.test_row_object_is_named_tuple.<locals>.TestrûTrêé2N)r`rarbrërìÚ string_columnr9r#r9r:ÚTest†
s r'rYrŸZhelloZworld)rìr&rûFrñ)r¾r§rârrìr&)r6r,rlr/rïrær$r<r_r8Z
create_allrrärrirrìr&rr²)    r\rær$Z    BaseModelr'råròr¥Z
test_queryr9r#r:Útest_row_object_is_named_tupleu
s"  ÿÿz0TestSQLiteAlchemy.test_row_object_is_named_tuplerrMcs<tƒ ||¡}|dkr(| dddœ¡}n| dddœ¡}|S©Nrr6)rrzint64[pyarrow]©Úsuperrr¤©r\rrr¥©Ú    __class__r9r:rš
s
z(TestSQLiteAlchemy.dtype_backend_expectedrür r"cCsdSrÉr9)r\rrür9r9r:r
sz3TestSQLiteAlchemy.test_read_sql_dtype_backend_table)r`rarbr§r~r|rdrcr-r€r"r(rr¼rrr
Ú __classcell__r9r9r-r:r G
s
 
%    r csNeZdZdZdZdZedd„ƒZedd„ƒZdd    „Z    d
d œ‡fd d „ Z
‡Z S)ÚTestMySQLAlchemyzA
    Test the sqlalchemy backend against an MySQL database.
 
    r$iê cCs(tjd|j›d|j›d|jd|_dS)Nzmysql+z://root@localhost:ú/pandas)r¹)r6r“r!Úportr¹r—rsr9r9r:rd³
sþzTestMySQLAlchemy.setup_enginecCs$t d¡}d|_d|jjji|_dS)Nr·r¸)r¼r½r!r¾r¿rÀr¹)rtr·r9r9r:rcº
s
zTestMySQLAlchemy.setup_drivercCsdSrÉr9rer9r9r:r-À
sz-TestMySQLAlchemy.test_default_type_conversionrrMcs<tƒ ||¡}|dkr(| dddœ¡}n| dddœ¡}|Sr)r*r,r-r9r:rÃ
s
z'TestMySQLAlchemy.dtype_backend_expected) r`rarbr§r~r2r|rdrcr-rr/r9r9r-r:r0©
s
 
r0c@s8eZdZdZdZdZedd„ƒZedd„ƒZdd    „Z    d
S) ÚTestPostgreSQLAlchemyzF
    Test the sqlalchemy backend against an PostgreSQL database.
 
    r%i8cCs"t d|j›d|j›d¡|_dS)Nz postgresql+z://postgres:postgres@localhost:r1)r6r“r!r2r—rsr9r9r:rd×
sÿz"TestPostgreSQLAlchemy.setup_enginecCst d¡d|_dS)NrÌ)r¼r½r!rsr9r9r:rcÝ
s
z"TestPostgreSQLAlchemy.setup_driverc     Cs–ddlm}tddgddgddgd    œƒ}|j ¡|j d
¡|j d ¡W5QRX|jd |jd ddkspt‚|jd|jd dddksŒt‚|jd|jd dddks¨t‚t     d |j¡}t
  ||¡t     d|j¡}t
  ||¡tj    d|jdd}t
  ||¡tj    d|jdd}t
  ||¡d}t j t|dtj    d|jddW5QRX|j ¡|j d
¡|j d ¡W5QRX|jd|jdd ddks”t‚|jd|jdd dd|jd|jdd dddksÊt‚tj    d|jdd}t
  t||gdd|¡t|j|ƒr’| ¡}    tj|    dd}
|
j|dd ddks2t‚|
j|dd dddksNt‚|
j|dd dddksjt‚tj    d|jdd}|
 d¡}t
  ||¡dS)NrrMrŸrr/r‚rërErFz$DROP SCHEMA IF EXISTS other CASCADE;zCREATE SCHEMA other;Ztest_schema_publicFr2Ztest_schema_public_explicitÚpublic)r§rBZtest_schema_otherÚother)rBz!Table test_schema_other not foundrî)rBr§rñ)rBr§râràTrÿZtest_schema_other2rý)r[rNrr<r_r–rärrr"rŽr3r¼rrrr]r^rZ
read_table) r\rNr¥r5r6rZres4rr¥Zengine2Zpdsqlr9r9r:Útest_schema_supportâ
sŽ   ÿýÿÿ  ÿ    ÿûûùÿ
ÿÿÿÿ
z)TestPostgreSQLAlchemy.test_schema_supportN)
r`rarbr§r~r2r|rdrcr6r9r9r9r:r3Í
s
 
r3c@s²eZdZdZdZejdddd„ƒZdd„Zd    d
„Z    d d „Z
d d„Z dd„Z dd„Z dd„Zej dddg¡dd„ƒZdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'S)(ÚTestSQLiteFallbackzG
    Test the fallback mode against an in-memory sqlite database.
 
    r#Tr©cCs0| ¡|_| |¡| |¡t |j¡|_dSrÉ)r^r<rrrrrÿr«r9r9r:r¬I s
 
 
zTestSQLiteFallback.setup_methodcCs | ¡dSrÉrhrer9r9r:riP sz*TestSQLiteFallback.test_read_sql_parametercCs | ¡dSrÉrjrer9r9r:rkS sz0TestSQLiteFallback.test_read_sql_named_parametercCs| |¡dSrÉrlrˆr9r9r:rmV sz$TestSQLiteFallback.test_to_sql_emptycCsdtddddgddddgdœƒ}|j |d¡dks4t‚|j d¡sDt‚|j d¡|j d¡r`t‚dS)NrnrorprqrrZdrop_test_framer‹)rrÿrärrÄr[)r\rár9r9r:Útest_create_and_drop_tableY sÿ z-TestSQLiteFallback.test_create_and_drop_tablecCs| |¡dSrÉrxrˆr9r9r:r¿f sz!TestSQLiteFallback.test_roundtripcCs | ¡dSrÉryrer9r9r:rÂi sz#TestSQLiteFallback.test_execute_sqlcCs€ttdddƒtdddƒgdgd}|jd|jdddks<t‚td    |jƒ}|jd
krft ||     t
¡¡n|jd kr|t ||¡dS) NrœrŸrrër±rFr2zSELECT * FROM test_dater#r$) rrrär<rr!r~rŽr3r¤r)rr9r9r:ržl s" 
 
z%TestSQLiteFallback.test_datetime_dateÚtz_awareFcCsž|stdddƒtdddƒg}n$tdddd}t| ¡ƒ d    d
„¡}t|d gd }|jd |jdddksjt‚t    d|jƒ}|j
dkrš|  dd
„¡}t   ||¡dS)NrŸrrŸr rˆrr‰rŠcSs| ¡SrÉ)Útimetz)rƒr9r9r:r§~ r¨z7TestSQLiteFallback.test_datetime_time.<locals>.<lambda>rër±r¡Fr2zSELECT * FROM test_timer#cSs
| d¡Sr¢r£r¥r9r9r:r§† r¨)rrrZ to_pydatetimeÚmaprrär<rr!r~r©rŽr3)r\r9Ztz_timesZtz_dtr¥r¥rIr9r9r:r«w s 
z%TestSQLiteFallback.test_datetime_timecCsTt dd|›d|j¡}g}|jD]*}t d|›d|j¡}| |j ¡¡q$|S)Nz1SELECT * FROM sqlite_master WHERE type = 'index' zAND tbl_name = 'ú'zPRAGMA index_info(ú))rr!r<rÓràrÊ)r\r(r)r Zix_nameZix_infor9r9r:rŸ‰ s
ÿý
z%TestSQLiteFallback._get_index_columnscCs | ¡dSrÉrµrer9r9r:r¶• sz)TestSQLiteFallback.test_to_sql_save_indexcCs | ¡dSrÉr·rer9r9r:r¸˜ sz$TestSQLiteFallback.test_transactionsc
CsT|j d|›d¡}|D] \}}}}}}    ||kr|Sqtd|›d|›dƒ‚dS)NzPRAGMA table_info(r=zTable z    , column rY)r<rAr)
r\r%r\ZrecsZcidrÓÚctypeZnot_nullÚdefaultÚpkr9r9r:r^› s
 
z*TestSQLiteFallback._get_sqlite_column_typec    Cs|jdkrt d¡ddg}ddg}t||d}| d|j¡d    ksFt‚|jd
|jdd id d    ksdt‚| dd¡d ksxt‚| d
d¡d ksŒt‚d}tjt    |d|jd|jdt
id W5QRX|jd|jd d d    ksÚt‚| dd¡d ksît‚| dd¡d kst‚dS)Nr$úNot applicable to MySQL legacyr¨r©r»r¼r±r½rr¾ÚSTRINGrèrøz!B \(<class 'bool'>\) not a stringrîr£rÀ) r~r¼rerrär<rr^rrÚbool)r\rršr¥rr9r9r:rÅ¢ s
 
  zTestSQLiteFallback.test_dtypecCsÄ|jdkrt d¡tddgƒttdddƒdgƒtddgddtd    dgƒd
œ}t|ƒ}d }| ||j¡d kspt‚|     |d ¡dks„t‚|     |d¡dks˜t‚|     |d¡dks¬t‚|     |d¡dksÀt‚dS)Nr$rATrÆr…rŸr|rèrùrÇrËrrÈrørÉr*rÊr-r+)
r~r¼rerrrrär<rr^)r\rr¥r^r9r9r:r͸ s
 
 
 
üz#TestSQLiteFallback.test_notna_dtypec Csâtddgddggddgd}d}tjt|d    | d
|j¡W5QRXtd d d dddddddg
ƒD]x\}}| ||j¡dks‚t‚t     ||j¡tddgddggd|gd}d|d›}| ||j¡dksÎt‚t     ||j¡qddS)NrŸrr.r‹rër1r±z$Empty table or column name specifiedrîr"ztest_weird_name]ztest_weird_name[ztest_weird_name`ztest_weird_name"ztest_weird_name'z_b.test_weird_name_01-30z"_b.test_weird_name_01-30"Z99beginswithnumberZ12345r Ztest_weird_col_namer)
rr¼rrrär<Ú    enumeraterrZ table_exists)r\r¥rZndxZ
weird_namer Zc_tblr9r9r:Útest_illegal_namesÌ s.öÿ  z%TestSQLiteFallback.test_illegal_namesN)r`rarbr§r~r¼rr¬rirkrmr8r¿rÂržrrr«rŸr¶r¸r^rÅrÍrEr9r9r9r:r7A s(
 
 
 r7z'{}'z{:.8f}z{:d}cCsdS)NÚNULLr9)Úxr9r9r:r§ö r¨r§z{:.10f}z'{!s}'cGsJg}|D]4}t|tƒr"t|ƒr"d}tt|ƒ}| ||ƒ¡q|t|ƒSrÉ)r]r¢rÚ _formattersrˆràr€)rrOZprocessed_argsÚargÚ    formatterr9r9r:Ú format_queryü s rKc    Cs8t |¡}| |¡ ¡}W5QRX|dkr0dSt|ƒS)z#Replace removed sql.tquery functionN)rr rArmr)rr¾rÁr¥r9r9r:Útquery s rLc@s\eZdZdd„Zdd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
dd„Z dd„Z dS)Ú TestXSQLitecCs*| ¡}| dt |¡›¡| ¡dSrf)r@rArrhri)r\r’r<rGr9r9r:r[ szTestXSQLite.drop_tablecCsØt ¡}tj|d|dddks"t‚t d|¡}|j|_|}t ||¡dgt|ƒ|d<|     ¡}t
t   t|ƒ¡t j dd    }|     ¡|d
<tj|d |dddks¢t‚tjd |d
d }|     ¡}||_d
|j_t ||¡dS)NZ
test_tableF)rÓr¾r§r zselect * from test_tablerëÚtxtrèr¿ZIdxZ test_table2zselect * from test_table2rç)rŽÚmakeTimeDataFramerrärr r§r3rþr
rr‹r¸r¡rÓ)r\rÝr~rKrIZframe2Znew_idxr9r9r:Ú
test_basic s0ÿ   ÿÿÿzTestXSQLite.test_basicc
Cs”t ¡}tj|jd<t |d¡}| ¡}| |¡d}|     ¡D]"\}}t
|f|žŽ}t ||dq>|  ¡tj d|d}    |j|    _tj|    |dddS)N)rrrßz(INSERT INTO test VALUES (%s, %s, %s, %s)r½úselect * from testgü©ñÒMbP?)Zrtol)rŽrOr‹rr‰rròr@rAZiterrowsrKrLrir r§r3)
r\rÝr~rôrGÚinsr¦rTZfmt_sqlrKr9r9r:Útest_write_row_by_row2 s  
z!TestXSQLite.test_write_row_by_rowc        Cs–t ¡}t |d¡}| ¡}| |¡d}|jd}t |¡}| |t|ƒ¡W5QRX|     ¡t 
d|¡}|j dd…|_ t  ||dd…¡dS)Nrßz$INSERT INTO test VALUES (?, ?, ?, ?)rrQrŸ) rŽrOrròr@rAr‰r r€rir r§r3)    r\rÝr~rôrGrRrTrÁrKr9r9r:Ú test_executeD s 
 
  zTestXSQLite.test_executecCs–t ¡}t |d¡}| ¡}|D]6}| d¡}t|ƒdkr |ddkr |ddks t‚q tj|dddgd    }| ¡}d
|ks€t‚| ¡}|     |¡dS) Nrßú rrr¨rŸZDATETIMEr©r$zPRIMARY KEY ("A", "B"))
rŽrOrròÚ
splitlinesrZrþrr@rA)r\rÝr~rôÚlinesÚlineÚtokensrGr9r9r:Ú test_schemaT s 
 zTestXSQLite.test_schemac
Csjd}| ¡}| |¡t |¡@}| d¡| d¡tjtjdd| d¡W5QRXW5QRXdS)Núƒ
        CREATE TABLE test
        (
        a TEXT,
        b TEXT,
        c REAL,
        PRIMARY KEY (a, b)
        );
        ú,INSERT INTO test VALUES("foo", "bar", 1.234)z,INSERT INTO test VALUES("foo", "baz", 2.567)zExecution failed on sqlrîz(INSERT INTO test VALUES("foo", "bar", 7))r@rArr r¼rrV)r\rÝrôrGrÁr9r9r:Útest_execute_failc s    
 
 
zTestXSQLite.test_execute_failc
Cs‚d}t t d¡¡8}| ¡}| |¡t |¡}| d¡W5QRXW5QRXd}tj    tj
|dt d|dW5QRXdS)Nr[rÛr\z$Cannot operate on a closed database.rîrQr½) rÜrrfr^r@rArr r¼rZProgrammingErrorrL)r\rôr<rGrÁrr9r9r:Útest_execute_closed_connectionw s    
 z*TestXSQLite.test_execute_closed_connectioncCs0tdt d¡iƒ}tj||ddddks,t‚dS)NÚFromr…Z testkeywordsF©r¾rÓr§)rr‹Zonesrrär)r\rÝr¥r9r9r:Útest_keyword_as_column_namesŒ sz(TestXSQLite.test_keyword_as_column_namescCsptddgdgd}tj||ddddks,t‚|}tdd    „| d
¡Dƒƒ}|d ksTt‚t d
|¡}t ||¡dS) NrŸrZc0r±Úmono_dfFr`css|]}|dVqdS)rNr9)rSZmy_c0r9r9r:Ú    <genexpr>˜ sz8TestXSQLite.test_onecolumn_of_integer.<locals>.<genexpr>zselect * from mono_dfr.)    rrrärÚsumrAr rŽr3)r\rÝrbZcon_xZthe_sumrKr9r9r:Útest_onecolumn_of_integer s  z%TestXSQLite.test_onecolumn_of_integerc    Cs´tddgddgdœƒ}tdddgd    d
d gdœƒ}d }d |›}d}tjt|dtj|||ddW5QRX| ||¡tj|||ddd}tjt|dtj|||ddW5QRXtj|||dddt||dddgksèt‚tj|||ddddkst‚t||ddddgks"t‚| ||¡tj|||ddddksLt‚t||dddgksft‚tj|||ddddks„t‚t||ddddddgks¤t‚| ||¡dS)NrŸrr¨r©)rGrHr.r‹r…rªr«ÚEZtable_if_existszSELECT * FROM z*'notvalidvalue' is not valid for if_existsrîZ notvalidvalue)r~r¾rÓrârz&Table 'table_if_exists' already existsrñF)r~r¾rÓrâr§r½ršr³)r.rª)r‹r«)r…rfrà)    rr¼rrrrär[rLr)r\rÝZdf_if_exists_1Zdf_if_exists_2r’Z
sql_selectrr9r9r:Útest_if_existsŸ s˜
ü ÿüûûùÿ
 ûùÿ
ûùÿ
 
û zTestXSQLite.test_if_existsN) r`rarbr[rPrSrTrZr]r^rarergr9r9r9r:rM srM)N)r§Ú
__future__rrÜrrCrrrrr™rÚpathlibr
rfr r‹r¼Z pandas._libsr Zpandas.util._test_decoratorsÚutilZ_test_decoratorsrHZpandas.core.dtypes.commonr r ZpandasròrrrrrrrrrrZpandas._testingZ_testingrŽZpandas.core.arraysrrZpandas.util.versionrZ    pandas.iorZ pandas.io.sqlrrrrr r!r"r6rar>rr;rJrcrhryr{r|r‘r˜rrœrzr¦rµr¶rÈrËrÎrÏrÔrÕrÖr×rØrÙrÝrÞZmysql_connectableZpostgresql_connectableZsqlite_connectableZsqlite_iris_connectableZsqlalchemy_connectableZsqlalchemy_connectable_irisZall_connectableZall_connectable_irisrrrrær÷rørrr    rrrr r"r#r*r-r7rLrQrRrSrcrrr}r¨r`rrIrbr r0r3r7r”r)Zstr_Úbytesr¢rìrˆrÏrCrHrKrLrMr9r9r9r:Ú<module>s–     0   $
 
ýøýí!
 
 
 
#
 
 
 
 
 
 
 
 
 
 
 
 
þþýý 
ÿ
 
                                    $ %
 
"GLXLb#s0÷