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 return sh.livePrefix, sh.multiLine
} }
// getTables returns all the tables of the database // listTables returns all the tables of the database, except the system ones.
func (sh *Shell) getAllTables(ctx context.Context) ([]string, error) { func (sh *Shell) listTables(ctx context.Context) ([]string, error) {
var tables []string 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 { if err != nil {
return nil, err return nil, err
} }
@@ -544,7 +544,7 @@ func (sh *Shell) completer(in prompt.Document) []prompt.Suggest {
expected := e.Expected expected := e.Expected
switch expected[0] { switch expected[0] {
case "table_name": case "table_name":
expected, err = sh.getAllTables(context.Background()) expected, err = sh.listTables(context.Background())
if err != nil { if err != nil {
return suggestions return suggestions
} }

View File

@@ -37,12 +37,12 @@ func (op *LikeOperator) Eval(env *environment.Environment) (types.Value, error)
} }
type NotLikeOperator struct { type NotLikeOperator struct {
LikeOperator *LikeOperator
} }
// NotLike creates an expression that evaluates to the result of a NOT LIKE b. // NotLike creates an expression that evaluates to the result of a NOT LIKE b.
func NotLike(a, b Expr) Expr { 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) { 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 { if tok.Precedence() >= minPrecedence {
switch { switch {
case tok == scanner.IN && tok.Precedence() >= minPrecedence: 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: 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 return expr.In, op, nil
case scanner.IS: case scanner.IS:
if tok, _, _ := p.ScanIgnoreWhitespace(); tok == scanner.NOT { if tok, _, _ := p.ScanIgnoreWhitespace(); tok == scanner.NOT {
return expr.IsNot, op, nil return expr.IsNot, scanner.ISN, nil
} }
p.Unscan() p.Unscan()
return expr.Is, op, nil return expr.Is, op, nil

View File

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