@@ -7,6 +7,7 @@ package gocql
7
7
import (
8
8
"encoding/hex"
9
9
"encoding/json"
10
+ "errors"
10
11
"fmt"
11
12
"strconv"
12
13
"strings"
@@ -1048,13 +1049,17 @@ func getFunctionsMetadata(session *Session, keyspaceName string) ([]FunctionMeta
1048
1049
if session .cfg .ProtoVersion == protoVersion1 || ! session .hasAggregatesAndFunctions {
1049
1050
return nil , nil
1050
1051
}
1052
+ var withoutBody bool
1051
1053
var tableName string
1052
1054
if session .useSystemSchema {
1053
1055
tableName = "system_schema.functions"
1054
1056
} else {
1055
1057
tableName = "system.schema_functions"
1056
1058
}
1057
- stmt := fmt .Sprintf (`
1059
+ FuncsStmt:
1060
+ var stmt string
1061
+ if ! withoutBody {
1062
+ stmt = fmt .Sprintf (`
1058
1063
SELECT
1059
1064
function_name,
1060
1065
argument_types,
@@ -1065,6 +1070,18 @@ func getFunctionsMetadata(session *Session, keyspaceName string) ([]FunctionMeta
1065
1070
return_type
1066
1071
FROM %s
1067
1072
WHERE keyspace_name = ?` , tableName )
1073
+ } else {
1074
+ stmt = fmt .Sprintf (`
1075
+ SELECT
1076
+ function_name,
1077
+ argument_types,
1078
+ argument_names,
1079
+ called_on_null_input,
1080
+ language,
1081
+ return_type
1082
+ FROM %s
1083
+ WHERE keyspace_name = ?` , tableName )
1084
+ }
1068
1085
1069
1086
var functions []FunctionMetadata
1070
1087
@@ -1073,14 +1090,25 @@ func getFunctionsMetadata(session *Session, keyspaceName string) ([]FunctionMeta
1073
1090
function := FunctionMetadata {Keyspace : keyspaceName }
1074
1091
var argumentTypes []string
1075
1092
var returnType string
1076
- err := rows .Scan (& function .Name ,
1077
- & argumentTypes ,
1078
- & function .ArgumentNames ,
1079
- & function .Body ,
1080
- & function .CalledOnNullInput ,
1081
- & function .Language ,
1082
- & returnType ,
1083
- )
1093
+ var err error
1094
+ if ! withoutBody {
1095
+ err = rows .Scan (& function .Name ,
1096
+ & argumentTypes ,
1097
+ & function .ArgumentNames ,
1098
+ & function .Body ,
1099
+ & function .CalledOnNullInput ,
1100
+ & function .Language ,
1101
+ & returnType ,
1102
+ )
1103
+ } else {
1104
+ err = rows .Scan (& function .Name ,
1105
+ & argumentTypes ,
1106
+ & function .ArgumentNames ,
1107
+ & function .CalledOnNullInput ,
1108
+ & function .Language ,
1109
+ & returnType ,
1110
+ )
1111
+ }
1084
1112
if err != nil {
1085
1113
return nil , err
1086
1114
}
@@ -1093,6 +1121,14 @@ func getFunctionsMetadata(session *Session, keyspaceName string) ([]FunctionMeta
1093
1121
}
1094
1122
1095
1123
if err := rows .Err (); err != nil {
1124
+ if ! withoutBody {
1125
+ // Yugabyte doesn't support the body column in the functions table
1126
+ var rerr RequestError
1127
+ if errors .As (err , & rerr ) && rerr .Code () == ErrCodeInvalid {
1128
+ withoutBody = true
1129
+ goto FuncsStmt
1130
+ }
1131
+ }
1096
1132
return nil , err
1097
1133
}
1098
1134
@@ -1103,14 +1139,17 @@ func getAggregatesMetadata(session *Session, keyspaceName string) ([]AggregateMe
1103
1139
if session .cfg .ProtoVersion == protoVersion1 || ! session .hasAggregatesAndFunctions {
1104
1140
return nil , nil
1105
1141
}
1142
+ var withoutReturnType bool
1106
1143
var tableName string
1107
1144
if session .useSystemSchema {
1108
1145
tableName = "system_schema.aggregates"
1109
1146
} else {
1110
1147
tableName = "system.schema_aggregates"
1111
1148
}
1112
-
1113
- stmt := fmt .Sprintf (`
1149
+ AggsStmt:
1150
+ var stmt string
1151
+ if ! withoutReturnType {
1152
+ stmt = fmt .Sprintf (`
1114
1153
SELECT
1115
1154
aggregate_name,
1116
1155
argument_types,
@@ -1121,6 +1160,18 @@ func getAggregatesMetadata(session *Session, keyspaceName string) ([]AggregateMe
1121
1160
state_type
1122
1161
FROM %s
1123
1162
WHERE keyspace_name = ?` , tableName )
1163
+ } else {
1164
+ stmt = fmt .Sprintf (`
1165
+ SELECT
1166
+ aggregate_name,
1167
+ argument_types,
1168
+ final_func,
1169
+ initcond,
1170
+ state_func,
1171
+ state_type
1172
+ FROM %s
1173
+ WHERE keyspace_name = ?` , tableName )
1174
+ }
1124
1175
1125
1176
var aggregates []AggregateMetadata
1126
1177
@@ -1130,14 +1181,25 @@ func getAggregatesMetadata(session *Session, keyspaceName string) ([]AggregateMe
1130
1181
var argumentTypes []string
1131
1182
var returnType string
1132
1183
var stateType string
1133
- err := rows .Scan (& aggregate .Name ,
1134
- & argumentTypes ,
1135
- & aggregate .finalFunc ,
1136
- & aggregate .InitCond ,
1137
- & returnType ,
1138
- & aggregate .stateFunc ,
1139
- & stateType ,
1140
- )
1184
+ var err error
1185
+ if ! withoutReturnType {
1186
+ err = rows .Scan (& aggregate .Name ,
1187
+ & argumentTypes ,
1188
+ & aggregate .finalFunc ,
1189
+ & aggregate .InitCond ,
1190
+ & returnType ,
1191
+ & aggregate .stateFunc ,
1192
+ & stateType ,
1193
+ )
1194
+ } else {
1195
+ err = rows .Scan (& aggregate .Name ,
1196
+ & argumentTypes ,
1197
+ & aggregate .finalFunc ,
1198
+ & aggregate .InitCond ,
1199
+ & aggregate .stateFunc ,
1200
+ & stateType ,
1201
+ )
1202
+ }
1141
1203
if err != nil {
1142
1204
return nil , err
1143
1205
}
@@ -1151,6 +1213,14 @@ func getAggregatesMetadata(session *Session, keyspaceName string) ([]AggregateMe
1151
1213
}
1152
1214
1153
1215
if err := rows .Err (); err != nil {
1216
+ if ! withoutReturnType {
1217
+ // Yugabyte doesn't support the return_type column in the aggregates table
1218
+ var rerr RequestError
1219
+ if errors .As (err , & rerr ) && rerr .Code () == ErrCodeInvalid {
1220
+ withoutReturnType = true
1221
+ goto AggsStmt
1222
+ }
1223
+ }
1154
1224
return nil , err
1155
1225
}
1156
1226
0 commit comments