diff --git a/dlls/msi/sql.y b/dlls/msi/sql.y
index abffb2f45b2a9362227e164c9da6a908c1170079..1cf3ad6428d20f41197a759ba0f4c342c0ed8fde 100644
--- a/dlls/msi/sql.y
+++ b/dlls/msi/sql.y
@@ -214,13 +214,23 @@ oneupdate:
     TK_UPDATE table TK_SET update_assign_list TK_WHERE expr
         {
             SQL_input* sql = (SQL_input*) info;
-            MSIVIEW *update = NULL; 
+            MSIVIEW *update = NULL;
 
             UPDATE_CreateView( sql->db, &update, $2, $4, $6 );
             if( !update )
                 YYABORT;
             $$ = update;
         }
+  | TK_UPDATE table TK_SET update_assign_list
+        {
+            SQL_input* sql = (SQL_input*) info;
+            MSIVIEW *update = NULL;
+
+            UPDATE_CreateView( sql->db, &update, $2, $4, NULL );
+            if( !update )
+                YYABORT;
+            $$ = update;
+        }
     ;
 
 onedelete:
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index b9ffaa773088bc8a1401f403059b428c49399766..6afb307518aa2552c1f31caae65fdbb128009926 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -3093,17 +3093,14 @@ static void test_update(void)
 
     /* no where condition */
     query = "UPDATE `Control` SET `Text` = 'this is text'";
-    todo_wine
-    {
-        r = MsiDatabaseOpenView(hdb, query, &view);
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCESS, got %d\n", r);
-        r = MsiViewExecute(view, 0);
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        r = MsiViewClose(view);
-        ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
-        r = MsiCloseHandle(view);
-        ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
-    }
+    r = MsiDatabaseOpenView(hdb, query, &view);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCESS, got %d\n", r);
+    r = MsiViewExecute(view, 0);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    r = MsiViewClose(view);
+    ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
+    r = MsiCloseHandle(view);
+    ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
 
     /* check the modified text */
     query = "SELECT `Text` FROM `Control`";
@@ -3138,10 +3135,7 @@ static void test_update(void)
     size = MAX_PATH;
     r = MsiRecordGetString(rec, 1, result, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
-    }
+    ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
 
     MsiCloseHandle(rec);
 
diff --git a/dlls/msi/update.c b/dlls/msi/update.c
index 9c8433939224898b1b0ceed313143363182d26a7..502af143d870063bdc4027a56e7eaee000d402e3 100644
--- a/dlls/msi/update.c
+++ b/dlls/msi/update.c
@@ -199,14 +199,19 @@ UINT UPDATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR table,
     if( r != ERROR_SUCCESS )
         return r;
 
-    /* add conditions first */
-    r = WHERE_CreateView( db, &wv, tv, expr );
-    if( r != ERROR_SUCCESS )
+    if (expr)
     {
-        tv->ops->delete( tv );
-        return r;
+        /* add conditions first */
+        r = WHERE_CreateView( db, &wv, tv, expr );
+        if( r != ERROR_SUCCESS )
+        {
+            tv->ops->delete( tv );
+            return r;
+        }
     }
-    
+    else
+       wv = tv;
+
     /* then select the columns we want */
     r = SELECT_CreateView( db, &sv, wv, columns );
     if( r != ERROR_SUCCESS )