# If the result is quoted, and the oid not unknown,
# add an explicit type cast.
# Check the last char because the first one might be 'E'.
- if dumper.oid and rv and rv[-1] == b"'"[0]:
+ oid = dumper.oid
+ if oid and rv and rv[-1] == b"'"[0]:
try:
- type_sql = self._oid_types[dumper.oid]
+ type_sql = self._oid_types[oid]
except KeyError:
- ti = self.adapters.types.get(dumper.oid)
+ ti = self.adapters.types.get(oid)
if ti:
- type_sql = ti.regtype.encode(self.encoding)
- if dumper.oid == ti.array_oid:
+ if oid < 8192:
+ # builtin: prefer "timestamptz" to "timestamp with time zone"
+ type_sql = ti.name.encode(self.encoding)
+ else:
+ type_sql = ti.regtype.encode(self.encoding)
+ if oid == ti.array_oid:
type_sql += b"[]"
else:
type_sql = b""
- self._oid_types[dumper.oid] = type_sql
+ self._oid_types[oid] = type_sql
if type_sql:
rv = b"%s::%s" % (rv, type_sql)
type_sql = b""
ti = self.adapters.types.get(oid)
if ti is not None:
- type_sql = ti.regtype.encode(self.encoding)
+ if oid < 8192:
+ # builtin: prefer "timestamptz" to "timestamp with time zone"
+ type_sql = ti.name.encode(self.encoding)
+ else:
+ type_sql = ti.regtype.encode(self.encoding)
if oid == ti.array_oid:
type_sql += b"[]"
== "'{2000-01-01}'::date[]"
)
- @pytest.mark.parametrize("name", ["a-b", f"{eur}", "order"])
+ def test_short_name_builtin(self, conn):
+ assert sql.Literal(dt.time(0, 0)).as_string(conn) == "'00:00:00'::time"
+ assert (
+ sql.Literal(dt.datetime(2000, 1, 1)).as_string(conn)
+ == "'2000-01-01 00:00:00'::timestamp"
+ )
+ assert (
+ sql.Literal([dt.datetime(2000, 1, 1)]).as_string(conn)
+ == "'{\"2000-01-01 00:00:00\"}'::timestamp[]"
+ )
+
+ @pytest.mark.parametrize("name", ["a-b", f"{eur}", "order", "foo bar"])
def test_invalid_name(self, conn, name):
conn.execute(
f"""