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" "bufio"
"bytes" "bytes"
"io" "io"
"strings"
) )
// stack represents a stack. // 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. // eof represents a marker rune for the end of the reader.

@ -84,7 +84,7 @@ func Test_ScannerSemi(t *testing.T) {
if err != nil { if err != nil {
t.Fatal("Scan of single semicolon failed") t.Fatal("Scan of single semicolon failed")
} }
if l != ";" { if l != "" {
t.Fatal("Scan of single semicolon returned incorrect value") t.Fatal("Scan of single semicolon returned incorrect value")
} }
_, err = s.Scan() _, err = s.Scan()
@ -101,7 +101,7 @@ func Test_ScannerSingleStatement(t *testing.T) {
if err != nil { if err != nil {
t.Fatal("Scan of single statement failed") 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") t.Fatal("Scan of single statement returned incorrect value")
} }
_, err = s.Scan() _, err = s.Scan()
@ -118,7 +118,7 @@ func Test_ScannerSingleStatementQuotes(t *testing.T) {
if err != nil { if err != nil {
t.Fatal("Scan of single statement failed") 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") t.Fatal("Scan of single statement returned incorrect value")
} }
_, err = s.Scan() _, err = s.Scan()
@ -135,7 +135,7 @@ func Test_ScannerSingleStatementQuotesEmbedded(t *testing.T) {
if err != nil { if err != nil {
t.Fatal("Scan of single statement failed") 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") t.Fatal("Scan of single statement returned incorrect value")
} }
_, err = s.Scan() _, err = s.Scan()
@ -155,7 +155,7 @@ func Test_ScannerMultiStatement(t *testing.T) {
t.Fatal("Scan of multi statement failed") 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) 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") 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) 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 { if err != nil {
t.Fatal("Scan of multiline statement failed") 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") t.Fatal("Scan of multiline statement returned incorrect value")
} }
_, err = s.Scan() _, err = s.Scan()

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

@ -264,7 +264,7 @@ COMMIT;
t.Fatalf("failed to load dump: %s", err.Error()) t.Fatalf("failed to load dump: %s", err.Error())
} }
if n != 2 { 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. // Check that data were loaded correctly.

Loading…
Cancel
Save