<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>