From ea28915133f7b96512233ca194a890e46a50b80e Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Wed, 25 Feb 2009 19:45:28 -0800 Subject: [PATCH] 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 0d4d9cfd88e..8a801f26d89 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 6ae487014c6..f662fe05666 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 5a9f7b13dbd..e0694b23d17 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);