@@ -26,11 +26,21 @@ func hasConcreteParamType(col *Column) bool {
2626 return col != nil && col .DataType != "" && col .DataType != "any"
2727}
2828
29- func paramTypeString (col * Column ) string {
30- if ! hasConcreteParamType (col ) {
31- return "any"
32- }
33- return col .DataType + strings .Repeat ("[]" , col .ArrayDims )
29+ func (comp * Compiler ) paramTypeString (col * Column ) string {
30+ if ! hasConcreteParamType (col ) {
31+ return "any"
32+ }
33+
34+ arraySuffix := strings .Repeat ("[]" , col .ArrayDims )
35+ if col .Type != nil && col .Type .Name != "" {
36+ return comp .parser .TypeName (col .Type .Schema , col .Type .Name ) + arraySuffix
37+ }
38+
39+ if rel , err := ParseRelationString (col .DataType ); err == nil && rel .Catalog == "" {
40+ return comp .parser .TypeName (rel .Schema , rel .Name ) + arraySuffix
41+ }
42+
43+ return col .DataType + arraySuffix
3444}
3545
3646func compatibleParamTypes (a , b * Column ) bool {
@@ -81,10 +91,15 @@ func mergeResolvedParam(existing, incoming Parameter) Parameter {
8191 return base
8292}
8393
84- func incompatibleParamRefError (ref paramRef , existing , incoming Parameter ) error {
94+ func ( comp * Compiler ) incompatibleParamRefError (ref paramRef , existing , incoming Parameter ) error {
8595 return & sqlerr.Error {
8696 Code : "42P08" ,
87- Message : fmt .Sprintf ("parameter $%d has incompatible types: %s, %s" , ref .ref .Number , paramTypeString (existing .Column ), paramTypeString (incoming .Column )),
97+ Message : fmt .Sprintf (
98+ "parameter $%d has incompatible types: %s, %s" ,
99+ ref .ref .Number ,
100+ comp .paramTypeString (existing .Column ),
101+ comp .paramTypeString (incoming .Column ),
102+ ),
88103 Location : ref .ref .Location ,
89104 }
90105}
@@ -171,7 +186,7 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
171186 addParam := func (ref paramRef , p Parameter ) error {
172187 if idx , ok := seen [p .Number ]; ok {
173188 if ! compatibleParamTypes (a [idx ].Column , p .Column ) {
174- return incompatibleParamRefError (ref , a [idx ], p )
189+ return comp . incompatibleParamRefError (ref , a [idx ], p )
175190 }
176191 a [idx ] = mergeResolvedParam (a [idx ], p )
177192 return nil
@@ -381,9 +396,10 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
381396 p , isNamed := params .FetchMerge (ref .ref .Number , defaultP )
382397 var namePrefix string
383398 if ! isNamed {
384- if ref .ref == n .Left {
399+ switch ref .ref {
400+ case n .Left :
385401 namePrefix = "from_"
386- } else if ref . ref == n .Right {
402+ case n .Right :
387403 namePrefix = "to_"
388404 }
389405 }
0 commit comments