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
U
¸ý°däÌã@sŽdZddlmZddlZddlmZddlmZddlmZddlm    Z    d    d
lm
Z
d    d lm Z d    d l m Z Gd d„dƒZGdd„deƒZdS)zóGlobal database feature support policy.
 
Provides decorators to mark tests requiring specific feature support from the
target database.
 
External dialect test suites should subclass SuiteRequirements
to provide specific inclusion/exclusions.
 
é)Ú annotationsNé)Úasyncio©Úconfig)Ú
exclusions©Úonly_oné©Ú create_engine)Úutil)Ú    QueuePoolc@s eZdZdS)Ú RequirementsN)Ú__name__Ú
__module__Ú __qualname__©rrúVd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/testing/requirements.pyr!src@sè eZdZedd„ƒZedd„ƒZedd„ƒZedd„ƒZed    d
„ƒZed d „ƒZ    ed d„ƒZ
edd„ƒZ edd„ƒZ edd„ƒZ edd„ƒZedd„ƒZedd„ƒZedd„ƒZedd„ƒZedd „ƒZed!d"„ƒZed#d$„ƒZed%d&„ƒZed'd(„ƒZed)d*„ƒZed+d,„ƒZed-d.„ƒZed/d0„ƒZed1d2„ƒZed3d4„ƒZed5d6„ƒZed7d8„ƒZed9d:„ƒZ ed;d<„ƒZ!ed=d>„ƒZ"ed?d@„ƒZ#edAdB„ƒZ$edCdD„ƒZ%edEdF„ƒZ&edGdH„ƒZ'edIdJ„ƒZ(edKdL„ƒZ)edMdN„ƒZ*edOdP„ƒZ+edQdR„ƒZ,edSdT„ƒZ-edUdV„ƒZ.edWdX„ƒZ/edYdZ„ƒZ0ed[d\„ƒZ1ed]d^„ƒZ2ed_d`„ƒZ3edadb„ƒZ4edcdd„ƒZ5ededf„ƒZ6edgdh„ƒZ7edidj„ƒZ8edkdl„ƒZ9edmdn„ƒZ:edodp„ƒZ;edqdr„ƒZ<edsdt„ƒZ=edudv„ƒZ>edwdx„ƒZ?edydz„ƒZ@ed{d|„ƒZAed}d~„ƒZBedd€„ƒZCedd‚„ƒZDedƒd„„ƒZEed…d†„ƒZFed‡dˆ„ƒZGed‰dŠ„ƒZHed‹dŒ„ƒZIeddŽ„ƒZJedd„ƒZKed‘d’„ƒZLed“d”„ƒZMed•d–„ƒZNed—d˜„ƒZOed™dš„ƒZPed›dœ„ƒZQeddž„ƒZRedŸd „ƒZSed¡d¢„ƒZTed£d¤„ƒZUed¥d¦„ƒZVed§d¨„ƒZWed©dª„ƒZXed«d¬„ƒZYed­d®„ƒZZed¯d°„ƒZ[ed±d²„ƒZ\ed³d´„ƒZ]edµd¶„ƒZ^ed·d¸„ƒZ_ed¹dº„ƒZ`ed»d¼„ƒZaed½d¾„ƒZbed¿dÀ„ƒZcedÁd„ƒZdedÃdĄƒZeedÅdƄƒZfedÇdȄƒZgedÉdʄƒZhedËd̄ƒZiedÍd΄ƒZjedÏdЄƒZkedÑd҄ƒZledÓdԄƒZmedÕdքƒZned×d؄ƒZoedÙdڄƒZpedÛd܄ƒZqedÝdބƒZredßdà„ƒZsedád℃Ztedãd䄃Zuedåd愃Zvedçd脃ZwedédꄃZxedëd섃ZyedídZzedïdð„ƒZ{edñdò„ƒZ|edódô„ƒZ}edõdö„ƒZ~ed÷dø„ƒZedùdú„ƒZ€edûdü„ƒZedýdþ„ƒZ‚edÿd„ƒZƒedd„ƒZ„edd„ƒZ…edd„ƒZ†dd„Z‡ed    d
„ƒZˆed d „ƒZ‰ed d„ƒZŠedd„ƒZ‹edd„ƒZŒedd„ƒZedd„ƒZŽedd„ƒZedd„ƒZedd„ƒZ‘edd„ƒZ’edd „ƒZ“ed!d"„ƒZ”ed#d$„ƒZ•ed%d&„ƒZ–ed'd(„ƒZ—ed)d*„ƒZ˜ed+d,„ƒZ™ed-d.„ƒZšed/d0„ƒZ›ed1d2„ƒZœed3d4„ƒZed5d6„ƒZžed7d8„ƒZŸed9d:„ƒZ ed;d<„ƒZ¡ed=d>„ƒZ¢ed?d@„ƒZ£edAdB„ƒZ¤edCdD„ƒZ¥edEdF„ƒZ¦edGdH„ƒZ§edIdJ„ƒZ¨edKdL„ƒZ©edMdN„ƒZªedOdP„ƒZ«edQdR„ƒZ¬edSdT„ƒZ­dUdV„Z®edWdX„ƒZ¯edYdZ„ƒZ°ed[d\„ƒZ±ed]d^„ƒZ²ed_d`„ƒZ³edadb„ƒZ´dcdd„Zµededf„ƒZ¶edgdh„ƒZ·edidj„ƒZ¸edkdl„ƒZ¹edmdn„ƒZºedodp„ƒZ»edqdr„ƒZ¼edsdt„ƒZ½edudv„ƒZ¾edwdx„ƒZ¿edydz„ƒZÀed{d|„ƒZÁed}d~„ƒZÂedd€„ƒZÐdd‚„ZĐdƒd„„ZÅed…d†„ƒZÆed‡dˆ„ƒZǐd‰dŠ„ZÈed‹dŒ„ƒZÉeddŽ„ƒZÊedd„ƒZËed‘d’„ƒZÌed“d”„ƒZÍed•d–„ƒZÎed—d˜„ƒZÏed™dš„ƒZÐed›dœ„ƒZÑeddž„ƒZÒedŸd „ƒZÓed¡d¢„ƒZÔed£d¤„ƒZÕed¥d¦„ƒZÖed§d¨„ƒZ×ed©dª„ƒZØed«d¬„ƒZÙed­d®„ƒZÚed¯d°„ƒZÛed±d²„ƒZÜed³d´„ƒZÝedµd¶„ƒZÞed·d¸„ƒZßed¹dº„ƒZàed»d¼„ƒZáed½d¾„ƒZâd¿S(ÀÚSuiteRequirementscCst ¡S)z/target platform can emit basic CreateTable DDL.©rÚopen©ÚselfrrrÚ create_table&szSuiteRequirements.create_tablecCst ¡S)z-target platform can emit basic DropTable DDL.rrrrrÚ
drop_table,szSuiteRequirements.drop_tablecCst ¡S)z>target platform supports IF NOT EXISTS / IF EXISTS for tables.©rÚclosedrrrrÚtable_ddl_if_exists2sz%SuiteRequirements.table_ddl_if_existscCst ¡S)z?target platform supports IF NOT EXISTS / IF EXISTS for indexes.rrrrrÚindex_ddl_if_exists8sz%SuiteRequirements.index_ddl_if_existscCst ¡S)z*Target database must support foreign keys.rrrrrÚ foreign_keys>szSuiteRequirements.foreign_keyscCst ¡S)zKTarget database creates an index that's reflected for
        foreign keys.rrrrrÚforeign_keys_reflect_as_indexDsz/SuiteRequirements.foreign_keys_reflect_as_indexcCst ¡S)z=Target database reflects unique indexes as unique constrains.rrrrrÚ*unique_index_reflect_as_unique_constraintsKsz<SuiteRequirements.unique_index_reflect_as_unique_constraintscCst ¡S)z7Target database reflects unique constraints as indexes.rrrrrÚ#unique_constraints_reflect_as_indexQsz5SuiteRequirements.unique_constraints_reflect_as_indexcCst ¡S)zãDatabase / dialect supports a query like::
 
             SELECT * FROM VALUES ( (c1, c2), (c1, c2), ...)
             AS some_table(col1, col2)
 
        SQLAlchemy generates this with the :func:`_sql.values` function.
 
        rrrrrÚtable_value_constructorWs
z)SuiteRequirements.table_value_constructorcCst ¡S)aÿTarget database passes SQL-92 style statements to cursor.execute()
        when a statement like select() or insert() is run.
 
        A very small portion of dialect-level tests will ensure that certain
        conditions are present in SQL strings, and these tests use very basic
        SQL that will work on any SQL-like platform in order to assert results.
 
        It's normally a given for any pep-249 DBAPI that a statement like
        "SELECT id, name FROM table WHERE some_table.id=5" will work.
        However, there are dialects that don't actually produce SQL Strings
        and instead may work with symbolic objects instead, or dialects that
        aren't working with SQL, so for those this requirement can be marked
        as excluded.
 
        rrrrrÚstandard_cursor_sqlcsz%SuiteRequirements.standard_cursor_sqlcCst ¡S)zQtarget database must support ON UPDATE..CASCADE behavior in
        foreign keys.rrrrrÚon_update_cascadewsz#SuiteRequirements.on_update_cascadecCst ¡S)zWtarget database must *not* support ON UPDATE..CASCADE behavior in
        foreign keys.rrrrrÚnon_updating_cascade~sz&SuiteRequirements.non_updating_cascadecCst ¡S©NrrrrrÚdeferrable_fks„sz SuiteRequirements.deferrable_fkscst ‡fdd„¡S)NcsˆjjpˆjjSr()r&Zenabledr)rrrrÚ<lambda>Žsz?SuiteRequirements.on_update_or_deferrable_fks.<locals>.<lambda>©rZonly_ifrrrrÚon_update_or_deferrable_fksˆs
ÿz-SuiteRequirements.on_update_or_deferrable_fkscCsdd„}t |¡S)z"target database is using QueuePoolcSst|jjtƒSr()Ú
isinstanceÚdbÚpoolrrrrrÚgo–sz(SuiteRequirements.queue_pool.<locals>.gor+©rr0rrrÚ
queue_pool’szSuiteRequirements.queue_poolcCst ¡S)z;Target database must support self-referential foreign keys.rrrrrÚself_referential_foreign_keys›sz/SuiteRequirements.self_referential_foreign_keyscCst ¡S)z=Target database must support the DDL phrases for FOREIGN KEY.rrrrrÚforeign_key_ddl¡sz!SuiteRequirements.foreign_key_ddlcCst ¡S)z3target database must support names for constraints.rrrrrÚnamed_constraints§sz#SuiteRequirements.named_constraintscCst ¡S)z8target database must apply names to unnamed constraints.rrrrrÚimplicitly_named_constraints­sz.SuiteRequirements.implicitly_named_constraintscCst ¡S)atarget database allows column names that have unusual characters
        in them, such as dots, spaces, slashes, or percent signs.
 
        The column names are as always in such a case quoted, however the
        DB still needs to support those characters in the name somehow.
 
        rrrrrÚunusual_column_name_characters³s    z0SuiteRequirements.unusual_column_name_characterscCst ¡S)z(Target database must support subqueries.rrrrrÚ
subqueries¾szSuiteRequirements.subqueriescCst ¡S)zRtarget database can render OFFSET, or an equivalent, in a
        SELECT.
        rrrrrÚoffsetÄszSuiteRequirements.offsetcCst ¡S)zWtarget database can render LIMIT and/or OFFSET using a bound
        parameter
        rrrrrÚbound_limit_offsetÌsz$SuiteRequirements.bound_limit_offsetcCst ¡S)zžtarget database can render LIMIT and/or OFFSET with a complete
        SQL expression, such as one that uses the addition operator.
        parameter
        rrrrrÚsql_expression_limit_offsetÔsz-SuiteRequirements.sql_expression_limit_offsetcCst ¡S)zÎTarget database must support parenthesized SELECT in UNION
        when LIMIT/OFFSET is specifically present.
 
        E.g. (SELECT ...) UNION (SELECT ..)
 
        This is known to fail on SQLite.
 
        rrrrrÚ/parens_in_union_contained_select_w_limit_offsetÝs
zASuiteRequirements.parens_in_union_contained_select_w_limit_offsetcCst ¡S)alTarget database must support parenthesized SELECT in UNION
        when OFFSET/LIMIT is specifically not present.
 
        E.g. (SELECT ... LIMIT ..) UNION (SELECT .. OFFSET ..)
 
        This is known to fail on SQLite.  It also fails on Oracle
        because without LIMIT/OFFSET, there is currently no step that
        creates an additional subquery.
 
        rrrrrÚ0parens_in_union_contained_select_wo_limit_offsetés zBSuiteRequirements.parens_in_union_contained_select_wo_limit_offsetcCst ¡S)z;Target database must support boolean expressions as columnsrrrrrÚboolean_col_expressions÷sz)SuiteRequirements.boolean_col_expressionscCst ¡S)z5Target database allows boolean columns to store NULL.rrrrrÚnullable_booleansýsz#SuiteRequirements.nullable_booleanscCst ¡S)z,Target backends that support nulls ordering.rrrrrÚ nullsorderingszSuiteRequirements.nullsorderingcCst ¡S)z‡target database/driver supports bound parameters as column
        expressions without being in the context of a typed column.
        rrrrrÚstandalone_binds    sz"SuiteRequirements.standalone_bindscCst ¡S)z‰target database/driver supports bound parameters with NULL in the
        WHERE clause, in situations where it has to be typed.
 
        rrrrrÚ!standalone_null_binds_whereclausesz3SuiteRequirements.standalone_null_binds_whereclausecCst ¡S)z5Target database must support INTERSECT or equivalent.rrrrrÚ    intersectszSuiteRequirements.intersectcCst ¡S)z?Target database must support EXCEPT or equivalent (i.e. MINUS).rrrrrÚexcept_szSuiteRequirements.except_cCst ¡S)z.Target database must support window functions.rrrrrÚwindow_functions"sz"SuiteRequirements.window_functionscCst ¡S)zTarget database supports CTEsrrrrrÚctes'szSuiteRequirements.ctescCst ¡S)z™target database supports CTES that ride on top of a normal UPDATE
        or DELETE statement which refers to the CTE in a correlated subquery.
 
        rrrrrÚctes_with_update_delete-sz)SuiteRequirements.ctes_with_update_deletecCst ¡S)z}target database supports CTES which consist of INSERT, UPDATE
        or DELETE *within* the CTE, e.g. WITH x AS (UPDATE....)rrrrrÚ ctes_on_dml6szSuiteRequirements.ctes_on_dmlcCst ¡S)z~target platform generates new surrogate integer primary key values
        when insert() is executed, excluding the pk column.rrrrrÚautoincrement_insert=sz&SuiteRequirements.autoincrement_insertcCst ¡S)a#target platform will allow cursor.fetchone() to proceed after a
        COMMIT.
 
        Typically this refers to an INSERT statement with RETURNING which
        is invoked within "autocommit".   If the row can be returned
        after the autocommit, then this rule can be open.
 
        rrrrrÚfetch_rows_post_commitDs z(SuiteRequirements.fetch_rows_post_commitcCst ¡S)z‰target platform supports SQL expressions in GROUP BY
 
        e.g.
 
        SELECT x + y AS somelabel FROM table GROUP BY x + y
 
        rrrrrÚgroup_by_complex_expressionQs
z-SuiteRequirements.group_by_complex_expressioncCst dd„d¡S)NcSs |jjj Sr()r.ÚdialectZsupports_sane_rowcountrrrrr*`óz1SuiteRequirements.sane_rowcount.<locals>.<lambda>z&driver doesn't support 'sane' rowcount©rÚskip_ifrrrrÚ sane_rowcount]sþzSuiteRequirements.sane_rowcountcCst dd„d¡S)NcSs |jjj Sr()r.rLZsupports_sane_multi_rowcountrrrrr*grMz7SuiteRequirements.sane_multi_rowcount.<locals>.<lambda>z;driver %(driver)s %(doesnt_support)s 'sane' multi row count©rZfails_ifrrrrÚsane_multi_rowcountdsþz%SuiteRequirements.sane_multi_rowcountcCst dd„d¡S)NcSs |jjj Sr()r.rLZ supports_sane_rowcount_returningrrrrr*nsÿz=SuiteRequirements.sane_rowcount_w_returning.<locals>.<lambda>z;driver doesn't support 'sane' rowcount when returning is onrQrrrrÚsane_rowcount_w_returningksüz+SuiteRequirements.sane_rowcount_w_returningcCst dd„d¡S)zatarget platform supports INSERT with no values, i.e.
        INSERT DEFAULT VALUES or equivalent.cSs|jjjp|jjjp|jjjSr()r.rLZsupports_empty_insertZsupports_default_valuesZsupports_default_metavaluerrrrr*zs
ÿz1SuiteRequirements.empty_inserts.<locals>.<lambda>zempty inserts not supportedr+rrrrÚ empty_insertstsüzSuiteRequirements.empty_insertscCs|jS)zvtarget platform supports INSERT with no values, i.e.
        INSERT DEFAULT VALUES or equivalent, within executemany())rTrrrrÚempty_inserts_executemany€sz+SuiteRequirements.empty_inserts_executemanycCst ¡S)z.target platform supports INSERT from a SELECT.rrrrrÚinsert_from_select‡sz$SuiteRequirements.insert_from_selectcCst dd„d¡S)z.target platform supports DELETE ... RETURNING.cSs
|jjjSr()r.rLÚdelete_returningrrrrr*’rMz4SuiteRequirements.delete_returning.<locals>.<lambda>z4%(database)s %(does_support)s 'DELETE ... RETURNING'r+rrrrrWsþz"SuiteRequirements.delete_returningcCst dd„d¡S)z.target platform supports INSERT ... RETURNING.cSs
|jjjSr()r.rLÚinsert_returningrrrrr*›rMz4SuiteRequirements.insert_returning.<locals>.<lambda>z4%(database)s %(does_support)s 'INSERT ... RETURNING'r+rrrrrX–sþz"SuiteRequirements.insert_returningcCst dd„d¡S)z.target platform supports UPDATE ... RETURNING.cSs
|jjjSr()r.rLÚupdate_returningrrrrr*¤rMz4SuiteRequirements.update_returning.<locals>.<lambda>z4%(database)s %(does_support)s 'UPDATE ... RETURNING'r+rrrrrYŸsþz"SuiteRequirements.update_returningcCst dd„d¡S)zÆtarget platform supports RETURNING when INSERT is used with
        executemany(), e.g. multiple parameter sets, indicating
        as many rows come back as do parameter sets were passed.
 
        cSs
|jjjSr()r.rLÚinsert_executemany_returningrrrrr*±rMz@SuiteRequirements.insert_executemany_returning.<locals>.<lambda>zR%(database)s %(does_support)s 'RETURNING of multiple rows with INSERT executemany'r+rrrrrZ¨sþz.SuiteRequirements.insert_executemany_returningcCst dd„d¡S)NcSs|jjjo|jjjo|jjjSr()r.rLÚsupports_multivalues_insertrXZuse_insertmanyvaluesrrrrr*¹s
ÿz4SuiteRequirements.insertmanyvalues.<locals>.<lambda>z=%(database)s %(does_support)s 'insertmanyvalues functionalityr+rrrrÚinsertmanyvalues¶süz"SuiteRequirements.insertmanyvaluescCst ¡S)zZTarget platform supports the syntax
        "(x, y) IN ((x1, y1), (x2, y2), ...)"
        rrrrrÚtuple_in¿szSuiteRequirements.tuple_incCs|jS)z%Target platform tuple IN w/ empty set)r]rrrrÚtuple_in_w_emptyÇsz"SuiteRequirements.tuple_in_w_emptycCst ¡S)zwtarget platform supports a SELECT statement that has
        the same name repeated more than once in the columns list.rrrrrÚ%duplicate_names_in_cursor_descriptionÌsz7SuiteRequirements.duplicate_names_in_cursor_descriptioncCst dd„d¡S)z[Target database must have 'denormalized', i.e.
        UPPERCASE as case insensitive names.cSs |jjj Sr()r.rLZrequires_name_normalizerrrrr*ÙrMz6SuiteRequirements.denormalized_names.<locals>.<lambda>z,Backend does not require denormalized names.rNrrrrÚdenormalized_namesÓsþz$SuiteRequirements.denormalized_namescCst dd„d¡S)zTtarget database must support multiple VALUES clauses in an
        INSERT statement.cSs |jjj Sr()r.rLr[rrrrr*ãrMz7SuiteRequirements.multivalues_inserts.<locals>.<lambda>z*Backend does not support multirow inserts.rNrrrrÚmultivalues_insertsÝsþz%SuiteRequirements.multivalues_insertscCst ¡S)zvtarget dialect implements the executioncontext.get_lastrowid()
        method without reliance on RETURNING.
 
        rrrrrÚimplements_get_lastrowidçsz*SuiteRequirements.implements_get_lastrowidcCst ¡S)zLdialect includes the required pep-249 attribute
        ``cursor.arraysize``rrrrrÚ    arraysizeïszSuiteRequirements.arraysizecCst ¡S)a<target dialect retrieves cursor.lastrowid, or fetches
        from a database-side function after an insert() construct executes,
        within the get_lastrowid() method.
 
        Only dialects that "pre-execute", or need RETURNING to get last
        inserted id, would return closed/fail/skip for this.
 
        rrrrrÚemulated_lastrowidös
z$SuiteRequirements.emulated_lastrowidcCst ¡S)z¢target dialect retrieves cursor.lastrowid or an equivalent
        after an insert() construct executes, even if the table has a
        Sequence on it.
 
        rrrrrÚ&emulated_lastrowid_even_with_sequencessz8SuiteRequirements.emulated_lastrowid_even_with_sequencescCst ¡S)z]target platform includes a 'lastrowid' accessor on the DBAPI
        cursor object.
 
        rrrrrÚdbapi_lastrowid sz!SuiteRequirements.dbapi_lastrowidcCst ¡S)z#Target database must support VIEWs.rrrrrÚviewsszSuiteRequirements.viewscCs tdd„ƒS)zXTarget database must support external schemas, and have one
        named 'test_schema'.cSs
|jjjSr()r.rLZsupports_schemasrrrrr*rMz+SuiteRequirements.schemas.<locals>.<lambda>rrrrrÚschemasszSuiteRequirements.schemascCst ¡S)zJtarget system must support reflection of inter-schema
        foreign keysrrrrrÚcross_schema_fk_reflection sz,SuiteRequirements.cross_schema_fk_reflectioncCst ¡S)aTarget supports refleciton of FOREIGN KEY constraints and
        will return the name of the constraint that was used in the
        "CONSTRAINT <name> FOREIGN KEY" DDL.
 
        MySQL prior to version 8 and MariaDB prior to version 10.5
        don't support this.
 
        rrrrrÚ&foreign_key_constraint_name_reflection&s
z8SuiteRequirements.foreign_key_constraint_name_reflectioncCst ¡S)zŒtarget system has a strong concept of 'default' schema that can
        be referred to implicitly.
 
        basically, PostgreSQL.
 
        rrrrrÚimplicit_default_schema2sz)SuiteRequirements.implicit_default_schemacCst ¡S)z`target dialect implements provisioning module including
        set_default_schema_on_connectionrrrrrÚdefault_schema_name_switch<sz,SuiteRequirements.default_schema_name_switchcCst dd„gd¡S)z0Target dialect must support server side cursors.cSs
|jjjSr()r.rLZsupports_server_side_cursorsrrrrr*HrMz7SuiteRequirements.server_side_cursors.<locals>.<lambda>zno server side cursors supportr+rrrrÚserver_side_cursorsCsþz%SuiteRequirements.server_side_cursorscCst dd„gd¡S)z'Target database must support SEQUENCEs.cSs
|jjjSr()r.rLÚsupports_sequencesrrrrr*QrMz-SuiteRequirements.sequences.<locals>.<lambda>zno sequence supportr+rrrrÚ    sequencesLsþzSuiteRequirements.sequencescCs t |j¡S)zJthe opposite of "sequences", DB does not support sequences at
        all.)rZ NotPredicaterorrrrÚ no_sequencesUszSuiteRequirements.no_sequencescCst dd„gd¡S)zgTarget database supports sequences, but also optionally
        as a means of generating new PK values.cSs|jjjo|jjjSr()r.rLrnÚsequences_optionalrrrrr*cs
z6SuiteRequirements.sequences_optional.<locals>.<lambda>z.no sequence support, or sequences not optionalr+rrrrrq\s
ÿûz$SuiteRequirements.sequences_optionalcCst dd„g¡S)atarget database / driver supports cursor.lastrowid as a means
        of retrieving the last inserted primary key value.
 
        note that if the target DB supports sequences also, this is still
        assumed to work.  This is a new use case brought on by MariaDB 10.3.
 
        cSs
|jjjSr(©r.rLZpostfetch_lastrowidrrrrr*srMz6SuiteRequirements.supports_lastrowid.<locals>.<lambda>r+rrrrÚsupports_lastrowidis    ÿz$SuiteRequirements.supports_lastrowidcCst dd„g¡S)z"the opposite of supports_lastrowidcSs |jjj Sr(rrrrrrr*zrMz8SuiteRequirements.no_lastrowid_support.<locals>.<lambda>r+rrrrÚno_lastrowid_supportvsÿz&SuiteRequirements.no_lastrowid_supportcCst ¡Sr(rrrrrÚreflects_pk_names}sz#SuiteRequirements.reflects_pk_namescCst ¡S)z8target database has general support for table reflectionrrrrrÚtable_reflectionsz"SuiteRequirements.table_reflectioncCst ¡S)z„target database supports creation and reflection of tables with no
        columns, or at least tables that seem to have no columns.rrrrrÚreflect_tables_no_columns†sz+SuiteRequirements.reflect_tables_no_columnscCst ¡S)z:Indicates if the database support table comment reflectionrrrrrÚcomment_reflectionsz$SuiteRequirements.comment_reflectioncCst ¡S)z{Indicates if the database support table comment reflection in the
        full unicode range, including emoji etc.
        rrrrrÚcomment_reflection_full_unicode’sz1SuiteRequirements.comment_reflection_full_unicodecCst ¡S)zXindicates if the database support constraint on constraints
        and their reflectionrrrrrÚconstraint_comment_reflection™sz/SuiteRequirements.constraint_comment_reflectioncCs|jS)z¹target database must support retrieval of the columns in a view,
        similarly to how a table is inspected.
 
        This does not include the full CREATE VIEW definition.
 
        ©rgrrrrÚview_column_reflectionŸsz(SuiteRequirements.view_column_reflectioncCs|jS)zStarget database must support inspection of the full CREATE VIEW
        definition.r{rrrrÚview_reflection©sz!SuiteRequirements.view_reflectioncCs|jSr()rhrrrrÚschema_reflection¯sz#SuiteRequirements.schema_reflectioncCst ¡S)zatarget database supports schema create and dropped with
        'CREATE SCHEMA' and 'DROP SCHEMA'rrrrrÚschema_create_delete³sz&SuiteRequirements.schema_create_deletecCst ¡Sr(rrrrrÚ!primary_key_constraint_reflection¹sz3SuiteRequirements.primary_key_constraint_reflectioncCst ¡Sr(rrrrrÚ!foreign_key_constraint_reflection½sz3SuiteRequirements.foreign_key_constraint_reflectioncCst ¡Sr(rrrrrÚ1foreign_key_constraint_option_reflection_ondeleteÁszCSuiteRequirements.foreign_key_constraint_option_reflection_ondeletecCst ¡Sr(rrrrrÚ1fk_constraint_option_reflection_ondelete_restrictÅszCSuiteRequirements.fk_constraint_option_reflection_ondelete_restrictcCst ¡Sr(rrrrrÚ1fk_constraint_option_reflection_ondelete_noactionÉszCSuiteRequirements.fk_constraint_option_reflection_ondelete_noactioncCst ¡Sr(rrrrrÚ1foreign_key_constraint_option_reflection_onupdateÍszCSuiteRequirements.foreign_key_constraint_option_reflection_onupdatecCst ¡Sr(rrrrrÚ1fk_constraint_option_reflection_onupdate_restrictÑszCSuiteRequirements.fk_constraint_option_reflection_onupdate_restrictcCst ¡Sr(rrrrrÚtemp_table_reflectionÕsz'SuiteRequirements.temp_table_reflectioncCs|jSr()r‡rrrrÚtemp_table_reflect_indexesÙsz,SuiteRequirements.temp_table_reflect_indexescCst ¡S)z8target dialect supports listing of temporary table namesrrrrrÚtemp_table_namesÝsz"SuiteRequirements.temp_table_namescCst ¡S)z9target dialect supports checking a single temp table namerrrrrÚhas_temp_tableâsz SuiteRequirements.has_temp_tablecCst ¡S)z)target database supports temporary tablesrrrrrÚtemporary_tablesçsz"SuiteRequirements.temporary_tablescCst ¡S)z(target database supports temporary viewsrrrrrÚtemporary_viewsìsz!SuiteRequirements.temporary_viewscCst ¡Sr(rrrrrÚindex_reflectionñsz"SuiteRequirements.index_reflectioncCst ¡Sr(rrrrrÚindex_reflects_included_columnsõsz1SuiteRequirements.index_reflects_included_columnscCst ¡S)z?target database supports CREATE INDEX with per-column ASC/DESC.rrrrrÚindexes_with_ascdescùsz&SuiteRequirements.indexes_with_ascdesccCst ¡S)zKtarget database supports reflecting INDEX with per-column
        ASC/DESC.rrrrrÚreflect_indexes_with_ascdescþsz.SuiteRequirements.reflect_indexes_with_ascdesccCst ¡S)zztarget database supports reflecting INDEX with per-column
        ASC/DESC but reflects them as expressions (like oracle).rrrrrÚ*reflect_indexes_with_ascdesc_as_expressionsz<SuiteRequirements.reflect_indexes_with_ascdesc_as_expressioncCst ¡S)z>target database supports CREATE INDEX against SQL expressions.rrrrrÚindexes_with_expressions
sz*SuiteRequirements.indexes_with_expressionscCst ¡S)zLtarget database supports reflection of indexes with
        SQL expressions.rrrrrÚ reflect_indexes_with_expressionssz2SuiteRequirements.reflect_indexes_with_expressionscCst ¡S)z8target dialect supports reflection of unique constraintsrrrrrÚunique_constraint_reflectionsz.SuiteRequirements.unique_constraint_reflectioncCst ¡S)z7target dialect supports reflection of check constraintsrrrrrÚcheck_constraint_reflectionsz-SuiteRequirements.check_constraint_reflectioncCst ¡S)z€target dialect raises IntegrityError when reporting an INSERT
        with a primary key violation.  (hint: it should)
 
        rrrrrÚ$duplicate_key_raises_integrity_errorsz6SuiteRequirements.duplicate_key_raises_integrity_errorcCst ¡S)z3Target database must support VARCHAR with no lengthrrrrrÚunbounded_varchar'sz#SuiteRequirements.unbounded_varcharcCst ¡S)zÜTarget database/dialect can receive / deliver / compare data with
        non-ASCII characters in plain VARCHAR, TEXT columns, without the need
        for special "national" datatypes like NVARCHAR or similar.
 
        rrrrrÚunicode_data_no_special_types-sz/SuiteRequirements.unicode_data_no_special_typescCst ¡S)zµTarget database/dialect must support Python unicode objects with
        non-ASCII characters represented, delivered as bound parameters
        as well as in result rows.
 
        rrrrrÚ unicode_data6szSuiteRequirements.unicode_datacCst ¡S)zRTarget driver must support some degree of non-ascii symbol
        names.
        rrrrrÚ unicode_ddl?szSuiteRequirements.unicode_ddlcCst ¡S)z?Target driver can create tables with a name like 'some " table'rrrrrÚsymbol_names_w_double_quoteFsz-SuiteRequirements.symbol_names_w_double_quotecCst ¡S)z™target dialect supports rendering of a date, time, or datetime as a
        literal string, e.g. via the TypeEngine.literal_processor() method.
 
        rrrrrÚdatetime_literalsKsz#SuiteRequirements.datetime_literalscCst ¡S)zUtarget dialect supports representation of Python
        datetime.datetime() objects.rrrrrÚdatetimeTszSuiteRequirements.datetimecCst ¡S)zvtarget dialect supports representation of Python
        datetime.datetime() with tzinfo with DateTime(timezone=True).rrrrrÚdatetime_timezone[sz#SuiteRequirements.datetime_timezonecCst ¡S)zntarget dialect supports representation of Python
        datetime.time() with tzinfo with Time(timezone=True).rrrrrÚ time_timezonebszSuiteRequirements.time_timezonecCst ¡S)z target dialect when given a date object will bind it such
        that the database server knows the object is a date, and not
        a plain string.
 
        rrrrrÚdate_implicit_boundisz%SuiteRequirements.date_implicit_boundcCst ¡S)z target dialect when given a time object will bind it such
        that the database server knows the object is a time, and not
        a plain string.
 
        rrrrrÚtime_implicit_boundrsz%SuiteRequirements.time_implicit_boundcCst ¡S)z¨target dialect when given a datetime object will bind it such
        that the database server knows the object is a datetime, and not
        a plain string.
 
        rrrrrÚdatetime_implicit_bound{sz)SuiteRequirements.datetime_implicit_boundcCst ¡S)zftarget dialect supports representation of Python
        datetime.datetime() with microsecond objects.rrrrrÚdatetime_microseconds„sz'SuiteRequirements.datetime_microsecondscCst ¡S)zŒtarget dialect supports representation of Python
        datetime.datetime() with microsecond objects but only
        if TIMESTAMP is used.rrrrrÚtimestamp_microseconds‹sz(SuiteRequirements.timestamp_microsecondscCs|jS)atarget dialect when given a datetime object which also includes
        a microseconds portion when using the TIMESTAMP data type
        will bind it such that the database server knows
        the object is a datetime with microseconds, and not a plain string.
 
        )r¤rrrrÚ%timestamp_microseconds_implicit_bound’sz7SuiteRequirements.timestamp_microseconds_implicit_boundcCst ¡S©zutarget dialect supports representation of Python
        datetime.datetime() objects with historic (pre 1970) values.rrrrrÚdatetime_historicœsz#SuiteRequirements.datetime_historiccCst ¡S)zQtarget dialect supports representation of Python
        datetime.date() objects.rrrrrÚdate£szSuiteRequirements.datecCst ¡S)zPtarget dialect accepts a datetime object as the target
        of a date column.rrrrrÚdate_coerces_from_datetimeªsz,SuiteRequirements.date_coerces_from_datetimecCst ¡Sr¦rrrrrÚ date_historic±szSuiteRequirements.date_historiccCst ¡S)zQtarget dialect supports representation of Python
        datetime.time() objects.rrrrrÚtime¸szSuiteRequirements.timecCst ¡S)zbtarget dialect supports representation of Python
        datetime.time() with microsecond objects.rrrrrÚtime_microseconds¿sz#SuiteRequirements.time_microsecondscCst ¡S)zttarget database/driver can allow BLOB/BINARY fields to be compared
        against a bound parameter value.
        rrrrrÚbinary_comparisonsÆsz$SuiteRequirements.binary_comparisonscCst ¡S)a!target backend supports simple binary literals, e.g. an
        expression like::
 
            SELECT CAST('foo' AS BINARY)
 
        Where ``BINARY`` is the type emitted from :class:`.LargeBinary`,
        e.g. it could be ``BLOB`` or similar.
 
        Basically fails on Oracle.
 
        rrrrrÚbinary_literalsÎsz!SuiteRequirements.binary_literalscCst ¡S)z:target dialect supports 'AUTOCOMMIT' as an isolation_levelrrrrrÚ
autocommitÞszSuiteRequirements.autocommitcCst ¡S)zÃtarget dialect supports general isolation level settings.
 
        Note that this requirement, when enabled, also requires that
        the get_isolation_levels() method be implemented.
 
        rrrrrÚisolation_levelãsz!SuiteRequirements.isolation_levelc
Csj|j ¡V}z|j |jj¡}Wn tk
r@YW5QR£dSX|jj|dœW5QR£SW5QRXdS)a¨Return a structure of supported isolation levels for the current
        testing dialect.
 
        The structure indicates to the testing suite what the expected
        "default" isolation should be, as well as the other values that
        are accepted.  The dictionary has two keys, "default" and "supported".
        The "supported" key refers to a list of all supported levels and
        it should include AUTOCOMMIT if the dialect supports it.
 
        If the :meth:`.DefaultRequirements.isolation_level` requirement is
        not open, then this method has no return value.
 
        E.g.::
 
            >>> testing.requirements.get_isolation_levels()
            {
                "default": "READ_COMMITTED",
                "supported": [
                    "SERIALIZABLE", "READ UNCOMMITTED",
                    "READ COMMITTED", "REPEATABLE READ",
                    "AUTOCOMMIT"
                ]
            }
        N)ÚdefaultÚ    supported)r.ÚconnectrLÚget_isolation_level_valuesÚ
connectionÚdbapi_connectionÚNotImplementedErrorZdefault_isolation_level)rrÚconnr²rrrÚget_isolation_levelsís ÿþz&SuiteRequirements.get_isolation_levelscCsdd„}t |¡S)zˆtarget dialect supports the
        :meth:`_engine.Dialect.get_isolation_level_values`
        method added in SQLAlchemy 2.0.
 
        c    Ss^|j ¡J}z|j |jj¡Wn tk
r@YW5QR£dSXW5QR£dSW5QRXdS©NFT)r.r³rLr´rµr¶r·)rr¸rrrr0s ÿz8SuiteRequirements.get_isolation_level_values.<locals>.gor+r1rrrr´s z,SuiteRequirements.get_isolation_level_valuescCsdd„}t |¡S)zctest that the dialect allows the 'isolation_level' argument
        to be handled by DefaultDialectcSs4zt|jjdd}WnYdSX|jjdkSdS)NzREAD COMMITTED)r°F)r r.ÚurlrLZ_on_connect_isolation_level)rÚerrrr0.sÿ
 
ÿzASuiteRequirements.dialect_level_isolation_level_param.<locals>.gor+r1rrrÚ#dialect_level_isolation_level_param)s z5SuiteRequirements.dialect_level_isolation_level_paramcCst ¡S)z.target platform implements a native JSON type.rrrrrÚ    json_type<szSuiteRequirements.json_typecCs|jS)zNtarget platform supports numeric array indexes
        within a JSON structure)r¾rrrrÚjson_array_indexesBsz$SuiteRequirements.json_array_indexescCst ¡Sr(rrrrrÚ(json_index_supplementary_unicode_elementIsz:SuiteRequirements.json_index_supplementary_unicode_elementcCst ¡S)z©Backend has a JSON_EXTRACT or similar function that returns a
        valid JSON string in all cases.
 
        Used to test a legacy feature and is not needed.
 
        rrrrrÚ!legacy_unconditional_json_extractMsz3SuiteRequirements.legacy_unconditional_json_extractcCst ¡S)zRtarget backend has general support for moderately high-precision
        numerics.rrrrrÚprecision_numerics_generalWsz,SuiteRequirements.precision_numerics_generalcCst ¡S)zbtarget backend supports Decimal() objects using E notation
        to represent very small values.rrrrrÚ"precision_numerics_enotation_small]sz4SuiteRequirements.precision_numerics_enotation_smallcCst ¡S)zbtarget backend supports Decimal() objects using E notation
        to represent very large values.rrrrrÚ"precision_numerics_enotation_largecsz4SuiteRequirements.precision_numerics_enotation_largecCst ¡S)z†target backend supports values with many digits on both sides,
        such as 319438950232418390.273596, 87673.594069654243
 
        rrrrrÚ*precision_numerics_many_significant_digitsisz<SuiteRequirements.precision_numerics_many_significant_digitscCs|jS)z}same as precision_numerics_many_significant_digits but within the
        context of a CAST statement (hello MySQL)
 
        )rÅrrrrÚ/cast_precision_numerics_many_significant_digitsqszASuiteRequirements.cast_precision_numerics_many_significant_digitscCst ¡S)a+target backend will return a selected Decimal as a Decimal, not
        a string.
 
        e.g.::
 
            expr = decimal.Decimal("15.7563")
 
            value = e.scalar(
                select(literal(expr))
            )
 
            assert value == expr
 
        See :ticket:`4036`
 
        rrrrrÚimplicit_decimal_bindsysz(SuiteRequirements.implicit_decimal_bindscCst ¡S)aFtarget backend will return result columns that are explicitly
        against NUMERIC or similar precision-numeric datatypes (not including
        FLOAT or INT types) as Python Decimal objects, and not as floats
        or ints, including when no SQLAlchemy-side typing information is
        associated with the statement (e.g. such as a raw SQL string).
 
        This should be enabled if either the DBAPI itself returns Decimal
        objects, or if the dialect has set up DBAPI-specific return type
        handlers such that Decimal objects come back automatically.
 
        rrrrrÚ#numeric_received_as_decimal_untypedŽs z5SuiteRequirements.numeric_received_as_decimal_untypedcCst ¡S)zhtarget database can select an aggregate from a subquery that's
        also using an aggregate
 
        rrrrrÚnested_aggregatessz#SuiteRequirements.nested_aggregatescCst ¡S)zbtarget database must support ON DELETE CASCADE on a self-referential
        foreign key
 
        rrrrrÚrecursive_fk_cascade¥sz&SuiteRequirements.recursive_fk_cascadecCst ¡S)z£A precision numeric type will return empty significant digits,
        i.e. a value such as 10.000 will come back in Decimal form with
        the .000 maintained.rrrrrÚ-precision_numerics_retains_significant_digits­sz?SuiteRequirements.precision_numerics_retains_significant_digitscCst ¡S)z@The Float type can persist and load float('inf'), float('-inf').rrrrrÚinfinity_floatsµsz!SuiteRequirements.infinity_floatscCst ¡Sr(rrrrrÚ-float_or_double_precision_behaves_generically»sz?SuiteRequirements.float_or_double_precision_behaves_genericallycCst ¡S)ztarget backend will return native floating point numbers with at
        least seven decimal places when using the generic Float type.
 
        rrrrrÚprecision_generic_float_type¿sz.SuiteRequirements.precision_generic_float_typecCst ¡S)zýtarget backend will return the exact float value 15.7563
        with only four significant digits from this statement:
 
        SELECT :param
 
        where :param is the Python float 15.7563
 
        i.e. it does not return 15.75629997253418
 
        rrrrrÚliteral_float_coercionÇs z(SuiteRequirements.literal_float_coercioncCst ¡S)zÀtarget backend can return a floating-point number with four
        significant digits (such as 15.7563) accurately
        (i.e. without FP inaccuracies, such as 15.75629997253418).
 
        rrrrrÚfloats_to_four_decimalsÕsz)SuiteRequirements.floats_to_four_decimalscCst ¡S)z™target backend doesn't crash when you try to select a NUMERIC
        value that has a value of NULL.
 
        Added to support Pyodbc bug #351.
        rrrrrÚfetch_null_from_numericÞsz)SuiteRequirements.fetch_null_from_numericcCst ¡S)z*target backend uses Numeric for Float/DualrrrrrÚfloat_is_numericèsz"SuiteRequirements.float_is_numericcCst ¡S)zUTarget database must support an unbounded Text() "
        "type such as TEXT or CLOBrrrrrÚ    text_typeîszSuiteRequirements.text_typecCst ¡S)zTtarget database can persist/return an empty string with a
        varchar.
 
        rrrrrÚempty_strings_varcharõsz'SuiteRequirements.empty_strings_varcharcCst ¡S)zRtarget database can persist/return an empty string with an
        unbounded text.rrrrrÚempty_strings_textýsz$SuiteRequirements.empty_strings_textcCst ¡S)zUtarget database supports use of an unbounded textual field in a
        WHERE clause.rrrrrÚ"expressions_against_unbounded_textsz4SuiteRequirements.expressions_against_unbounded_textcCst ¡S)z;target driver must support the literal statement 'select 1'rrrrrÚ    selectone szSuiteRequirements.selectonecCst ¡S)z(Target database must support savepoints.rrrrrÚ
savepointsszSuiteRequirements.savepointscCst ¡S)z4Target database must support two-phase transactions.rrrrrÚtwo_phase_transactionssz(SuiteRequirements.two_phase_transactionscCst ¡S)z'Target must support UPDATE..FROM syntaxrrrrrÚ update_fromszSuiteRequirements.update_fromcCst ¡S)z=Target must support DELETE FROM..FROM or DELETE..USING syntaxrrrrrÚ delete_from!szSuiteRequirements.delete_fromcCst ¡S)a¢Target must support UPDATE (or DELETE) where the same table is
        present in a subquery in the WHERE clause.
 
        This is an ANSI-standard syntax that apparently MySQL can't handle,
        such as::
 
            UPDATE documents SET flag=1 WHERE documents.title IN
                (SELECT max(documents.title) AS title
                    FROM documents GROUP BY documents.user_id
                )
 
        rrrrrÚupdate_where_target_in_subquery&sz1SuiteRequirements.update_where_target_in_subquerycCst ¡S)zOtarget database must use a plain percent '%' as the 'modulus'
        operator.rrrrrÚmod_operator_as_percent_sign6sz.SuiteRequirements.mod_operator_as_percent_signcCst ¡S)atarget backend supports weird identifiers with percent signs
        in them, e.g. 'some % column'.
 
        this is a very weird use case but often has problems because of
        DBAPIs that use python formatting.  It's not a critical use
        case either.
 
        rrrrrÚpercent_schema_names<s
z&SuiteRequirements.percent_schema_namescCst ¡S)z¢target database supports ordering by a column from a SELECT
        inside of a UNION
 
        E.g.  (SELECT id, ...) UNION (SELECT id, ...) ORDER BY id
 
        rrrrrÚorder_by_col_from_unionHsz)SuiteRequirements.order_by_col_from_unioncCst ¡S)atarget backend supports ORDER BY a column label within an
        expression.
 
        Basically this::
 
            select data as foo from test order by foo || 'bar'
 
        Lots of databases including PostgreSQL don't support this,
        so this is off by default.
 
        rrrrrÚorder_by_label_with_expressionRs z0SuiteRequirements.order_by_label_with_expressioncs‡fdd„}t |¡S)Ncs,zˆ |¡WdStk
r&YdSXdSrº)Úget_order_by_collationr·rrrrÚcheckcs
 
z3SuiteRequirements.order_by_collation.<locals>.checkrN©rrârrrÚorder_by_collationas z$SuiteRequirements.order_by_collationcCs
tƒ‚dSr()r·©rrrrrrálsz(SuiteRequirements.get_order_by_collationcCst ¡S)zUTarget driver must support non-ASCII characters being passed at
        all.
        rrrrrÚunicode_connectionsosz%SuiteRequirements.unicode_connectionscCst ¡S)zµTarget driver must raise a DBAPI-level exception, such as
        InterfaceError, when the underlying connection has been closed
        and the execute() method is called.
        rrrrrÚgraceful_disconnectsvsz&SuiteRequirements.graceful_disconnectscCst ¡S)zU
        Target must support simultaneous, independent database connections.
        rrrrrÚindependent_connections~sz)SuiteRequirements.independent_connectionscCst ¡S)z9Catchall for a large variety of MySQL on Windows failuresrrrrrÚskip_mysql_on_windows…sz'SuiteRequirements.skip_mysql_on_windowscCst dd„¡S)aTest environment must allow ad-hoc engine/connection creation.
 
        DBs that scale poorly for many connections, even when closed, i.e.
        Oracle, may use the "--low-connections" option which flags this
        requirement as not present.
 
        cSs|jjSr()ÚoptionsZlow_connectionsrrrrr*”rMz2SuiteRequirements.ad_hoc_engines.<locals>.<lambda>rNrrrrÚad_hoc_enginesŠs    ÿz SuiteRequirements.ad_hoc_enginescCst | ¡¡Sr()rrOÚ_running_on_windowsrrrrÚ
no_windows—szSuiteRequirements.no_windowscCstjdd„ddS)NcSs t ¡dkS)NÚWindows)ÚplatformÚsystemrrrrr*rMz7SuiteRequirements._running_on_windows.<locals>.<lambda>zrunning on Windows)Ú description)rZLambdaPredicaterrrrrì›sþz%SuiteRequirements._running_on_windowscCstjjSr()rÚ add_to_markerÚtiming_intensiverrrrró¡sz"SuiteRequirements.timing_intensivecCstjjSr()rròÚmemory_intensiverrrrrô¥sz"SuiteRequirements.memory_intensivecCst dd„d¡S)z}Mark tests that use threading and mock at the same time - stability
        issues have been observed with coverage
 
        cSs|jjSr(©rêZ has_coveragerrrrr*°rMz7SuiteRequirements.threading_with_mock.<locals>.<lambda>zStability issues with coveragerNrrrrÚthreading_with_mock©sþz%SuiteRequirements.threading_with_mockcCsdd„}t |¡S)NcSs,z tdƒWntk
r"YdSXdSdS©Nzsqlalchemy-stubs.ext.mypyFT©Ú
__import__Ú ImportErrorrrrrrâ¶s
 z2SuiteRequirements.sqlalchemy2_stubs.<locals>.checkr+rãrrrÚsqlalchemy2_stubs´sz#SuiteRequirements.sqlalchemy2_stubscCsdd„}t |¡S)NcSs,z tdƒWntk
r"YdSXdSdSr÷rørrrrrâÂs
 z5SuiteRequirements.no_sqlalchemy2_stubs.<locals>.checkrNrãrrrÚno_sqlalchemy2_stubsÀsz&SuiteRequirements.no_sqlalchemy2_stubscCst dd„d¡S)NcSstjSr()r Zpy38rrrrr*ÏrMz,SuiteRequirements.python38.<locals>.<lambda>zPython 3.8 or above requiredr+rrrrÚpython38ÌsÿzSuiteRequirements.python38cCst dd„d¡S)NcSstjSr()r Zpy39rrrrr*ÕrMz,SuiteRequirements.python39.<locals>.<lambda>zPython 3.9 or above requiredr+rrrrÚpython39ÒsÿzSuiteRequirements.python39cCst dd„d¡S)NcSstjSr()r Zpy310rrrrr*ÛrMz-SuiteRequirements.python310.<locals>.<lambda>zPython 3.10 or above requiredr+rrrrÚ    python310ØsÿzSuiteRequirements.python310cCst dd„d¡S)NcSstjSr()r Zpy311rrrrr*árMz-SuiteRequirements.python311.<locals>.<lambda>zPython 3.11 or above requiredr+rrrrÚ    python311ÞsÿzSuiteRequirements.python311cCst dd„d¡S)NcSstjSr()r Úcpythonrrrrr*çrMz+SuiteRequirements.cpython.<locals>.<lambda>zcPython interpreter neededr+rrrrräsÿzSuiteRequirements.cpythoncCst dd„d¡S)NcSstjSr()r Úis64bitrrrrr*ìrMz+SuiteRequirements.is64bit.<locals>.<lambda>z64bit requiredr+rrrrrêszSuiteRequirements.is64bitcCsdd„}t |d¡S)NcSs,z tdƒWntk
r"YdSXdSdS)NÚpatchFTrørrrrÚ    check_libðs
 z2SuiteRequirements.patch_library.<locals>.check_libzpatch library neededr+)rrrrrÚ patch_libraryîszSuiteRequirements.patch_librarycCs|jS)z“target platform must remove all cycles unconditionally when
        gc.collect() is called, as well as clean out unreferenced subclasses.
 
        )rrrrrÚpredictable_gcúsz SuiteRequirements.predictable_gccCst dd„d¡S)zÂTest should be skipped if coverage is enabled.
 
        This is to block tests that exercise libraries that seem to be
        sensitive to coverage, such as PostgreSQL notice logging.
 
        cSs|jjSr(rõrrrrr* rMz/SuiteRequirements.no_coverage.<locals>.<lambda>z(Issues observed when coverage is enabledrNrrrrÚ no_coveragesþzSuiteRequirements.no_coveragecCsdS©NFrrårrrÚ_has_mysql_on_windowssz'SuiteRequirements._has_mysql_on_windowscCsdSrrrårrrÚ_has_mysql_fully_case_sensitivesz1SuiteRequirements._has_mysql_fully_case_sensitivecst ‡fdd„¡S)Ncs
ˆ ¡ Sr()Ú _has_sqliterrrrr*rMz*SuiteRequirements.sqlite.<locals>.<lambda>rNrrrrÚsqliteszSuiteRequirements.sqlitecCst dd„d¡S)NcSs
t ¡ Sr()r Zhas_compiled_extrrrrr*rMz/SuiteRequirements.cextensions.<locals>.<lambda>zCython extensions not installedrNrrrrÚ cextensionssþzSuiteRequirements.cextensionscCs6ddlm}z|dƒWdStk
r0YdSXdS)Nrr z    sqlite://TF)Z
sqlalchemyr rú)rr rrrr  s  zSuiteRequirements._has_sqlitecCst ¡S)z@dialect makes use of await_() to invoke operations on the DBAPI.rrrrrÚ async_dialect)szSuiteRequirements.async_dialectcCs|jSr()Úgreenletrrrrr/szSuiteRequirements.asynciocCsdd„}t |¡S)NcSs6tjs
dSz ddl}Wntk
r,YdSXdSdS)NFrT)Ú _test_asyncioZENABLE_ASYNCIOrrú)rrrrrr05s z&SuiteRequirements.greenlet.<locals>.gor+r1rrrr3s zSuiteRequirements.greenletcCst ¡S)zSupports computed columnsrrrrrÚcomputed_columnsBsz"SuiteRequirements.computed_columnscCst ¡S)z/Supports computed columns with `persisted=True`rrrrrÚcomputed_columns_storedGsz)SuiteRequirements.computed_columns_storedcCst ¡S)z0Supports computed columns with `persisted=False`rrrrrÚcomputed_columns_virtualLsz*SuiteRequirements.computed_columns_virtualcCst ¡S)zSIf the default persistence is virtual or stored when `persisted`
        is omittedrrrrrÚ"computed_columns_default_persistedQsz4SuiteRequirements.computed_columns_default_persistedcCst ¡S)zTIf persistence information is returned by the reflection of
        computed columnsrrrrrÚ"computed_columns_reflect_persistedWsz4SuiteRequirements.computed_columns_reflect_persistedcCst ¡S)z1If a backend supports the DISTINCT ON in a selectrrrrrÚsupports_distinct_on]sz&SuiteRequirements.supports_distinct_oncCst dd„d¡S)a Supports some form of "x IS [NOT] DISTINCT FROM y" construct.
        Different dialects will implement their own flavour, e.g.,
        sqlite will emit "x IS NOT y" instead of "x IS DISTINCT FROM y".
 
        .. seealso::
 
            :meth:`.ColumnOperators.is_distinct_from`
 
        cSs |jjj Sr()r.rLÚsupports_is_distinct_fromrrrrr*nrMz=SuiteRequirements.supports_is_distinct_from.<locals>.<lambda>z4driver doesn't support an IS DISTINCT FROM constructrNrrrrrbs þz+SuiteRequirements.supports_is_distinct_fromcCst ¡S)zKIf a backend supports GENERATED { ALWAYS | BY DEFAULT }
        AS IDENTITYrrrrrÚidentity_columnsrsz"SuiteRequirements.identity_columnscCst ¡S)z•If a backend supports GENERATED { ALWAYS | BY DEFAULT }
        AS IDENTITY with a standard syntax.
        This is mainly to exclude MSSql.
        rrrrrÚidentity_columns_standardxsz+SuiteRequirements.identity_columns_standardcCst ¡S)z+backend supports the regexp_match operator.rrrrrÚ regexp_match€szSuiteRequirements.regexp_matchcCst ¡S)z-backend supports the regexp_replace operator.rrrrrÚregexp_replace…sz SuiteRequirements.regexp_replacecCst ¡S)z(backend supports the fetch first clause.rrrrrÚ fetch_firstŠszSuiteRequirements.fetch_firstcCst ¡S)z5backend supports the fetch first clause with percent.rrrrrÚ fetch_percentszSuiteRequirements.fetch_percentcCst ¡S)z2backend supports the fetch first clause with ties.rrrrrÚ
fetch_ties”szSuiteRequirements.fetch_tiescCst ¡S)z1backend supports the fetch first without order byrrrrrÚfetch_no_order_by™sz#SuiteRequirements.fetch_no_order_bycCst ¡S)zwbackend supports the offset when using fetch first with percent
        or ties. basically this is "not mssql"
        rrrrrÚfetch_offset_with_optionsžsz+SuiteRequirements.fetch_offset_with_optionscCst ¡S)zžbackend supports fetch / offset with expression in them, like
 
        SELECT * FROM some_table
        OFFSET 1 + 1 ROWS FETCH FIRST 1 + 1 ROWS ONLY
        rrrrrÚfetch_expression¥sz"SuiteRequirements.fetch_expressioncCst ¡S)zIf autoincrement=True on a column does not require an explicit
        sequence. This should be false only for oracle.
        rrrrrÚautoincrement_without_sequence®sz0SuiteRequirements.autoincrement_without_sequencecCst ¡S)z=If X[Y] can be implemented with ``__class_getitem__``. py3.7+rrrrrÚgeneric_classesµsz!SuiteRequirements.generic_classescCst ¡S)z@indicates if the json_deserializer function is called with bytesrrrrrÚjson_deserializer_binaryºsz*SuiteRequirements.json_deserializer_binarycCst ¡S)z6Target database must support reflecting table_options.rrrrrÚreflect_table_options¿sz'SuiteRequirements.reflect_table_optionscCst ¡S)z0Target database must support MATERIALIZED VIEWs.rrrrrÚmaterialized_viewsÄsz$SuiteRequirements.materialized_viewscCst ¡S)z/Target database reflect MATERIALIZED VIEWs pks.rrrrrÚmaterialized_views_reflect_pkÉsz/SuiteRequirements.materialized_views_reflect_pkN)ãrrrÚpropertyrrrrr r!r"r#r$r%r&r'r)r,r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrPrRrSrTrUrVrWrXrYrZr\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrorprqrsrtrurvrwrxryrzr|r}r~rr€rr‚rƒr„r…r†r‡rˆr‰rŠr‹rŒrrŽrrr‘r’r“r”r•r–r—r˜r™ršr›rœrržrŸr r¡r¢r£r¤r¥r§r¨r©rªr«r¬r­r®r¯r°r¹r´r½r¾r¿rÀrÁrÂrÃrÄrÅrÆrÇrÈrÉrÊrËrÌrÍrÎrÏrÐrÑrÒrÓrÔrÕrÖr×rØrÙrÚrÛrÜrÝrÞrßràrärárærçrèrérërírìrórôrörûrürýrþrÿrrrrrrr    r
r r r rrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'rrrrr%sp
 
 
 
 
 
 
 
 
 
 
 
 
 
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    
    
 
 
 
 
 
 
 
 
 
    
 
 
 
 
 
 
 
 
 
 
 
 
 
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    
 
 
 
 
 
      '              
 
          r)Ú__doc__Ú
__future__rrïÚrrrrr    r r r/rrrrrrrÚ<module>
s