From 7281024b45db2ddcc54cf6257fe5559b9b07aa93 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Mon, 30 May 2011 09:31:50 -0400 Subject: Fix bug with string literals in unAs --- src/c/urweb.c | 22 ++++++++-------------- src/mono_opt.sml | 2 +- tests/t_t.ur | 5 +++-- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/c/urweb.c b/src/c/urweb.c index 1edf47e0..865ce024 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -3562,7 +3562,7 @@ __attribute__((noreturn)) void uw_redirect(uw_context ctx, uw_Basis_string url) } uw_Basis_string uw_Basis_unAs(uw_context ctx, uw_Basis_string s) { - uw_Basis_string r = uw_malloc(ctx, strlen(s) + 1); + uw_Basis_string ret = uw_malloc(ctx, strlen(s) + 1), r = ret; for (; *s; ++s) { if (s[0] == '\'') { @@ -3572,27 +3572,21 @@ uw_Basis_string uw_Basis_unAs(uw_context ctx, uw_Basis_string s) { *r++ = '\''; break; } else if (s[0] == '\\') { - if (s[1] == '\\') { - *r++ = '\\'; - *r++ = '\\'; - ++s; - } else if (s[1] == '\'') { - *r++ = '\\'; - *r++ = '\''; - ++s; - } else - *r++ = '\''; + *r++ = '\\'; + *r++ = s[1]; + ++s; } else *r++ = s[0]; } if (*s == 0) break; - } else if (s[0] == 'T' && s[1] == '.') - ++s; + } else if (s[0] == 'T' && s[1] == '_' && s[2] == 'T' && s[3] == '.') + s += 3; else *r++ = s[0]; } - return r; + *r = 0; + return ret; } uw_Basis_string uw_Basis_mstrcat(uw_context ctx, ...) { diff --git a/src/mono_opt.sml b/src/mono_opt.sml index ffadeec4..5abbf900 100644 --- a/src/mono_opt.sml +++ b/src/mono_opt.sml @@ -102,7 +102,7 @@ fun unAs s = fun doChars (cs, acc) = case cs of #"T" :: #"_" :: #"T" :: #"." :: cs => doChars (cs, acc) - | #"'" :: cs => doString (cs, acc) + | #"'" :: cs => doString (cs, #"'" :: acc) | ch :: cs => doChars (cs, ch :: acc) | [] => String.implode (rev acc) diff --git a/tests/t_t.ur b/tests/t_t.ur index 9e38a30d..a20e45f1 100644 --- a/tests/t_t.ur +++ b/tests/t_t.ur @@ -1,3 +1,4 @@ -table t : {A : int} +table t : {A : int, B : string} -task initialize = fn () => dml (UPDATE t SET A = A + 1 WHERE TRUE) +task initialize = fn () => dml (UPDATE t SET A = A + 1 WHERE TRUE); + dml (UPDATE t SET B = 'q' WHERE TRUE) -- cgit v1.2.3