mirror of
https://github.com/chaisql/chai.git
synced 2025-10-06 16:18:14 +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
|
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
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user