in metadata.go [1236:1292]
func getAggregatesMetadata(session *Session, keyspaceName string) ([]AggregateMetadata, error) {
if session.cfg.ProtoVersion == protoVersion1 || !session.hasAggregatesAndFunctions {
return nil, nil
}
var tableName string
if session.useSystemSchema {
tableName = "system_schema.aggregates"
} else {
tableName = "system.schema_aggregates"
}
stmt := fmt.Sprintf(`
SELECT
aggregate_name,
argument_types,
final_func,
initcond,
return_type,
state_func,
state_type
FROM %s
WHERE keyspace_name = ?`, tableName)
var aggregates []AggregateMetadata
rows := session.control.query(stmt, keyspaceName).Scanner()
for rows.Next() {
aggregate := AggregateMetadata{Keyspace: keyspaceName}
var argumentTypes []string
var returnType string
var stateType string
err := rows.Scan(&aggregate.Name,
&argumentTypes,
&aggregate.finalFunc,
&aggregate.InitCond,
&returnType,
&aggregate.stateFunc,
&stateType,
)
if err != nil {
return nil, err
}
aggregate.ReturnType = getTypeInfo(returnType, byte(session.cfg.ProtoVersion), session.logger)
aggregate.StateType = getTypeInfo(stateType, byte(session.cfg.ProtoVersion), session.logger)
aggregate.ArgumentTypes = make([]TypeInfo, len(argumentTypes))
for i, argumentType := range argumentTypes {
aggregate.ArgumentTypes[i] = getTypeInfo(argumentType, byte(session.cfg.ProtoVersion), session.logger)
}
aggregates = append(aggregates, aggregate)
}
if err := rows.Err(); err != nil {
return nil, err
}
return aggregates, nil
}