def _to_schema_column_or_string(element):
- if hasattr(element, "__clause_element__"):
+ if element is None:
+ return element
+ elif hasattr(element, "__clause_element__"):
element = element.__clause_element__()
if not isinstance(element, util.string_types + (ColumnElement,)):
msg = "Element %r is not a string name or column element"
)
)
+ def _col_expressions(self, table):
+ return [
+ table.c[col] if isinstance(col, util.string_types) else col
+ for col in self._pending_colargs
+ ]
+
def _set_parent(self, table):
- for col in self._pending_colargs:
- if isinstance(col, util.string_types):
- col = table.c[col]
- self.columns.add(col)
+ for col in self._col_expressions(table):
+ if col is not None:
+ self.columns.add(col)
class ColumnCollectionConstraint(ColumnCollectionMixin, Constraint):
strname,
add_element,
) in self._extract_col_expression_collection(expressions):
- if add_element is not None:
- columns.append(add_element)
+ columns.append(add_element)
processed_expressions.append(expr)
self.expressions = processed_expressions
self.table = table
table.indexes.add(self)
+ expressions = self.expressions
+ col_expressions = self._col_expressions(table)
+ assert len(expressions) == len(col_expressions)
self.expressions = [
expr if isinstance(expr, ClauseElement) else colexpr
- for expr, colexpr in util.zip_longest(
- self.expressions, self.columns
- )
+ for expr, colexpr in zip(expressions, col_expressions)
]
@property
dialect=dialect,
)
- def test_functional_index(self):
+ def test_functional_index_w_string_cols_combo(self):
metadata = MetaData()
- x = Table("x", metadata, Column("q", String(50)))
- idx = Index("y", func.lower(x.c.q))
-
- self.assert_compile(
- schema.CreateIndex(idx), "CREATE INDEX y ON x (lower(q))"
+ x = Table(
+ "x",
+ metadata,
+ Column("q", String(50)),
+ Column("p", Integer),
+ Column("z", Integer),
)
- self.assert_compile(
- schema.CreateIndex(idx),
- "CREATE INDEX y ON x (lower(q))",
- dialect=testing.db.dialect,
- )
+ for idx, ddl in [
+ (
+ Index("y", func.lower(x.c.q), "p", x.c.z),
+ "CREATE INDEX y ON x (lower(q), p, z)",
+ ),
+ (
+ Index("y", "p", func.lower(x.c.q), "z"),
+ "CREATE INDEX y ON x (p, lower(q), z)",
+ ),
+ (
+ Index("y", "p", "z", func.lower(x.c.q)),
+ "CREATE INDEX y ON x (p, z, lower(q))",
+ ),
+ (
+ Index("y", func.foo("foob"), x.c.p, "z"),
+ "CREATE INDEX y ON x (foo('foob'), p, z)",
+ ),
+ (
+ Index("y", x.c.p, func.foo("foob"), "z"),
+ "CREATE INDEX y ON x (p, foo('foob'), z)",
+ ),
+ (
+ Index("y", func.foo("foob"), "p", "z"),
+ "CREATE INDEX y ON x (foo('foob'), p, z)",
+ ),
+ ]:
+ x.append_constraint(idx)
+ self.assert_compile(schema.CreateIndex(idx), ddl)
def test_index_against_text_separate(self):
metadata = MetaData()