@@ -61,6 +61,20 @@ def rewrite_rows_range_order_by_window(_, **kwargs):
61
61
return _ .copy (order_by = (_ .func .arg ,))
62
62
63
63
64
+ from ibis .expr .datatypes import dt
65
+ from ibis .expr .operations import IfElse
66
+
67
+ # wrap any boolean-valued SELECT column in IIF(..) CAST BIT (Gil tip)
68
+ @replace (p .Select )
69
+ def cast_boolean_in_select (_ , ** kwargs ):
70
+ new_selections : dict [str , Any ] = {}
71
+ for name , expr in _ .selections .items ():
72
+ if expr .dtype .is_boolean ():
73
+ new_selections [name ] = IfElse (expr , 1 , 0 ).cast (dt .boolean )
74
+ else :
75
+ new_selections [name ] = expr
76
+ return _ .copy (selections = new_selections )
77
+
64
78
class MSSQLCompiler (SQLGlotCompiler ):
65
79
__slots__ = ()
66
80
@@ -69,6 +83,7 @@ class MSSQLCompiler(SQLGlotCompiler):
69
83
dialect = MSSQL
70
84
type_mapper = MSSQLType
71
85
rewrites = (
86
+ cast_boolean_in_select ,
72
87
exclude_unsupported_window_frame_from_ops ,
73
88
exclude_unsupported_window_frame_from_row_number ,
74
89
exclude_unsupported_window_frame_from_rank ,
@@ -553,5 +568,13 @@ def visit_RPad(self, op, *, arg, length, pad):
553
568
),
554
569
)
555
570
571
+ def visit_IfElse (self , op , * , bool_expr , true_expr , false_null_expr ):
572
+ iif_expr = super ().visit_IfElse (
573
+ op ,
574
+ bool_expr = bool_expr ,
575
+ true_expr = true_expr ,
576
+ false_null_expr = false_null_expr ,
577
+ )
578
+ return self .cast (iif_expr , dt .boolean )
556
579
557
580
compiler = MSSQLCompiler ()
0 commit comments