@@ -1071,13 +1071,30 @@ func TestFunctionRegistration(t *testing.T) {
1071
1071
regex := func (re , s string ) (bool , error ) {
1072
1072
return regexp .MatchString (re , s )
1073
1073
}
1074
+ generic := func (a interface {}) int64 {
1075
+ switch a .(type ) {
1076
+ case int64 :
1077
+ return 1
1078
+ case float64 :
1079
+ return 2
1080
+ case []byte :
1081
+ return 3
1082
+ case string :
1083
+ return 4
1084
+ default :
1085
+ panic ("unreachable" )
1086
+ }
1087
+ }
1074
1088
variadic := func (a , b int64 , c ... int64 ) int64 {
1075
1089
ret := a + b
1076
1090
for _ , d := range c {
1077
1091
ret += d
1078
1092
}
1079
1093
return ret
1080
1094
}
1095
+ variadicGeneric := func (a ... interface {}) int64 {
1096
+ return int64 (len (a ))
1097
+ }
1081
1098
1082
1099
sql .Register ("sqlite3_FunctionRegistration" , & SQLiteDriver {
1083
1100
ConnectHook : func (conn * SQLiteConn ) error {
@@ -1105,9 +1122,15 @@ func TestFunctionRegistration(t *testing.T) {
1105
1122
if err := conn .RegisterFunc ("regex" , regex , true ); err != nil {
1106
1123
return err
1107
1124
}
1125
+ if err := conn .RegisterFunc ("generic" , generic , true ); err != nil {
1126
+ return err
1127
+ }
1108
1128
if err := conn .RegisterFunc ("variadic" , variadic , true ); err != nil {
1109
1129
return err
1110
1130
}
1131
+ if err := conn .RegisterFunc ("variadicGeneric" , variadicGeneric , true ); err != nil {
1132
+ return err
1133
+ }
1111
1134
return nil
1112
1135
},
1113
1136
})
@@ -1131,9 +1154,14 @@ func TestFunctionRegistration(t *testing.T) {
1131
1154
{"SELECT not(0)" , true },
1132
1155
{`SELECT regex("^foo.*", "foobar")` , true },
1133
1156
{`SELECT regex("^foo.*", "barfoobar")` , false },
1157
+ {"SELECT generic(1)" , int64 (1 )},
1158
+ {"SELECT generic(1.1)" , int64 (2 )},
1159
+ {`SELECT generic(NULL)` , int64 (3 )},
1160
+ {`SELECT generic("foo")` , int64 (4 )},
1134
1161
{"SELECT variadic(1,2)" , int64 (3 )},
1135
1162
{"SELECT variadic(1,2,3,4)" , int64 (10 )},
1136
1163
{"SELECT variadic(1,1,1,1,1,1,1,1,1,1)" , int64 (10 )},
1164
+ {`SELECT variadicGeneric(1,"foo",2.3, NULL)` , int64 (4 )},
1137
1165
}
1138
1166
1139
1167
for _ , op := range ops {
0 commit comments