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

Commit a1ee88e

Browse files
committed
sql/*: implement drop index statement
Signed-off-by: Miguel Molina <miguel@erizocosmi.co>
1 parent 0b8a5d0 commit a1ee88e

File tree

12 files changed

+261
-15
lines changed

12 files changed

+261
-15
lines changed

sql/analyzer/rules.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -769,25 +769,29 @@ func dedupStrings(in []string) []string {
769769
return result
770770
}
771771

772-
// indexCatalog sets the catalog in the CreateIndex nodes.
772+
// indexCatalog sets the catalog in the CreateIndex and DropIndex nodes.
773773
func indexCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
774774
if !n.Resolved() {
775775
return n, nil
776776
}
777777

778-
ci, ok := n.(*plan.CreateIndex)
779-
if !ok {
780-
return n, nil
781-
}
782-
783778
span, ctx := ctx.Span("index_catalog")
784779
defer span.Finish()
785780

786-
nc := *ci
787-
ci.Catalog = a.Catalog
788-
ci.CurrentDatabase = a.CurrentDatabase
789-
790-
return &nc, nil
781+
switch node := n.(type) {
782+
case *plan.CreateIndex:
783+
nc := *node
784+
nc.Catalog = a.Catalog
785+
nc.CurrentDatabase = a.CurrentDatabase
786+
return &nc, nil
787+
case *plan.DropIndex:
788+
nc := *node
789+
nc.Catalog = a.Catalog
790+
nc.CurrentDatabase = a.CurrentDatabase
791+
return &nc, nil
792+
default:
793+
return n, nil
794+
}
791795
}
792796

793797
func pushdown(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {

sql/analyzer/rules_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,33 @@ func TestQualifyColumns(t *testing.T) {
569569
require.Equal(expected, result)
570570
}
571571

572+
func TestCatalogIndex(t *testing.T) {
573+
require := require.New(t)
574+
f := getRule("index_catalog")
575+
576+
c := sql.NewCatalog()
577+
a := New(c)
578+
a.CurrentDatabase = "foo"
579+
580+
tbl := mem.NewTable("foo", nil)
581+
582+
node, err := f.Apply(sql.NewEmptyContext(), a, plan.NewCreateIndex("", tbl, nil, "", make(map[string]string)))
583+
require.NoError(err)
584+
585+
ci, ok := node.(*plan.CreateIndex)
586+
require.True(ok)
587+
require.Equal(c, ci.Catalog)
588+
require.Equal("foo", ci.CurrentDatabase)
589+
590+
node, err = f.Apply(sql.NewEmptyContext(), a, plan.NewDropIndex("foo", tbl))
591+
require.NoError(err)
592+
593+
di, ok := node.(*plan.DropIndex)
594+
require.True(ok)
595+
require.Equal(c, di.Catalog)
596+
require.Equal("foo", di.CurrentDatabase)
597+
}
598+
572599
func TestReorderProjection(t *testing.T) {
573600
require := require.New(t)
574601
f := getRule("reorder_projection")

sql/index.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ type Index interface {
4545
// one expression, it means the index has multiple columns indexed. If it's
4646
// just one, it means it may be an expression or a column.
4747
ExpressionHashes() []ExpressionHash
48+
// Driver ID of the index.
49+
Driver() string
4850
}
4951

5052
// AscendIndex is an index that is sorted in ascending order.
@@ -206,6 +208,7 @@ func (r *IndexRegistry) ReleaseIndex(idx Index) {
206208
func (r *IndexRegistry) Index(db, id string) Index {
207209
r.mut.RLock()
208210
defer r.mut.RUnlock()
211+
r.retainIndex(db, id)
209212
return r.indexes[indexKey{db, strings.ToLower(id)}]
210213
}
211214

sql/index/pilosa/index.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ func (idx *sqlIndex) ExpressionHashes() []sql.ExpressionHash {
144144
return idx.expressions
145145
}
146146

147+
func (sqlIndex) Driver() string { return "pilosa" }
148+
147149
// lookup implements sql.IndexLookup and sql.IndexValueIter interface
148150
type sqlIndexLookupIter struct {
149151
offset uint64

sql/index_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ func (i dummyIdx) Get(...interface{}) (IndexLookup, error) { panic("not implemen
126126
func (i dummyIdx) Has(...interface{}) (bool, error) { panic("not implemented") }
127127
func (i dummyIdx) Database() string { return i.database }
128128
func (i dummyIdx) Table() string { return i.table }
129+
func (i dummyIdx) Driver() string { return "dummy" }
129130

130131
type dummyExpr struct {
131132
foo int

sql/parse/create_index.go renamed to sql/parse/indexes.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func parseCreateIndex(s string) (sql.Node, error) {
5252
readKeyValue(config),
5353
skipSpaces,
5454
),
55+
checkEOF,
5556
}
5657

5758
for _, step := range steps {
@@ -195,6 +196,36 @@ func readValue(val *string) parseFunc {
195196
}
196197
}
197198

199+
func parseDropIndex(str string) (sql.Node, error) {
200+
r := bufio.NewReader(strings.NewReader(str))
201+
202+
var name, table string
203+
steps := []parseFunc{
204+
expect("drop"),
205+
skipSpaces,
206+
expect("index"),
207+
skipSpaces,
208+
readIdent(&name),
209+
skipSpaces,
210+
expect("on"),
211+
skipSpaces,
212+
readIdent(&table),
213+
skipSpaces,
214+
checkEOF,
215+
}
216+
217+
for _, step := range steps {
218+
if err := step(r); err != nil {
219+
return nil, err
220+
}
221+
}
222+
223+
return plan.NewDropIndex(
224+
name,
225+
plan.NewUnresolvedTable(table),
226+
), nil
227+
}
228+
198229
func parseIndexExpr(str string) (sql.Expression, error) {
199230
stmt, err := sqlparser.Parse("SELECT " + str)
200231
if err != nil {
@@ -368,3 +399,12 @@ func skipSpaces(r *bufio.Reader) error {
368399
}
369400
}
370401
}
402+
403+
func checkEOF(rd *bufio.Reader) error {
404+
r, _, err := rd.ReadRune()
405+
if err == io.EOF {
406+
return nil
407+
}
408+
409+
return errUnexpectedSyntax.New("EOF", r)
410+
}
File renamed without changes.

sql/parse/parse.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ var (
3131
var (
3232
describeTablesRegex = regexp.MustCompile(`^describe\s+table\s+(.*)`)
3333
createIndexRegex = regexp.MustCompile(`^create\s+index\s+`)
34+
dropIndexRegex = regexp.MustCompile(`^drop\s+index\s+`)
3435
)
3536

3637
// Parse parses the given SQL sentence and returns the corresponding node.
@@ -48,6 +49,8 @@ func Parse(ctx *sql.Context, s string) (sql.Node, error) {
4849
return parseDescribeTables(lowerQuery)
4950
case createIndexRegex.MatchString(lowerQuery):
5051
return parseCreateIndex(s)
52+
case dropIndexRegex.MatchString(lowerQuery):
53+
return parseDropIndex(s)
5154
}
5255

5356
stmt, err := sqlparser.Parse(s)
@@ -78,7 +81,7 @@ func convert(ctx *sql.Context, stmt sqlparser.Statement, query string) (sql.Node
7881
case *sqlparser.Insert:
7982
return convertInsert(ctx, n)
8083
case *sqlparser.DDL:
81-
return convertDDL(n, query)
84+
return convertDDL(n)
8285
}
8386
}
8487

@@ -141,7 +144,7 @@ func convertSelect(ctx *sql.Context, s *sqlparser.Select) (sql.Node, error) {
141144
return node, nil
142145
}
143146

144-
func convertDDL(c *sqlparser.DDL, query string) (sql.Node, error) {
147+
func convertDDL(c *sqlparser.DDL) (sql.Node, error) {
145148
switch c.Action {
146149
case sqlparser.CreateStr:
147150
return convertCreateTable(c)

sql/parse/parse_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package parse
33
import (
44
"testing"
55

6-
"github.com/stretchr/testify/require"
7-
"gopkg.in/src-d/go-mysql-server.v0/sql"
86
"gopkg.in/src-d/go-mysql-server.v0/sql/expression"
97
"gopkg.in/src-d/go-mysql-server.v0/sql/plan"
8+
9+
"github.com/stretchr/testify/require"
10+
"gopkg.in/src-d/go-mysql-server.v0/sql"
1011
)
1112

1213
var fixtures = map[string]sql.Node{
@@ -588,6 +589,10 @@ var fixtures = map[string]sql.Node{
588589
plan.NewUnresolvedTable("baz"),
589590
),
590591
),
592+
`DROP INDEX foo ON bar`: plan.NewDropIndex(
593+
"foo",
594+
plan.NewUnresolvedTable("bar"),
595+
),
591596
}
592597

593598
func TestParse(t *testing.T) {

sql/plan/create_index_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func (i *mockIndex) Get(key ...interface{}) (sql.IndexLookup, error) {
7171
func (i *mockIndex) Has(key ...interface{}) (bool, error) {
7272
panic("unimplemented")
7373
}
74+
func (*mockIndex) Driver() string { return "mock" }
7475

7576
type mockDriver struct {
7677
deleted []string

0 commit comments

Comments
 (0)