@@ -392,6 +392,23 @@ func buildSquashedTable(
392392 }
393393 case nil :
394394 var f sql.Expression
395+ var refIt gitbase.RefsIter
396+
397+ if index == nil {
398+ f , filters , err = transferFilters (
399+ filters ,
400+ gitbase .RefCommitsTableName ,
401+ gitbase .ReferencesTableName ,
402+ gitbase .RefsSchema ,
403+ "ref_name" , "repository_id" ,
404+ )
405+ if err != nil {
406+ return nil , err
407+ }
408+
409+ refIt = gitbase .NewAllRefsIter (f , true )
410+ }
411+
395412 f , filters , err = filtersForTable (
396413 gitbase .RefCommitsTableName ,
397414 filters ,
@@ -404,7 +421,7 @@ func buildSquashedTable(
404421 if index != nil {
405422 iter = gitbase .NewIndexRefCommitsIter (index , f )
406423 } else {
407- iter = gitbase .NewAllRefCommitsIter ( f )
424+ iter = gitbase .NewRefRefCommitsIter ( refIt , f )
408425 }
409426 default :
410427 addUnsquashable (gitbase .RefCommitsTableName )
@@ -1141,6 +1158,35 @@ func filtersForTables(
11411158 return
11421159}
11431160
1161+ func filtersForColumns (
1162+ filters []sql.Expression ,
1163+ table string ,
1164+ columns ... string ,
1165+ ) (columnFilters []sql.Expression , remaining []sql.Expression ) {
1166+ var fTable []sql.Expression
1167+ fTable , remaining = filtersForTables (filters , table )
1168+
1169+ for _ , f := range fTable {
1170+ valid := true
1171+ expression .Inspect (f , func (e sql.Expression ) bool {
1172+ gf , ok := e .(* expression.GetField )
1173+ if ok && ! stringInSlice (columns , gf .Name ()) {
1174+ valid = false
1175+ return false
1176+ }
1177+
1178+ return true
1179+ })
1180+
1181+ if valid {
1182+ columnFilters = append (columnFilters , f )
1183+ } else {
1184+ remaining = append (remaining , f )
1185+ }
1186+ }
1187+
1188+ return
1189+ }
11441190func stringInSlice (strs []string , str string ) bool {
11451191 for _ , s := range strs {
11461192 if s == str {
@@ -1572,6 +1618,51 @@ func fixFieldIndexes(e sql.Expression, schema sql.Schema) (sql.Expression, error
15721618 })
15731619}
15741620
1621+ func transferFilters (
1622+ filters []sql.Expression ,
1623+ from , to string ,
1624+ schema sql.Schema ,
1625+ columns ... string ,
1626+ ) (sql.Expression , []sql.Expression , error ) {
1627+ f , r := filtersForColumns (filters , from , columns ... )
1628+ fixed , err := fixFieldTable (expression .JoinAnd (f ... ), to , schema )
1629+ if err != nil {
1630+ return nil , nil , err
1631+ }
1632+
1633+ return fixed , r , err
1634+ }
1635+
1636+ func fixFieldTable (
1637+ e sql.Expression ,
1638+ table string ,
1639+ schema sql.Schema ,
1640+ ) (sql.Expression , error ) {
1641+ if e == nil {
1642+ return nil , nil
1643+ }
1644+ return e .TransformUp (func (e sql.Expression ) (sql.Expression , error ) {
1645+ gf , ok := e .(* expression.GetField )
1646+ if ! ok {
1647+ return e , nil
1648+ }
1649+
1650+ for idx , col := range schema {
1651+ if gf .Name () == col .Name {
1652+ return expression .NewGetFieldWithTable (
1653+ idx ,
1654+ gf .Type (),
1655+ table ,
1656+ gf .Name (),
1657+ gf .IsNullable (),
1658+ ), nil
1659+ }
1660+ }
1661+
1662+ return nil , analyzer .ErrColumnTableNotFound .New (gf .Table (), gf .Name ())
1663+ })
1664+ }
1665+
15751666func filterDiff (a , b []sql.Expression ) []sql.Expression {
15761667 var result []sql.Expression
15771668
0 commit comments