@@ -313,7 +313,7 @@ func (m *Max1Row) CollationCoercibility(ctx *sql.Context) (collation sql.Collati
313313}
314314
315315// EvalMultiple returns all rows returned by a subquery.
316- func (s * Subquery ) EvalMultiple (ctx * sql.Context , row sql.Row ) ([] interface {} , error ) {
316+ func (s * Subquery ) EvalMultiple (ctx * sql.Context , row sql.Row ) (sql. Row , error ) {
317317 s .cacheMu .Lock ()
318318 cached := s .resultsCached
319319 s .cacheMu .Unlock ()
@@ -341,7 +341,7 @@ func (s *Subquery) canCacheResults() bool {
341341 return s .correlated .Empty () && ! s .volatile
342342}
343343
344- func (s * Subquery ) evalMultiple (ctx * sql.Context , row sql.Row ) ([] interface {} , error ) {
344+ func (s * Subquery ) evalMultiple (ctx * sql.Context , row sql.Row ) (sql. Row , error ) {
345345 // Any source of rows, as well as any node that alters the schema of its children, needs to be wrapped so that its
346346 // result rows are prepended with the scope row.
347347 q , _ , err := transform .Node (s .Query , PrependRowInPlan (row , false ))
@@ -362,7 +362,7 @@ func (s *Subquery) evalMultiple(ctx *sql.Context, row sql.Row) ([]interface{}, e
362362
363363 // Reduce the result row to the size of the expected schema. This means chopping off the first len(row) columns.
364364 col := len (row )
365- var result [] interface {}
365+ var result sql. Row
366366 for {
367367 row , err := iter .Next (ctx )
368368 if err == io .EOF {
@@ -407,7 +407,7 @@ func (s *Subquery) HashMultiple(ctx *sql.Context, row sql.Row) (sql.KeyValueCach
407407 defer s .cacheMu .Unlock ()
408408 if ! s .resultsCached || s .hashCache == nil {
409409 hashCache , disposeFn := ctx .Memory .NewHistoryCache ()
410- err = putAllRows (ctx , hashCache , result )
410+ err = putAllRows (ctx , hashCache , s . Query . Schema (), result )
411411 if err != nil {
412412 return nil , err
413413 }
@@ -417,7 +417,11 @@ func (s *Subquery) HashMultiple(ctx *sql.Context, row sql.Row) (sql.KeyValueCach
417417 }
418418
419419 cache := sql .NewMapCache ()
420- return cache , putAllRows (ctx , cache , result )
420+ err = putAllRows (ctx , cache , s .Query .Schema (), result )
421+ if err != nil {
422+ return nil , err
423+ }
424+ return cache , nil
421425}
422426
423427// HasResultRow returns whether the subquery has a result set > 0.
@@ -467,21 +471,25 @@ func (s *Subquery) HasResultRow(ctx *sql.Context, row sql.Row) (bool, error) {
467471// normalizeValue returns a canonical version of a value for use in a sql.KeyValueCache.
468472// Two values that compare equal should have the same canonical version.
469473// TODO: Fix https://github.com/dolthub/dolt/issues/9049 by making this function collation-aware
470- func normalizeForKeyValueCache (ctx * sql.Context , val interface {}) (interface {}, error ) {
471- return sql .UnwrapAny (ctx , val )
474+ func normalizeForKeyValueCache (ctx * sql.Context , typ sql.Type , val interface {}) (interface {}, error ) {
475+ val , err := sql .UnwrapAny (ctx , val )
476+ if err != nil {
477+ return nil , err
478+ }
479+ return val , nil
472480}
473481
474- func putAllRows (ctx * sql.Context , cache sql.KeyValueCache , vals []interface {}) error {
475- for _ , val := range vals {
476- val , err := normalizeForKeyValueCache (ctx , val )
482+ func putAllRows (ctx * sql.Context , cache sql.KeyValueCache , sch sql. Schema , vals []interface {}) error {
483+ for i , val := range vals {
484+ normVal , err := normalizeForKeyValueCache (ctx , sch [ i ]. Type , val )
477485 if err != nil {
478486 return err
479487 }
480- rowKey , err := sql .HashOf (ctx , sql .NewRow (val ))
488+ rowKey , err := sql .HashOf (ctx , sql .NewRow (normVal ))
481489 if err != nil {
482490 return err
483491 }
484- err = cache .Put (rowKey , val )
492+ err = cache .Put (rowKey , normVal )
485493 if err != nil {
486494 return err
487495 }
0 commit comments