@@ -4449,6 +4449,142 @@ static void test_tables_order(void)
4449
4449
DeleteFile (msifile );
4450
4450
}
4451
4451
4452
+ static void test_rows_order (void )
4453
+ {
4454
+ const char * query ;
4455
+ MSIHANDLE hdb = 0 , hview = 0 , hrec = 0 ;
4456
+ UINT r ;
4457
+ char buffer [100 ];
4458
+ DWORD sz ;
4459
+
4460
+ r = MsiOpenDatabase (msifile , MSIDBOPEN_CREATE , & hdb );
4461
+ ok (r == ERROR_SUCCESS , "MsiOpenDatabase failed\n" );
4462
+
4463
+ query = "CREATE TABLE `foo` ( "
4464
+ "`bar` LONGCHAR NOT NULL PRIMARY KEY `bar`)" ;
4465
+ r = run_query (hdb , 0 , query );
4466
+ ok (r == ERROR_SUCCESS , "failed to create table\n" );
4467
+
4468
+ r = run_query (hdb , 0 , "INSERT INTO `foo` "
4469
+ "( `bar` ) VALUES ( 'A' )" );
4470
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4471
+
4472
+ r = run_query (hdb , 0 , "INSERT INTO `foo` "
4473
+ "( `bar` ) VALUES ( 'B' )" );
4474
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4475
+
4476
+ r = run_query (hdb , 0 , "INSERT INTO `foo` "
4477
+ "( `bar` ) VALUES ( 'C' )" );
4478
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4479
+
4480
+ r = run_query (hdb , 0 , "INSERT INTO `foo` "
4481
+ "( `bar` ) VALUES ( 'D' )" );
4482
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4483
+
4484
+ r = run_query (hdb , 0 , "INSERT INTO `foo` "
4485
+ "( `bar` ) VALUES ( 'E' )" );
4486
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4487
+
4488
+ r = run_query (hdb , 0 , "INSERT INTO `foo` "
4489
+ "( `bar` ) VALUES ( 'F' )" );
4490
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4491
+
4492
+ query = "CREATE TABLE `bar` ( "
4493
+ "`foo` LONGCHAR NOT NULL, "
4494
+ "`baz` LONGCHAR NOT NULL "
4495
+ "PRIMARY KEY `foo` )" ;
4496
+ r = run_query (hdb , 0 , query );
4497
+ ok (r == ERROR_SUCCESS , "failed to create table\n" );
4498
+
4499
+ r = run_query (hdb , 0 , "INSERT INTO `bar` "
4500
+ "( `foo`, `baz` ) VALUES ( 'C', 'E' )" );
4501
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4502
+
4503
+ r = run_query (hdb , 0 , "INSERT INTO `bar` "
4504
+ "( `foo`, `baz` ) VALUES ( 'F', 'A' )" );
4505
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4506
+
4507
+ r = run_query (hdb , 0 , "INSERT INTO `bar` "
4508
+ "( `foo`, `baz` ) VALUES ( 'A', 'B' )" );
4509
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4510
+
4511
+ r = run_query (hdb , 0 , "INSERT INTO `bar` "
4512
+ "( `foo`, `baz` ) VALUES ( 'D', 'E' )" );
4513
+ ok (r == ERROR_SUCCESS , "cannot add value to table\n" );
4514
+
4515
+ /* The rows of the table must be ordered by the column values of
4516
+ each row. For strings, the column value is the string id
4517
+ in the string table. */
4518
+
4519
+ query = "SELECT * FROM `bar`" ;
4520
+ r = MsiDatabaseOpenView (hdb , query , & hview );
4521
+ ok (r == ERROR_SUCCESS , "MsiDatabaseOpenView failed\n" );
4522
+ r = MsiViewExecute (hview , 0 );
4523
+ ok (r == ERROR_SUCCESS , "MsiViewExecute failed\n" );
4524
+
4525
+ r = MsiViewFetch (hview , & hrec );
4526
+ ok (r == ERROR_SUCCESS , "MsiViewFetch failed\n" );
4527
+ sz = sizeof (buffer );
4528
+ r = MsiRecordGetString (hrec , 1 , buffer , & sz );
4529
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4530
+ ok (!lstrcmp (buffer , "A" ), "Expected A, got %s\n" , buffer );
4531
+ sz = sizeof (buffer );
4532
+ r = MsiRecordGetString (hrec , 2 , buffer , & sz );
4533
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4534
+ ok (!lstrcmp (buffer , "B" ), "Expected B, got %s\n" , buffer );
4535
+ r = MsiCloseHandle (hrec );
4536
+ ok (r == ERROR_SUCCESS , "failed to close record\n" );
4537
+
4538
+ r = MsiViewFetch (hview , & hrec );
4539
+ ok (r == ERROR_SUCCESS , "MsiViewFetch failed\n" );
4540
+ sz = sizeof (buffer );
4541
+ r = MsiRecordGetString (hrec , 1 , buffer , & sz );
4542
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4543
+ ok (!lstrcmp (buffer , "C" ), "Expected E, got %s\n" , buffer );
4544
+ sz = sizeof (buffer );
4545
+ r = MsiRecordGetString (hrec , 2 , buffer , & sz );
4546
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4547
+ ok (!lstrcmp (buffer , "E" ), "Expected E, got %s\n" , buffer );
4548
+ r = MsiCloseHandle (hrec );
4549
+ ok (r == ERROR_SUCCESS , "failed to close record\n" );
4550
+
4551
+ r = MsiViewFetch (hview , & hrec );
4552
+ ok (r == ERROR_SUCCESS , "MsiViewFetch failed\n" );
4553
+ sz = sizeof (buffer );
4554
+ r = MsiRecordGetString (hrec , 1 , buffer , & sz );
4555
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4556
+ ok (!lstrcmp (buffer , "D" ), "Expected D, got %s\n" , buffer );
4557
+ sz = sizeof (buffer );
4558
+ r = MsiRecordGetString (hrec , 2 , buffer , & sz );
4559
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4560
+ ok (!lstrcmp (buffer , "E" ), "Expected E, got %s\n" , buffer );
4561
+ r = MsiCloseHandle (hrec );
4562
+ ok (r == ERROR_SUCCESS , "failed to close record\n" );
4563
+
4564
+ r = MsiViewFetch (hview , & hrec );
4565
+ ok (r == ERROR_SUCCESS , "MsiViewFetch failed\n" );
4566
+ sz = sizeof (buffer );
4567
+ r = MsiRecordGetString (hrec , 1 , buffer , & sz );
4568
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4569
+ ok (!lstrcmp (buffer , "F" ), "Expected F, got %s\n" , buffer );
4570
+ sz = sizeof (buffer );
4571
+ r = MsiRecordGetString (hrec , 2 , buffer , & sz );
4572
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
4573
+ ok (!lstrcmp (buffer , "A" ), "Expected A, got %s\n" , buffer );
4574
+ r = MsiCloseHandle (hrec );
4575
+ ok (r == ERROR_SUCCESS , "failed to close record\n" );
4576
+
4577
+ r = MsiViewClose (hview );
4578
+ ok (r == ERROR_SUCCESS , "MsiViewClose failed\n" );
4579
+ r = MsiCloseHandle (hview );
4580
+ ok (r == ERROR_SUCCESS , "MsiCloseHandle failed\n" );
4581
+
4582
+ r = MsiCloseHandle (hdb );
4583
+ ok (r == ERROR_SUCCESS , "MsiCloseHandle failed\n" );
4584
+
4585
+ DeleteFile (msifile );
4586
+ }
4587
+
4452
4588
static void test_select_markers (void )
4453
4589
{
4454
4590
MSIHANDLE hdb = 0 , rec , view , res ;
@@ -7109,6 +7245,51 @@ static void test_dbmerge(void)
7109
7245
r = run_query (href , 0 , query );
7110
7246
ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7111
7247
7248
+ query = "CREATE TABLE `One` ( "
7249
+ "`A` CHAR(72), "
7250
+ "`B` CHAR(56), "
7251
+ "`C` CHAR(64) LOCALIZABLE, "
7252
+ "`D` LONGCHAR, "
7253
+ "`E` CHAR(72) NOT NULL, "
7254
+ "`F` CHAR(56) NOT NULL, "
7255
+ "`G` CHAR(64) NOT NULL LOCALIZABLE, "
7256
+ "`H` LONGCHAR NOT NULL "
7257
+ "PRIMARY KEY `A` )" ;
7258
+ r = run_query (hdb , 0 , query );
7259
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7260
+
7261
+ query = "CREATE TABLE `One` ( "
7262
+ "`A` CHAR(64), "
7263
+ "`B` CHAR(64), "
7264
+ "`C` CHAR(64), "
7265
+ "`D` CHAR(64), "
7266
+ "`E` CHAR(64) NOT NULL, "
7267
+ "`F` CHAR(64) NOT NULL, "
7268
+ "`G` CHAR(64) NOT NULL, "
7269
+ "`H` CHAR(64) NOT NULL "
7270
+ "PRIMARY KEY `A` )" ;
7271
+ r = run_query (href , 0 , query );
7272
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7273
+
7274
+ /* column sting types don't match exactly */
7275
+ r = MsiDatabaseMergeA (hdb , href , "MergeErrors" );
7276
+ ok (r == ERROR_SUCCESS ,
7277
+ "Expected ERROR_SUCCESS, got %d\n" , r );
7278
+
7279
+ /* nothing in MergeErrors */
7280
+ query = "SELECT * FROM `MergeErrors`" ;
7281
+ r = do_query (hdb , query , & hrec );
7282
+ ok (r == ERROR_BAD_QUERY_SYNTAX ,
7283
+ "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n" , r );
7284
+
7285
+ query = "DROP TABLE `One`" ;
7286
+ r = run_query (hdb , 0 , query );
7287
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7288
+
7289
+ query = "DROP TABLE `One`" ;
7290
+ r = run_query (href , 0 , query );
7291
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7292
+
7112
7293
query = "CREATE TABLE `One` ( `A` INT, `B` INT PRIMARY KEY `A` )" ;
7113
7294
r = run_query (hdb , 0 , query );
7114
7295
ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
@@ -7553,6 +7734,70 @@ static void test_dbmerge(void)
7553
7734
ok (r == ERROR_BAD_QUERY_SYNTAX ,
7554
7735
"Expected ERROR_BAD_QUERY_SYNTAX, got %d\n" , r );
7555
7736
7737
+ query = "DROP TABLE `One`" ;
7738
+ r = run_query (hdb , 0 , query );
7739
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7740
+
7741
+ query = "DROP TABLE `One`" ;
7742
+ r = run_query (href , 0 , query );
7743
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7744
+
7745
+ query = "CREATE TABLE `One` ( `A` INT, `B` CHAR(72) PRIMARY KEY `A` )" ;
7746
+ r = run_query (hdb , 0 , query );
7747
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7748
+ r = run_query (href , 0 , query );
7749
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7750
+
7751
+ query = "INSERT INTO `One` ( `A`, `B` ) VALUES ( 1, 'foo' )" ;
7752
+ r = run_query (href , 0 , query );
7753
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7754
+
7755
+ query = "INSERT INTO `One` ( `A`, `B` ) VALUES ( 2, 'bar' )" ;
7756
+ r = run_query (href , 0 , query );
7757
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7758
+
7759
+ r = MsiDatabaseMergeA (hdb , href , "MergeErrors" );
7760
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7761
+
7762
+ query = "SELECT * FROM `One`" ;
7763
+ r = MsiDatabaseOpenViewA (hdb , query , & hview );
7764
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7765
+ r = MsiViewExecute (hview , 0 );
7766
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7767
+
7768
+ r = MsiViewFetch (hview , & hrec );
7769
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7770
+
7771
+ r = MsiRecordGetInteger (hrec , 1 );
7772
+ ok (r == 1 , "Expected 1, got %d\n" , r );
7773
+
7774
+ size = MAX_PATH ;
7775
+ r = MsiRecordGetStringA (hrec , 2 , buf , & size );
7776
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7777
+ ok (!lstrcmpA (buf , "foo" ), "Expected \"foo\", got \"%s\"\n" , buf );
7778
+
7779
+ MsiCloseHandle (hrec );
7780
+
7781
+ r = MsiViewFetch (hview , & hrec );
7782
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7783
+
7784
+ r = MsiRecordGetInteger (hrec , 1 );
7785
+ ok (r == 2 , "Expected 2, got %d\n" , r );
7786
+
7787
+ size = MAX_PATH ;
7788
+ r = MsiRecordGetStringA (hrec , 2 , buf , & size );
7789
+ ok (r == ERROR_SUCCESS , "Expected ERROR_SUCCESS, got %d\n" , r );
7790
+ ok (!lstrcmpA (buf , "bar" ), "Expected \"bar\", got \"%s\"\n" , buf );
7791
+
7792
+ MsiCloseHandle (hrec );
7793
+
7794
+ r = MsiViewFetch (hview , & hrec );
7795
+ ok (r == ERROR_NO_MORE_ITEMS ,
7796
+ "Expected ERROR_NO_MORE_ITEMS, got %d\n" , r );
7797
+
7798
+ MsiViewClose (hview );
7799
+ MsiCloseHandle (hview );
7800
+
7556
7801
MsiCloseHandle (hdb );
7557
7802
MsiCloseHandle (href );
7558
7803
DeleteFileA (msifile );
@@ -8218,6 +8463,7 @@ START_TEST(db)
8218
8463
test_update ();
8219
8464
test_special_tables ();
8220
8465
test_tables_order ();
8466
+ test_rows_order ();
8221
8467
test_select_markers ();
8222
8468
test_viewmodify_update ();
8223
8469
test_viewmodify_assign ();
0 commit comments