@@ -163,7 +163,7 @@ def get_insert_default(self, column): # pragma: NO COVER
163163 """ ,
164164 flags = re .IGNORECASE | re .VERBOSE ,
165165 )
166- def __distribute_types_to_expanded_placeholders (self , m ): # pragma: NO COVER
166+ def __distribute_types_to_expanded_placeholders (self , m ):
167167 # If we have an in parameter, it sometimes gets expaned to 0 or more
168168 # parameters and we need to move the type marker to each
169169 # parameter.
@@ -174,8 +174,6 @@ def __distribute_types_to_expanded_placeholders(self, m): # pragma: NO COVER
174174 # suffixes refect that when an array parameter is expanded,
175175 # numeric suffixes are added. For example, a placeholder like
176176 # `%(foo)s` gets expaneded to `%(foo_0)s, `%(foo_1)s, ...`.
177-
178- # Coverage: despite our best efforts, never recognized this segment of code as being tested.
179177 placeholders , type_ = m .groups ()
180178 if placeholders :
181179 placeholders = placeholders .replace (")" , f":{ type_ } )" )
@@ -358,7 +356,11 @@ def group_by_clause(self, select, **kw):
358356
359357 __sqlalchemy_version_info = packaging .version .parse (sqlalchemy .__version__ )
360358
361- __expanding_text = "POSTCOMPILE"
359+ __expanding_text = (
360+ "EXPANDING"
361+ if __sqlalchemy_version_info < packaging .version .parse ("1.4" )
362+ else "POSTCOMPILE"
363+ )
362364
363365 # https://github.com/sqlalchemy/sqlalchemy/commit/f79df12bd6d99b8f6f09d4bf07722638c4b4c159
364366 __expanding_conflict = (
@@ -386,6 +388,9 @@ def visit_in_op_binary(self, binary, operator_, **kw):
386388 self ._generate_generic_binary (binary , " IN " , ** kw )
387389 )
388390
391+ def visit_empty_set_expr (self , element_types , ** kw ):
392+ return ""
393+
389394 def visit_not_in_op_binary (self , binary , operator , ** kw ):
390395 return (
391396 "("
@@ -419,16 +424,31 @@ def visit_contains_op_binary(self, binary, operator, **kw):
419424 self ._maybe_reescape (binary ), operator , ** kw
420425 )
421426
427+ def visit_notcontains_op_binary (self , binary , operator , ** kw ):
428+ return super (BigQueryCompiler , self ).visit_notcontains_op_binary (
429+ self ._maybe_reescape (binary ), operator , ** kw
430+ )
431+
422432 def visit_startswith_op_binary (self , binary , operator , ** kw ):
423433 return super (BigQueryCompiler , self ).visit_startswith_op_binary (
424434 self ._maybe_reescape (binary ), operator , ** kw
425435 )
426436
437+ def visit_notstartswith_op_binary (self , binary , operator , ** kw ):
438+ return super (BigQueryCompiler , self ).visit_notstartswith_op_binary (
439+ self ._maybe_reescape (binary ), operator , ** kw
440+ )
441+
427442 def visit_endswith_op_binary (self , binary , operator , ** kw ):
428443 return super (BigQueryCompiler , self ).visit_endswith_op_binary (
429444 self ._maybe_reescape (binary ), operator , ** kw
430445 )
431446
447+ def visit_notendswith_op_binary (self , binary , operator , ** kw ):
448+ return super (BigQueryCompiler , self ).visit_notendswith_op_binary (
449+ self ._maybe_reescape (binary ), operator , ** kw
450+ )
451+
432452 ############################################################################
433453
434454 __placeholder = re .compile (r"%\(([^\]:]+)(:[^\]:]+)?\)s$" ).match
@@ -490,8 +510,7 @@ def visit_bindparam(
490510 # here, because then we can't do a recompile later (e.g., first
491511 # print the statment, then execute it). See issue #357.
492512 #
493- # Coverage: despite our best efforts, never recognized this segment of code as being tested.
494- if getattr (bindparam , "expand_op" , None ) is not None : # pragma: NO COVER
513+ if getattr (bindparam , "expand_op" , None ) is not None :
495514 assert bindparam .expand_op .__name__ .endswith ("in_op" ) # in in
496515 bindparam = bindparam ._clone (maintain_key = True )
497516 bindparam .expanding = False
@@ -1259,6 +1278,10 @@ def do_rollback(self, dbapi_connection):
12591278 # BigQuery has no support for transactions.
12601279 pass
12611280
1281+ def _check_unicode_returns (self , connection , additional_tests = None ):
1282+ # requests gives back Unicode strings
1283+ return True
1284+
12621285 def get_view_definition (self , connection , view_name , schema = None , ** kw ):
12631286 if isinstance (connection , Engine ):
12641287 connection = connection .connect ()
0 commit comments