<div dir="ltr"><div><div>Sorry about the missing semicolons.  Here's a non-ad hock typed up example:<br><br>--------------------------------------------------------------------------------------------------------<br>table posts : { Id : int, Title : string, Body : string, Created : time }<br>      PRIMARY KEY Id<br>table userIdToPostIds : { UserId : int, PostId : int }<br>      PRIMARY KEY UserId<br>table users : { Id : int, Username : string }<br>      PRIMARY KEY Id<br><br>fun blog () : transaction page =<br>    posts <- queryX (SELECT Posts.Title, Posts.Body, Users.Username, Posts.Created<br>             FROM posts, users, userIdToPostIds<br>             WHERE users.Id = userIdToPostIds.UserId<br>             AND   posts.Id = userIdToPostIds.PostId)<br>        (fn row => post' row.Posts.Title row.Posts.Body row.Users.Username row.Posts.Created);<br>    posts2 <- queryX (SELECT Posts.Title, Posts.Body, Users.Username, Posts.Created<br>             FROM posts, users, userIdToPostIds<br>             WHERE users.Id = userIdToPostIds.UserId<br>             AND   posts.Id = userIdToPostIds.PostId)<br>        (fn row => post' row.Posts.Title row.Posts.Body row.Users.Username row.Posts.Created);<br>    return (Page.page' blogName<br>    <xml><br>    {topbar' ()}<br>    {posts' posts}<br>    {posts' posts2}<br>    </xml>)<br><br>and topbar' () : xbody =<br>    <xml><div class="topbar">{[blogName]}</div></xml><br><br>and posts' (posts) : xbody =<br>    <xml><div class="postsList"><br>    {posts}<br>     </div></xml><br>--------------------------------------------------------------------------------------------------------<br>    <br>and comments () : transaction page = error <xml>/comments not implemented.</xml><br><br></div>I've simply duplicated the query into a new variable 'posts2' and called the post generation again using it (to avoid a possible unused variable warning/error), hence my question about a single query per transaction.  When I compile I get:<br><br>/home/burton/blog/blog.ur:20:0: (to 64:3) Some constructor unification variables are undetermined in declaration<br>(look for them as "<UNIF:...>")<br>Decl: <br><br>.....<br> [], <br>                     Users = ([Id = int]) ++ ([Username = string]) ++ [], <br>                     UserIdToPostIds =<br>                      ([UserId = int]) ++ ([PostId = int]) ++ []]] [[]] [bool]<br>                 Basis.sql_prim [bool] Basis.sql_bool Basis.True, <br>               SelectFields =<br>                Basis.sql_subset<br>                 [[Posts =<br>                    (([Created = time]) ++<br>                      ([Body = string]) ++ [Title = string], ([Id = int]) ++ []),<br>                                                                                 <br>                    Users = ([Username = string], ([Id = int]) ++ []), <br>                    UserIdToPostIds =<br>                     ([], ([UserId = int]) ++ ([PostId = int]) ++ [])]], <br>               SelectExps = {}}, <br>            OrderBy =<br>             Basis.sql_order_by_Nil<br>              [([]) ++<br>                [Posts =<br>                  ([Id = int]) ++<br>                   ([Created = time, Body = string, Title = string]) ++ [], <br>                  Users = ([Id = int]) ++ ([Username = string]) ++ [], <br>                  UserIdToPostIds = ([UserId = int]) ++ ([PostId = int]) ++ []]]<br>              [[]], Limit = Basis.sql_no_limit, Offset = Basis.sql_no_offset})<br>        (fn row :<br>          $(([Posts =<br>               $(([Title = string]) ++<br>                  ([Body = string]) ++ ([Created = time]) ++ [])]) ++<br>             (([Users = $(([Username = string]) ++ [])]) ++ []) ++ []) =><br>          post' row.#Posts.#Title row.#Posts.#Body row.#Users.#Username<br>           row.#Posts.#Created))<br>      (fn posts : xml ([Dyn = (), MakeForm = (), Body = ()]) ([]) ([]) =><br>        Basis.bind [transaction]<br>         [xml ([Dyn = (), MakeForm = (), Body = ()]) ([]) ([])]<br>         [xml ([Html = ()]) ([]) ([])] Basis.transaction_monad<br>         (queryX<br>           [[Posts =<br>              (fn fields :: ({Type} * {Type}) => fields.1)<br>               (([Created = time]) ++ ([Body = string]) ++ [Title = string], <br>                 ([Id = int]) ++ <UNIF:U314::{Type}>), <br>              Users =<br>               (fn fields :: ({Type} * {Type}) => fields.1)<br>                ([Username = string], ([Id = int]) ++ [])]] [[]]<br>           [[Dyn = (), MakeForm = (), Body = ()]] [[]]<br>           (Basis.sql_query [[]] [[]]<br>             [[Posts =<br>                ([Id = int]) ++<br>                 ([Created = time, Body = string, Title = string]) ++<br>                  <UNIF:U314::{Type}>, <br>                Users = ([Id = int]) ++ ([Username = string]) ++ [], <br>                UserIdToPostIds = ([UserId = int]) ++ ([PostId = int]) ++ []]]<br>             [[Posts =<br>                (fn fields :: ({Type} * {Type}) => fields.1)<br>                 (([Created = time]) ++ ([Body = string]) ++ [Title = string], <br>                   ([Id = int]) ++ <UNIF:U314::{Type}>), <br>                Users =<br>                 (fn fields :: ({Type} * {Type}) => fields.1)<br>                  ([Username = string], ([Id = int]) ++ [])]] [[]]<br>             {Rows =<br>               Basis.sql_query1 [[]] [[]]<br>                [[Posts =<br>                   ([Id = int]) ++<br>                    ([Created = time, Body = string, Title = string]) ++<br>                     <UNIF:U314::{Type}>, <br>                   Users = ([Id = int]) ++ ([Username = string]) ++ [], <br>                   UserIdToPostIds = ([UserId = int]) ++ ([PostId = int]) ++ []]]<br>                [[Posts =<br>                   ([Id = int]) ++<br>                    ([Created = time, Body = string, Title = string]) ++<br>                     <UNIF:U314::{Type}>, <br>                   Users = ([Id = int]) ++ ([Username = string]) ++ [], <br>                   UserIdToPostIds = ([UserId = int]) ++ ([PostId = int]) ++ []]]<br>                [[Posts =<br>                   (fn fields :: ({Type} * {Type}) => fields.1)<br>                    (([Created = time]) ++<br>                      ([Body = string]) ++ [Title = string], <br>                      ([Id = int]) ++ <UNIF:U314::{Type}>), <br>                   Users =<br>                    (fn fields :: ({Ty<br><br></div>Without the duplicated query I can compile without any warnings or errors.<br><br>Burton<br><div><br><br><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 3, 2014 at 12:23 PM, Adam Chlipala <span dir="ltr"><<a href="mailto:adamc@csail.mit.edu" target="_blank">adamc@csail.mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 10/03/2014 02:21 PM, Burton Samograd wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Are you limited to one query per transaction?<br>
</blockquote>
<br></span>
No.  Your code example below seems to be missing semicolons at line ends.<span class="im HOEnZb"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This type of code causes compiler errors where a single query doesn't:<br>
<br>
fun page () : transaction xbody =<br>
<br>
data <- (SELECT * FROM table ...) (fn row => ...)<br>
data2 <- (SELECT * FROM table2 ...) (fn row => ...)<br>
<br>
(* Generate part of the page with data *)<br>
{header data}<br>
<br>
(* Generate another section with data2 *)<br>
{footer data2}<br>
</blockquote>
<br></span><div class="HOEnZb"><div class="h5">
______________________________<u></u>_________________<br>
Ur mailing list<br>
<a href="mailto:Ur@impredicative.com" target="_blank">Ur@impredicative.com</a><br>
<a href="http://www.impredicative.com/cgi-bin/mailman/listinfo/ur" target="_blank">http://www.impredicative.com/<u></u>cgi-bin/mailman/listinfo/ur</a><br>
</div></div></blockquote></div><br></div>