Fix shell table autocompletion

This commit is contained in:
Asdine El Hrychy
2022-05-12 23:12:39 +04:00
parent bbe5d8fb1a
commit 1e2eada67c
4 changed files with 18 additions and 15 deletions

View File

@@ -501,11 +501,11 @@ func (sh *Shell) changelivePrefix() (string, bool) {
return sh.livePrefix, sh.multiLine
}
// getTables returns all the tables of the database
func (sh *Shell) getAllTables(ctx context.Context) ([]string, error) {
// listTables returns all the tables of the database, except the system ones.
func (sh *Shell) listTables(ctx context.Context) ([]string, error) {
var tables []string
res, err := sh.db.Query("SELECT name FROM __genji_catalog WHERE type = 'table'")
res, err := sh.db.Query("SELECT name FROM __genji_catalog WHERE type = 'table' AND name NOT LIKE '__genji%'")
if err != nil {
return nil, err
}
@@ -544,7 +544,7 @@ func (sh *Shell) completer(in prompt.Document) []prompt.Suggest {
expected := e.Expected
switch expected[0] {
case "table_name":
expected, err = sh.getAllTables(context.Background())
expected, err = sh.listTables(context.Background())
if err != nil {
return suggestions
}

View File

@@ -37,12 +37,12 @@ func (op *LikeOperator) Eval(env *environment.Environment) (types.Value, error)
}
type NotLikeOperator struct {
LikeOperator
*LikeOperator
}
// NotLike creates an expression that evaluates to the result of a NOT LIKE b.
func NotLike(a, b Expr) Expr {
return &NotLikeOperator{LikeOperator{&simpleOperator{a, b, scanner.LIKE}}}
return &NotLikeOperator{&LikeOperator{&simpleOperator{a, b, scanner.NLIKE}}}
}
func (op *NotLikeOperator) Eval(env *environment.Environment) (types.Value, error) {

View File

@@ -104,9 +104,9 @@ func (p *Parser) parseOperator(minPrecedence int, allowed ...scanner.Token) (fun
if tok.Precedence() >= minPrecedence {
switch {
case tok == scanner.IN && tok.Precedence() >= minPrecedence:
return expr.NotIn, op, nil
return expr.NotIn, scanner.NIN, nil
case tok == scanner.LIKE && tok.Precedence() >= minPrecedence:
return expr.NotLike, op, nil
return expr.NotLike, scanner.NLIKE, nil
}
}
@@ -155,7 +155,7 @@ func (p *Parser) parseOperator(minPrecedence int, allowed ...scanner.Token) (fun
return expr.In, op, nil
case scanner.IS:
if tok, _, _ := p.ScanIgnoreWhitespace(); tok == scanner.NOT {
return expr.IsNot, op, nil
return expr.IsNot, scanner.ISN, nil
}
p.Unscan()
return expr.Is, op, nil

View File

@@ -59,6 +59,7 @@ const (
IS // IS
ISN // IS NOT
LIKE // LIKE
NLIKE // NOT LIKE
CONCAT // ||
BETWEEN // BETWEEN
operatorEnd
@@ -334,18 +335,20 @@ func (tok Token) Precedence() int {
return 1
case AND:
return 2
case EQ, NEQ, IS, IN, LIKE, EQREGEX, NEQREGEX, BETWEEN:
case NOT:
return 3
case LT, LTE, GT, GTE:
case EQ, NEQ, IS, ISN, IN, NIN, LIKE, NLIKE, EQREGEX, NEQREGEX, BETWEEN:
return 4
case BITWISEOR, BITWISEXOR, BITWISEAND:
case LT, LTE, GT, GTE:
return 5
case ADD, SUB:
case BITWISEOR, BITWISEXOR, BITWISEAND:
return 6
case MUL, DIV, MOD:
case ADD, SUB:
return 7
case CONCAT:
case MUL, DIV, MOD:
return 8
case CONCAT:
return 9
}
return 0
}