James Hawkins : msi: Don't create a temporary table that is not held.

Alexandre Julliard julliard at winehq.org
Thu Feb 26 09:05:04 CST 2009


Module: wine
Branch: master
Commit: ea28915133f7b96512233ca194a890e46a50b80e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ea28915133f7b96512233ca194a890e46a50b80e

Author: James Hawkins <truiken at gmail.com>
Date:   Wed Feb 25 19:45:28 2009 -0800

msi: Don't create a temporary table that is not held.

---

 dlls/msi/create.c   |    7 ++++++-
 dlls/msi/package.c  |   17 +++++++++--------
 dlls/msi/tests/db.c |    7 +++++--
 3 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/dlls/msi/create.c b/dlls/msi/create.c
index 0d4d9cf..8a801f2 100644
--- a/dlls/msi/create.c
+++ b/dlls/msi/create.c
@@ -44,6 +44,7 @@ typedef struct tagMSICREATEVIEW
     MSIDATABASE     *db;
     LPWSTR           name;
     BOOL             bIsTemp;
+    BOOL             hold;
     column_info     *col_info;
 } MSICREATEVIEW;
 
@@ -62,9 +63,12 @@ static UINT CREATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
     MSITABLE *table;
     BOOL persist = (cv->bIsTemp) ? MSICONDITION_FALSE : MSICONDITION_TRUE;
 
-    TRACE("%p Table %s (%s)\n", cv, debugstr_w(cv->name), 
+    TRACE("%p Table %s (%s)\n", cv, debugstr_w(cv->name),
           cv->bIsTemp?"temporary":"permanent");
 
+    if (cv->bIsTemp && !cv->hold)
+        return ERROR_SUCCESS;
+
     return msi_create_table( cv->db, cv->name, cv->col_info, persist, &table);
 }
 
@@ -197,6 +201,7 @@ UINT CREATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR table,
     cv->name = table;
     cv->col_info = col_info;
     cv->bIsTemp = temp;
+    cv->hold = hold;
     *view = (MSIVIEW*) cv;
 
     return ERROR_SUCCESS;
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 6ae4870..f662fe0 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -66,14 +66,15 @@ static UINT create_temp_property_table(MSIPACKAGE *package)
     UINT rc;
 
     static const WCHAR CreateSql[] = {
-       'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','_','P','r','o',
-       'p','e','r','t','y','`',' ','(',' ','`','_','P','r','o','p','e','r','t',
-       'y','`',' ','C','H','A','R','(','5','6',')',' ','N','O','T',' ','N','U',
-       'L','L',' ','T','E','M','P','O','R','A','R','Y',',',' ','`','V','a','l',
-       'u','e','`',' ','C','H','A','R','(','9','8',')',' ','N','O','T',' ','N',
-       'U','L','L',' ','T','E','M','P','O','R','A','R','Y',' ','P','R','I','M',
-       'A','R','Y',' ','K','E','Y',' ','`','_','P','r','o','p','e','r','t','y',
-        '`',')',0};
+       'C','R','E','A','T','E',' ','T','A','B','L','E',' ',
+       '`','_','P','r','o','p','e','r','t','y','`',' ','(',' ',
+       '`','_','P','r','o','p','e','r','t','y','`',' ',
+       'C','H','A','R','(','5','6',')',' ','N','O','T',' ','N','U','L','L',' ',
+       'T','E','M','P','O','R','A','R','Y',',',' ',
+       '`','V','a','l','u','e','`',' ','C','H','A','R','(','9','8',')',' ',
+       'N','O','T',' ','N','U','L','L',' ','T','E','M','P','O','R','A','R','Y',
+       ' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ',
+       '`','_','P','r','o','p','e','r','t','y','`',')',' ','H','O','L','D',0};
 
     rc = MSI_DatabaseOpenViewW(package->db, CreateSql, &view);
     if (rc != ERROR_SUCCESS)
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 5a9f7b1..e0694b2 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -3274,10 +3274,13 @@ static void test_temporary_table(void)
     r = run_query(hdb, 0, query);
     ok(r == ERROR_SUCCESS, "failed to add table\n");
 
-    todo_wine {
+    query = "SELECT * FROM `T2`";
+    r = MsiDatabaseOpenView(hdb, query, &view);
+    ok(r == ERROR_BAD_QUERY_SYNTAX,
+       "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+
     cond = MsiDatabaseIsTablePersistent(hdb, "T2");
     ok( cond == MSICONDITION_NONE, "wrong return condition\n");
-    }
 
     query = "CREATE TABLE `T3` ( `B` SHORT NOT NULL TEMPORARY, `C` CHAR(255) PRIMARY KEY `C`)";
     r = run_query(hdb, 0, query);




More information about the wine-cvs mailing list