This is achieved by tightening the regexp used to detect valid strings.
INSERT INTO types.value (type_id, val_int)
VALUES (3, CAST(token AS integer))
RETURNING value_id INTO result;
- ELSIF token ~ '^".*"' THEN -- string
+ ELSIF token ~ '^"(?:[\\\\].|[^\\\\"])*"' THEN -- string
-- string
str := substring(token FROM 2 FOR (char_length(token)-2));
str := replace(str, '\\', chr(CAST(x'7f' AS integer)));
val token = rdr.next()
val re_int = """^(-?[0-9]+)$""".r
val re_flt = """^(-?[0-9][0-9.]*)$""".r
- val re_str = """^"(.*)"$""".r
+ val re_str = """^"((?:\\.|[^\\"])*)"$""".r
val re_str_bad = """^"(.*)$""".r
val re_key = """^:(.*)$""".r
return token match {
return IntegerNew(str2nr(token))
elseif token =~ "^-\\?[0-9][0-9.]*$"
return FloatNew(str2float(token))
- elseif token =~ "^\".*\"$"
+ elseif token =~ "^\"\\%(\\\\.\\|[^\\\\\"]\\)*\"$"
return StringNew(ParseString(token))
elseif token =~ "^\".*$"
throw "expected '\"', got EOF"
}
NUMBER_REGEXP = regcomp("^-?[0-9]+$")
-STR_REGEXP = regcomp("^\".*\"$")
+STR_REGEXP = regcomp("^\"([\\].|[^\\\"])*\"$")
STR_BAD_REGEXP = regcomp("^\".*$")
func unescape(s)