From 91ec65d7f150a7951d4b17119447bfb9167bcaa2 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Tue, 1 Aug 2006 17:36:03 -0700 Subject: [PATCH] msi: Add tests for SQL query markers. --- dlls/msi/tests/db.c | 208 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 195 insertions(+), 13 deletions(-) diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 063c645353d..e68f2a2a045 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -457,7 +457,7 @@ static void test_msibadqueries(void) ok(r == TRUE, "file didn't exist after commit\n"); } -static UINT run_query( MSIHANDLE hdb, const char *query ) +static UINT run_query( MSIHANDLE hdb, MSIHANDLE hrec, const char *query ) { MSIHANDLE hview = 0; UINT r; @@ -466,7 +466,7 @@ static UINT run_query( MSIHANDLE hdb, const char *query ) if( r != ERROR_SUCCESS ) return r; - r = MsiViewExecute(hview, 0); + r = MsiViewExecute(hview, hrec); if( r == ERROR_SUCCESS ) r = MsiViewClose(hview); MsiCloseHandle(hview); @@ -490,7 +490,7 @@ static void test_viewmodify(void) query = "CREATE TABLE `phone` ( " "`id` INT, `name` CHAR(32), `number` CHAR(32) " "PRIMARY KEY `id`)"; - r = run_query( hdb, query ); + r = run_query( hdb, 0, query ); ok(r == ERROR_SUCCESS, "query failed\n"); /* check what the error function reports without doing anything */ @@ -736,7 +736,7 @@ static void test_viewgetcolumninfo(void) hdb = create_db(); ok( hdb, "failed to create db\n"); - r = run_query( hdb, + r = run_query( hdb, 0, "CREATE TABLE `Properties` " "( `Property` CHAR(255), `Value` CHAR(1) PRIMARY KEY `Property`)" ); ok( r == ERROR_SUCCESS , "Failed to create table\n" ); @@ -763,7 +763,7 @@ static void test_viewgetcolumninfo(void) MsiCloseHandle( rec ); - r = run_query( hdb, + r = run_query( hdb, 0, "CREATE TABLE `Binary` " "( `Name` CHAR(255), `Data` OBJECT PRIMARY KEY `Name`)" ); ok( r == ERROR_SUCCESS , "Failed to create table\n" ); @@ -789,7 +789,7 @@ static void test_viewgetcolumninfo(void) ok( check_record( rec, 2, "Data"), "wrong record type\n"); MsiCloseHandle( rec ); - r = run_query( hdb, + r = run_query( hdb, 0, "CREATE TABLE `UIText` " "( `Key` CHAR(72) NOT NULL, `Text` CHAR(255) LOCALIZABLE PRIMARY KEY `Key`)" ); ok( r == ERROR_SUCCESS , "Failed to create table\n" ); @@ -957,7 +957,7 @@ static void test_streamtable(void) hdb = create_db(); ok( hdb, "failed to create db\n"); - r = run_query( hdb, + r = run_query( hdb, 0, "CREATE TABLE `Properties` " "( `Property` CHAR(255), `Value` CHAR(1) PRIMARY KEY `Property`)" ); ok( r == ERROR_SUCCESS , "Failed to create table\n" ); @@ -996,7 +996,7 @@ static void test_where(void) hdb = create_db(); ok( hdb, "failed to create db\n"); - r = run_query( hdb, + r = run_query( hdb, 0, "CREATE TABLE `Media` (" "`DiskId` SHORT NOT NULL, " "`LastSequence` LONG, " @@ -1007,17 +1007,17 @@ static void test_where(void) "PRIMARY KEY `DiskId`)" ); ok( r == S_OK, "cannot create Media table: %d\n", r ); - r = run_query( hdb, "INSERT INTO `Media` " + r = run_query( hdb, 0, "INSERT INTO `Media` " "( `DiskId`, `LastSequence`, `DiskPrompt`, `Cabinet`, `VolumeLabel`, `Source` ) " "VALUES ( 1, 0, '', 'zero.cab', '', '' )" ); ok( r == S_OK, "cannot add file to the Media table: %d\n", r ); - r = run_query( hdb, "INSERT INTO `Media` " + r = run_query( hdb, 0, "INSERT INTO `Media` " "( `DiskId`, `LastSequence`, `DiskPrompt`, `Cabinet`, `VolumeLabel`, `Source` ) " "VALUES ( 2, 1, '', 'one.cab', '', '' )" ); ok( r == S_OK, "cannot add file to the Media table: %d\n", r ); - r = run_query( hdb, "INSERT INTO `Media` " + r = run_query( hdb, 0, "INSERT INTO `Media` " "( `DiskId`, `LastSequence`, `DiskPrompt`, `Cabinet`, `VolumeLabel`, `Source` ) " "VALUES ( 3, 2, '', 'two.cab', '', '' )" ); ok( r == S_OK, "cannot add file to the Media table: %d\n", r ); @@ -1088,14 +1088,14 @@ static void test_msiimport(void) r = add_table_to_db(hdb, test_data); todo_wine { - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); } query = "SELECT * FROM `TestTable`"; r = MsiDatabaseOpenView(hdb, query, &view); todo_wine { - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); } r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); @@ -1172,6 +1172,187 @@ static void test_msiimport(void) ok(i == -2147483640, "Expected -2147483640, got %d\n", i); } + MsiCloseHandle(rec); + MsiCloseHandle(view); + MsiCloseHandle(hdb); + DeleteFileA(msifile); +} + +static void test_markers(void) +{ + MSIHANDLE hdb, rec; + LPCSTR query; + UINT r; + + hdb = create_db(); + ok( hdb, "failed to create db\n"); + + rec = MsiCreateRecord(3); + MsiRecordSetString(rec, 1, "Table"); + MsiRecordSetString(rec, 2, "Apples"); + MsiRecordSetString(rec, 3, "Oranges"); + + /* try a legit create */ + query = "CREATE TABLE `Table` ( `One` SHORT NOT NULL, `Two` CHAR(255) PRIMARY KEY `One`)"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try table name as marker */ + rec = MsiCreateRecord(1); + MsiRecordSetString(rec, 1, "Fable"); + query = "CREATE TABLE `?` ( `One` SHORT NOT NULL, `Two` CHAR(255) PRIMARY KEY `One`)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try table name as marker without backticks */ + MsiRecordSetString(rec, 1, "Mable"); + query = "CREATE TABLE ? ( `One` SHORT NOT NULL, `Two` CHAR(255) PRIMARY KEY `One`)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try one column name as marker */ + MsiRecordSetString(rec, 1, "One"); + query = "CREATE TABLE `Mable` ( `?` SHORT NOT NULL, `Two` CHAR(255) PRIMARY KEY `One`)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try column names as markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(2); + MsiRecordSetString(rec, 1, "One"); + MsiRecordSetString(rec, 2, "Two"); + query = "CREATE TABLE `Mable` ( `?` SHORT NOT NULL, `?` CHAR(255) PRIMARY KEY `One`)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try names with backticks */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(3); + MsiRecordSetString(rec, 1, "One"); + MsiRecordSetString(rec, 2, "Two"); + MsiRecordSetString(rec, 3, "One"); + query = "CREATE TABLE `Mable` ( `?` SHORT NOT NULL, `?` CHAR(255) PRIMARY KEY `?`)"; + r = run_query(hdb, rec, query); + todo_wine + { + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + } + + /* try names with backticks, minus definitions */ + query = "CREATE TABLE `Mable` ( `?`, `?` PRIMARY KEY `?`)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try names without backticks */ + query = "CREATE TABLE `Mable` ( ? SHORT NOT NULL, ? CHAR(255) PRIMARY KEY ?)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try one long marker */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(1); + MsiRecordSetString(rec, 1, "`One` SHORT NOT NULL, `Two` CHAR(255) PRIMARY KEY `One`"); + query = "CREATE TABLE `Mable` ( ? )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try all names as markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(4); + MsiRecordSetString(rec, 1, "Mable"); + MsiRecordSetString(rec, 2, "One"); + MsiRecordSetString(rec, 3, "Two"); + MsiRecordSetString(rec, 4, "One"); + query = "CREATE TABLE `?` ( `?` SHORT NOT NULL, `?` CHAR(255) PRIMARY KEY `?`)"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try a legit insert */ + query = "INSERT INTO `Table` ( `One`, `Two` ) VALUES ( 5, 'hello' )"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try values as markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(2); + MsiRecordSetInteger(rec, 1, 4); + MsiRecordSetString(rec, 2, "hi"); + query = "INSERT INTO `Table` ( `One`, `Two` ) VALUES ( ?, '?' )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try column names and values as markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(4); + MsiRecordSetString(rec, 1, "One"); + MsiRecordSetString(rec, 2, "Two"); + MsiRecordSetInteger(rec, 3, 5); + MsiRecordSetString(rec, 4, "hi"); + query = "INSERT INTO `Table` ( `?`, `?` ) VALUES ( ?, '?' )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try column names as markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(2); + MsiRecordSetString(rec, 1, "One"); + MsiRecordSetString(rec, 2, "Two"); + query = "INSERT INTO `Table` ( `?`, `?` ) VALUES ( 3, 'yellow' )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* try table name as a marker */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(1); + MsiRecordSetString(rec, 1, "Table"); + query = "INSERT INTO `?` ( `One`, `Two` ) VALUES ( 2, 'green' )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try table name and values as markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(3); + MsiRecordSetString(rec, 1, "Table"); + MsiRecordSetInteger(rec, 2, 10); + MsiRecordSetString(rec, 3, "haha"); + query = "INSERT INTO `?` ( `One`, `Two` ) VALUES ( ?, '?' )"; + r = run_query(hdb, rec, query); + todo_wine + { + ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %d\n", r); + } + + /* try all markers */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(5); + MsiRecordSetString(rec, 1, "Table"); + MsiRecordSetString(rec, 1, "One"); + MsiRecordSetString(rec, 1, "Two"); + MsiRecordSetInteger(rec, 2, 10); + MsiRecordSetString(rec, 3, "haha"); + query = "INSERT INTO `?` ( `?`, `?` ) VALUES ( ?, '?' )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* insert an integer as a string */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(2); + MsiRecordSetString(rec, 1, "11"); + MsiRecordSetString(rec, 2, "hi"); + query = "INSERT INTO `Table` ( `One`, `Two` ) VALUES ( ?, '?' )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* leave off the '' for the string */ + MsiCloseHandle(rec); + rec = MsiCreateRecord(2); + MsiRecordSetInteger(rec, 1, 12); + MsiRecordSetString(rec, 2, "hi"); + query = "INSERT INTO `Table` ( `One`, `Two` ) VALUES ( ?, ? )"; + r = run_query(hdb, rec, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + MsiCloseHandle(hdb); DeleteFileA(msifile); } @@ -1189,4 +1370,5 @@ START_TEST(db) test_streamtable(); test_where(); test_msiimport(); + test_markers(); }