mirror of
https://github.com/chaisql/chai.git
synced 2025-10-06 08:06:55 +08:00
Fix shell table autocompletion
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user