mirror of
				https://github.com/chaisql/chai.git
				synced 2025-10-31 19:02:48 +08:00 
			
		
		
		
	parser: fix statement parsing
This commit is contained in:
		| @@ -80,28 +80,37 @@ func (p *Parser) ParseQuery() (query.Query, error) { | ||||
|  | ||||
| // ParseQuery parses a Genji SQL string and returns a Query. | ||||
| func (p *Parser) Parse(fn func(statement.Statement) error) error { | ||||
| 	semi := true | ||||
|  | ||||
| 	for { | ||||
| 		if tok, pos, lit := p.ScanIgnoreWhitespace(); tok == scanner.EOF { | ||||
| 		err := p.skipMany(scanner.SEMICOLON) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		end, err := p.parseOptional(scanner.EOF) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if end { | ||||
| 			return nil | ||||
| 		} else if tok == scanner.SEMICOLON { | ||||
| 			semi = true | ||||
| 		} else { | ||||
| 			if !semi { | ||||
| 				return newParseError(scanner.Tokstr(tok, lit), []string{";"}, pos) | ||||
| 			} | ||||
| 			p.Unscan() | ||||
| 			s, err := p.ParseStatement() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		s, err := p.ParseStatement() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		tok, pos, lit := p.ScanIgnoreWhitespace() | ||||
| 		switch tok { | ||||
| 		case scanner.EOF: | ||||
| 			return fn(s) | ||||
| 		case scanner.SEMICOLON: | ||||
| 			err = fn(s) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			semi = false | ||||
| 		default: | ||||
| 			p.Unscan() | ||||
| 			return newParseError(scanner.Tokstr(tok, lit), []string{";"}, pos) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -142,6 +151,16 @@ func (p *Parser) ParseStatement() (statement.Statement, error) { | ||||
| 	}, pos) | ||||
| } | ||||
|  | ||||
| func (p *Parser) skipMany(tok scanner.Token) error { | ||||
| 	for { | ||||
| 		t, _, _ := p.ScanIgnoreWhitespace() | ||||
| 		if t != tok { | ||||
| 			p.Unscan() | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // parseCondition parses the "WHERE" clause of the query, if it exists. | ||||
| func (p *Parser) parseCondition() (expr.Expr, error) { | ||||
| 	// Check if the WHERE token exists. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Asdine El Hrychy
					Asdine El Hrychy