Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 2ea6781

Browse files
authored
Merge pull request #613 from kuba--/fix-612/checksum
Fix checksum for multi underlying tables.
2 parents d3cf828 + 39884d9 commit 2ea6781

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

sql/plan/create_index.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,17 @@ func getIndexableTable(t sql.Table) (sql.IndexableTable, error) {
8585
}
8686
}
8787

88+
func getChecksumable(t sql.Table) sql.Checksumable {
89+
switch t := t.(type) {
90+
case sql.Checksumable:
91+
return t
92+
case sql.TableWrapper:
93+
return getChecksumable(t.Underlying())
94+
default:
95+
return nil
96+
}
97+
}
98+
8899
// RowIter implements the Node interface.
89100
func (c *CreateIndex) RowIter(ctx *sql.Context) (sql.RowIter, error) {
90101
table, ok := c.Table.(*ResolvedTable)
@@ -119,7 +130,7 @@ func (c *CreateIndex) RowIter(ctx *sql.Context) (sql.RowIter, error) {
119130
}
120131
}
121132

122-
if ch, ok := table.Table.(sql.Checksumable); ok {
133+
if ch := getChecksumable(table.Table); ch != nil {
123134
c.Config[sql.ChecksumKey], err = ch.Checksum()
124135
if err != nil {
125136
return nil, err

sql/plan/create_index_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,48 @@ func TestCreateIndexChecksum(t *testing.T) {
209209
require.Equal("1", driver.config["idx"][sql.ChecksumKey])
210210
}
211211

212+
func TestCreateIndexChecksumWithUnderlying(t *testing.T) {
213+
require := require.New(t)
214+
215+
table :=
216+
&underlyingTable{
217+
&underlyingTable{
218+
&underlyingTable{
219+
&checksumTable{
220+
mem.NewTable("foo", sql.Schema{
221+
{Name: "a", Source: "foo"},
222+
{Name: "b", Source: "foo"},
223+
{Name: "c", Source: "foo"},
224+
}),
225+
"1",
226+
},
227+
},
228+
},
229+
}
230+
231+
driver := new(mockDriver)
232+
catalog := sql.NewCatalog()
233+
catalog.RegisterIndexDriver(driver)
234+
235+
exprs := []sql.Expression{
236+
expression.NewGetFieldWithTable(2, sql.Int64, "foo", "c", true),
237+
expression.NewGetFieldWithTable(0, sql.Int64, "foo", "a", true),
238+
}
239+
240+
ci := NewCreateIndex(
241+
"idx", NewResolvedTable(table), exprs, "mock",
242+
map[string]string{"async": "false"},
243+
)
244+
ci.Catalog = catalog
245+
ci.CurrentDatabase = "foo"
246+
247+
_, err := ci.RowIter(sql.NewEmptyContext())
248+
require.NoError(err)
249+
250+
require.Equal([]string{"idx"}, driver.saved)
251+
require.Equal("1", driver.config["idx"][sql.ChecksumKey])
252+
}
253+
212254
func TestCreateIndexWithIter(t *testing.T) {
213255
require := require.New(t)
214256
foo := mem.NewPartitionedTable("foo", sql.Schema{
@@ -360,3 +402,9 @@ func (t *checksumTable) Checksum() (string, error) {
360402
}
361403

362404
func (t *checksumTable) Underlying() sql.Table { return t.Table }
405+
406+
type underlyingTable struct {
407+
sql.Table
408+
}
409+
410+
func (t *underlyingTable) Underlying() sql.Table { return t.Table }

0 commit comments

Comments
 (0)