1
0
Fork 0

Merge pull request #217 from rqlite/integrate_sql_parser

Start integration of SQL line parser
master
Philip O'Toole 8 years ago committed by GitHub
commit 0f7889ed55

@ -4,6 +4,7 @@ import (
"bufio"
"bytes"
"io"
"strings"
)
// stack represents a stack.
@ -104,7 +105,7 @@ func (s *Scanner) Scan() (string, error) {
}
}
return buf.String(), nil
return strings.Trim(strings.TrimRight(buf.String(), ";"), "\n"), nil
}
// eof represents a marker rune for the end of the reader.

@ -84,7 +84,7 @@ func Test_ScannerSemi(t *testing.T) {
if err != nil {
t.Fatal("Scan of single semicolon failed")
}
if l != ";" {
if l != "" {
t.Fatal("Scan of single semicolon returned incorrect value")
}
_, err = s.Scan()
@ -101,7 +101,7 @@ func Test_ScannerSingleStatement(t *testing.T) {
if err != nil {
t.Fatal("Scan of single statement failed")
}
if l != "SELECT * FROM foo;" {
if l != "SELECT * FROM foo" {
t.Fatal("Scan of single statement returned incorrect value")
}
_, err = s.Scan()
@ -118,7 +118,7 @@ func Test_ScannerSingleStatementQuotes(t *testing.T) {
if err != nil {
t.Fatal("Scan of single statement failed")
}
if l != `SELECT * FROM "foo";` {
if l != `SELECT * FROM "foo"` {
t.Fatal("Scan of single statement returned incorrect value")
}
_, err = s.Scan()
@ -135,7 +135,7 @@ func Test_ScannerSingleStatementQuotesEmbedded(t *testing.T) {
if err != nil {
t.Fatal("Scan of single statement failed")
}
if l != `SELECT * FROM ";SELECT * FROM '"foo"'";` {
if l != `SELECT * FROM ";SELECT * FROM '"foo"'"` {
t.Fatal("Scan of single statement returned incorrect value")
}
_, err = s.Scan()
@ -155,7 +155,7 @@ func Test_ScannerMultiStatement(t *testing.T) {
t.Fatal("Scan of multi statement failed")
}
if l != e[i] {
if l != strings.Trim(e[i], "\n;") {
t.Fatalf("Scan of multi statement returned incorrect value, exp %s, got %s", e[i], l)
}
}
@ -172,7 +172,7 @@ func Test_ScannerMultiStatementQuotesEmbedded(t *testing.T) {
t.Fatal("Scan of multi statement failed")
}
if l != e[i] {
if l != strings.Trim(e[i], "\n;") {
t.Fatalf("Scan of multi statement returned incorrect value, exp %s, got %s", e[i], l)
}
}
@ -206,7 +206,7 @@ func Test_ScannerMultiLine(t *testing.T) {
if err != nil {
t.Fatal("Scan of multiline statement failed")
}
if l != stmt {
if l != strings.Trim(stmt, "\n;") {
t.Fatal("Scan of multiline statement returned incorrect value")
}
_, err = s.Scan()

@ -4,7 +4,6 @@
package store
import (
"bufio"
"bytes"
"encoding/binary"
"encoding/json"
@ -16,13 +15,13 @@ import (
"net"
"os"
"path/filepath"
"strings"
"sync"
"time"
"github.com/hashicorp/raft"
"github.com/hashicorp/raft-boltdb"
sql "github.com/rqlite/rqlite/db"
parser "github.com/rqlite/rqlite/sql"
)
var (
@ -460,19 +459,17 @@ func (s *Store) Load(r io.Reader, sz int) (int64, error) {
// Read the dump, executing the commands.
var queries []string
var n int64
buf := bufio.NewReader(r)
scanner := parser.NewScanner(r)
for {
cmd, err := buf.ReadString('\n')
cmd, err := scanner.Scan()
if err != nil && err != io.EOF {
return 0, err
return n, err
}
cmd = strings.TrimRight(cmd, "\n;")
if cmd == "PRAGMA foreign_keys=OFF" ||
cmd == "BEGIN TRANSACTION" ||
cmd == "COMMIT" {
continue
}
if cmd == "" && err == io.EOF {
break
}

@ -264,7 +264,7 @@ COMMIT;
t.Fatalf("failed to load dump: %s", err.Error())
}
if n != 2 {
t.Fatal("wrong number of statements loaded")
t.Fatalf("wrong number of statements loaded, exp %d, got %d", 2, n)
}
// Check that data were loaded correctly.

Loading…
Cancel
Save