diff --git a/query/execute/table.go b/query/execute/table.go
index ac9f1bf1ed..3f77d445f7 100644
--- a/query/execute/table.go
+++ b/query/execute/table.go
@@ -72,7 +72,7 @@ func CopyTable(t query.Table, a *Allocator) query.Table {
 		builder.AddCol(c)
 	}
 
-	AppendTable(t, builder, colMap)
+	AppendMappedTable(t, builder, colMap)
 	// ColListTableBuilders do not error
 	nb, _ := builder.Table()
 	return nb
@@ -115,27 +115,48 @@ func AddNewCols(t query.Table, builder TableBuilder) []int {
 	return colMap
 }
 
-// AppendTable append data from table t onto builder.
+// AppendMappedTable appends data from table t onto builder.
 // The colMap is a map of builder column index to table column index.
-func AppendTable(t query.Table, builder TableBuilder, colMap []int) {
+func AppendMappedTable(t query.Table, builder TableBuilder, colMap []int) {
 	if len(t.Cols()) == 0 {
 		return
 	}
 
 	t.Do(func(cr query.ColReader) error {
-		AppendCols(cr, builder, colMap)
+		AppendMappedCols(cr, builder, colMap)
 		return nil
 	})
 }
 
-// AppendCols appends all columns from cr onto builder.
+// AppendTable appends data from table t onto builder.
+// This function assumes builder and t have the same column schema.
+func AppendTable(t query.Table, builder TableBuilder) {
+	if len(t.Cols()) == 0 {
+		return
+	}
+
+	t.Do(func(cr query.ColReader) error {
+		AppendCols(cr, builder)
+		return nil
+	})
+}
+
+// AppendMappedCols appends all columns from cr onto builder.
 // The colMap is a map of builder column index to cr column index.
-func AppendCols(cr query.ColReader, builder TableBuilder, colMap []int) {
+func AppendMappedCols(cr query.ColReader, builder TableBuilder, colMap []int) {
 	for j := range builder.Cols() {
 		AppendCol(j, colMap[j], cr, builder)
 	}
 }
 
+// AppendCols appends all columns from cr onto builder.
+// This function assumes that builder and cr have the same column schema.
+func AppendCols(cr query.ColReader, builder TableBuilder) {
+	for j := range builder.Cols() {
+		AppendCol(j, j, cr, builder)
+	}
+}
+
 // AppendCol append a column from cr onto builder
 // The indexes bj and cj are builder and col reader indexes respectively.
 func AppendCol(bj, cj int, cr query.ColReader, builder TableBuilder) {
diff --git a/query/functions/join.go b/query/functions/join.go
index afcbf6100b..27e655f0e7 100644
--- a/query/functions/join.go
+++ b/query/functions/join.go
@@ -418,13 +418,8 @@ func (buf *streamBuffer) insert(table query.Table) {
 	builder := execute.NewColListTableBuilder(table.Key(), buf.alloc)
 	execute.AddTableCols(table, builder)
 
-	builderColumnsToTableColumns := make([]int, len(builder.Cols()))
-	for i := range builder.Cols() {
-		builderColumnsToTableColumns[i] = i
-	}
-
 	// Append the input table to this builder
-	execute.AppendTable(table, builder, builderColumnsToTableColumns)
+	execute.AppendTable(table, builder)
 
 	// Insert this table into the buffer
 	buf.data[table.Key()] = builder
diff --git a/query/functions/limit.go b/query/functions/limit.go
index 720b14dc63..cdc4544962 100644
--- a/query/functions/limit.go
+++ b/query/functions/limit.go
@@ -128,8 +128,6 @@ type limitTransformation struct {
 	cache execute.TableBuilderCache
 
 	n, offset int
-
-	colMap []int
 }
 
 func NewLimitTransformation(d execute.Dataset, cache execute.TableBuilderCache, spec *LimitProcedureSpec) *limitTransformation {
@@ -152,16 +150,6 @@ func (t *limitTransformation) Process(id execute.DatasetID, tbl query.Table) err
 	}
 	execute.AddTableCols(tbl, builder)
 
-	ncols := builder.NCols()
-	if cap(t.colMap) < ncols {
-		t.colMap = make([]int, ncols)
-		for j := range t.colMap {
-			t.colMap[j] = j
-		}
-	} else {
-		t.colMap = t.colMap[:ncols]
-	}
-
 	// AppendTable with limit
 	n := t.n
 	offset := t.offset
@@ -189,7 +177,7 @@ func (t *limitTransformation) Process(id execute.DatasetID, tbl query.Table) err
 			start:     start,
 			stop:      stop,
 		}
-		execute.AppendCols(lcr, builder, t.colMap)
+		execute.AppendCols(lcr, builder)
 		return nil
 	})
 	return nil
diff --git a/query/functions/percentile.go b/query/functions/percentile.go
index 13326c70d4..e30fa17451 100644
--- a/query/functions/percentile.go
+++ b/query/functions/percentile.go
@@ -346,18 +346,14 @@ func NewExactPercentileSelectorTransformation(d execute.Dataset, cache execute.T
 }
 
 func (t *ExactPercentileSelectorTransformation) Process(id execute.DatasetID, tbl query.Table) error {
-	copyTable := execute.NewColListTableBuilder(tbl.Key(), t.a)
-	cols := tbl.Cols()
-	colMap := make([]int, len(cols))
-	for j, c := range cols {
-		colMap[j] = j
-		copyTable.AddCol(c)
-	}
-	valueIdx := execute.ColIdx(t.spec.Column, cols)
+	valueIdx := execute.ColIdx(t.spec.Column, tbl.Cols())
 	if valueIdx < 0 {
 		return fmt.Errorf("no column %q exists", t.spec.Column)
 	}
-	execute.AppendTable(tbl, copyTable, colMap)
+
+	copyTable := execute.NewColListTableBuilder(tbl.Key(), t.a)
+	execute.AddTableCols(tbl, copyTable)
+	execute.AppendTable(tbl, copyTable)
 	copyTable.Sort([]string{t.spec.Column}, false)
 
 	n := copyTable.RawTable().NRows()
diff --git a/query/functions/range.go b/query/functions/range.go
index 9e237d170f..682c70e566 100644
--- a/query/functions/range.go
+++ b/query/functions/range.go
@@ -254,11 +254,7 @@ func (t *rangeTransformation) Process(id execute.DatasetID, tbl query.Table) err
 	}
 
 	if forwardTable {
-		cols := make([]int, len(tbl.Cols()))
-		for i := range cols {
-			cols[i] = i
-		}
-		execute.AppendTable(tbl, builder, cols)
+		execute.AppendTable(tbl, builder)
 		return nil
 	}
 
diff --git a/query/functions/sort.go b/query/functions/sort.go
index a12e200ec0..cd07a27653 100644
--- a/query/functions/sort.go
+++ b/query/functions/sort.go
@@ -113,8 +113,6 @@ type sortTransformation struct {
 
 	cols []string
 	desc bool
-
-	colMap []int
 }
 
 func NewSortTransformation(d execute.Dataset, cache execute.TableBuilderCache, spec *SortProcedureSpec) *sortTransformation {
@@ -144,18 +142,7 @@ func (t *sortTransformation) Process(id execute.DatasetID, tbl query.Table) erro
 		return fmt.Errorf("sort found duplicate table with key: %v", tbl.Key())
 	}
 	execute.AddTableCols(tbl, builder)
-
-	ncols := builder.NCols()
-	if cap(t.colMap) < ncols {
-		t.colMap = make([]int, ncols)
-		for j := range t.colMap {
-			t.colMap[j] = j
-		}
-	} else {
-		t.colMap = t.colMap[:ncols]
-	}
-
-	execute.AppendTable(tbl, builder, t.colMap)
+	execute.AppendTable(tbl, builder)
 
 	builder.Sort(t.cols, t.desc)
 	return nil