@@ -2,12 +2,12 @@ package postgres
22
33import (
44 "encoding/base64"
5+ "fmt"
56 "github.com/go-jet/jet/v2/internal/utils/ptr"
6- "github.com/stretchr/testify/assert"
7- "math"
8-
97 "github.com/go-jet/jet/v2/qrm"
108 "github.com/lib/pq"
9+ "github.com/stretchr/testify/assert"
10+ "math"
1111 "testing"
1212 "time"
1313
@@ -1728,6 +1728,135 @@ SELECT ROW($1::integer, $2::real, $3::text) AS "row",
17281728 })
17291729}
17301730
1731+ func TestSubQueryAllExpTypes (t * testing.T ) {
1732+ skipForCockroachDB (t )
1733+
1734+ subquery := SELECT (
1735+ Bool (true ).AS ("bool" ),
1736+ Int32 (11 ).AS ("int" ),
1737+ Text ("doe" ).AS ("text" ),
1738+ Date (2000 , 2 , 2 ).AS ("date" ),
1739+ Time (11 , 20 , 40 ).AS ("time" ),
1740+ Timez (11 , 20 , 40 , 200 , "UTC" ).AS ("timez" ),
1741+ Timestamp (2030 , 3 , 4 , 11 , 20 , 40 ).AS ("timestamp" ),
1742+ Timestampz (2023 , 1 , 2 , 11 , 20 , 40 , 200 , "UTC" ).AS ("timestampz" ),
1743+ INTERVAL (100 , HOUR ).AS ("interval" ),
1744+ Bytea ("bytes" ).AS ("bytea" ),
1745+
1746+ ARRAY (Bool (true )).AS ("bool_arr" ),
1747+ ARRAY (Int32 (11 )).AS ("int_arr" ),
1748+ ARRAY (Text ("doe" )).AS ("text_arr" ),
1749+ ARRAY (Date (2000 , 2 , 2 )).AS ("date_arr" ),
1750+ ARRAY (Time (11 , 20 , 40 )).AS ("time_arr" ),
1751+ ARRAY (Timez (11 , 20 , 40 , 200 , "UTC" )).AS ("timez_arr" ),
1752+ ARRAY (Timestamp (2030 , 3 , 4 , 11 , 20 , 40 )).AS ("timestamp_arr" ),
1753+ ARRAY (Timestampz (2023 , 1 , 2 , 11 , 20 , 40 , 200 , "UTC" )).AS ("timestampz_arr" ),
1754+ ARRAY (INTERVAL (100 , HOUR )).AS ("interval_arr" ),
1755+ ARRAY (Bytea ("bytes" )).AS ("bytea_arr" ),
1756+
1757+ INT4_RANGE (Int (1 ), Int (200 )).AS ("int4_range" ),
1758+ DATE_RANGE (Date (2000 , 2 , 2 ), Date (2010 , 3 , 3 )).AS ("date_range" ),
1759+ NUM_RANGE (Float (0.22 ), Float (22.1 )).AS ("num_range" ),
1760+ TS_RANGE (LOCALTIMESTAMP (), LOCALTIMESTAMP ().ADD (INTERVAL (1 , HOUR ))).AS ("ts_range" ),
1761+ TSTZ_RANGE (NOW (), NOW ().ADD (INTERVAL (3 , MONTH ))).AS ("tstz_range" ),
1762+ ).AsTable ("sub" )
1763+
1764+ var result = "\n "
1765+ for _ , projection := range subquery .AllColumns () {
1766+ result += fmt .Sprintf ("Column type: %T\n " , projection )
1767+ }
1768+
1769+ require .Equal (t , result , `
1770+ Column type: *jet.boolColumnImpl
1771+ Column type: *jet.integerColumnImpl
1772+ Column type: *jet.stringColumnImpl
1773+ Column type: *jet.dateColumnImpl
1774+ Column type: *jet.timeColumnImpl
1775+ Column type: *jet.timezColumnImpl
1776+ Column type: *jet.timestampColumnImpl
1777+ Column type: *jet.timestampzColumnImpl
1778+ Column type: *jet.intervalColumnImpl
1779+ Column type: *jet.blobColumnImpl
1780+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.BoolExpression]
1781+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.IntegerExpression]
1782+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.StringExpression]
1783+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.DateExpression]
1784+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.TimeExpression]
1785+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.TimezExpression]
1786+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.TimestampExpression]
1787+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.TimestampzExpression]
1788+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.IntervalExpression]
1789+ Column type: *jet.arrayColumnImpl[github.com/go-jet/jet/v2/internal/jet.BlobExpression]
1790+ Column type: *jet.rangeColumnImpl[github.com/go-jet/jet/v2/internal/jet.IntegerExpression]
1791+ Column type: *jet.rangeColumnImpl[github.com/go-jet/jet/v2/internal/jet.DateExpression]
1792+ Column type: *jet.rangeColumnImpl[github.com/go-jet/jet/v2/internal/jet.NumericExpression]
1793+ Column type: *jet.rangeColumnImpl[github.com/go-jet/jet/v2/internal/jet.TimestampExpression]
1794+ Column type: *jet.rangeColumnImpl[github.com/go-jet/jet/v2/internal/jet.TimestampzExpression]
1795+ ` )
1796+
1797+ stmt := SELECT (
1798+ subquery .AllColumns (),
1799+ ).FROM (subquery )
1800+
1801+ testutils .AssertStatementSql (t , stmt , `
1802+ SELECT sub.bool AS "bool",
1803+ sub.int AS "int",
1804+ sub.text AS "text",
1805+ sub.date AS "date",
1806+ sub.time AS "time",
1807+ sub.timez AS "timez",
1808+ sub.timestamp AS "timestamp",
1809+ sub.timestampz AS "timestampz",
1810+ sub.interval AS "interval",
1811+ sub.bytea AS "bytea",
1812+ sub.bool_arr AS "bool_arr",
1813+ sub.int_arr AS "int_arr",
1814+ sub.text_arr AS "text_arr",
1815+ sub.date_arr AS "date_arr",
1816+ sub.time_arr AS "time_arr",
1817+ sub.timez_arr AS "timez_arr",
1818+ sub.timestamp_arr AS "timestamp_arr",
1819+ sub.timestampz_arr AS "timestampz_arr",
1820+ sub.interval_arr AS "interval_arr",
1821+ sub.bytea_arr AS "bytea_arr",
1822+ sub.int4_range AS "int4_range",
1823+ sub.date_range AS "date_range",
1824+ sub.num_range AS "num_range",
1825+ sub.ts_range AS "ts_range",
1826+ sub.tstz_range AS "tstz_range"
1827+ FROM (
1828+ SELECT $1::boolean AS "bool",
1829+ $2::integer AS "int",
1830+ $3::text AS "text",
1831+ $4::date AS "date",
1832+ $5::time without time zone AS "time",
1833+ $6::time with time zone AS "timez",
1834+ $7::timestamp without time zone AS "timestamp",
1835+ $8::timestamp with time zone AS "timestampz",
1836+ INTERVAL '100 HOUR' AS "interval",
1837+ $9::bytea AS "bytea",
1838+ ARRAY[$10::boolean] AS "bool_arr",
1839+ ARRAY[$11::integer] AS "int_arr",
1840+ ARRAY[$12::text] AS "text_arr",
1841+ ARRAY[$13::date] AS "date_arr",
1842+ ARRAY[$14::time without time zone] AS "time_arr",
1843+ ARRAY[$15::time with time zone] AS "timez_arr",
1844+ ARRAY[$16::timestamp without time zone] AS "timestamp_arr",
1845+ ARRAY[$17::timestamp with time zone] AS "timestampz_arr",
1846+ ARRAY[INTERVAL '100 HOUR'] AS "interval_arr",
1847+ ARRAY[$18::bytea] AS "bytea_arr",
1848+ int4range($19, $20) AS "int4_range",
1849+ daterange($21::date, $22::date) AS "date_range",
1850+ numrange($23, $24) AS "num_range",
1851+ tsrange(LOCALTIMESTAMP, LOCALTIMESTAMP + INTERVAL '1 HOUR') AS "ts_range",
1852+ tstzrange(NOW(), NOW() + INTERVAL '3 MONTH') AS "tstz_range"
1853+ ) AS sub;
1854+ ` )
1855+
1856+ _ , err := stmt .Exec (db )
1857+ require .NoError (t , err )
1858+ }
1859+
17311860func TestAllTypesSubQueryFrom (t * testing.T ) {
17321861 subQuery := SELECT (
17331862 AllTypes .Boolean ,
0 commit comments