CIDR,
CITEXT,
DATE,
+ DATEMULTIRANGE,
+ DATERANGE,
+ DOMAIN,
DOUBLE_PRECISION,
ENUM,
FLOAT,
HSTORE,
INET,
+ INT4MULTIRANGE,
+ INT4RANGE,
+ INT8MULTIRANGE,
+ INT8RANGE,
INTEGER,
INTERVAL,
JSON,
JSONB,
+ JSONPATH,
MACADDR,
MACADDR8,
MONEY,
NUMERIC,
+ NUMMULTIRANGE,
+ NUMRANGE,
OID,
REAL,
+ REGCLASS,
+ REGCONFIG,
SMALLINT,
TEXT,
TIME,
TIMESTAMP,
- UUID,
- VARCHAR,
- INT4RANGE,
- INT8RANGE,
- NUMRANGE,
- DATERANGE,
+ TSMULTIRANGE,
+ TSQUERY,
TSRANGE,
+ TSTZMULTIRANGE,
TSTZRANGE,
- REGCONFIG,
- REGCLASS,
- TSQUERY,
TSVECTOR,
+ UUID,
+ VARCHAR,
)
Types which are specific to PostgreSQL, or have PostgreSQL-specific
"VARCHAR2",
"NVARCHAR2",
"ROWID",
+ "REAL",
)
class Float(Numeric[_N]):
-
"""Type representing floating point types, such as ``FLOAT`` or ``REAL``.
This type returns Python ``float`` objects by default, unless the
- :paramref:`.Float.asdecimal` flag is set to True, in which case they
+ :paramref:`.Float.asdecimal` flag is set to ``True``, in which case they
are coerced to ``decimal.Decimal`` objects.
-
+ When a :paramref:`.Float.precision` is not provided in a
+ :class:`_types.Float` type some backend may compile this type as
+ an 8 bytes / 64 bit float datatype. To use a 4 bytes / 32 bit float
+ datatype a precision <= 24 can usually be provided or the
+ :class:`_types.REAL` type can be used.
+ This is known to be the case in the PostgreSQL and MSSQL dialects
+ that render the type as ``FLOAT`` that's in both an alias of
+ ``DOUBLE PRECISION``. Other third party dialects may have similar
+ behavior.
"""
__visit_name__ = "float"
ddl,
)
assert isinstance(tbl.c.boo.type.as_generic(), Boolean)
+
+
+class NumberTest(fixtures.TestBase, AssertsCompiledSQL):
+ __dialect__ = mssql.dialect()
+
+ @testing.combinations(
+ ("sa", sqltypes.Float(), "FLOAT"), # ideally it should render real
+ ("sa", sqltypes.Double(), "DOUBLE PRECISION"),
+ ("sa", sqltypes.FLOAT(), "FLOAT"),
+ ("sa", sqltypes.REAL(), "REAL"),
+ ("sa", sqltypes.DOUBLE(), "DOUBLE"),
+ ("sa", sqltypes.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("mssql", mssql.FLOAT(), "FLOAT"),
+ ("mssql", mssql.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("mssql", mssql.REAL(), "REAL"),
+ id_="ira",
+ )
+ def test_float_type_compile(self, type_, sql_text):
+ self.assert_compile(type_, sql_text)
datetime.time(8, 37, 35, 450),
)
+ @testing.combinations(
+ ("sa", sqltypes.Float(), "FLOAT"),
+ ("sa", sqltypes.Double(), "DOUBLE"),
+ ("sa", sqltypes.FLOAT(), "FLOAT"),
+ ("sa", sqltypes.REAL(), "REAL"),
+ ("sa", sqltypes.DOUBLE(), "DOUBLE"),
+ ("sa", sqltypes.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("mysql", mysql.FLOAT(), "FLOAT"),
+ ("mysql", mysql.DOUBLE(), "DOUBLE"),
+ ("mysql", mysql.REAL(), "REAL"),
+ id_="ira",
+ )
+ def test_float_type_compile(self, type_, sql_text):
+ self.assert_compile(type_, sql_text)
+
class TypeRoundTripTest(fixtures.TestBase, AssertsExecutionResults):
__dialect__ = mysql.dialect()
expr = column("bar", oracle.INTERVAL) == datetime.timedelta(days=1)
eq_(expr.right.type._type_affinity, sqltypes.Interval)
+ @testing.combinations(
+ ("sa", sqltypes.Float(), "FLOAT"),
+ ("sa", sqltypes.Double(), "DOUBLE PRECISION"),
+ ("sa", sqltypes.FLOAT(), "FLOAT"),
+ ("sa", sqltypes.REAL(), "REAL"),
+ ("sa", sqltypes.DOUBLE(), "DOUBLE"),
+ ("sa", sqltypes.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("oracle", oracle.FLOAT(), "FLOAT"),
+ ("oracle", oracle.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("oracle", oracle.REAL(), "REAL"),
+ ("oracle", oracle.BINARY_DOUBLE(), "BINARY_DOUBLE"),
+ ("oracle", oracle.BINARY_FLOAT(), "BINARY_FLOAT"),
+ id_="ira",
+ )
+ def test_float_type_compile(self, type_, sql_text):
+ self.assert_compile(type_, sql_text)
+
class TypesTest(fixtures.TestBase):
__only_on__ = "oracle"
class MiscTypesTest(AssertsCompiledSQL, fixtures.TestBase):
+ __dialect__ = postgresql.dialect()
+
@testing.combinations(
("asyncpg", "x LIKE $1::VARCHAR"),
("psycopg", "x LIKE %(x_1)s::VARCHAR"),
dialect=f"postgresql+{driver}",
)
+ @testing.combinations(
+ ("sa", sqltypes.Float(), "FLOAT"), # ideally it should render real
+ ("sa", sqltypes.Double(), "DOUBLE PRECISION"),
+ ("sa", sqltypes.FLOAT(), "FLOAT"),
+ ("sa", sqltypes.REAL(), "REAL"),
+ ("sa", sqltypes.DOUBLE(), "DOUBLE"),
+ ("sa", sqltypes.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("pg", postgresql.FLOAT(), "FLOAT"),
+ ("pg", postgresql.DOUBLE_PRECISION(), "DOUBLE PRECISION"),
+ ("pg", postgresql.REAL(), "REAL"),
+ id_="ira",
+ )
+ def test_float_type_compile(self, type_, sql_text):
+ self.assert_compile(type_, sql_text)
+
class FloatCoercionTest(fixtures.TablesTest, AssertsExecutionResults):
__only_on__ = "postgresql"