@@ -30,6 +30,13 @@ type ExecFn<TRow, TParam> = [TParam] extends [never]
3030 params : TParam & Record < string , unknown > ,
3131 ) => Promise < Array < ApplyOverride < TSpec , TRow > > > ;
3232
33+ class BrandedSqlType < TDbType , TDbSource > {
34+ protected __dbtype : TDbType ;
35+ protected __dbsource : TDbSource ;
36+ }
37+
38+ type SqlType < T , TDbType , TDbSource > = T & BrandedSqlType < TDbType , TDbSource > ;
39+
3340class Query < TRow , TParam > {
3441 public query ;
3542 public params ;
@@ -68,14 +75,14 @@ const queries = {
6875 customer_id = @customer_id
6976` ] : new Query <
7077 {
71- first_name : string ;
72- last_name : string ;
73- email : string | null ;
74- address_id : number ;
75- store_id : number ;
76- activebool : boolean ;
77- create_date : Date ;
78- last_update : Date | null ;
78+ first_name : SqlType < string , 'text' , 'customer.first_name' > ;
79+ last_name : SqlType < string , 'text' , 'customer.last_name' > ;
80+ email : SqlType < string , 'text' , 'customer.email' > | null ;
81+ address_id : SqlType < number , 'int4' , 'customer.address_id' > ;
82+ store_id : SqlType < number , 'int4' , 'customer.store_id' > ;
83+ activebool : SqlType < boolean , 'bool' , 'customer.activebool' > ;
84+ create_date : SqlType < Date , 'date' , 'customer.create_date' > ;
85+ last_update : SqlType < Date , 'timestamptz' , 'customer.last_update' > | null ;
7986 } ,
8087 { customer_id : UUID }
8188 > (
@@ -106,7 +113,13 @@ const queries = {
106113 WHERE
107114 title LIKE '%' || @film_title || '%';
108115` ] : new Query <
109- { film_id : number ; title : string ; description : string | null ; release_year : unknown | null ; rental_rate : number } ,
116+ {
117+ film_id : SqlType < number , 'int4' , 'film.film_id' > ;
118+ title : SqlType < string , 'text' , 'film.title' > ;
119+ description : SqlType < string , 'text' , 'film.description' > | null ;
120+ release_year : SqlType < unknown , 'year' , 'film.release_year' > | null ;
121+ rental_rate : SqlType < number , 'numeric' , 'film.rental_rate' > ;
122+ } ,
110123 { film_title : string | null }
111124 > (
112125 `SELECT
@@ -137,7 +150,15 @@ const queries = {
137150 r.customer_id = @customer_id
138151 ORDER BY
139152 r.rental_date DESC;
140- ` ] : new Query < { rental_id : number ; rental_date : Date ; film_title : string ; return_date : Date | null } , { customer_id : number } > (
153+ ` ] : new Query <
154+ {
155+ rental_id : SqlType < number , 'int4' , 'rental.rental_id' > ;
156+ rental_date : SqlType < Date , 'timestamptz' , 'rental.rental_date' > ;
157+ film_title : SqlType < string , 'text' , 'film.title' > ;
158+ return_date : SqlType < Date , 'timestamptz' , 'rental.return_date' > | null ;
159+ } ,
160+ { customer_id : number }
161+ > (
141162 `SELECT
142163 r.rental_id,
143164 r.rental_date,
@@ -165,7 +186,10 @@ const queries = {
165186 customer_id
166187 HAVING
167188 customer_id = @customer_id
168- ` ] : new Query < { customer_id : number ; rental_count : number } , { customer_id : number } > (
189+ ` ] : new Query <
190+ { customer_id : SqlType < number , 'int4' , 'rental.customer_id' > ; rental_count : SqlType < number , 'bigint' , '' > } ,
191+ { customer_id : number }
192+ > (
169193 `SELECT
170194 customer_id,
171195 COUNT(*) AS rental_count
@@ -205,7 +229,13 @@ const queries = {
205229 ORDER BY
206230 total_revenue DESC
207231 LIMIT 5
208- ` ] : new Query < { category_name : string ; total_revenue : number } , never > (
232+ ` ] : new Query <
233+ {
234+ category_name : SqlType < string , 'text' , 'categoryrevenue.category_name' > ;
235+ total_revenue : SqlType < number , 'bigint' , 'categoryrevenue.total_revenue' > ;
236+ } ,
237+ never
238+ > (
209239 `WITH CategoryRevenue AS (
210240 SELECT
211241 c.name AS category_name,
0 commit comments