@@ -579,6 +579,30 @@ def get_column_specification(self, column, **kwargs):
579
579
def post_create_table (self , table ):
580
580
return " WITH %CLASSPARAMETER ALLOWIDENTITYINSERT = 1"
581
581
582
+ def visit_create_index (
583
+ self , create , include_schema = False , include_table_schema = True , ** kw
584
+ ):
585
+ text = super ().visit_create_index (create , include_schema , include_table_schema , ** kw )
586
+
587
+ index = create .element
588
+ preparer = self .preparer
589
+
590
+ # handle other included columns
591
+ includeclause = index .dialect_options ["iris" ]["include" ]
592
+ if includeclause :
593
+ inclusions = [
594
+ index .table .c [col ]
595
+ if isinstance (col , util .string_types )
596
+ else col
597
+ for col in includeclause
598
+ ]
599
+
600
+ text += " WITH DATA (%s)" % ", " .join (
601
+ [preparer .quote (c .name ) for c in inclusions ]
602
+ )
603
+
604
+ return text
605
+
582
606
583
607
class IRISTypeCompiler (compiler .GenericTypeCompiler ):
584
608
def visit_boolean (self , type_ , ** kw ):
@@ -667,6 +691,10 @@ class IRISDialect(default.DefaultDialect):
667
691
type_compiler = IRISTypeCompiler
668
692
execution_ctx_cls = IRISExecutionContext
669
693
694
+ construct_arguments = [
695
+ (schema .Index , {"include" : None }),
696
+ ]
697
+
670
698
def __init__ (self , ** kwargs ):
671
699
default .DefaultDialect .__init__ (self , ** kwargs )
672
700
@@ -808,6 +836,8 @@ def has_table(self, connection, table_name, schema=None, **kw):
808
836
def get_indexes (self , connection , table_name , schema = None , unique = False , ** kw ):
809
837
schema_name = self .get_schema (schema )
810
838
indexes = ischema .indexes
839
+ tables = ischema .tables
840
+ index_def = ischema .index_definition
811
841
812
842
s = (
813
843
sql .select (
@@ -816,6 +846,20 @@ def get_indexes(self, connection, table_name, schema=None, unique=False, **kw):
816
846
indexes .c .primary_key ,
817
847
indexes .c .non_unique ,
818
848
indexes .c .asc_or_desc ,
849
+ index_def .c .Data ,
850
+ )
851
+ .select_from (indexes )
852
+ .outerjoin (
853
+ index_def ,
854
+ sql .and_ (
855
+ index_def .c .SqlName == indexes .c .index_name ,
856
+ index_def .c .parent ==
857
+ sql .select (tables .c .classname )
858
+ .where (
859
+ indexes .c .table_name == tables .c .table_name ,
860
+ indexes .c .table_schema == tables .c .table_schema ,
861
+ ).scalar_subquery ()
862
+ ),
819
863
)
820
864
.where (
821
865
sql .and_ (
@@ -838,6 +882,7 @@ def get_indexes(self, connection, table_name, schema=None, unique=False, **kw):
838
882
_ ,
839
883
nuniq ,
840
884
_ ,
885
+ include ,
841
886
) = row
842
887
843
888
indexrec = indexes [idxname ]
@@ -849,6 +894,12 @@ def get_indexes(self, connection, table_name, schema=None, unique=False, **kw):
849
894
indexrec ["column_names" ].append (
850
895
self .normalize_name (colname )
851
896
)
897
+ include = include .split (',' ) if include else []
898
+ indexrec ["include_columns" ] = include
899
+ if include :
900
+ indexrec ["dialect_options" ] = {
901
+ "iris_include" : include
902
+ }
852
903
853
904
indexes = list (indexes .values ())
854
905
return indexes
@@ -1007,7 +1058,7 @@ def get_columns(self, connection, table_name, schema=None, **kw):
1007
1058
schema_name = self .get_schema (schema )
1008
1059
tables = ischema .tables
1009
1060
columns = ischema .columns
1010
- property = ischema .property
1061
+ property = ischema .property_definition
1011
1062
1012
1063
whereclause = sql .and_ (
1013
1064
columns .c .table_name == str (table_name ),
0 commit comments