--- /dev/null
+.. change::
+ :tags: bug, mysql
+ :tickets: 5800
+
+ Fixed regression from SQLAlchemy 1.3.20 caused by the fix for
+ :ticket:`5462` which adds double-parenthesis for MySQL functional
+ expressions in indexes, as is required by the backend, this inadvertently
+ extended to include arbitrary :func:`_sql.text` expressions as well as
+ Alembic's internal textual component, which are required by Alembic for
+ arbitrary index expressions which don't imply double parenthesis. The
+ check has been narrowed to include only binary/ unary/functional
+ expressions directly.
\ No newline at end of file
from ...engine import reflection
from ...sql import compiler
from ...sql import elements
+from ...sql import functions
from ...sql import operators
from ...sql import util as sql_util
from ...types import BINARY
self.sql_compiler.process(
elements.Grouping(expr)
if (
- not isinstance(expr, elements.ColumnClause)
- and (
- not isinstance(expr, elements.UnaryExpression)
- or expr.modifier
+ isinstance(expr, elements.BinaryExpression)
+ or (
+ isinstance(expr, elements.UnaryExpression)
+ and expr.modifier
not in (operators.desc_op, operators.asc_op)
)
+ or isinstance(expr, functions.FunctionElement)
)
else expr,
include_table=False,
from sqlalchemy import Table
from sqlalchemy import testing
from sqlalchemy import TEXT
+from sqlalchemy import text
from sqlalchemy import TIME
from sqlalchemy import Time
from sqlalchemy import TIMESTAMP
"CREATE FULLTEXT INDEX test_idx1 " "ON testtbl (data(10))",
)
+ def test_create_index_with_text(self):
+ m = MetaData()
+ tbl = Table("testtbl", m, Column("data", String(255)))
+ idx = Index("test_idx1", text("created_at desc"), _table=tbl)
+
+ self.assert_compile(
+ schema.CreateIndex(idx),
+ "CREATE INDEX test_idx1 ON testtbl (created_at desc)",
+ )
+
+ def test_create_index_with_arbitrary_column_element(self):
+ from sqlalchemy.ext.compiler import compiles
+
+ class _textual_index_element(sql.ColumnElement):
+ """alembic's wrapper"""
+
+ __visit_name__ = "_textual_idx_element"
+
+ def __init__(self, table, text):
+ self.table = table
+ self.text = text
+
+ @compiles(_textual_index_element)
+ def _render_textual_index_column(element, compiler, **kw):
+ return compiler.process(element.text, **kw)
+
+ m = MetaData()
+ tbl = Table("testtbl", m, Column("data", String(255)))
+ idx = Index(
+ "test_idx1",
+ _textual_index_element(tbl, text("created_at desc")),
+ _table=tbl,
+ )
+
+ self.assert_compile(
+ schema.CreateIndex(idx),
+ "CREATE INDEX test_idx1 ON testtbl (created_at desc)",
+ )
+
def test_create_index_with_parser(self):
m = MetaData()
tbl = Table("testtbl", m, Column("data", String(255)))