Repository: pingcap/tidb-lightning
Pull request #164 (2019-04-16 09:32:17)

Cherry-pick 2.1: Fix interpretation of integers in a BIT column (#161)
<!--
Thank you for contributing to TiDB-Lightning! Please read the [CONTRIBUTING](https://github.com/pingcap/tidb-lightning/blob/master/CONTRIBUTING.md) document **BEFORE** filing this PR.
-->

### What problem does this PR solve? <!--add issue link with summary if exists-->

Cherry-picks #161 to 2.1 for 2.1.9 release. 

### What is changed and how it works?


### Check List <!--REMOVE the items that are not applicable-->

Tests <!-- At least one of them must be included. -->

 - Unit test
 - Integration test

Side effects

Related changes

 - Need to be included in the release note

kennytm: /run-all-tests tidb=release-2.1 pd=release-2.1 tikv=release-2.1
kennytm: PTAL @GregoryIan @lonng 
GregoryIan: do we need [code](https://github.com/pingcap/tidb-lightning/pull/161/files#diff-24429677b84d3a72eee0e75a50ccc160R19)?
lonng: LGTM
kennytm: @GregoryIan No, that specific line was added to fix breakage introduced in #157, but was specifically *not* backported to 2.x.
GregoryIan: LGTM

Patch:
diff --git a/lightning/mydump/parser.go b/lightning/mydump/parser.go
index 2dff8e8..1f13f3b 100644
--- a/lightning/mydump/parser.go
+++ b/lightning/mydump/parser.go
@@ -15,8 +15,10 @@ package mydump
 
 import (
 	"bytes"
+	"fmt"
 	"io"
 	"regexp"
+	"strconv"
 	"strings"
 	"time"
 
@@ -154,12 +156,43 @@ const (
 	tokFalse
 	tokHexString
 	tokBinString
+	tokInteger
 	tokSingleQuoted
 	tokDoubleQuoted
 	tokBackQuoted
 	tokUnquoted
 )
 
+var tokenDescriptions = [...]string{
+	tokNil:          "<Nil>",
+	tokRowBegin:     "RowBegin",
+	tokRowEnd:       "RowEnd",
+	tokValues:       "Values",
+	tokNull:         "Null",
+	tokTrue:         "True",
+	tokFalse:        "False",
+	tokHexString:    "HexString",
+	tokBinString:    "BinString",
+	tokInteger:      "Integer",
+	tokSingleQuoted: "SingleQuoted",
+	tokDoubleQuoted: "DoubleQuoted",
+	tokBackQuoted:   "BackQuoted",
+	tokUnquoted:     "Unquoted",
+}
+
+// String implements the fmt.Stringer interface
+//
+// Mainly used for debugging a token.
+func (tok token) String() string {
+	t := int(tok)
+	if t >= 0 && t < len(tokenDescriptions) {
+		if description := tokenDescriptions[t]; description != "" {
+			return description
+		}
+	}
+	return fmt.Sprintf("<Unknown(%d)>", t)
+}
+
 func (parser *blockParser) readBlock() error {
 	startTime := time.Now()
 
@@ -287,10 +320,10 @@ func (parser *ChunkParser) ReadRow() error {
 	//                                              stateValues (no-op)
 	//              (             tokRowBegin
 	//                                              stateRow (reset row)
-	//              1             tokUnquoted
+	//              1             tokInteger
 	//                                              stateRow (append value)
 	//              ,
-	//              2             tokUnquoted
+	//              2             tokInteger
 	//                                              stateRow (append value)
 	//              )             tokRowEnd
 	//                                              return
@@ -305,7 +338,7 @@ func (parser *ChunkParser) ReadRow() error {
 	//              ,
 	//              (             tokRowBegin
 	//                                              stateRow (reset row)
-	//              3             tokUnquoted
+	//              3             tokInteger
 	//                                              stateRow (append value)
 	//              )             tokRowEnd
 	//                                              return
@@ -327,7 +360,7 @@ func (parser *ChunkParser) ReadRow() error {
 	//                                              stateValues
 	//              (             tokRowBegin
 	//                                              stateRow (reset row)
-	//              4             tokUnquoted
+	//              4             tokInteger
 	//                                              stateRow (append value)
 	//              )             tokRowEnd
 	//                                              return
@@ -377,6 +410,25 @@ func (parser *ChunkParser) ReadRow() error {
 				value.SetInt64(1)
 			case tokFalse:
 				value.SetInt64(0)
+			case tokInteger:
+				c := string(content)
+				if strings.HasPrefix(c, "-") {
+					i, err := strconv.ParseInt(c, 10, 64)
+					if err == nil {
+						value.SetInt64(i)
+						break
+					}
+				} else {
+					u, err := strconv.ParseUint(c, 10, 64)
+					if err == nil {
+						value.SetUint64(u)
+						break
+					}
+				}
+				// if the integer is too long, fallback to treating it as a
+				// string (all types that treats integer specially like BIT
+				// can't handle integers more than 64 bits anyway)
+				fallthrough
 			case tokUnquoted, tokSingleQuoted, tokDoubleQuoted:
 				value.SetString(parser.unescapeString(string(content)))
 			case tokHexString:
diff --git a/lightning/mydump/parser.rl b/lightning/mydump/parser.rl
index 29962c4..f431fba 100644
--- a/lightning/mydump/parser.rl
+++ b/lightning/mydump/parser.rl
@@ -62,8 +62,9 @@ double_quoted = '"' (^'"' | bs any | '""')** '"';
 back_quoted = '`' (^'`' | '``')* '`';
 unquoted = ^([,;()'"`] | space)+;
 
-hex_string = /0x[0-9a-fA-F]+/ | "x'"i [0-9a-f]* "'";
-bin_string = /0b[01]+/ | "b'"i [01]* "'";
+integer = '-'? [0-9]+;
+hex_string = '0x' [0-9a-fA-F]+ | "x'"i [0-9a-fA-F]* "'";
+bin_string = '0b' [01]+ | "b'"i [01]* "'";
 
 main := |*
 	comment;
@@ -98,6 +99,11 @@ main := |*
 		fbreak;
 	};
 
+	integer => {
+		consumedToken = tokInteger
+		fbreak;
+	};
+
 	hex_string => {
 		consumedToken = tokHexString
 		fbreak;
diff --git a/lightning/mydump/parser_generated.go b/lightning/mydump/parser_generated.go
index e87b0b6..230b479 100644
--- a/lightning/mydump/parser_generated.go
+++ b/lightning/mydump/parser_generated.go
@@ -31,7 +31,7 @@ import (
 )
 
 
-//.... lightning/mydump/parser.rl:133
+//.... lightning/mydump/parser.rl:139
 
 
 
@@ -43,7 +43,7 @@ const chunk_parser_error int = 0
 const chunk_parser_en_main int = 21
 
 
-//.... lightning/mydump/parser.rl:136
+//.... lightning/mydump/parser.rl:142
 
 func (parser *ChunkParser) lex() (token, []byte, error) {
 	var cs, ts, te, act, p int
@@ -56,7 +56,7 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 	act = 0
 	}
 
-//.... lightning/mydump/parser.rl:140
+//.... lightning/mydump/parser.rl:146
 
 	for {
 		data := parser.buf
@@ -107,12 +107,12 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 		goto st_case_27
 	case 28:
 		goto st_case_28
+	case 29:
+		goto st_case_29
 	case 8:
 		goto st_case_8
 	case 9:
 		goto st_case_9
-	case 29:
-		goto st_case_29
 	case 30:
 		goto st_case_30
 	case 31:
@@ -123,10 +123,10 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 		goto st_case_33
 	case 34:
 		goto st_case_34
-	case 35:
-		goto st_case_35
 	case 10:
 		goto st_case_10
+	case 35:
+		goto st_case_35
 	case 36:
 		goto st_case_36
 	case 37:
@@ -175,8 +175,6 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 		goto st_case_58
 	case 59:
 		goto st_case_59
-	case 60:
-		goto st_case_60
 	case 11:
 		goto st_case_11
 	case 12:
@@ -193,6 +191,8 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 		goto st_case_17
 	case 18:
 		goto st_case_18
+	case 60:
+		goto st_case_60
 	case 61:
 		goto st_case_61
 	case 62:
@@ -203,14 +203,12 @@ func (parser *ChunkParser) lex() (token, []byte, error) {
 		goto st_case_64
 	case 65:
 		goto st_case_65
-	case 66:
-		goto st_case_66
 	case 19:
 		goto st_case_19
 	case 20:
 		goto st_case_20
-	case 67:
-		goto st_case_67
+	case 66:
+		goto st_case_66
 	}
 	goto st_out
 tr4:
@@ -242,37 +240,37 @@ tr4:
 		consumedToken = tokFalse
 		{p++; cs = 21; goto _out }
 	}
-	case 8:
+	case 9:
 	{p = (te) - 1
 
 		consumedToken = tokHexString
 		{p++; cs = 21; goto _out }
 	}
-	case 9:
+	case 10:
 	{p = (te) - 1
 
 		consumedToken = tokBinString
 		{p++; cs = 21; goto _out }
 	}
-	case 10:
+	case 11:
 	{p = (te) - 1
 
 		consumedToken = tokSingleQuoted
 		{p++; cs = 21; goto _out }
 	}
-	case 11:
+	case 12:
 	{p = (te) - 1
 
 		consumedToken = tokDoubleQuoted
 		{p++; cs = 21; goto _out }
 	}
-	case 12:
+	case 13:
 	{p = (te) - 1
 
 		consumedToken = tokBackQuoted
 		{p++; cs = 21; goto _out }
 	}
-	case 13:
+	case 14:
 	{p = (te) - 1
 
 		consumedToken = tokUnquoted
@@ -285,7 +283,7 @@ tr4:
 	
 	goto st21
 tr8:
-//.... lightning/mydump/parser.rl:126
+//.... lightning/mydump/parser.rl:132
 p = (te) - 1
 {
 		consumedToken = tokUnquoted
@@ -293,12 +291,12 @@ p = (te) - 1
 	}
 	goto st21
 tr10:
-//.... lightning/mydump/parser.rl:69
+//.... lightning/mydump/parser.rl:70
 te = p+1
 
 	goto st21
 tr13:
-//.... lightning/mydump/parser.rl:106
+//.... lightning/mydump/parser.rl:112
 te = p+1
 {
 		consumedToken = tokBinString
@@ -306,7 +304,7 @@ te = p+1
 	}
 	goto st21
 tr22:
-//.... lightning/mydump/parser.rl:101
+//.... lightning/mydump/parser.rl:107
 te = p+1
 {
 		consumedToken = tokHexString
@@ -314,7 +312,7 @@ te = p+1
 	}
 	goto st21
 tr29:
-//.... lightning/mydump/parser.rl:71
+//.... lightning/mydump/parser.rl:72
 te = p+1
 {
 		consumedToken = tokRowBegin
@@ -322,15 +320,15 @@ te = p+1
 	}
 	goto st21
 tr30:
-//.... lightning/mydump/parser.rl:76
+//.... lightning/mydump/parser.rl:77
 te = p+1
 {
 		consumedToken = tokRowEnd
 		{p++; cs = 21; goto _out }
 	}
 	goto st21
-tr43:
-//.... lightning/mydump/parser.rl:116
+tr44:
+//.... lightning/mydump/parser.rl:122
 te = p
 p--
 {
@@ -338,8 +336,8 @@ p--
 		{p++; cs = 21; goto _out }
 	}
 	goto st21
-tr44:
-//.... lightning/mydump/parser.rl:111
+tr45:
+//.... lightning/mydump/parser.rl:117
 te = p
 p--
 {
@@ -347,8 +345,8 @@ p--
 		{p++; cs = 21; goto _out }
 	}
 	goto st21
-tr45:
-//.... lightning/mydump/parser.rl:126
+tr46:
+//.... lightning/mydump/parser.rl:132
 te = p
 p--
 {
@@ -356,8 +354,17 @@ p--
 		{p++; cs = 21; goto _out }
 	}
 	goto st21
+tr48:
+//.... lightning/mydump/parser.rl:102
+te = p
+p--
+{
+		consumedToken = tokInteger
+		{p++; cs = 21; goto _out }
+	}
+	goto st21
 tr84:
-//.... lightning/mydump/parser.rl:121
+//.... lightning/mydump/parser.rl:127
 te = p
 p--
 {
@@ -379,7 +386,7 @@ act = 0
 //.... NONE:1
 ts = p
 
-//.... tmp_parser.go:382
+//.... tmp_parser.go:389
 		switch data[p] {
 		case 32:
 			goto tr10
@@ -396,51 +403,56 @@ ts = p
 		case 45:
 			goto st25
 		case 47:
-			goto st27
+			goto st28
 		case 48:
-			goto st30
+			goto st31
 		case 59:
 			goto tr10
 		case 66:
-			goto tr34
+			goto tr35
 		case 67:
-			goto st36
+			goto st35
 		case 70:
-			goto st43
+			goto st42
 		case 73:
-			goto st47
+			goto st46
 		case 78:
-			goto st50
+			goto st49
 		case 84:
-			goto st53
+			goto st52
 		case 85:
-			goto st56
+			goto st55
 		case 86:
-			goto st61
+			goto st60
 		case 88:
-			goto tr42
+			goto tr43
 		case 96:
 			goto st20
 		case 98:
-			goto tr34
+			goto tr35
 		case 99:
-			goto st36
+			goto st35
 		case 102:
-			goto st43
+			goto st42
 		case 105:
-			goto st47
+			goto st46
 		case 110:
-			goto st50
+			goto st49
 		case 116:
-			goto st53
+			goto st52
 		case 117:
-			goto st56
+			goto st55
 		case 118:
-			goto st61
+			goto st60
 		case 120:
-			goto tr42
+			goto tr43
 		}
-		if 9 <= data[p] && data[p] <= 13 {
+		switch {
+		case data[p] > 13:
+			if 49 <= data[p] && data[p] <= 57 {
+				goto st27
+			}
+		case data[p] >= 9:
 			goto tr10
 		}
 		goto tr26
@@ -448,56 +460,42 @@ tr26:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:126
-act = 13;
+//.... lightning/mydump/parser.rl:132
+act = 14;
 	goto st22
-tr49:
+tr51:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:69
+//.... lightning/mydump/parser.rl:70
 act = 1;
 	goto st22
-tr53:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:106
-act = 9;
-	goto st22
-tr55:
-//.... NONE:1
-te = p+1
-
-//.... lightning/mydump/parser.rl:101
-act = 8;
-	goto st22
 tr65:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:96
+//.... lightning/mydump/parser.rl:97
 act = 7;
 	goto st22
 tr70:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:86
+//.... lightning/mydump/parser.rl:87
 act = 5;
 	goto st22
 tr73:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:91
+//.... lightning/mydump/parser.rl:92
 act = 6;
 	goto st22
 tr83:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:81
+//.... lightning/mydump/parser.rl:82
 act = 4;
 	goto st22
 	st22:
@@ -505,7 +503,7 @@ act = 4;
 			goto _test_eof22
 		}
 	st_case_22:
-//.... tmp_parser.go:508
+//.... tmp_parser.go:506
 		switch data[p] {
 		case 32:
 			goto tr4
@@ -589,19 +587,19 @@ tr1:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:116
-act = 11;
+//.... lightning/mydump/parser.rl:122
+act = 12;
 	goto st23
 	st23:
 		if p++; p == pe {
 			goto _test_eof23
 		}
 	st_case_23:
-//.... tmp_parser.go:600
+//.... tmp_parser.go:598
 		if data[p] == 34 {
 			goto st2
 		}
-		goto tr43
+		goto tr44
 	st3:
 		if p++; p == pe {
 			goto _test_eof3
@@ -695,19 +693,19 @@ tr6:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:111
-act = 10;
+//.... lightning/mydump/parser.rl:117
+act = 11;
 	goto st24
 	st24:
 		if p++; p == pe {
 			goto _test_eof24
 		}
 	st_case_24:
-//.... tmp_parser.go:706
+//.... tmp_parser.go:704
 		if data[p] == 39 {
 			goto st5
 		}
-		goto tr44
+		goto tr45
 	st6:
 		if p++; p == pe {
 			goto _test_eof6
@@ -742,28 +740,32 @@ act = 10;
 	st_case_25:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
-		case 45:
 			goto tr46
+		case 45:
+			goto tr47
 		case 59:
-			goto tr45
+			goto tr46
 		case 96:
-			goto tr45
+			goto tr46
 		}
 		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+		case data[p] < 39:
+			if 9 <= data[p] && data[p] <= 13 {
+				goto tr46
 			}
-		case data[p] >= 9:
-			goto tr45
+		case data[p] > 41:
+			if 48 <= data[p] && data[p] <= 57 {
+				goto st27
+			}
+		default:
+			goto tr46
 		}
 		goto tr26
-tr46:
+tr47:
 //.... NONE:1
 te = p+1
 
@@ -773,7 +775,7 @@ te = p+1
 			goto _test_eof26
 		}
 	st_case_26:
-//.... tmp_parser.go:776
+//.... tmp_parser.go:778
 		switch data[p] {
 		case 10:
 			goto tr10
@@ -796,7 +798,7 @@ te = p+1
 		case data[p] >= 9:
 			goto st7
 		}
-		goto tr46
+		goto tr47
 	st7:
 		if p++; p == pe {
 			goto _test_eof7
@@ -813,45 +815,75 @@ te = p+1
 	st_case_27:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr48
 		case 34:
-			goto tr45
+			goto tr48
+		case 44:
+			goto tr48
+		case 59:
+			goto tr48
+		case 96:
+			goto tr48
+		}
+		switch {
+		case data[p] < 39:
+			if 9 <= data[p] && data[p] <= 13 {
+				goto tr48
+			}
+		case data[p] > 41:
+			if 48 <= data[p] && data[p] <= 57 {
+				goto st27
+			}
+		default:
+			goto tr48
+		}
+		goto tr26
+	st28:
+		if p++; p == pe {
+			goto _test_eof28
+		}
+	st_case_28:
+		switch data[p] {
+		case 32:
+			goto tr46
+		case 34:
+			goto tr46
 		case 42:
-			goto tr47
+			goto tr49
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 96:
-			goto tr45
+			goto tr46
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-tr47:
+tr49:
 //.... NONE:1
 te = p+1
 
-	goto st28
-	st28:
+	goto st29
+	st29:
 		if p++; p == pe {
-			goto _test_eof28
+			goto _test_eof29
 		}
-	st_case_28:
-//.... tmp_parser.go:847
+	st_case_29:
+//.... tmp_parser.go:879
 		switch data[p] {
 		case 32:
 			goto st8
 		case 34:
 			goto st8
 		case 42:
-			goto tr48
+			goto tr50
 		case 44:
 			goto st8
 		case 59:
@@ -867,7 +899,7 @@ te = p+1
 		case data[p] >= 9:
 			goto st8
 		}
-		goto tr47
+		goto tr49
 	st8:
 		if p++; p == pe {
 			goto _test_eof8
@@ -889,28 +921,28 @@ te = p+1
 			goto tr10
 		}
 		goto st8
-tr48:
+tr50:
 //.... NONE:1
 te = p+1
 
-	goto st29
-	st29:
+	goto st30
+	st30:
 		if p++; p == pe {
-			goto _test_eof29
+			goto _test_eof30
 		}
-	st_case_29:
-//.... tmp_parser.go:902
+	st_case_30:
+//.... tmp_parser.go:934
 		switch data[p] {
 		case 32:
 			goto st8
 		case 34:
 			goto st8
 		case 42:
-			goto tr48
+			goto tr50
 		case 44:
 			goto st8
 		case 47:
-			goto tr49
+			goto tr51
 		case 59:
 			goto st8
 		case 96:
@@ -924,209 +956,217 @@ te = p+1
 		case data[p] >= 9:
 			goto st8
 		}
-		goto tr47
-	st30:
+		goto tr49
+	st31:
 		if p++; p == pe {
-			goto _test_eof30
+			goto _test_eof31
 		}
-	st_case_30:
+	st_case_31:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr48
 		case 34:
-			goto tr45
+			goto tr48
 		case 44:
-			goto tr45
+			goto tr48
 		case 59:
-			goto tr45
+			goto tr48
 		case 96:
-			goto tr45
+			goto tr48
 		case 98:
-			goto st31
+			goto tr52
 		case 120:
-			goto st33
+			goto tr53
 		}
 		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+		case data[p] < 39:
+			if 9 <= data[p] && data[p] <= 13 {
+				goto tr48
 			}
-		case data[p] >= 9:
-			goto tr45
+		case data[p] > 41:
+			if 48 <= data[p] && data[p] <= 57 {
+				goto st27
+			}
+		default:
+			goto tr48
 		}
 		goto tr26
-	st31:
+tr52:
+//.... NONE:1
+te = p+1
+
+//.... lightning/mydump/parser.rl:132
+act = 14;
+	goto st32
+tr54:
+//.... NONE:1
+te = p+1
+
+//.... lightning/mydump/parser.rl:112
+act = 10;
+	goto st32
+	st32:
 		if p++; p == pe {
-			goto _test_eof31
+			goto _test_eof32
 		}
-	st_case_31:
+	st_case_32:
+//.... tmp_parser.go:1013
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr4
 		case 34:
-			goto tr45
+			goto tr4
 		case 44:
-			goto tr45
+			goto tr4
 		case 59:
-			goto tr45
+			goto tr4
 		case 96:
-			goto tr45
+			goto tr4
 		}
 		switch {
 		case data[p] < 39:
 			if 9 <= data[p] && data[p] <= 13 {
-				goto tr45
+				goto tr4
 			}
 		case data[p] > 41:
 			if 48 <= data[p] && data[p] <= 49 {
-				goto st32
+				goto tr54
 			}
 		default:
-			goto tr45
+			goto tr4
 		}
 		goto tr26
-	st32:
+tr53:
+//.... NONE:1
+te = p+1
+
+//.... lightning/mydump/parser.rl:132
+act = 14;
+	goto st33
+tr55:
+//.... NONE:1
+te = p+1
+
+//.... lightning/mydump/parser.rl:107
+act = 9;
+	goto st33
+	st33:
 		if p++; p == pe {
-			goto _test_eof32
+			goto _test_eof33
 		}
-	st_case_32:
+	st_case_33:
+//.... tmp_parser.go:1058
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr4
 		case 34:
-			goto tr45
-		case 43:
-			goto tr53
+			goto tr4
 		case 44:
-			goto tr45
+			goto tr4
 		case 59:
-			goto tr45
-		case 96:
-			goto tr45
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
-			}
-		case data[p] >= 9:
-			goto tr45
-		}
-		goto tr26
-	st33:
-		if p++; p == pe {
-			goto _test_eof33
-		}
-	st_case_33:
-		switch data[p] {
-		case 32:
-			goto tr45
-		case 34:
-			goto tr45
-		case 44:
-			goto tr45
-		case 59:
-			goto tr45
+			goto tr4
 		case 96:
-			goto tr45
+			goto tr4
 		}
 		switch {
 		case data[p] < 48:
 			switch {
 			case data[p] > 13:
 				if 39 <= data[p] && data[p] <= 41 {
-					goto tr45
+					goto tr4
 				}
 			case data[p] >= 9:
-				goto tr45
+				goto tr4
 			}
 		case data[p] > 57:
 			switch {
 			case data[p] > 70:
 				if 97 <= data[p] && data[p] <= 102 {
-					goto st34
+					goto tr55
 				}
 			case data[p] >= 65:
-				goto st34
+				goto tr55
 			}
 		default:
-			goto st34
+			goto tr55
 		}
 		goto tr26
+tr35:
+//.... NONE:1
+te = p+1
+
+	goto st34
 	st34:
 		if p++; p == pe {
 			goto _test_eof34
 		}
 	st_case_34:
+//.... tmp_parser.go:1104
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
-		case 43:
-			goto tr55
+			goto tr46
+		case 39:
+			goto st10
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 96:
-			goto tr45
+			goto tr46
 		}
 		switch {
 		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+			if 40 <= data[p] && data[p] <= 41 {
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-tr34:
-//.... NONE:1
-te = p+1
-
-	goto st35
+	st10:
+		if p++; p == pe {
+			goto _test_eof10
+		}
+	st_case_10:
+		if data[p] == 39 {
+			goto tr13
+		}
+		if 48 <= data[p] && data[p] <= 49 {
+			goto st10
+		}
+		goto tr8
 	st35:
 		if p++; p == pe {
 			goto _test_eof35
 		}
 	st_case_35:
-//.... tmp_parser.go:1094
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
-		case 39:
-			goto st10
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
+		case 79:
+			goto st36
 		case 96:
-			goto tr45
+			goto tr46
+		case 111:
+			goto st36
 		}
 		switch {
 		case data[p] > 13:
-			if 40 <= data[p] && data[p] <= 41 {
-				goto tr45
+			if 39 <= data[p] && data[p] <= 41 {
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-	st10:
-		if p++; p == pe {
-			goto _test_eof10
-		}
-	st_case_10:
-		if data[p] == 39 {
-			goto tr13
-		}
-		if 48 <= data[p] && data[p] <= 49 {
-			goto st10
-		}
-		goto tr8
 	st36:
 		if p++; p == pe {
 			goto _test_eof36
@@ -1134,27 +1174,27 @@ te = p+1
 	st_case_36:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 79:
+			goto tr46
+		case 78:
 			goto st37
 		case 96:
-			goto tr45
-		case 111:
+			goto tr46
+		case 110:
 			goto st37
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st37:
@@ -1164,27 +1204,27 @@ te = p+1
 	st_case_37:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 78:
+			goto tr46
+		case 86:
 			goto st38
 		case 96:
-			goto tr45
-		case 110:
+			goto tr46
+		case 118:
 			goto st38
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st38:
@@ -1194,27 +1234,27 @@ te = p+1
 	st_case_38:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 86:
+			goto tr46
+		case 69:
 			goto st39
 		case 96:
-			goto tr45
-		case 118:
+			goto tr46
+		case 101:
 			goto st39
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st39:
@@ -1224,27 +1264,27 @@ te = p+1
 	st_case_39:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 69:
+			goto tr46
+		case 82:
 			goto st40
 		case 96:
-			goto tr45
-		case 101:
+			goto tr46
+		case 114:
 			goto st40
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st40:
@@ -1254,27 +1294,27 @@ te = p+1
 	st_case_40:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 82:
+			goto tr46
+		case 84:
 			goto st41
 		case 96:
-			goto tr45
-		case 114:
+			goto tr46
+		case 116:
 			goto st41
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st41:
@@ -1284,27 +1324,25 @@ te = p+1
 	st_case_41:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
+		case 40:
+			goto tr10
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 84:
-			goto st42
+			goto tr46
 		case 96:
-			goto tr45
-		case 116:
-			goto st42
+			goto tr46
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st42:
@@ -1314,25 +1352,27 @@ te = p+1
 	st_case_42:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
-		case 40:
-			goto tr10
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
+		case 65:
+			goto st43
 		case 96:
-			goto tr45
+			goto tr46
+		case 97:
+			goto st43
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st43:
@@ -1342,27 +1382,27 @@ te = p+1
 	st_case_43:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 65:
+			goto tr46
+		case 76:
 			goto st44
 		case 96:
-			goto tr45
-		case 97:
+			goto tr46
+		case 108:
 			goto st44
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st44:
@@ -1372,27 +1412,27 @@ te = p+1
 	st_case_44:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 76:
+			goto tr46
+		case 83:
 			goto st45
 		case 96:
-			goto tr45
-		case 108:
+			goto tr46
+		case 115:
 			goto st45
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st45:
@@ -1402,27 +1442,27 @@ te = p+1
 	st_case_45:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 83:
-			goto st46
+			goto tr46
+		case 69:
+			goto tr65
 		case 96:
-			goto tr45
-		case 115:
-			goto st46
+			goto tr46
+		case 101:
+			goto tr65
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st46:
@@ -1432,27 +1472,27 @@ te = p+1
 	st_case_46:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 69:
-			goto tr65
+			goto tr46
+		case 78:
+			goto st47
 		case 96:
-			goto tr45
-		case 101:
-			goto tr65
+			goto tr46
+		case 110:
+			goto st47
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st47:
@@ -1462,27 +1502,27 @@ te = p+1
 	st_case_47:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 78:
+			goto tr46
+		case 84:
 			goto st48
 		case 96:
-			goto tr45
-		case 110:
+			goto tr46
+		case 116:
 			goto st48
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st48:
@@ -1492,27 +1532,27 @@ te = p+1
 	st_case_48:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 84:
-			goto st49
+			goto tr46
+		case 79:
+			goto tr51
 		case 96:
-			goto tr45
-		case 116:
-			goto st49
+			goto tr46
+		case 111:
+			goto tr51
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st49:
@@ -1522,27 +1562,27 @@ te = p+1
 	st_case_49:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 79:
-			goto tr49
+			goto tr46
+		case 85:
+			goto st50
 		case 96:
-			goto tr45
-		case 111:
-			goto tr49
+			goto tr46
+		case 117:
+			goto st50
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st50:
@@ -1552,27 +1592,27 @@ te = p+1
 	st_case_50:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 85:
+			goto tr46
+		case 76:
 			goto st51
 		case 96:
-			goto tr45
-		case 117:
+			goto tr46
+		case 108:
 			goto st51
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st51:
@@ -1582,27 +1622,27 @@ te = p+1
 	st_case_51:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 76:
-			goto st52
+			goto tr70
 		case 96:
-			goto tr45
+			goto tr46
 		case 108:
-			goto st52
+			goto tr70
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st52:
@@ -1612,27 +1652,27 @@ te = p+1
 	st_case_52:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 76:
-			goto tr70
+			goto tr46
+		case 82:
+			goto st53
 		case 96:
-			goto tr45
-		case 108:
-			goto tr70
+			goto tr46
+		case 114:
+			goto st53
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st53:
@@ -1642,27 +1682,27 @@ te = p+1
 	st_case_53:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 82:
+			goto tr46
+		case 85:
 			goto st54
 		case 96:
-			goto tr45
-		case 114:
+			goto tr46
+		case 117:
 			goto st54
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st54:
@@ -1672,27 +1712,27 @@ te = p+1
 	st_case_54:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 85:
-			goto st55
+			goto tr46
+		case 69:
+			goto tr73
 		case 96:
-			goto tr45
-		case 117:
-			goto st55
+			goto tr46
+		case 101:
+			goto tr73
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st55:
@@ -1702,27 +1742,27 @@ te = p+1
 	st_case_55:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 69:
-			goto tr73
+			goto tr46
+		case 83:
+			goto st56
 		case 96:
-			goto tr45
-		case 101:
-			goto tr73
+			goto tr46
+		case 115:
+			goto st56
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st56:
@@ -1732,27 +1772,27 @@ te = p+1
 	st_case_56:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 83:
+			goto tr46
+		case 73:
 			goto st57
 		case 96:
-			goto tr45
-		case 115:
+			goto tr46
+		case 105:
 			goto st57
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st57:
@@ -1762,27 +1802,27 @@ te = p+1
 	st_case_57:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 73:
+			goto tr46
+		case 78:
 			goto st58
 		case 96:
-			goto tr45
-		case 105:
+			goto tr46
+		case 110:
 			goto st58
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st58:
@@ -1792,89 +1832,59 @@ te = p+1
 	st_case_58:
 		switch data[p] {
 		case 32:
-			goto tr45
-		case 34:
-			goto tr45
-		case 44:
-			goto tr45
-		case 59:
-			goto tr45
-		case 78:
-			goto st59
-		case 96:
-			goto tr45
-		case 110:
-			goto st59
-		}
-		switch {
-		case data[p] > 13:
-			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
-			}
-		case data[p] >= 9:
-			goto tr45
-		}
-		goto tr26
-	st59:
-		if p++; p == pe {
-			goto _test_eof59
-		}
-	st_case_59:
-		switch data[p] {
-		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 71:
 			goto tr77
 		case 96:
-			goto tr45
+			goto tr46
 		case 103:
 			goto tr77
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 tr77:
 //.... NONE:1
 te = p+1
 
-	goto st60
-	st60:
+	goto st59
+	st59:
 		if p++; p == pe {
-			goto _test_eof60
+			goto _test_eof59
 		}
-	st_case_60:
-//.... tmp_parser.go:1858
+	st_case_59:
+//.... tmp_parser.go:1868
 		switch data[p] {
 		case 32:
 			goto st11
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 96:
-			goto tr45
+			goto tr46
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st11:
@@ -1964,188 +1974,188 @@ te = p+1
 			goto tr10
 		}
 		goto tr8
-	st61:
+	st60:
 		if p++; p == pe {
-			goto _test_eof61
+			goto _test_eof60
 		}
-	st_case_61:
+	st_case_60:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 65:
-			goto st62
+			goto st61
 		case 96:
-			goto tr45
+			goto tr46
 		case 97:
-			goto st62
+			goto st61
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-	st62:
+	st61:
 		if p++; p == pe {
-			goto _test_eof62
+			goto _test_eof61
 		}
-	st_case_62:
+	st_case_61:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 76:
-			goto st63
+			goto st62
 		case 96:
-			goto tr45
+			goto tr46
 		case 108:
-			goto st63
+			goto st62
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-	st63:
+	st62:
 		if p++; p == pe {
-			goto _test_eof63
+			goto _test_eof62
 		}
-	st_case_63:
+	st_case_62:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 85:
-			goto st64
+			goto st63
 		case 96:
-			goto tr45
+			goto tr46
 		case 117:
-			goto st64
+			goto st63
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-	st64:
+	st63:
 		if p++; p == pe {
-			goto _test_eof64
+			goto _test_eof63
 		}
-	st_case_64:
+	st_case_63:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 69:
-			goto st65
+			goto st64
 		case 96:
-			goto tr45
+			goto tr46
 		case 101:
-			goto st65
+			goto st64
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-	st65:
+	st64:
 		if p++; p == pe {
-			goto _test_eof65
+			goto _test_eof64
 		}
-	st_case_65:
+	st_case_64:
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 83:
 			goto tr83
 		case 96:
-			goto tr45
+			goto tr46
 		case 115:
 			goto tr83
 		}
 		switch {
 		case data[p] > 13:
 			if 39 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
-tr42:
+tr43:
 //.... NONE:1
 te = p+1
 
-	goto st66
-	st66:
+	goto st65
+	st65:
 		if p++; p == pe {
-			goto _test_eof66
+			goto _test_eof65
 		}
-	st_case_66:
-//.... tmp_parser.go:2127
+	st_case_65:
+//.... tmp_parser.go:2137
 		switch data[p] {
 		case 32:
-			goto tr45
+			goto tr46
 		case 34:
-			goto tr45
+			goto tr46
 		case 39:
 			goto st19
 		case 44:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
+			goto tr46
 		case 96:
-			goto tr45
+			goto tr46
 		}
 		switch {
 		case data[p] > 13:
 			if 40 <= data[p] && data[p] <= 41 {
-				goto tr45
+				goto tr46
 			}
 		case data[p] >= 9:
-			goto tr45
+			goto tr46
 		}
 		goto tr26
 	st19:
@@ -2157,11 +2167,15 @@ te = p+1
 			goto tr22
 		}
 		switch {
-		case data[p] > 57:
+		case data[p] < 65:
+			if 48 <= data[p] && data[p] <= 57 {
+				goto st19
+			}
+		case data[p] > 70:
 			if 97 <= data[p] && data[p] <= 102 {
 				goto st19
 			}
-		case data[p] >= 48:
+		default:
 			goto st19
 		}
 		goto tr8
@@ -2178,15 +2192,15 @@ tr25:
 //.... NONE:1
 te = p+1
 
-//.... lightning/mydump/parser.rl:121
-act = 12;
-	goto st67
-	st67:
+//.... lightning/mydump/parser.rl:127
+act = 13;
+	goto st66
+	st66:
 		if p++; p == pe {
-			goto _test_eof67
+			goto _test_eof66
 		}
-	st_case_67:
-//.... tmp_parser.go:2189
+	st_case_66:
+//.... tmp_parser.go:2203
 		if data[p] == 96 {
 			goto st20
 		}
@@ -2207,16 +2221,16 @@ act = 12;
 	_test_eof7: cs = 7; goto _test_eof
 	_test_eof27: cs = 27; goto _test_eof
 	_test_eof28: cs = 28; goto _test_eof
+	_test_eof29: cs = 29; goto _test_eof
 	_test_eof8: cs = 8; goto _test_eof
 	_test_eof9: cs = 9; goto _test_eof
-	_test_eof29: cs = 29; goto _test_eof
 	_test_eof30: cs = 30; goto _test_eof
 	_test_eof31: cs = 31; goto _test_eof
 	_test_eof32: cs = 32; goto _test_eof
 	_test_eof33: cs = 33; goto _test_eof
 	_test_eof34: cs = 34; goto _test_eof
-	_test_eof35: cs = 35; goto _test_eof
 	_test_eof10: cs = 10; goto _test_eof
+	_test_eof35: cs = 35; goto _test_eof
 	_test_eof36: cs = 36; goto _test_eof
 	_test_eof37: cs = 37; goto _test_eof
 	_test_eof38: cs = 38; goto _test_eof
@@ -2241,7 +2255,6 @@ act = 12;
 	_test_eof57: cs = 57; goto _test_eof
 	_test_eof58: cs = 58; goto _test_eof
 	_test_eof59: cs = 59; goto _test_eof
-	_test_eof60: cs = 60; goto _test_eof
 	_test_eof11: cs = 11; goto _test_eof
 	_test_eof12: cs = 12; goto _test_eof
 	_test_eof13: cs = 13; goto _test_eof
@@ -2250,15 +2263,15 @@ act = 12;
 	_test_eof16: cs = 16; goto _test_eof
 	_test_eof17: cs = 17; goto _test_eof
 	_test_eof18: cs = 18; goto _test_eof
+	_test_eof60: cs = 60; goto _test_eof
 	_test_eof61: cs = 61; goto _test_eof
 	_test_eof62: cs = 62; goto _test_eof
 	_test_eof63: cs = 63; goto _test_eof
 	_test_eof64: cs = 64; goto _test_eof
 	_test_eof65: cs = 65; goto _test_eof
-	_test_eof66: cs = 66; goto _test_eof
 	_test_eof19: cs = 19; goto _test_eof
 	_test_eof20: cs = 20; goto _test_eof
-	_test_eof67: cs = 67; goto _test_eof
+	_test_eof66: cs = 66; goto _test_eof
 
 	_test_eof: {}
 	if p == eof {
@@ -2268,95 +2281,93 @@ act = 12;
 		case 2:
 			goto tr4
 		case 23:
-			goto tr43
+			goto tr44
 		case 3:
 			goto tr4
 		case 5:
 			goto tr4
 		case 24:
-			goto tr44
+			goto tr45
 		case 6:
 			goto tr4
 		case 25:
-			goto tr45
+			goto tr46
 		case 26:
-			goto tr45
+			goto tr46
 		case 7:
 			goto tr8
 		case 27:
-			goto tr45
+			goto tr48
 		case 28:
-			goto tr45
+			goto tr46
+		case 29:
+			goto tr46
 		case 8:
 			goto tr8
 		case 9:
 			goto tr8
-		case 29:
-			goto tr45
 		case 30:
-			goto tr45
+			goto tr46
 		case 31:
-			goto tr45
+			goto tr48
 		case 32:
-			goto tr45
+			goto tr4
 		case 33:
-			goto tr45
+			goto tr4
 		case 34:
-			goto tr45
-		case 35:
-			goto tr45
+			goto tr46
 		case 10:
 			goto tr8
+		case 35:
+			goto tr46
 		case 36:
-			goto tr45
+			goto tr46
 		case 37:
-			goto tr45
+			goto tr46
 		case 38:
-			goto tr45
+			goto tr46
 		case 39:
-			goto tr45
+			goto tr46
 		case 40:
-			goto tr45
+			goto tr46
 		case 41:
-			goto tr45
+			goto tr46
 		case 42:
-			goto tr45
+			goto tr46
 		case 43:
-			goto tr45
+			goto tr46
 		case 44:
-			goto tr45
+			goto tr46
 		case 45:
-			goto tr45
+			goto tr46
 		case 46:
-			goto tr45
+			goto tr46
 		case 47:
-			goto tr45
+			goto tr46
 		case 48:
-			goto tr45
+			goto tr46
 		case 49:
-			goto tr45
+			goto tr46
 		case 50:
-			goto tr45
+			goto tr46
 		case 51:
-			goto tr45
+			goto tr46
 		case 52:
-			goto tr45
+			goto tr46
 		case 53:
-			goto tr45
+			goto tr46
 		case 54:
-			goto tr45
+			goto tr46
 		case 55:
-			goto tr45
+			goto tr46
 		case 56:
-			goto tr45
+			goto tr46
 		case 57:
-			goto tr45
+			goto tr46
 		case 58:
-			goto tr45
+			goto tr46
 		case 59:
-			goto tr45
-		case 60:
-			goto tr45
+			goto tr46
 		case 11:
 			goto tr8
 		case 12:
@@ -2373,23 +2384,23 @@ act = 12;
 			goto tr8
 		case 18:
 			goto tr8
+		case 60:
+			goto tr46
 		case 61:
-			goto tr45
+			goto tr46
 		case 62:
-			goto tr45
+			goto tr46
 		case 63:
-			goto tr45
+			goto tr46
 		case 64:
-			goto tr45
+			goto tr46
 		case 65:
-			goto tr45
-		case 66:
-			goto tr45
+			goto tr46
 		case 19:
 			goto tr8
 		case 20:
 			goto tr4
-		case 67:
+		case 66:
 			goto tr84
 		}
 	}
@@ -2397,7 +2408,7 @@ act = 12;
 	_out: {}
 	}
 
-//.... lightning/mydump/parser.rl:151
+//.... lightning/mydump/parser.rl:157
 
 		if cs == 0 {
 			common.AppLogger.Errorf("Syntax error near byte %d, content is «%s»", parser.pos, string(data))


Test patch:
diff --git a/lightning/mydump/loader_test.go b/lightning/mydump/loader_test.go
index 706e739..0358412 100644
--- a/lightning/mydump/loader_test.go
+++ b/lightning/mydump/loader_test.go
@@ -62,8 +62,8 @@ func (s *testMydumpLoaderSuite) TestLoader(c *C) {
 	}{
 		{name: "i", dataFiles: 1},
 		{name: "report_case_high_risk", dataFiles: 1},
-		{name: "tbl_autoid", dataFiles: 1},
 		{name: "tbl_multi_index", dataFiles: 1},
+		{name: "tbl_autoid", dataFiles: 1},
 	}
 
 	for i, table := range expected {
diff --git a/lightning/mydump/parser_test.go b/lightning/mydump/parser_test.go
index 3304aa9..e8b7575 100644
--- a/lightning/mydump/parser_test.go
+++ b/lightning/mydump/parser_test.go
@@ -37,9 +37,9 @@ func (s *testMydumpParserSuite) TearDownSuite(c *C) {}
 func (s *testMydumpParserSuite) TestReadRow(c *C) {
 	reader := strings.NewReader(
 		"/* whatever pragmas */;" +
-			"INSERT INTO `namespaced`.`table` (columns, more, columns) VALUES (1, 2, 3),\n(4, 5, 6);" +
+			"INSERT INTO `namespaced`.`table` (columns, more, columns) VALUES (1,-2, 3),\n(4,5., 6);" +
 			"INSERT `namespaced`.`table` (x,y,z) VALUES (7,8,9);" +
-			"insert another_table values (10, 11, 12, '(13)', '(', 14, ')');",
+			"insert another_table values (10,11e1,12, '(13)', '(', 14, ')');",
 	)
 
 	ioWorkers := worker.NewPool(context.Background(), 5, "test")
@@ -49,9 +49,9 @@ func (s *testMydumpParserSuite) TestReadRow(c *C) {
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
 		RowID: 1,
 		Row: []types.Datum{
-			types.NewStringDatum("1"),
-			types.NewStringDatum("2"),
-			types.NewStringDatum("3"),
+			types.NewUintDatum(1),
+			types.NewIntDatum(-2),
+			types.NewUintDatum(3),
 		},
 	})
 	c.Assert(parser.Columns(), DeepEquals, []string{"columns", "more", "columns"})
@@ -63,9 +63,9 @@ func (s *testMydumpParserSuite) TestReadRow(c *C) {
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
 		RowID: 2,
 		Row: []types.Datum{
-			types.NewStringDatum("4"),
-			types.NewStringDatum("5"),
-			types.NewStringDatum("6"),
+			types.NewUintDatum(4),
+			types.NewStringDatum("5."),
+			types.NewUintDatum(6),
 		}})
 	c.Assert(parser.Columns(), DeepEquals, []string{"columns", "more", "columns"})
 	offset, rowID = parser.Pos()
@@ -76,9 +76,9 @@ func (s *testMydumpParserSuite) TestReadRow(c *C) {
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
 		RowID: 3,
 		Row: []types.Datum{
-			types.NewStringDatum("7"),
-			types.NewStringDatum("8"),
-			types.NewStringDatum("9"),
+			types.NewUintDatum(7),
+			types.NewUintDatum(8),
+			types.NewUintDatum(9),
 		},
 	})
 	c.Assert(parser.Columns(), DeepEquals, []string{"x", "y", "z"})
@@ -90,12 +90,12 @@ func (s *testMydumpParserSuite) TestReadRow(c *C) {
 	c.Assert(parser.LastRow(), DeepEquals, mydump.Row{
 		RowID: 4,
 		Row: []types.Datum{
-			types.NewStringDatum("10"),
-			types.NewStringDatum("11"),
-			types.NewStringDatum("12"),
+			types.NewUintDatum(10),
+			types.NewStringDatum("11e1"),
+			types.NewUintDatum(12),
 			types.NewStringDatum("(13)"),
 			types.NewStringDatum("("),
-			types.NewStringDatum("14"),
+			types.NewUintDatum(14),
 			types.NewStringDatum(")"),
 		}})
 	c.Assert(parser.Columns(), IsNil)
diff --git a/tests/various_types/data/vt.binary.sql b/tests/various_types/data/vt.binary.sql
index 6288db4..9f231c5 100644
--- a/tests/various_types/data/vt.binary.sql
+++ b/tests/various_types/data/vt.binary.sql
@@ -1,19 +1,19 @@
 INSERT INTO `binary` VALUES
 ( 0, x'ee72ae0aef354c5d94ffe82f696af30d'),
-( 1, x'2dad56480dbd4a00a1aed85a3fbc6c3d'),
-( 2, x'a35b4b77c45349d79faa41041efad77b'),
-( 3, x'950a780f93b840109a97a8c60304ef69'),
-( 4, x'73da4e0f11714304b781c2339e5c3973'),
-( 5, x'0a3c47cc54ea4ce3bb917006985bf31a'),
-( 6, x'd03a918aa5454cfd8400cc37490505a9'),
-( 7, x'1d0f15874a93418e9b70197594e5bc8b'),
+( 1, x'2daD56480dbd4a00a1aed85a3fbc6c3d'),
+( 2, x'a35B4b77c45349d79faa41041efad77b'),
+( 3, x'950A780f93b840109a97a8c60304ef69'),
+( 4, x'73dA4e0f11714304b781c2339e5c3973'),
+( 5, x'0a3C47cc54ea4ce3bb917006985bf31a'),
+( 6, x'd03A918aa5454cfd8400cc37490505a9'),
+( 7, x'1d0F15874a93418e9b70197594e5bc8b'),
 ( 8, x'd5019bd872194b868b5f8d0ed4b0aed5'),
 ( 9, x'b292179cdf0c459291dcfb8b95afc3e8'),
-(10, x'3f0f41aa5468468ab90c42eb02e909d2'),
+(10, x'3f0F41aa5468468ab90c42eb02e909d2'),
 (11, x'a6175ce6b6a74e63a784b1b4ab4a4c70'),
-(12, x'a7dae6d2275e4ffd86dcba5c00e48fe5'),
-(13, x'b07b158d46174c8a90791667c5545cc4'),
-(14, x'7f8e4fae730a4faf86a1a4e5b1447fab'),
+(12, x'a7dAe6d2275e4ffd86dcba5c00e48fe5'),
+(13, x'b07B158d46174c8a90791667c5545cc4'),
+(14, x'7f8E4fae730a4faf86a1a4e5b1447fab'),
 (15, x'13364cf3a5174f7eb78ebd6177af0e93'),
 (16, x'35a044893d1c40f9a2414c23e5a5f5bd'),
 (17, x'97197ef428044b84a36190a3384402aa'),
@@ -22,30 +22,30 @@ INSERT INTO `binary` VALUES
 (20, x'ca63c5d01b6945068fdae901ed855698'),
 (21, x'2e17ff04fa374fd6a6f92d09f4ef4a5f'),
 (22, x'9d65d2fc85d74c3a88f8cba092903980'),
-(23, x'4b0d0e94201a45ac89c410b4fefb8d95'),
+(23, x'4b0D0e94201a45ac89c410b4fefb8d95'),
 (24, x'a290faa6ee5241179702a69961b46c3b'),
 (25, x'61270388bd744edf9089638806efe0a9'),
 (26, x'6e54e72c08784a88991e285c49945525'),
-(27, x'308d6c267c3d4b25a68c7a1435b1a4f6'),
+(27, x'308D6c267c3d4b25a68c7a1435b1a4f6'),
 (28, x'2944629d7fef4dc0b4472ef100718837'),
 (29, x'fde1328c409c43a8b1b08c35c8000f92'),
 (30, x'ba4274c329e8413cbe87611e4570f999'),
 (31, x'6bd41abb12ea44899c47cfc4b43e1ed3'),
-(32, x'123d777433c14deaaeadec5b5bae772c'),
+(32, x'123D777433c14deaaeadec5b5bae772c'),
 (33, x'42e7ffe70e084e6fa079e9596d7f0b83'),
-(34, x'115bc64364f0456e8523bd8286c39446'),
+(34, x'115Bc64364f0456e8523bd8286c39446'),
 (35, x'd9d0233306bb4e648820ef426e089d8a'),
 (36, x'f48888bc0d614963907db98f3a7766b6'),
 (37, x'a913d4bacc4c4c479fb9271bede8015e'),
 (38, x'c567fa2b4f8e4f39896d52e59ea92e87'),
 (39, x'4015636d2bf543978c6b32d145e7592c'),
 (40, x'41832db1800046bea4f27f22b61bb5e7'),
-(41, x'55dc0343db6a420898729096305b8c07'),
+(41, x'55dC0343db6a420898729096305b8c07'),
 (42, x'22e65824c67a4ae1b89d997bc6ee29d4'),
-(43, x'090abbb2f22e4f97a4fea52eb1a80a0b'),
+(43, x'090Abbb2f22e4f97a4fea52eb1a80a0b'),
 (44, x'90553b8ae4c442e08fc3f20320b1110b'),
 (45, x'43626db940334c75bc11ea41099565cf'),
-(46, x'747b4c36678948a8921763afbee2dd15'),
+(46, x'747B4c36678948a8921763afbee2dd15'),
 (47, x'a5e015d13d76447eaf8fb834007481e9'),
 (48, x'b75264a7e7074df187a2b9052ad4e36d'),
-(49, x'45cd65089a064ab781406a84a109faef');
+(49, x'45cD65089a064ab781406a84a109faef');
diff --git a/tests/various_types/data/vt.bit-schema.sql b/tests/various_types/data/vt.bit-schema.sql
index 72e9a1d..e2d9bf3 100644
--- a/tests/various_types/data/vt.bit-schema.sql
+++ b/tests/various_types/data/vt.bit-schema.sql
@@ -1,4 +1,4 @@
 CREATE TABLE `bit`(
     `ref` INT NOT NULL,
-    `pk` BIT(2) NOT NULL PRIMARY KEY
+    `pk` BIT(2) NOT NULL
 );
\ No newline at end of file
diff --git a/tests/various_types/data/vt.bit.sql b/tests/various_types/data/vt.bit.sql
index 34d190f..37e81c7 100644
--- a/tests/various_types/data/vt.bit.sql
+++ b/tests/various_types/data/vt.bit.sql
@@ -1,1 +1,6 @@
-INSERT INTO `bit` VALUES (1, b'00'), (2, b'01'), (3, b'10'), (4, b'11');
+INSERT INTO `bit` VALUES
+(1, b'00'), (2, b'01'), (3, b'10'), (4, b'11'),
+(11, 0b0), (12, 0b1), (13, 0b10), (14, 0b11),
+(21, 0x0), (22, 0x1), (23, 0x2), (24, 0x3),
+(41, 0), (42, 1), (43, 2), (44, 3);
+
diff --git a/tests/various_types/data/vt.enum-set.sql b/tests/various_types/data/vt.enum-set.sql
index 408f92f..355ca5e 100644
--- a/tests/various_types/data/vt.enum-set.sql
+++ b/tests/various_types/data/vt.enum-set.sql
@@ -27,3 +27,10 @@ INSERT INTO `enum-set` VALUES
 ("g4d","x18,x09,x37,x31,x15,x51,x50,x56,x63,x03,x14,x49,x16,x12,x34,x45,x38,x20,x05,x28,x30,x01"),
 ("g27","x01,x08,x21,x41,x29,x02,x32,x31,x06,x24,x20,x43,x48,x51,x18,x34,x30,x00,x14,x03,x09,x44,x05"),
 ("g98","x24,x50,x46,x61,x09,x17,x20,x26,x28,x08,x19,x43,x35,x56,x36,x27,x25,x48,x63,x30,x21,x38,x33,x07");
+
+INSERT INTO `enum-set` VALUES (154, 11937444798263156608);
+-- g99 -> x07,x08,x09,x10,x11,x12,x14,x16,x17,x18,x19,x22,x25,x26,x28,x29,x30,x31,x32,x33,x35,x38,x39,x41,x44,x46,x49,x51,x53,x55,x56,x58,x61,x63
+
+-- INSERT INTO `enum-set` VALUES (0x676639, 0x7830302C7830322C7830352C7830392C7831332C7831342C7831352C7831362C7831392C7832302C7833302C7833332C7833362C7833372C7833382C7834312C7834332C7834352C7834362C7834372C7834382C7835302C7835352C7835392C7836302C7836312C783633);
+-- -- re-enable once pingcap/tidb#10154 is fixed and cherry-picked into a 3.0-beta release.
+
diff --git a/tests/various_types/data/vt.precise_types-schema.sql b/tests/various_types/data/vt.precise_types-schema.sql
new file mode 100644
index 0000000..8454118
--- /dev/null
+++ b/tests/various_types/data/vt.precise_types-schema.sql
@@ -0,0 +1,6 @@
+create table precise_types (
+    a BIGINT UNSIGNED NOT NULL,
+    b BIGINT NOT NULL,
+    c DECIMAL(20,0) NOT NULL,
+    d DOUBLE(20,0) NOT NULL
+);
diff --git a/tests/various_types/data/vt.precise_types.sql b/tests/various_types/data/vt.precise_types.sql
new file mode 100644
index 0000000..e521c60
--- /dev/null
+++ b/tests/various_types/data/vt.precise_types.sql
@@ -0,0 +1,6 @@
+insert into precise_types values (
+    18446744073709551614,
+    -9223372036854775806,
+    99999999999999999999,
+    18446744073709551614
+);
diff --git a/tests/various_types/run.sh b/tests/various_types/run.sh
index b25fa9c..124732d 100755
--- a/tests/various_types/run.sh
+++ b/tests/various_types/run.sh
@@ -22,11 +22,11 @@ run_lightning
 echo 'Import finished'
 
 run_sql 'SELECT count(pk), bin(min(pk)), bin(max(pk)) FROM vt.bit'
-check_contains 'count(pk): 4'
+check_contains 'count(pk): 16'
 check_contains 'bin(min(pk)): 0'
 check_contains 'bin(max(pk)): 11'
-run_sql 'SELECT ref FROM vt.bit WHERE pk = 0b10'
-check_contains 'ref: 3'
+run_sql 'SELECT sum(ref) FROM vt.bit WHERE pk = 0b10'
+check_contains 'sum(ref): 82'
 
 run_sql 'SELECT count(pk), min(pk), max(pk), sum(pk) FROM vt.decimal'
 check_contains 'count(pk): 50'
@@ -82,11 +82,13 @@ check_contains '"68": 1'
 check_contains '"126": 1'
 
 run_sql 'SELECT count(*) FROM vt.`enum-set`'
-check_contains 'count(*): 25'
+check_contains 'count(*): 26'
 run_sql 'SELECT count(*) FROM vt.`enum-set` WHERE find_in_set("x50", `set`) > 0'
 check_contains 'count(*): 10'
 run_sql 'SELECT `set` FROM vt.`enum-set` WHERE `enum` = "gcc"'
 check_contains 'set: x00,x06,x07,x09,x17,x20,x23,x24,x27,x37,x44,x46,x49,x54,x55,x58,x61,x62'
+run_sql 'SELECT `set` FROM vt.`enum-set` WHERE `enum` = "g99"'
+check_contains 'set: x07,x08,x09,x10,x11,x12,x14,x16,x17,x18,x19,x22,x25,x26,x28,x29,x30,x31,x32,x33,x35,x38,x39,x41,x44,x46,x49,x51,x53,x55,x56,x58,x61,x63'
 
 run_sql 'SELECT count(*) FROM vt.empty_strings'
 check_contains 'count(*): 6'
@@ -96,3 +98,9 @@ run_sql 'SELECT sum(pk) FROM vt.empty_strings WHERE a = 0x22'
 check_contains 'sum(pk): 18'
 run_sql 'SELECT sum(pk) FROM vt.empty_strings WHERE a = 0x27'
 check_contains 'sum(pk): 40'
+
+run_sql 'SELECT a, b, c, d FROM vt.precise_types'
+check_contains 'a: 18446744073709551614'
+check_contains 'b: -9223372036854775806'
+check_contains 'c: 99999999999999999999'
+check_contains 'd: 1.8446744073709552e19'