From: Volker W. <po...@vo...> - 2004-09-08 07:00:10
|
Hi. I've stumbled into another bug, in version 0.9. I want to query a table for whether a certain row exists. I don't want to actually return anything. Since the query needs a project, I return a constant as a dummy value. This is my query: erg <- query db $ do tab <- table T.t restrict ( tab!T.praed .==. constant 1 .&&. tab!T.arg0 .==. constant 2 ) project (T.praed << constant 0) The query always returns the constant, regardless of whether the row exists. It should only return a result when the row exists: mysql> select 0 as praed; +-------+ | praed | +-------+ | 0 | +-------+ 1 row in set (0.00 sec) mysql> select 0 as praed from t where praed = 1 and arg0 = 2; Empty set (0.01 sec) mysql> insert into t (praed, arg0) values (1,2); Query OK, 1 row affected (0.00 sec) mysql> select 0 as praed from t where praed = 1 and arg0 = 2; +-------+ | praed | +-------+ | 0 | +-------+ 1 row in set (0.00 sec) I've traced the problem to Database.lazyQuery, and found that the actual query is optimized away. The unoptimised query is (why so compliated?): Project [("praed",AttrExpr "praed2")] (Project [("praed2",ConstExpr (IntegerLit 0)),("praed1",AttrExpr "praed1"),("arg01",AttrExpr "arg01"),("daten1",AttrExpr "daten1")] (Restrict (BinExpr OpAnd (BinExpr OpEq (AttrExpr "praed1") (ConstExpr (IntegerLit 1))) (BinExpr OpEq (AttrExpr "arg01") (ConstExpr (IntegerLit 2)))) (Project [("praed1",AttrExpr "praed"),("arg01",AttrExpr "arg0"),("daten1",AttrExpr "daten")] (BaseTable "t" ["praed","arg0","daten"])))) SELECT DISTINCT praed2 as praed FROM (SELECT DISTINCT 0 as praed2, praed1, arg01, daten1 FROM (SELECT DISTINCT praed as praed1, arg0 as arg01, daten as daten1 FROM t as T1) as T1 WHERE ((praed1 = 1) AND (arg01 = 2))) as T1 The optimised query is: Project [("praed",ConstExpr (IntegerLit 0))] Empty SELECT DISTINCT 0 as praed Regards, Volker -- Volker Wysk <po...@vo...> http://www.volker-wysk.de |