Hewlett-Packard Company ______TPC Benchmark™ •H Full Disclosure Report for HP Integrity Superdome using Microsoft SQL Server 2005 Enterprise Edition for -based Systems (SP1) and Windows Server 2003 Datacenter Edition 64-bit (SP1) ______

Second Edition November 2005

HP TPC-H FULL DISCLOSURE REPORT i © 2005 Hewlett-Packard Company. All rights reserved. Hewlett-Packard Company (HP), the Sponsor of this benchmark test, believes that the information in this document is accurate as of the publication date. The information in this document is subject to change without notice. The Sponsor assumes no responsibility for any errors that may appear in this document.

The pricing information in this document is believed to accurately reflect the current prices as of the publication date. However, the Sponsor provides no warranty of the pricing information in this document.

Benchmark results are highly dependent upon workload, specific application requirements, and system design and implementation. Relative system performance will vary as a result of these and other factors. Therefore, the TPC Benchmark H should not be used as a substitute for a specific customer application benchmark when critical capacity planning and/or product evaluation decisions are contemplated.

All performance data contained in this report was obtained in a rigorously controlled environment. Results obtained in other operating environments may vary significantly. No warranty of system performance or price/performance is expressed or implied in this report.

Copyright 2005 Hewlett-Packard Company.

All rights reserved. Permission is hereby granted to reproduce this document in whole or in part provided the copyright notice printed above is set forth in full text or on the title page of each item reproduced.

Printed in the United States, November, 2005

HP and HP StorageWorks are registered trademarks of Hewlett-Packard Company.

Microsoft, Windows 2003 and SQL Server 2005 are registered trademarks of Microsoft Corporation.

TPC Benchmark, TPC-H, QppH, QthH and QphH are registered certification marks of the Transaction Processing Performance Council.

All other brand or product names mentioned herein must be considered trademarks or registered trademarks of their respective owners.

HP TPC-H FULL DISCLOSURE REPORT ii © 2005 Hewlett-Packard Company. All rights reserved. Abstract

Overview

This report documents the methodology and results of the TPC Benchmark™ H test conducted on the HP Integrity Superdome using Microsoft SQL Server 2005 Enterprise Edition for Itanium-based systems SP1, in conformance with the requirements of the TPC Benchmark™ H Standard Specification, Revision 2.3.0. The operating system used for the benchmark was Microsoft Windows 2003 Datacenter Edition (64-bit) SP1.

The TPC Benchmark™ H was developed by the Transaction Processing Performance Council (TPC). The TPC was founded to define transaction processing benchmarks and to disseminate objective, verifiable performance data to the industry.

Requests for this TPC Benchmark H Full Disclosure Report should be sent to:

TPC Presidio of San Francisco Building 572B Ruger St. (surface) P.O. Box 29920 (mail) San Francisco, CA 94129-0920 Voice: 415-561-6272 Fax: 415-561-6120 Email: [email protected]

Standard and Executive Summary Statements

Pages iv - viii contain the Executive Summary and Numerical Quantities Summary of the benchmark results for the HP Integrity Superdome.

Auditor

The benchmark configuration, environment and methodology used to produce and validate the test results, and the pricing model used to calculate the cost per QppH and QthH were audited by Lorna Livingtree of Performance Metrics, Inc. to verify compliance with the relevant TPC specifications.

The auditor’s letter of attestation is attached in Section 9.1 “Auditors’ Report.”

HP TPC-H FULL DISCLOSURE REPORT iii © 2005 Hewlett-Packard Company. All rights reserved. TPC-H Rev. 2.3.0 HP Integrity Superdome Report Date November 07, 2005 Revision Date November 28, 2005 Total System Cost Composite Query per Hour Rating Price Performance 75.16 USD/ QphH 2,326,457 USD 30,956.6 QphH @ 3000GB @3000GB Database size Database Manager Operating System Other Software Availability Date Microsoft SQL Server Microsoft Windows MS Visual Basic 2005 Enterprise Server 2003, 3000 GB MS Visual C++ May 05 2006 Edition for Itanium- Datacenter Edition MS Resource Kit based systems SP1 (64-bit) SP1 258.5 3166.8 RF2 RF1 Q22 Query Times in seconds Q21 Q20 Power Run Q19 Q18 Throughput Run Q17 Q16 Geometric Mean of Power Test Q15 Arithmetic Mean of Throughput Test Q14 Q13 Q12 Q11 Q10 Q9 Q8 Q7 Q6 Q5 Q4 Q3 Q2 Q1 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000

Database Load Time = 41h33min14sec Load included backup: Y Total Data Storage / Database Size = 6.70 RAID(Base Tables): Y RAID(Base Tables and Auxiliary Data Structure): Y RAID(All)= Y System configuration Processors 32 Itanium 2 1.6GHz with 9MB L3 Cache Memory 256 GB Main Memory 49 SmartArray 6402 Disk Controllers 1 U320 Dual SCSI Controller Disk Drives 7 36 GB SCSI (local) 8 146GB SCSI (Log) 672 36GB SCSI (DB) Total Disk Storage 20,086GB

HP TPC-H FULL DISCLOSURE REPORT iv © 2005 Hewlett-Packard Company. All rights reserved. TPC-H Rev. 2.3.0 TPC Pricing 1.0.1 HP Integrity Superdome Report Date: November 07, 2005 Revision Date: November 28, 2005 Availability Date: May 5, 2006 3 Yr Price Part Unit Extended Description Qty. Maint Key Number Price Price Price HP Superdome 32-way cabinet 1 A5201A, Opt. 429 $236,716 1 $236,716 Superdome 32 way add-on cabinet 1 A5202A, Opt. 006 $251,200 1 $251,200 IPF Superdome Cell Board (sx1000) 1 A6866A $19,200 16 $307,200 HP 12 Slot PCI-X Chassis for sx1000 1 A6864A $16,805 8 $134,440 3 Year Svc & Support Price (Hardware and Software) 1 1 $535,718 HP Superdome Itanium2 1.6 GHz 9M 2 CPU 1 AD003A $41,800 16 $668,800 Superdome 128GB Memory Pack 1 AB547A $282,880 2 $565,760 I/O chassis enclosure for PCI chassis 1 A5862A $25,725 4 $102,900 Graphite I/O expansion power subsystem 1 A5861D $34,860 2 $69,720 12 Slot PCI-X Chassis for rack system E 1 A6864AZ $16,805 8 $134,440 HP ProCurve Switch2124 1 J4868A $279 1 $279 $212 Core I/O card 1 A6865A $1,045 1 $1,045 HP Superdome Rack System Mgmt. Station 1 A9802B $6,500 1 $6,500 1U RackMT Display/Keyboard/Mouse 1 AB243AZ $3,046 1 $3,046 1000Base-T Gigabit Eth Adp 1 A7061A $270 2 $540 FC-HBA 2GB, 1 Channel 1 AB467A $1,520 2 $3,040 HP Smart Array Controller 6402 (incl. boot) 1 A9890A $1,669 49 $81,781 HP Dual Channel U320 SCSI Adapter 1 A7173 $795 1 $795 36GB, 15krpm Ultra3 Wide disk 1 286776-B22 $299 679 $203,021 36GB, 15krpm Ultra3 Wide disk 10% spares 1 286776-B22 $299 68 $20,332 Storageworks MSA30 SB (incl. boot) 1 302969-B21 $2,829 49 $138,621 Storageworks MSA30 10% spares 1 302969-B21 $2,829 5 $14,145 SW 4000 39FT Cable All 1 150214-B21 $114 49 $5,586 HP Rack System / E, 41U 1 A4902D $1,910 6 $11,460 Rear Door for 41U rack 1 A5213DZ $334 6 $2,004 4 Bay Rack Support 1 HA1103A Opt 6EC $1,558 1 $1,558 PDCA Redundant Power Source 1 A5800A $578 2 $1,156 HP Power Distribution Unit 200-240V / Opt. AW4 1 A5137AZ $239 21 $5,019 Modular Storage Array 1000 1 201723-B22 $6,995 1 $6,995 MSA1000 controller 1 218231-B22 $4,290 1 $4,290 MSA1000 Fibre Channel I/O Module 1 218960-B21 $375 1 $375 Storage MAS1000 Support 3yrs 24x7 4hr incl disks 1 HA110A3 #6FG $3,222 1 $3,222 146GB, 10krpm U320 disk 1 286716-B22 $499 8 $3,992 5M LC to LC Cable Kit 1 221692-B22 $82 4 $328 SCSI Cable 10m VHDTS68 / HDTS68 Multimd 1 C2363B $335 1 $335 SCSI Terminator LVD/SE HDTS68 Multimd 1 C2364A $100 1 $100 HP C13/C14 Jumper Cord 2.5M 1 E7742A $25 1 $25 5300 Tape Array 1 C7508AZ $1,045 1 $1,045 DVD Rom drive 1 Q1592A $649 1 $649 Server Subtotal $2,987,680 $540,710

HP TPC-H FULL DISCLOSURE REPORT v © 2005 Hewlett-Packard Company. All rights reserved. TPC-H Rev. 2.3.0 TPC Pricing 1.0.1 HP Integrity Superdome Report Date: November 07 2005 Revision Date: November 28, 2005 Availability Date: May 5 2006 3 Yr Price Part Unit Extended Description Qty. Maint Key Number Price Price Price Microsoft Windows Server 2003 DC Edition 64-bit Service Pack 1 1 T2372A opt032 $64,000 1 $64,000 Microsoft SQL Server 2005 Enterprise Edition 64-bit 2 810-04794 $8,487 1 $8,487 $245 Microsoft SQL Server Client License 2 359-01911 $156 45 $7,020 Microsoft Visual C++ Standard 2 254-00170 $109 1 $109 Microsoft Visual Basic 2 046-00856 $109 1 $109 Server Software Subtotal $79,725 $245 Total Extended Price $3,608,360 HP's Large Configuration Discount * *Total Discounts: $1,281,904 * All discounts are based on US list prices and for similar quantities and configurations. An approximate 35.68 % 3 year cost of ownership: $2,326,457 discount was based on the overall specific components and support pricing from vendor 1 in this single QphH 30,956.6 quotation. Discounts for similarly sized configurations will be similar to those quoted here, but may vary based on the components in the configuration.

Price Key: 1-HP, 2-Microsoft Audited by Lorna Livingtree of Performance Metrics Inc. $/QphH: $75.16

Prices used in TPC benchmarks reflect the actual prices a customer would pay for a one-time purchase of the stated components. Individually negotiated discounts are not permitted. Special prices based on assumptions about past or future purchases are not permitted. All discounts reflect standard pricing policies for the listed components. For complete details, see the pricing sections of the TPC benchmark specifications. If you find that stated prices are not available according to these terms, please inform the TPC at [email protected]. Thank you.

Sales contact Vendor 1: HP Sales Development, 19111 Pruneridge Ave., Cupertino, CA 95014 (408) 447 2320 Sales contact Vendor 2: Jamie Reding (425) 703-0510 [email protected]

HP TPC-H FULL DISCLOSURE REPORT vi © 2005 Hewlett-Packard Company. All rights reserved. TPC-H Rev. 2.3.0 Report Date: November 07, 2005 HP Integrity Superdome Revision Date: November 28, 2005 Availability Date: May 5, 2006

Numerical Quantities

Measurement Results

Database Scale Factor 3000GB Total Data Storage / Database Size 6.70 Start of Database Load 10-20-05 21:16:54 End of Database Load 10-22-05 14:50:08 Database Load Time 41h 33min 14sec Query Streams for Throughput Test 8 TPC-H Power 41,779.5 TPC-H Throughput 22,937.4 TPC-H Composite Query-per-Hour (QphH@3000GB) 30,956.6 Total System Price over 3 Years 2,326,457 USD TPC-H Price/Performance Metric (USD/QphH@3000GB) 75.16 USD / QphH@3000GB

Measurement Interval

Measurement Interval in Throughput Test (Ts) = seconds 82869 seconds

Duration of Stream Execution

Query Start Date/Time RF1 Start Date/Time RF2 Start Date/Time Seed Duration Query End Date/Time RF1 End Date/Time RF2 End Date/Time 10/22/05 20:58:16 10/22/05 20:46:39 10/22/05 23:42:26 Stream 00 1021145008 3:03:21 10/22/05 23:42:25 10/22/05 20:58:15 10/22/05 23:50:00 10/22/05 23:50:02 10/23/05 19:41:23 10/23/05 19:51:57 Stream 01 1021145009 20:10:51 10/23/05 19:16:20 10/23/05 19:51:56 10/23/05 20:00:53 10/22/05 23:50:03 10/23/05 20:00:56 10/23/05 20:14:25 Stream 02 1021145010 20:34:07 10/23/05 19:30:12 10/23/05 20:14:24 10/23/05 20:24:10 10/22/05 23:50:03 10/23/05 20:24:14 10/23/05 20:39:30 Stream 03 1021145011 20:58:35 10/23/05 18:20:19 10/23/05 20:39:29 10/23/05 20:48:38 10/22/05 23:50:04 10/23/05 20:48:43 10/23/05 21:03:49 Stream 04 1021145012 21:22:59 10/23/05 19:41:20 10/23/05 21:03:47 10/23/05 21:13:02 10/22/05 23:50:05 10/23/05 21:13:09 10/23/05 21:28:21 Stream 05 1021145013 21:47:54 10/23/05 18:16:04 10/23/05 21:28:18 10/23/05 21:37:59 10/22/05 23:50:05 10/23/05 21:38:06 10/23/05 21:53:44 Stream 06 1021145014 22:13:08 10/23/05 19:10:35 10/23/05 21:53:41 10/23/05 22:03:13 10/22/05 23:50:06 10/23/05 22:03:22 10/23/05 22:18:30 Stream 07 1021145015 22:37:26 10/23/05 19:37:04 10/23/05 22:18:27 10/23/05 22:27:32 10/22/05 23:50:07 10/23/05 22:27:42 10/23/05 22:41:30 Stream 08 1021145016 23:01:04 10/23/05 19:37:49 10/23/05 22:41:26 10/23/05 22:51:11

HP TPC-H FULL DISCLOSURE REPORT vii © 2005 Hewlett-Packard Company. All rights reserved. TPC-H Rev. 2.3.0 Report Date: November 07, 2005 HP Integrity Superdome Revision Date: November 28, 2005 Availability Date: May 5, 2006

TPC-H Timing Intervals (in seconds):

Query Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Stream 0 1205.3 47.9 81.1 126.2 248.3 75.8 278.4 224.8 Stream 1 7034.3 840.9 1070.4 4960.8 3192.7 143.2 3187.1 1482.3 Stream 2 5921.4 2620.6 1845.4 2684.9 2646.0 572.6 3648.8 2956.6 Stream 3 5903.0 1766.0 2214.5 812.4 5739.2 287.0 3335.3 939.4 Stream 4 6277.7 1442.7 73.3 3706.7 883.9 324.2 4743.7 1082.8 Stream 5 4608.8 3009.0 1315.1 1890.9 1802.5 543.7 2676.9 2391.5 Stream 6 7041.0 1120.0 5243.0 1228.5 2347.3 350.9 2721.6 2751.1 Stream 7 3750.7 986.9 648.2 3650.5 4598.0 459.5 2682.6 2476.5 Stream 8 10781.8 592.7 3539.5 3145.5 3465.2 567.9 1972.2 3544.7 Min Qi 3750.7 592.7 73.3 812.4 883.9 143.2 1972.2 939.4 Max Qi 10781.8 3009.0 5243.0 4960.8 5739.2 572.6 4743.7 3544.7 Avg Qi 6414.8 1547.4 1993.7 2760.0 3084.3 406.1 3121.0 2203.1 Query Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Stream 0 1503.7 125.6 164.5 276.1 483.4 96.8 76.0 463.3 Stream 1 7561.0 4926.6 2010.2 1985.5 2981.7 1594.7 1883.9 2854.9 Stream 2 6969.6 3173.0 2088.1 2433.8 4629.4 5060.2 1705.3 1761.3 Stream 3 4836.7 3253.6 866.4 3331.3 2127.5 2456.8 3331.7 2036.7 Stream 4 15114.1 1857.4 2096.1 4177.5 2611.5 1890.2 1005.3 1979.4 Stream 5 13429.7 2915.9 1920.5 1704.0 2237.0 2608.2 764.3 2162.1 Stream 6 13046.2 1417.2 2535.6 1604.2 4088.8 1920.1 536.8 3880.2 Stream 7 11200.8 2292.7 2692.7 4602.5 3247.7 1419.4 2053.9 2961.8 Stream 8 7360.2 1339.5 304.1 1786.5 5618.1 2488.2 1279.9 3002.3 Min Qi 4836.7 1339.5 304.1 1604.2 2127.5 1419.4 536.8 1761.3 Max Qi 15114.1 4926.6 2692.7 4602.5 5618.1 5060.2 3331.7 3880.2 Avg Qi 9939.8 2647.0 1814.2 2703.1 3442.7 2429.7 1570.1 2344.6 Query Q17 Q18 Q19 Q20 Q21 Q22 RF1 RF2 Stream 0 108.9 1910.8 236.1 98.9 1712.1 305.2 695.8 454.3 Stream 1 3268.6 6016.4 1944.4 1965.3 6107.2 2966.2 632.3 536.2 Stream 2 1251.1 6221.9 1741.7 1888.2 7397.1 1592.6 807.7 584.4 Stream 3 2112.1 7566.7 3473.4 723.4 8246.8 1255.8 914.3 547.6 Stream 4 665.8 6534.6 2573.5 112.5 11792.7 531.0 903.9 553.2 Stream 5 1410.2 7424.2 2669.2 482.9 6432.4 1960.7 908.9 577.9 Stream 6 1065.0 4820.2 1336.1 1660.6 6396.3 2519.3 934.3 569.9 Stream 7 1666.9 5581.1 1193.4 1588.5 8005.6 3458.4 905.2 542.0 Stream 8 1120.3 6163.9 1817.2 1038.9 7550.8 2782.6 823.9 581.2 Min Qi 665.8 4820.2 1193.4 112.5 6107.2 531.0 632.3 536.2 Max Qi 3268.6 7566.7 3473.4 1965.3 11792.7 3458.4 934.3 584.4 Avg Qi 2200.5 6291.1 2093.6 1182.5 7741.1 2133.3 853.8 561.6

HP TPC-H FULL DISCLOSURE REPORT viii © 2005 Hewlett-Packard Company. All rights reserved. Abstract...... iii Overview...... iii Standard and Executive Summary Statements...... iii Auditor ...... iii 1.0 General Items ...... 11 1.1 Test Sponsor ...... 11 1.2 Parameter Settings...... 11 1.3 Configuration Items ...... 11 2.0 Clause 1: Logical Database Design ...... 13 2.1 Table Definitions...... 13 2.2 Physical Organization of Database ...... 13 2.3 Horizontal Partitioning...... 13 2.4 Replication...... 13 3.0 Clause 2: Queries and Refresh Functions - Related Items...... 14 3.1 Query Language ...... 14 3.2 Random Number Generation...... 14 3.3 Substitution Parameters Generation...... 14 3.4 Query Text and Output Data from Database...... 14 3.5 Query Substitution Parameters and Seeds Used...... 14 3.6 Isolation Level...... 14 3.7 Refresh Functions...... 14 4.0 Clause 3: Database System Properties ...... 15 4.1 Atomicity Requirements...... 15 4.1.1 Atomicity of the Completed Transactions...... 15 4.1.2 Atomicity of Aborted Transactions...... 15 4.2 Consistency Requirements...... 15 4.3 Isolation Requirements ...... 16 4.4 Durability Requirements...... 18 5.0 Clause 4: Scaling and Database Population...... 19 5.1 Initial Cardinality of Tables...... 19 5.2 Distribution of Tables and Logs Across Media...... 19 5.3 Mapping of Database Partitions/Replications ...... 25 5.4 Implementation of RAID...... 25 5.5 DBGEN Modifications ...... 25 5.6 Database Load time...... 25 5.7 Data Storage Ratio ...... 25 5.8 Database Load Mechanism Details and Illustration...... 26 6.0 Clause 5: Performance Metrics and Execution Rules Related Items ...... 27 6.1 Steps after the Load Test ...... 27 6.2 Steps in the Power Test...... 27 6.3 Timing Intervals for Each Query and Refresh Function...... 27 6.4 Number of Streams for The Throughput Test ...... 27 6.5 Start and End Date/Times for Each Query Stream ...... 27 6.6 Total Elapsed Time for the Measurement Interval...... 27 6.7 Refresh Function Start Date/Time and Finish Date/Time ...... 27 6.8 Timing Intervals for Each Query and Each Refresh Function for Each Stream ...... 28 6.9 Performance Metrics ...... 28 6.10 The Performance Metric and Numerical Quantities from Both Runs ...... 28 6.11 System Activity Between Tests...... 28 HP TPC-H FULL DISCLOSURE REPORT ix © 2005 Hewlett-Packard Company. All rights reserved. 7.0 Clause 6: SUT and Driver Implementation Related Items ...... 29 7.1 Driver ...... 29 7.2 Implementation Specific Layer (ISL) ...... 29 7.3 Profile-Directed Optimization ...... 30 8. Clause 7: Pricing Related Items...... 31 8.1 Hardware and Software Used ...... 31 8.2 Three-Year Cost of System Configuration ...... 31 8.3 Availability Dates...... 31 9. Clause 8: Audit Related Items ...... 32 9.1 Auditors’ Report...... 32 Appendix A: Tunable Parameters...... 35 Appendix B: Database Build Scripts...... 137 Appendix C: Query Text and Output...... 142 Appendix D: Seeds and Query Substitution Parameters...... 149 Appendix E: Refresh Function Source Code...... 152 Appendix F: Implementation Specific Layer and Source Code ...... 156 Appendix G: DBGen Modifications...... 570 Appendix H: Price Quotations ...... 585

HP TPC-H FULL DISCLOSURE REPORT 10 © 2005 Hewlett-Packard Company. All rights reserved. 1.0 General Items

1.1 Test Sponsor

A statement identifying the benchmark sponsor(s) and other participating companies must be provided.

This benchmark was sponsored by Hewlett-Packard Company. The benchmark was developed and engineered by Hewlett-Packard Company. Testing took place at Microsoft facilities in Redmond, Washington.

1.2 Parameter Settings

Settings must be provided for all customer-tunable parameters and options which have been changed from the defaults found in actual products, including by not limited to:

· Database Tuning Options · Optimizer/Query execution options · Query processing tool/language configuration parameters · Recovery/commit options · Consistency/locking options · Operating system and configuration parameters · Configuration parameters and options for any other software component incorporated into the pricing structure · Compiler optimization options

This requirement can be satisfied by providing a full list of all parameters and options, as long as all those which have been modified from their default values have been clearly identified and these parameters and options are only set once.

Appendix A, “Tunable Parameters,” contains a list of all database parameters and operating system parameters.

1.3 Configuration Items

Diagrams of both measured and priced configurations must be provided, accompanied by a description of the differences. This includes, but is not limited to:

· Number and type of processors · Size of allocated memory, and any specific mapping/partitioning of memory unique to the test. · Number and type of disk units (and controllers, if applicable). · Number of channels or bus connections to disk units, including their protocol type. · Number of LAN (e.g. Ethernet) Connections, including routers, workstations, terminals, etc., that were physically used in the test or are incorporated into the pricing structure. · Type and the run-time execution location of software components (e.g., DBMS, query processing tools /languages, middle-ware components, software drivers, etc.).

HP TPC-H FULL DISCLOSURE REPORT 11 © 2005 Hewlett-Packard Company. All rights reserved. The server System Under Test (SUT), an HP Integrity Superdome, depicted in Figure 1.1, consisted of :

32 Intel Itanium 2 1.6GHz with 9MB L3 Cache 256 GB of memory 49 6402 Smart Array Controllers 49 HP StorageWorks MSA 30 Enclosures 679 72.8GB Pluggable Ultra320 15K rpm 1” height drives 1 AB467A 2Gb Fibre Channel Controller 1 HP StorageWorks MSA 1000 Dual Controller Enclosure 8 146GB Pluggable 10K rpm drives

49 x SmartArray 6402 49 x MSA30 679 x 36GB 15K rpm Disks

HP Integrity Superdome

1 x AB232A 1 x MSA1000 ` 8 x 146GB 10K rpm Disks

Figure 1.1 Benchmark and priced configuration for HP Integrity Superdome

HP TPC-H FULL DISCLOSURE REPORT 12 © 2005 Hewlett-Packard Company. All rights reserved. 2.0 Clause 1: Logical Database Design

2.1 Table Definitions Listings must be provided for all table definition statements and all other statements used to set up the test and qualification databases. (8.1.2.1)

Appendix B, “Database Build Scripts,” contains the table definitions and the program used to load the database.

2.2 Physical Organization of Database The physical organization of tables and indices, within the test and qualification databases, must be disclosed. If the column ordering of any table is different from that specified in Clause 1.4, it must be noted.

Appendix B, “Database Build Scripts,” contains the DDL for the index definitions.

2.3 Horizontal Partitioning Horizontal partitioning of tables and rows in the test and qualification databases (see Clause 1.5.4) must be disclosed.

Horizontal partitioning was not used

2.4 Replication Any replication of physical objects must be disclosed and must conform to the requirements of Clause 1.5.6.

No replication was used.

HP TPC-H FULL DISCLOSURE REPORT 13 © 2005 Hewlett-Packard Company. All rights reserved. 3.0 Clause 2: Queries and Refresh Functions - Related Items

3.1 Query Language The query language used to implement the queries must be identified.

T-SQL was the query language used.

3.2 Random Number Generation The method of verification for the random number generation must be described unless the supplied DBGEN and QGEN were used.

DBGEN version 2.1.1b with modifications (see Appendix G) and QGEN version 1.3 were used to generate all database populations.

3.3 Substitution Parameters Generation The method used to generate values for substitution parameters must be disclosed. If QGEN is not used for this purpose, then the source code of any non-commercial tool used must be disclosed. If QGEN is used, the version number, release number, modification number and patch level of QGEN must be disclosed.

The TPC source based QGEN version 1.3.0 was used to generate the substitution parameters

3.4 Query Text and Output Data from Database The executable query text used for query validation must be disclosed along with the corresponding output data generated during the execution of the query text against the qualification database. If minor modifications (see Clause 2.2.3) have been applied to any functional query definitions or approved variants in order to obtain executable query text, these modifications must be disclosed and justified. The justification for a particular minor query modification can apply collectively to all queries for which it has been used. The output data for the power and throughput tests must be made available electronically upon request..

Appendix C contains the query text and query output. The following modifications were used: o In Q1 the function "count_big" is used in place of "count" o The “dateadd” function is used to perform date arithmetic in Q1, Q4, Q5, Q6, Q10, Q12, Q14 , Q15 and Q20. o The “datepart” function is used to extract part of a date (“YY”) in Q7, Q8 and Q9. o The “top” function is used to restrict the number of output rows in Q2, Q3, Q10, Q18 and Q21.

3.5 Query Substitution Parameters and Seeds Used All the query substitution parameters used during the performance test must be disclosed in tabular format, along with the seeds used to generate these parameters.

Appendix D contains the seed and query substitution parameters used.

3.6 Isolation Level The isolation level used to run the queries must be disclosed. If the isolation level does not map closely to one of the isolation levels defined in Clause 3.4, additional descriptive detail must be provided.

The queries and transactions were run with isolation P2, Read Committed.

3.7 Refresh Functions The details of how the refresh functions were implemented must be disclosed

Appendix E contains the source code for the refresh functions.

HP TPC-H FULL DISCLOSURE REPORT 14 © 2005 Hewlett-Packard Company. All rights reserved. 4.0 Clause 3: Database System Properties

4.1 Atomicity Requirements The results of the ACID tests must be disclosed along with a description of how the ACID requirements were met. This includes disclosing the code written to implement the ACID Transaction and Query.

All ACID tests were conducted according to specification. The Atomicity, Isolation, Consistency and Durability tests were performed on the HP Integrity Superdome.

4.1.1 Atomicity of the Completed Transactions Perform the ACID Transaction for a randomly selected set of input data and verify that the appropriate rows have been changed in the ORDER, LINEITEM, and HISTORY tables.

The following steps were performed to verify the Atomicity of completed transactions: 1. The total price from the ORDER table and the extended price from the LINEITEM table were retrieved for a randomly selected order key. 2. The ACID Transaction was performed using the order key from step 1. 3. The ACID Transaction committed. 4. The total price from the ORDER table and the extended price from the LINEITEM table were retrieved for the same order key. It was verified that the appropriate rows had been changed.

4.1.2 Atomicity of Aborted Transactions Perform the ACID transaction for a randomly selected set of input data, submitting a ROLLBACK of the transaction for the COMMIT of the transaction. Verify that the appropriate rows have not been changed in the ORDER, LINEITEM, and HISTORY tables.

The following steps were performed to verify the Atomicity of the aborted ACID transaction: 1. The total price from the ORDER table and the extended price from the LINEITEM table were retrieved for a randomly selected order key. 2. The ACID Transaction was performed using the order key from step 1. The transaction was stopped prior to the commit. 3. The ACID Transaction was ROLLED BACK. . 4. The total price from the ORDER table and the extended price from the LINEITEM table were retrieved for the same order key used in steps 1 and 2. It was verified that the appropriate rows had not been changed.

4.2 Consistency Requirements Consistency is the property of the application that requires any execution of transactions to take the database from one consistent state to another. A consistent state for the TPC-H database is defined to exist when:

O_TOTALPRICE = SUM(trunc(trunc((L_EXTENDEDPRICE – L_DISCOUNT) * (1 + L_TAX)))

for each ORDER and LINEITEM defined by (O_ORDERKEY = L_ORDERKEY)

4.2.1 Consistency Tests Verify that ORDER and LINEITEM tables are initially consistent as defined in Clause 3.3.2.1, based upon a random sample of at least 10 distinct values of O_ORDERKEY. The following steps were performed to verify consistency: 1. The consistency of the ORDER and LINEITEM tables was verified based on a sample of O_ORDERKEYs. 2. One hundred ACID Transactions were submitted from each of six execution streams. 3. The consistency of the ORDER and LINEITEM tables was re-verified.

HP TPC-H FULL DISCLOSURE REPORT 15 © 2005 Hewlett-Packard Company. All rights reserved. 4.3 Isolation Requirements Operations of concurrent transactions must yield results which are indistinguishable from the results which would be obtained by forcing each transaction to be serially executed to completion in some order.

4.3.1 Isolation Test 1 - Read-Write Conflict with Commit Demonstrate isolation for the read-write conflict of a read-write transaction and a read-only transaction when the read-write transaction is committed)

The following steps were performed to satisfy the test of isolation for a read-only and a read-write committed transaction: 1. An ACID Transaction was started for a randomly selected O_KEY, L_KEY and DELTA. The ACID Transaction was suspended prior to Commit. 2. An ACID query was started for the same O_KEY used in step 1. The ACID query blocked and did not see any uncommitted changes made by the ACID Transaction. 3. The ACID Transaction was resumed and committed. The ACID query completed. It returned the data as committed by the ACID Transaction.

4.3.2 Isolation Test 2 - Read-Write Conflict with Rollback Demonstrate isolation for the read-write conflict of a read-write transaction and a read-only transaction when the read-write transaction is rolled back.

The following steps were performed to satisfy the test of isolation for read-only and a rolled back read-write transaction: 1. An ACID transaction was started for a randomly selected O_KEY, L_KEY and DELTA. The ACID Transaction was suspended prior to Rollback. 2. An ACID query was started for the same O_KEY used in step 1. The ACID query did not see any uncommitted changes made by the ACID Transaction. 3. The ACID Transaction was ROLLED BACK. 4. The ACID query completed.

4.3.3 Isolation Test 3 - Write-Write Conflict with Commit Demonstrate isolation for the write-write conflict of two update transactions when the first transaction is committed.

The following steps were performed to verify isolation of two update transactions:

1. An ACID Transaction T1 was started for a randomly selected O_KEY, L_KEY and DELTA. The ACID transaction T1 was suspended prior to Commit. 2. Another ACID Transaction T2 was started using the same O_KEY and L_KEY and a randomly selected DELTA. 3. T2 waited. 4. The ACID transaction T1 was allowed to Commit and T2 completed. 5. It was verified that: T2.L_EXTENDEDPRICE = T1.L_EXTENDEDPRICE +(DELTA1*(T1.L_EXTENDEDPRICE/T1.L_QUANTITY))

4.3.4 Isolation Test 4 - Write-Write Conflict with Rollback Demonstrate isolation for the write-write conflict of two update transactions when the first transaction is rolled back.

The following steps were performed to verify the isolation of two update transactions after the first one is rolled back:

1. An ACID Transaction T1 was started for a randomly selected O_KEY, L_KEY and DELTA. The ACID Transaction T1 was suspended prior to Rollback. 2. Another ACID Transaction T2 was started using the same O_KEY and L_KEY used in step 1 and a randomly selected DELTA. 3. T2 waited. 4. T1 was allowed to ROLLBACK and T2 completed.

HP TPC-H FULL DISCLOSURE REPORT 16 © 2005 Hewlett-Packard Company. All rights reserved. 5. It was verified that T2.L_EXTENDEDPRICE = T1.L_EXTENDEDPRICE.

4.3.5 Isolation Test 5 – Concurrent Read and Write Transactions on Different Tables Demonstrate the ability of read and write transactions affecting different database tables to make progress concurrently.

The following steps were performed:

1. An ACID Transaction T1 for a randomly selected O_KEY, L_KEY and DELTA. The ACID Transaction T1 was suspended prior to Commit. 2. Another ACID Transaction T2 was started using random values for PS_PARTKEY and PS_SUPPKEY. 3. T2 completed. 4. T1 completed and the appropriate rows in the ORDER, LINEITEM and HISTORY tables were changed.

4.3.6 Isolation Test 6 – Update Transactions During Continuous Read-Only Query Stream Demonstrate the continuous submission of arbitrary (read-only) queries against one or more tables of the database does not indefinitely delay update transactions affecting those tables from making progress.

The following steps were performed:

1. An ACID Transaction T1 was started, executing Q1 against the qualification database. The substitution parameter was chosen from the interval [0..2159] so that the query ran for a sufficient amount of time. 2. Before T1 completed, an ACID Transaction T2 was started using randomly selected values of O_KEY, L_KEY and DELTA. 3. T2 completed before T1 completed. 4. It was verified that the appropriate rows in the ORDER, LINEITEM and HISTORY tables were changed.

HP TPC-H FULL DISCLOSURE REPORT 17 © 2005 Hewlett-Packard Company. All rights reserved. 4.4 Durability Requirements The tested system must guarantee durability: the ability to preserve the effects of committed transactions and insure database consistency after recovery from any one of the failures listed in Clause 3.5.2.

4.4.1 Permanent Unrecoverable Failure of Any Durable Medium and Loss of System Power Guarantee the database and committed updates are preserved across a permanent irrecoverable failure of any single durable medium containing TPC-H database tables or recovery log tables

The test database log was stored on a RAID-10 array of 8 physical drives. The tables for the test database were stored on 96 logical volumes on RAID-5 arrays across 7 physical drives. A backup of the test database was taken. The backup was spread across 24 logical volumes spriped across 96 RAID-5 arrays, each array across 7 physical disks.

The tests were conducted on the qualification database. The qualification database was loaded in the same fashion as the test database but used fewer disks. The steps performed are shown below:

1. The complete database was backed up. 2. Eight streams of ACID transactions were started. Each stream executed a minimum of 100 transactions. 3. While the test was running, one of the disks from the database RAID-10 log was removed. 4. After it was determined that the test would still run with the loss of a log disk, one physical drive of a RAID-5 data volume was removed. 5. It was determined that the test kept on running. 6. The eight streams of ACID transactions finished successfully, i.e. the durability requirement of preservation of the database after loss of a single durable medium was fulfilled.

4.4.2 System Crash Guarantee the database and committed updates are preserved across an instantaneous interruption (system crash/system hang) in processing which requires the system to reboot to recover.

1. Eight streams of ACID transactions were started. Each stream executed a minimum of 100 transactions. 2. While the streams of ACID transactions were running a system hardware reset was issued. 3. The system rebooted and the database was restarted. 4. The database went through a recovery period. 5. The success file and the HISTORY table counts were compared and were found to match.

4.4.3 Memory Failure Guarantee the database and committed updates are preserved across failure of all or part of memory (loss of contents).

See section 4.4.2

HP TPC-H FULL DISCLOSURE REPORT 18 © 2005 Hewlett-Packard Company. All rights reserved. 5.0 Clause 4: Scaling and Database Population

5.1 Initial Cardinality of Tables The cardinality (i.e., the number of rows) of each table of the test database, as it existed at the completion of the database load (see clause 4.2.5) must be disclosed.

Table 5.1 lists the TPC-H Benchmark defined tables and the row count for each table as they existed upon completion of the build.

TABLE # of Rows Lineitem 18,000,048,306 Orders 4,500,000,000 Partsupp 2,400,000,000 Part 600,000,000 Customer 450,000,000 Supplier 30,000,000 Nation 25 Region 5 Table 5.1 Initial Number of Rows

5.2 Distribution of Tables and Logs Across Media The distribution of tables and logs across all media must be explicitly described for the tested and priced systems.

Microsoft SQL Server was configured on an HP Integrity Superdome with the following configuration:

· 49 Smart Array 6402 Disk RAID Controllers · 1 AB467A 2Gb Fibre Channel Controller · 1 A7173A Dual Channel SCSI Controller · 49 HP StorageWorks MSA 30 enclosures · 1 HP StorageWorks MSA1000 enclosure · 679 36GB 15k rpm external disk drives · 8 146GB 10k rpm external disk drives

680 disks were used to hold table data, indexes, database log and the temporary database (TempDB).

The raw partitions for the database and the NTFS partition for the backup and flat files were mounted to a folder on the G: drive

G:\mnt\li G:\mnt\gen G:\mnt\temp G:\mnt\ntfs

A description of distribution of database filegroups and log can be found in the Table below.

HP TPC-H FULL DISCLOSURE REPORT 19 © 2005 Hewlett-Packard Company. All rights reserved. SmartArray # of Array Fault Size in Partition Content 6402 Disks Tolerance GB Format

0-0-1-5 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI Cabinet 0 Bay 0 Chassis 1 Slot 5 RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-0-1-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-0-1-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-0-3-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-0-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-0-3-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-1-3-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-1-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-1-3-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-1-1-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

HP TPC-H FULL DISCLOSURE REPORT 20 © 2005 Hewlett-Packard Company. All rights reserved. SmartArray # of Array Fault Size in GB Partition Format Content 6402 Disks Tolerance

0-1-1-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-1-1-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-0-1-5 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI Cabinet 1 Bay 0 Chassis 1 Slot 5 RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-0-1-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-0-1-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-0-3-5 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-0-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-0-3-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-1-1-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-1-1-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

HP TPC-H FULL DISCLOSURE REPORT 21 © 2005 Hewlett-Packard Company. All rights reserved. SmartArray # of Array Fault Partition Size in GB Content 6402 Disks Tolerance Format

1-1-1-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-1-3-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-1-3-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

1-1-3-7 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-0-1-4 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI Cabinet 0 Bay 0 Chassis 1 Slot 5 RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-0-1-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-0-1-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-0-3-4 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-0-3-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-0-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

HP TPC-H FULL DISCLOSURE REPORT 22 © 2005 Hewlett-Packard Company. All rights reserved. SmartArray # of Array Fault Partition Size in GB Content 6402 Disks Tolerance Format

8-1-1-4 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-1-1-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-1-1-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-1-3-4 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-1-3-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-1-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-2-1-4 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-2-1-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-2-1-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-2-3-4 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

HP TPC-H FULL DISCLOSURE REPORT 23 © 2005 Hewlett-Packard Company. All rights reserved. SmartArray # of Array Fault Partition Size in GB Content 6402 Disks Tolerance Format

8-2-3-5 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-2-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-3-1-4 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-3-1-5 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-1-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-3-3-4 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-3-3-5 Channel A/ B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

8-3-3-6 Channel A/B 7 RAID 5 110 RAW Tpch3000g LI RAW Tpch3000g GEN RAW Tpch3000g TempDB RAID 5 98 NTFS Flatfiles, Backup

0-1-3-1 Channel A/B 3 RAID 10 36 NTFS OS, SQL 36 NTFS Tools 36 NTFS Tools

HP TPC-H FULL DISCLOSURE REPORT 24 © 2005 Hewlett-Packard Company. All rights reserved. AB467A # of Array Fault Partition Fibre Channel Size in GB Content Disks Tolerance Format Controller 0-1-3-4 8 RAID 10 350 RAW Tpch3000g Log L:\ Tools and Mount 50 NTFS Points G:\

U320 SCSI # of Array Fault Partition Size in GB Content Controller Disks Tolerance Format 0-1-3-2 1 Basic Disk 32 NTFS Management OS

5.3 Mapping of Database Partitions/Replications The mapping of database partitions/replications must be explicitly described.

Database partitioning/replication was not used.

5.4 Implementation of RAID Implementations may use some form of RAID to ensure high availability. If used for data, auxiliary storage (e.g. indexes) or temporary space, the level of RAID used must be disclosed for each device.

RAID 5 was used for database filegroups and tempdb, RAID 10 for database recovery logs, RAID 5 for Backup.

5.5 DBGEN Modifications The version number, release number, modification number, and patch level of DBGEN must be disclosed. Any modifications to the DBGEN (see Clause 4.2.1) source code must be disclosed. In the event that a program other than DBGEN was used to populate the database, it must be disclosed in its entirety.

DBGEN version 2.1.1b was used. Modifications made are listed in Appendix G.

5.6 Database Load time The database load time for the test database (see clause 4.3) must be disclosed.

The database load time was 41h 33 min 14 seconds

5.7 Data Storage Ratio The data storage ratio must be disclosed. It is computed by dividing the total data storage of the priced configuration (expressed in GB) by the size chosen for the test database as defined in 4.1.3.1. The ratio must be reported to the nearest 1/100th, rounded up.

# of Disk Type Total (GB) Disks 36 GB 15k rpm Ultra 320 679 20,086 146GB 10K rpm U320 8

Size of test database: 3000GB Data Storage Ratio: 6.70

HP TPC-H FULL DISCLOSURE REPORT 25 © 2005 Hewlett-Packard Company. All rights reserved. 5.8 Database Load Mechanism Details and Illustration The details of the database load must be disclosed, including a block diagram illustrating the overall process. Disclosure of the load procedure includes all steps, scripts, input and configuration files required to completely reproduce the test and qualification databases.

Flat files for each of the tables were created using DBGEN. The tables were loaded as depicted in Figure 5-8.

Create Flat Files for each table

Create Database

Configure Database for load

Partitioned Load from Flat Files

Create Indices and Timed Load Constraints

Create Statistics and set date correlation

Create RF's and backup DB

End of Load

Figure 5.8: Block Diagram of Database Load Process

HP TPC-H FULL DISCLOSURE REPORT 26 © 2005 Hewlett-Packard Company. All rights reserved. 6.0 Clause 5: Performance Metrics and Execution Rules Related Items

6.1 Steps after the Load Test Any system activity on the SUT that takes place between the conclusion of the load test and the beginning of the performance test must be fully disclosed including listings of scripts or command logs.

Auditor requested queries were run against the database to verify the correctness of the load. The system was rebooted and SQL Server was restarted.

6.2 Steps in the Power Test The details of the steps followed to implement the power test (e.g., system boot, database restart, etc.) must be disclosed.

The following steps were used to implement the power test:

1. RF1 Refresh Transaction 2. Stream 0 Execution 3. RF2 Refresh Transaction.

6.3 Timing Intervals for Each Query and Refresh Function The timing intervals (see Clause 5.3.6) for each query of the measured set and for both refresh functions must be reported for the power test.

The timing intervals for each query and both refresh functions are given in the Numerical Quantities Summary earlier in this document on page vii.

6.4 Number of Streams for The Throughput Test The number of execution streams used for the throughput test must be disclosed.

8 streams were used for the Throughput Test.

6.5 Start and End Date/Times for Each Query Stream The start time and finish time for each query execution stream must be reported for the throughput test.

The Numerical Quantities Summary on page vii contains the start and stop times for the query execution streams run on the system reported.

6.6 Total Elapsed Time for the Measurement Interval The total elapsed time of the measurement interval(see Clause 5.3.5) must be reported for the throughput test.

The Numerical Quantities Summary on page vii contains the timing intervals for the throughput test run on the system reported.

6.7 Refresh Function Start Date/Time and Finish Date/Time Start and finish time for each update function in the update stream must be reported for the throughput test.

The Numerical Quantities Summary on page vii contains the start and finish times for the refresh functions of each stream.

HP TPC-H FULL DISCLOSURE REPORT 27 © 2005 Hewlett-Packard Company. All rights reserved. 6.8 Timing Intervals for Each Query and Each Refresh Function for Each Stream The timing intervals (see Clause 5.3.6) for each query of each stream and for each update function must be reported for the throughput test.

The timing intervals for each query and each update function are given in the Numerical Quantities Summary earlier in this document on page vii.

6.9 Performance Metrics The computed performance metrics, related numerical quantities and the price performance metric must be reported.

The Numerical Quantities Summary contains the performance metrics, related numerical quantities, and the price/performance metric for the system reported.

6.10 The Performance Metric and Numerical Quantities from Both Runs The performance metric (QphH@Size) and the numerical quantities (TPC-H Power@Size and TPC-H Throughput@ Size) from both of the runs must be disclosed

Run ID QppH@3000GB QthH@3000GB QphH@3000GB Run 1 45,093.9 23,897.4 32,827.2 Run 2 41,779.5 22,937.4 30,956.6

6.11 System Activity Between Tests Any activity on the SUT that takes place between the conclusion of Run1 and the beginning of Run2 must be disclosed.

The system was rebooted and SQL Server was restarted.

HP TPC-H FULL DISCLOSURE REPORT 28 © 2005 Hewlett-Packard Company. All rights reserved. 7.0 Clause 6: SUT and Driver Implementation Related Items

7.1 Driver A detailed description of how the driver performs its functions must be supplied, including any related source code or scripts. This description should allow an independent reconstruction of the driver.

The TPC-H benchmark was implemented using a Microsoft tool called StepMaster. StepMaster is a general purpose test tool which can drive ODBC and shell commands. Within StepMaster, the user designs a workspace corresponding to the sequence of operations (or steps) to be executed. When the workspace is executed, StepMaster records information about the run into a database as well as a log file for later analysis.

StepMaster provides a mechanism for creating parallel streams of execution. This is used in the throughput tests to drive the query and refresh streams. Each step is timed using a millisecond resolution timer. A timestamp T1 is taken before beginning the operation and a timestamp T2 is taken after completing the operation. These times are recorded in a database as well as a log file for later analysis.

Two types of ODBC connections are supported. A dynamic connection is used to execute a single operation and is closed when the operation finishes. A static connection is held open until the run completes and may be used to execute more than one step. A connection (either static or dynamic) can only have one outstanding operation at any time.

In TPC-H, static connections are used for the query streams in the power and throughput tests. StepMaster reads an Access database to determine the sequence of steps to execute. These commands are represented as the Implementation Specific Layer. StepMaster records its execution history, including all timings, in the Access database. Additionally, StepMaster writes a textual log file of execution for each run.

The source code is disclosed on Appendix F

7.2 Implementation Specific Layer (ISL) If an implementation-specific layer is used, then a detailed description of how it performs its functions must be supplied, including any related source code or scripts. This description should allow an independent reconstruction of the implementation-specific layer.

The following steps are performed, to accomplish the Power and Throughput Runs:

1. Power Run

· Execute 144 concurrent RF1 threads, each of which will apply a segment of a refresh set generated by dbgen. Each thread submits multiple transactions, where a transaction spans a set of orders and their associated lineitems.

· Execute the Stream 0 queries in the order according to TPC Benchmark H Specification, Appendix A

· Execute 144 concurrent RF2 threads, each of which will apply a segment of a refresh set generated by dbgen. Each thread submits multiple transactions, where a transaction spans a set of orders and their associated line items.

HP TPC-H FULL DISCLOSURE REPORT 29 © 2005 Hewlett-Packard Company. All rights reserved. 2. Throughput Run

· Execute 8 concurrent query streams. Each stream executes queries in the order according to TPC Benchmark H Specification, Appendix A, for the appropriate Stream ID (01-08). Upon completion of each stream, a semaphore is signaled to indicate completion. · Execute 8 consecutive RF1/RF2 transactions, against ascending Refresh sets produced by dbgen. The first RF1 waits on a semaphore prior to beginning its insert operations.

Each step is timed by StepMaster. The timing information, together with an activity log, are stored for later analysis. The inputs and results of steps are stored in text files for later analysis.

7.3 Profile-Directed Optimization If profile-directed optimization as described in Clause 5.2.9 is used, such use must be disclosed.

Profile-directed optimization was not used.

HP TPC-H FULL DISCLOSURE REPORT 30 © 2005 Hewlett-Packard Company. All rights reserved. 8. Clause 7: Pricing Related Items

8.1 Hardware and Software Used A detailed list of hardware and software used in the priced system must be reported. Each item must have a vendor part number, description, and release/revision level, and indicate General Availability status or committed delivery date. If package pricing is used, contents of the package must be disclosed. Pricing source(s) and effective date(s) of price(s) must also be reported.

The pricing summary sheet is given on page v in the Executive Summary at the front of this report. The source for all prices is indicated.

The HP Integrity Superdome, system memory, additional processors, disk controllers, and hard drives are all available at the time of publication.

The pricing and availability of the Microsoft software used is given in a quote from Microsoft, which is included in this report in Appendix H.

8.2 Three-Year Cost of System Configuration The total 3-year price of the entire configuration must be reported, including: hardware, software, and maintenance charges. Separate component pricing is required.

The pricing summary sheet on page v in the front of this report contains all details.

8.3 Availability Dates The committed delivery date for general availability (availability date) of products used in the priced calculations must be reported. When the priced system includes products with different availability dates, the single availability date reported on the first page of the executive summary must be the date by which all components are committed to being available. The full disclosure report must report availability dates individually for at least each of the categories for which a pricing subtotal must be provided (see Clause 7.3.1.4). All availability dates, whether for individual components or for the SUT as a whole, must be disclosed to a precision of 1 day, but the precise format is left to the test sponsor.

Category Available Server Hardware Now (date of publication) Storage Now (date of publication) Server Software Now (date of publication) SQL Server May 6 2006

HP TPC-H FULL DISCLOSURE REPORT 31 © 2005 Hewlett-Packard Company. All rights reserved. 9. Clause 8: Audit Related Items

9.1 Auditors’ Report The auditor’s agency name, address, phone number, and Attestation letter with a brief audit summary report indicating compliance must be included in the full disclosure report. A statement should be included specifying who to contact in order to obtain further information regarding the audit process.

This implementation of the TPC Benchmark H was audited by Lorna Livingtree of Performance Metrics, a certified TPC-H auditor. Further information regarding the audit process may be obtained from:

Lorna Livingtree Performance Metrics Inc. PO Box 984 Klamath, CA 95548 (707) 482 0523

Requests for this TPC Benchmark H Full Disclosure Report should be sent to:

TPC Presidio of San Francisco Building 572B Ruger St. (surface) P.O. Box 29920 (mail) San Francisco, CA 94129-0920 Voice: 415-561-6272 Fax: 415-561-6120 Email: [email protected]

HP TPC-H FULL DISCLOSURE REPORT 32 © 2005 Hewlett-Packard Company. All rights reserved. HP TPC-H FULL DISCLOSURE REPORT 33 © 2005 Hewlett-Packard Company. All rights reserved. HP TPC-H FULL DISCLOSURE REPORT 34 © 2005 Hewlett-Packard Company. All rights reserved. Appendix A: Tunable Parameters

System Info

SQL Server

SQL install: The installation followed the default options. For the sort order Latin1_General_binary was chosen. Client tools and development tools were not installed on the server. Mixed mode authentication was used.

SQL Startup parameters: -c -x - E -T834 -T2301

-x Disable the Keeping of CPU time and cache-hit ratio statistics. -c Start SQL Server independently of Windows NT Service Control Manager -E Increase the number of consecutive extents allocated per file to 4 -T2301 Ttrace flag to enable more accurate query run-time behavior modeling in the SQL Server query optimizer typically only needed for large data set decision support processing. - T834 On systems with 8GB or more, this traceflag causes the buffer pool to use large pages. These are allocated at startup and are kept throughout the lifetime of the process. This trace flag can only be set on 64-bit installations of SQL Server.

The following parameters were changed from their default values: name minimum maximum config_value run_value ------affinity mask -2147483648 2147483647 -1 -1 allow updates 0 1 1 1 lightweight pooling 0 1 1 1 max server memory (MB) 16 2147483647 250000 250000 min server memory (MB) 0 2147483647 240000 240000 network packet size (B) 512 32767 32767 32767 recovery interval (min) 0 32767 32767 32767 show advanced options 0 1 1 1 query wait -1 2147483647 2147483647 2147483647

HP TPC-H FULL DISCLOSURE REPORT 35 © 2005 Hewlett-Packard Company. All rights reserved. System Information

System Information report written at: 10/29/05 11:44:42 Processor ia64 Family 31 Model 2 Stepping 1 System Name: SQLORCAH GenuineIntel ~1600 Mhz [System Summary] Processor ia64 Family 31 Model 2 Stepping 1 GenuineIntel ~1600 Mhz Item Value Processor ia64 Family 31 Model 2 Stepping 1 OS Name Microsoft(R) Windows(R) Server 2003, Datacenter GenuineIntel ~1600 Mhz Edition for 64-Bit Itanium-based Systems Processor ia64 Family 31 Model 2 Stepping 1 Version 5.2.3790 Service Pack 1 Build 3790 GenuineIntel ~1600 Mhz Other OS Description Not Available BIOS Version/Date HP 2.50, Not Available OS Manufacturer Microsoft Corporation SMBIOS Version 2.3 System Name SQLORCAH Windows Directory C:\WINDOWS System Manufacturer hp System Directory C:\WINDOWS\system32 System Model superdome server SD64A Boot Device \Device\HarddiskVolume481 System Type Itanium (TM) -based System Locale United States Processor ia64 Family 31 Model 2 Stepping 1 Hardware Abstraction Layer Version = "5.2.3790.1830 GenuineIntel ~1600 Mhz (srv03_sp1_rtm.050324-1447)" Processor ia64 Family 31 Model 2 Stepping 1 User Name Not Available GenuineIntel ~1600 Mhz Ti me Zone Pacific Daylight Time Processor ia64 Family 31 Model 2 Stepping 1 Total Physical Memory 261,884.40 MB GenuineIntel ~1600 Mhz Available Physical Memory 6.79 GB Processor ia64 Family 31 Model 2 Stepping 1 Total Virtual Memory 255.22 GB GenuineIntel ~1600 Mhz Available Virtual Memory 7.38 GB Processor ia64 Family 31 Model 2 Stepping 1 Page File Space 2.00 GB GenuineIntel ~1600 Mhz Page File C:\pagefile.sys Processor ia64 Family 31 Model 2 Stepping 1 GenuineIntel ~1600 Mhz [Hardware Resources] Processor ia64 Family 31 Model 2 Stepping 1 GenuineIntel ~1600 Mhz Processor ia64 Family 31 Model 2 Stepping 1 [Conflicts/Sharing] GenuineIntel ~1600 Mhz Processor ia64 Family 31 Model 2 Stepping 1 Resource Device GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz I/O Port 0x0000A000-0x0000AFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 I/O Port 0x0000A000-0x0000AFFF PCI bus GenuineIntel ~1600 Mhz Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI bus GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI standard Processor ia64 Family 31 Model 2 Stepping 1 PCI-to-PCI bridge GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI standard GenuineIntel ~1600 Mhz PCI-to-PCI bridge Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI bus GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI standard Processor ia64 Family 31 Model 2 Stepping 1 PCI-to-PCI bridge GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI standard GenuineIntel ~1600 Mhz PCI-to-PCI bridge Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI bus GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI standard Processor ia64 Family 31 Model 2 Stepping 1 PCI-to-PCI bridge GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI bus Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI standard GenuineIntel ~1600 Mhz PCI-to-PCI bridge Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI bus GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Processor ia64 Family 31 Model 2 Stepping 1 Memory Address 0xF0000000-0xFFFFFFFF PCI bus GenuineIntel ~1600 Mhz Memory Address 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge HP TPC-H FULL DISCLOSURE REPORT 36 © 2005 Hewlett-Packard Company. All rights reserved. Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00000000-0x000002FF PCI bus PCI-to-PCI bridge I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00000000-0x000002FF PCI bus PCI-to-PCI bridge I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00000000-0x000002FF PCI bus PCI-to-PCI bridge I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00000000-0x000002FF PCI bus PCI-to-PCI bridge I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00000000-0x000002FF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00000000-0x000002FF PCI bus PCI-to-PCI bridge Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00002000-0x00002FFF LSI Logic 53C1010-66 PCI-to-PCI bridge Device Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00002000-0x00002FFF PCI bus PCI-to-PCI bridge I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00002000-0x00002FFF PCI bus PCI-to-PCI bridge I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00002000-0x00002FFF PCI bus PCI-to-PCI bridge I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00002000-0x00002FFF PCI bus PCI-to-PCI bridge I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard I/O Port 0x00002000-0x00002FFF PCI bus PCI-to-PCI bridge I/O Port 0x00002000-0x00002FFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI standard 6400 Controller (Non-Miniport) PCI-to-PCI bridge Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI bus 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI standard 6400 Controller (Non-Miniport) PCI-to-PCI bridge Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI bus 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI standard 6400 Controller (Non-Miniport) PCI-to-PCI bridge Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI bus 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI standard 6400 Controller (Non-Miniport) PCI-to-PCI bridge Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI bus 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI standard 6400 Controller (Non-Miniport) PCI-to-PCI bridge Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI bus 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI standard 6400 Controller (Non-Miniport) PCI-to-PCI bridge Memory Address 0xF0080000-0xF0081FFF Smart Array Memory Address 0xF0000000-0xFFFFFFFF PCI bus 6400 Controller (Non-Miniport) Memory Address 0xF0000000-0xFFFFFFFF PCI standard Memory Address 0xF0080000-0xF0081FFF Smart Array PCI-to-PCI bridge 6400 Controller (Non-Miniport) Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00000000-0x000002FF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00000000-0x000002FF PCI bus HP TPC-H FULL DISCLOSURE REPORT 37 © 2005 Hewlett-Packard Company. All rights reserved. Memory Address 0xF0080000-0xF0081FFF Smart Array PCI bus 6400 Controller (Non-Miniport) HP Baseboard Management Controller Interface Driver Memory Address 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non-Miniport) Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00006000-0x00007FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xF0080000-0xF0081FFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xF0080000-0xF0081FFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI 6400 Controller (Non-Miniport) bridge Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00006000-0x00007FFF Smart Array 6400 6400 Controller (Non-Miniport) Controller (Non-Miniport) Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00006000-0x00007FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xF0080000-0xF0081FFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xF0080000-0xF0081FFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI 6400 Controller (Non-Miniport) bridge Memory Address 0xF0080000-0xF0081FFF Smart Array I/O Port 0x00006000-0x00007FFF Smart Array 6400 6400 Controller (Non-Miniport) Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge Memory Address 0xD 8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xD8000000-0xDFFFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xD8000000-0xDFFFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xD8000000-0xDFFFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xD8000000-0xDFFFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xD8000000-0xDFFFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 Memory Address 0xD8000000-0xDFFFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus Memory Address 0xD8000000-0xDFFFFFFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI Memory Address 0xD8000000-0xDFFFFFFF PCI bus bridge I/O Port 0x00006000-0x00007FFF Smart Array 6400 I/O Port 0x00009000-0x00009FFF PCI bus Controller (Non-Miniport) I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI I/O Port 0x00009000-0x00009FFF PCI bus bridge I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 I/O Port 0x00009000-0x00009FFF PCI bus Controller (Non-Miniport) I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI I/O Port 0x00009000-0x00009FFF PCI bus bridge I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 I/O Port 0x00009000-0x00009FFF PCI bus Controller (Non-Miniport) I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF PCI bus I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI I/O Port 0x00009000-0x00009FFF PCI bus bridge I/O Port 0x00009000-0x00009FFF PCI bus I/O Port 0x00006000-0x00007FFF Smart Array 6400 I/O Port 0x00009000-0x00009FFF PCI bus Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI bus HP TPC-H FULL DISCLOSURE REPORT 38 © 2005 Hewlett-Packard Company. All rights reserved. I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI I/O Port 0x0000E000-0x0000FFFF PCI bus bridge I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x00006000-0x00007FFF Smart Array 6400 bridge Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 I/O Port 0x00006000-0x00007FFF PCI bus Controller (Non-Miniport) I/O Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI I/O Port 0x0000E000-0x0000FFFF PCI bus bridge I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x00006000-0x00007FFF Smart Array 6400 bridge Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non-Miniport) Memory Address 0xE0040000-0xE007FFFF Intel(R) I/O Port 0x0000E000-0x0000FFFF PCI bus PRO/1000 MT Dual Port Network Connection I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI Memory Address 0xE0040000-0xE007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Memory Address 0xE0040000-0xE007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI bus Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI 6400 Controller (Non-Miniport) bridge Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 6400 Controller (Non-Miniport) Controller (Non-Miniport) Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI Memory Address 0xE0040000-0xE007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Memory Address 0xE0040000-0xE007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI bus Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI 6400 Controller (Non-Miniport) bridge Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 6400 Controller (Non-Miniport) Controller (Non-Miniport) Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI Memory Address 0xE0040000-0xE007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Memory Address 0xE0040000-0xE007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI bus Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI 6400 Controller (Non-Miniport) bridge Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 6400 Controller (Non-Miniport) Controller (Non-Miniport) Memory Address 0xE0040000-0xE007FFFF Smart Array I/O Port 0x0000E000-0x0000FFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI Memory Address 0xE0040000-0xE007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge bridge I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non-Miniport) Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x00003000-0x00003FFF PCI bus bridge I/O Port 0x00003000-0x00003FFF LSI Logic 53C896 I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 Device Controller (Non-Miniport) I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x00003000-0x00003FFF PCI bus bridge I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 I/O Port 0x00003000-0x00003FFF PCI bus Controller (Non-Miniport) I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x00003000-0x00003FFF PCI bus bridge I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 I/O Port 0x00003000-0x00003FFF PCI bus Controller (Non-Miniport) I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x00003000-0x00003FFF PCI bus bridge I/O Port 0x00003000-0x00003FFF PCI bus I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 I/O Port 0x00003000-0x00003FFF PCI bus Controller (Non-Miniport) I/O Port 0x0000E000-0x0000FFFF PCI bus I/O Port 0x0000B000-0x0000BFFF PCI bus I/O Port 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI I/O Port 0x0000B000-0x0000BFFF PCI bus bridge I/O Port 0x0000B000-0x0000BFFF PCI bus I/O Port 0x0000E000-0x0000FFFF Smart Array 6400 I/O Port 0x0000B000-0x0000BFFF PCI bus Controller (Non-Miniport) I/O Port 0x0000B000-0x0000BFFF PCI bus HP TPC-H FULL DISCLOSURE REPORT 39 © 2005 Hewlett-Packard Company. All rights reserved. I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard I/O Port 0x0000B000-0x0000BFFF PCI bus PCI-to-PCI bridge I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard I/O Port 0x0000B000-0x0000BFFF PCI bus PCI-to-PCI bridge I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus I/O Port 0x0000B000-0x0000BFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard I/O Port 0x0000B000-0x0000BFFF PCI bus PCI-to-PCI bridge Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI standard Memory Address 0xE0000000-0xEFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC8000000-0xCFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC8000000-0xCFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC8000000-0xCFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC8000000-0xCFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF Emulex Memory Address 0xC8000000-0xCFFFFFFF PCI bus LightPulse LP9802, PCI Slot 11104, Storport Miniport Driver Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC8000000-0xCFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC8000000-0xCFFFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xC8000000-0xCFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xD0000000-0xD7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xD0000000-0xD7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xD0000000-0xD7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xD0000000-0xD7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xD0000000-0xD7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xD0000000-0xD7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xD0000000-0xD7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus Memory Address 0xE0000000-0xEFFFFFFF PCI standard Memory Address 0xC0000000-0xC7FFFFFF PCI bus PCI-to-PCI bridge Memory Address 0xC0000000-0xC7FFFFFF PCI bus HP TPC-H FULL DISCLOSURE REPORT 40 © 2005 Hewlett-Packard Company. All rights reserved. Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF Intel(R) PRO/1000 MT Memory Address 0xC0000000-0xC7FFFFFF PCI bus Dual Port Network Connection Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xC0000000-0xC7FFFFFF PCI bus bridge Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xC0000000-0xC7FFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xC0000000-0xC7FFFFFF PCI bus bridge Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xC0000000-0xC7FFFFFF PCI bus Controller (Non-Miniport) Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xC0000000-0xC7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xC0000000-0xC7FFFFFF PCI bus bridge Memory Address 0xC0000000-0xC 7FFFFFF PCI bus I/O Port 0x00004000-0x00005FFF Smart Array 6400 Controller (Non-Miniport) Memory Address 0xE0080000-0xE009FFFF Intel(R) I/O Port 0x00004000-0x00005FFF PCI bus PRO/1000 MT Dual Port Network Connection I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xE0080000-0xE009FFFF Smart Array I/O Port 0x00004000-0x00005FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xE0080000-0xE009FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xE0080000-0xE009FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xE0080000-0xE009FFFF Smart Array I/O Port 0x00004000-0x00005FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xE0080000-0xE009FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xE0080000-0xE009FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xE0080000-0xE009FFFF Smart Array I/O Port 0x00004000-0x00005FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xE0080000-0xE009FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xE0080000-0xE009FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xE0080000-0xE009FFFF Smart Array I/O Port 0x00004000-0x00005FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xE0080000-0xE009FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xE0080000-0xE009FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI bus Memory Address 0xE0080000-0xE009FFFF Smart Array I/O Port 0x00004000-0x00005FFF Emulex LightPulse 6400 Controller (Non-Miniport) LP9802, PCI Slot 11104, Storport Miniport Driver Memory Address 0xE0080000-0xE009FFFF Smart Array I/O Port 0x00004000-0x00005FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF PCI standard PCI-to-PCI Memory Address 0xE0080000-0xE009FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x00004000-0x00005FFF Smart Array 6400 Memory Address 0xE0080000-0xE009FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI I/O Port 0x00001000-0x00001FFF PCI standard PCI-to-PCI bridge bridge I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 I/O Port 0x00001000-0x00001FFF Smart Array 6400 Controller (Non-Miniport) Controller I/O Port 0x0000C000-0x0000DFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus I/O Port 0x0000C000-0x0000DFFF PCI bus I/O Port 0x00001000-0x00001FFF PCI bus I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI I/O Port 0x00001000-0x00001FFF PCI bus bridge I/O Port 0x00001000-0x00001FFF PCI bus I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 I/O Port 0x00001000-0x00001FFF PCI bus Controller (Non-Miniport) HP TPC-H FULL DISCLOSURE REPORT 41 © 2005 Hewlett-Packard Company. All rights reserved. I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI 6400 Controller (Non-Miniport) bridge Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 6400 Controller (Non-Miniport) Controller (Non-Miniport) Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI Memory Address 0xF0040000-0xF007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 Memory Address 0xF0040000-0xF007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI Memory Address 0xF0040000-0xF007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 Memory Address 0xF0040000-0xF007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI Memory Address 0xF0040000-0xF007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 Memory Address 0xF0040000-0xF007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI Memory Address 0xF0040000-0xF007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 Memory Address 0xF0040000-0xF007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x0000C000-0x0000DFFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI Memory Address 0xF0040000-0xF007FFFF Smart Array bridge 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF Smart Array 6400 Memory Address 0xF0040000-0xF007FFFF Smart Array Controller (Non-Miniport) 6400 Controller (Non-Miniport) I/O Port 0x0000C000-0x0000DFFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non-Miniport) I/O Port 0x00008000-0x00008FFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x00008000-0x00008FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00008000-0x00008FFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x00008000-0x00008FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00008000-0x00008FFF PCI bus Memory Address 0xF0040000-0xF007FFFF Smart Array I/O Port 0x00008000-0x00008FFF PCI bus 6400 Controller (Non-Miniport) I/O Port 0x00008000-0x00008FFF PCI bus I/O Port 0x00008000-0x00008FFF PCI bus I/O Port 0x00008000-0x00008FFF PCI bus [DMA] I/O Port 0x00008000-0x00008FFF PCI bus I/O Port 0x00008000-0x00008FFF PCI bus Resource Device Status I/O Port 0x00008000-0x00008FFF PCI bus I/O Port 0x00008000-0x00008FFF PCI bus [Forced Hardware] I/O Port 0x00008000-0x00008FFF PCI bus I/O Port 0x00008000-0x00008FFF PCI bus Device PNP Device ID I/O Port 0x00008000-0x00008FFF PCI bus [I/O] Memory Address 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non-Miniport) Resource Device Status Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000000-0x000002FF PCI bus OK 6400 Controller (Non-Miniport) 0x00000000-0x000002FF PCI bus OK Memory Address 0xF0040000-0xF007FFFF Smart Array 0x00000400-0x00000FFF PCI bus OK 6400 Controller (Non-Miniport) HP TPC-H FULL DISCLOSURE REPORT 42 © 2005 Hewlett-Packard Company. All rights reserved. 0x00000D80-0x00000DBF HP Management Processor OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- Miniport) OK 0x00000D00-0x00000D7F HP Core-Io Device 01 OK 0x00004000-0x00005FFF PCI bus OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00001000-0x00001FFF PCI bus OK OK 0x00001000-0x00001FFF PCI standard PCI-to-PCI bridge 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- OK Miniport) OK 0x00001000-0x00001FFF Smart Array 6400 Controller OK 0x00004000-0x00005FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00001000-0x00001FFF PCI bus OK OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- 0x00001000-0x00001FFF PCI bus OK Miniport) OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00001000-0x00001FFF PCI bus OK OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- 0x00001000-0x00001FFF PCI bus OK Miniport) OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00001000-0x00001FFF PCI bus OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00001000-0x00001FFF PCI bus OK OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- 0x00002000-0x00002FFF LSI Logic 53C1010-66 Device OK Miniport) OK 0x00004000-0x00005FFF PCI bus OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00002000-0x00002FFF PCI bus OK OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- 0x00002000-0x00002FFF PCI bus OK Miniport) OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF Emulex LightPulse LP9802, PCI 0x00002000-0x00002FFF PCI bus OK Slot 11104, Storport Miniport Driver OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF PCI bus OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00002000-0x00002FFF PCI bus OK OK 0x00002000-0x00002FFF PCI bus OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- 0x00002000-0x00002FFF PCI bus OK Miniport) OK 0x00002000-0x00002FFF PCI bus OK 0x00004040-0x0000407F Intel(R) PRO/1000 MT Dual Port 0x00002000-0x00002FFF PCI bus OK Network Connection #2 OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x00003000-0x00003FFF LSI Logic 53C896 Device OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x00003000-0x00003FFF PCI bus OK Miniport) OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x00003000-0x00003FFF PCI bus OK OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x00003000-0x00003FFF PCI bus OK Miniport) OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x00003000-0x00003FFF PCI bus OK OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x00003000-0x00003FFF PCI bus OK Miniport) OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x00003000-0x00003FFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x00003000-0x00003FFF PCI bus OK OK 0x00003100-0x000031FF LSI Logic 53C896 Device OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- Miniport) OK 0x00004000-0x00005FFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x00004000-0x00005FFF Intel(R) PRO/1000 MT Dual Port 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge Network Connection OK OK 0x00004000-0x00005FFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0x00006000-0x00007FFF PCI bus OK 0x00004000-0x00005FFF Smart Array 6400 Controller (Non- 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0x00004000-0x00005FFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x00004000-0x00005FFF PCI bus OK Miniport) OK 0x00004000-0x00005FFF PCI standard PCI-to-PCI bridge 0x00006000-0x00007FFF PCI bus OK OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge OK HP TPC-H FULL DISCLOSURE REPORT 43 © 2005 Hewlett-Packard Company. All rights reserved. 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x00009000-0x00009FFF PCI bus OK Miniport) OK 0x00009000-0x00009FFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x00009000-0x00009FFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x00009000-0x00009FFF PCI bus OK OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000A000-0x0000AFFF PCI bus OK Miniport) OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000A000-0x0000AFFF PCI bus OK OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000A000-0x0000AFFF PCI bus OK Miniport) OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000A000-0x0000AFFF PCI bus OK OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000A000-0x0000AFFF PCI bus OK Miniport) OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000A000-0x0000AFFF PCI bus OK OK 0x0000A000-0x0000AFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000B000-0x0000BFFF PCI bus OK Miniport) OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000B000-0x0000BFFF PCI bus OK OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000B000-0x0000BFFF PCI bus OK Miniport) OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000B000-0x0000BFFF PCI bus OK OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000B000-0x0000BFFF PCI bus OK Miniport) OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000B000-0x0000BFFF PCI bus OK OK 0x0000B000-0x0000BFFF PCI bus OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000B000-0x0000BFFF PCI bus OK Miniport) OK 0x0000C000-0x0000DFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge OK OK 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0x0000C000-0x0000DFFF PCI bus OK 0x00006000-0x00007FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00006000-0x00007FFF PCI standard PCI-to-PCI bridge 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge OK OK 0x00006000-0x00007FFF Smart Array 6400 Controller (Non- 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x00008000-0x00008FFF PCI bus OK OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- 0x00008000-0x00008FFF PCI bus OK Miniport) OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x00008000-0x00008FFF PCI bus OK OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- 0x00008000-0x00008FFF PCI bus OK Miniport) OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00008000-0x00008FFF PCI bus OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x00008000-0x00008FFF PCI bus OK OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- 0x00009000-0x00009FFF PCI bus OK Miniport) OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x00009000-0x00009FFF PCI bus OK OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- 0x00009000-0x00009FFF PCI bus OK Miniport) OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF PCI bus OK 0x00009000-0x00009FFF PCI bus OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x00009000-0x00009FFF PCI bus OK OK HP TPC-H FULL DISCLOSURE REPORT 44 © 2005 Hewlett-Packard Company. All rights reserved. 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0x0000C000-0x0000DFFF PCI bus OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- 0x0000C000-0x0000DFFF PCI bus OK Miniport) OK 0x0000C000-0x0000DFFF PCI standard PCI-to-PCI bridge 0x0000E000-0x0000FFFF PCI bus OK OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge 0x0000C000-0x0000DFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- 0x0000C000-0x0000DFFF PCI bus OK Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge [IRQs] OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Resource Device Status Miniport) OK IRQ 16 Microsoft ACPI-Compliant System OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 17 HP Baseboard Management Controller Interface Driver 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK OK IRQ 35 Smart Array 6400 Controller OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- IRQ 46 LSI Logic 53C1010-66 Device OK Miniport) OK IRQ 57 LSI Logic 53C896 Device OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 58 LSI Logic 53C896 Device OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge IRQ 68 Intel(R) PRO/1000 MT Dual Port Network Connection OK OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- IRQ 69 Intel(R) PRO/1000 MT Dual Port Network Connection Miniport) OK #2 OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 79 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK IRQ 134 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Miniport) OK IRQ 145 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge IRQ 208 Smart Array 6400 Controller (Non-Miniport) OK OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- IRQ 219 Smart Array 6400 Controller (Non-Miniport) OK Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 285 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK IRQ 359 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Miniport) OK IRQ 414 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge IRQ 425 Smart Array 6400 Controller (Non-Miniport) OK OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- IRQ 488 Smart Array 6400 Controller (Non-Miniport) OK Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 499 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK IRQ 565 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Miniport) OK IRQ 628 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge IRQ 639 Smart Array 6400 Controller (Non-Miniport) OK OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- IRQ 705 Smart Array 6400 Controller (Non-Miniport) OK Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 779 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK IRQ 834 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Miniport) OK IRQ 845 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge IRQ 919 Smart Array 6400 Controller (Non-Miniport) OK OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- IRQ 974 Smart Array 6400 Controller (Non-Miniport) OK Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK IRQ 985 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI standard PCI-to-PCI bridge OK IRQ 1048 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF Smart Array 6400 Controller (Non- Miniport) OK IRQ 1059 Smart Array 6400 Controller (Non-Miniport) OK 0x0000E000-0x0000FFFF PCI bus OK HP TPC-H FULL DISCLOSURE REPORT 45 © 2005 Hewlett-Packard Company. All rights reserved. IRQ 1125 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK IRQ 1199 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK IRQ 1254 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK IRQ 1265 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK IRQ 1328 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK IRQ 1339 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK IRQ 1405 Smart Array 6400 Controller (Non-Miniport) OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xC0040000-0xC0040FFF HP Management Processor OK IRQ 1479 Smart Array 6400 Controller (Non-Miniport) OK 0xC0041000-0xC00413FF HP Core-Io Device 01 OK IRQ 1534 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1545 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI standard PCI-to-PCI bridge OK IRQ 1608 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1619 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1685 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1759 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1814 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1825 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1888 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1899 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 1965 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2028 Emulex LightPulse LP9802, PCI Slot 11104, Storport 0xC8000000-0xCFFFFFFF PCI bus OK Miniport Driver OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2039 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2094 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2105 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2168 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2179 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8000000-0xCFFFFFFF PCI bus OK IRQ 2245 Smart Array 6400 Controller (Non-Miniport) OK 0xC8000000-0xCFFFFFFF PCI bus OK 0xC8080000-0xC8081FFF Smart Array 6400 Controller OK

[Memory] 0xC8040000-0xC807FFFF Smart Array 6400 Controller OK

Resource Device Status 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xC0000000-0xC7FFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK HP TPC-H FULL DISCLOSURE REPORT 46 © 2005 Hewlett-Packard Company. All rights reserved. 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD0000000-0xD7FFFFFF PCI bus OK OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD0000000-0xD7FFFFFF PCI bus OK OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0000000-0xD7FFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD0000000-0xD7FFFFFF PCI bus OK OK 0xD0022000-0xD00223FF LSI Logic 53C1010-66 Device OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD0020000-0xD0021FFF LSI Logic 53C1010-66 Device OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF Emulex LightPulse LP9802, PCI 0xD8000000-0xDFFFFFFF PCI bus OK Slot 11104, Storport Miniport Driver OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xD8000000-0xDFFFFFFF PCI bus OK OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xD8000000-0xDFFFFFFF PCI bus OK 0xE0080000-0xE009FFFF Intel(R) PRO/1000 MT Dual Port 0xD8044000-0xD80443FF LSI Logic 53C896 Device OK Network Connection OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xD8040000-0xD8041FFF LSI Logic 53C896 Device OK Miniport) OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xD8045000-0xD80453FF LSI Logic 53C896 Device OK Miniport) OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xD8042000-0xD8043FFF LSI Logic 53C896 Device OK Miniport) OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI bus OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI bus OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI bus OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI bus OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI bus OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xE0000000-0xEFFFFFFF PCI bus OK Miniport) OK 0xE0000000-0xEFFFFFFF PCI standard PCI-to-PCI bridge 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- OK Miniport) OK HP TPC-H FULL DISCLOSURE REPORT 47 © 2005 Hewlett-Packard Company. All rights reserved. 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE0080000-0xE009FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0040000-0xE007FFFF Intel(R) PRO/1000 MT Dual Port 0xF0000000-0xFFFFFFFF PCI bus OK Network Connection OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xE0040000-0xE007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xE00A0000-0xE00BFFFF Intel(R) PRO/1000 MT Dual Port 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Network Connection #2 OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge OK OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI bus OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge Miniport) OK OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0000000-0xFFFFFFFF PCI bus OK Miniport) OK 0xF0000000-0xFFFFFFFF PCI standard PCI-to-PCI bridge 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- OK Miniport) OK HP TPC-H FULL DISCLOSURE REPORT 48 © 2005 Hewlett-Packard Company. All rights reserved. 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- 0xE0001000-0xE00010FF Emulex LightPulse LP9802, PCI Miniport) OK Slot 11104, Storport Miniport Driver OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- Miniport) OK [Components] 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- Miniport) OK 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- Miniport) OK [Multimedia] 0xF0080000-0xF0081FFF Smart Array 6400 Controller (Non- Miniport) OK 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK [Audio Codecs] 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Miniport) OK CODEC Manufacturer Description Status File 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- Version Size Creation Date Miniport) OK c:\windows\system32\msadp32.acm Microsoft Corporation 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK C:\WINDOWS\system32\MSADP32.ACM 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- 5.2.3790.0 (srv03_rtm.030324-2048) 49.00 KB Miniport) OK (50,176 bytes) 9/8/2005 12:19 PM 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- c:\windows\system32\imaadp32.acm Microsoft Corporation Miniport) OK OK 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- C:\WINDOWS\system32\IMAADP32.ACM Miniport) OK 5.2.3790.0 (srv03_rtm.030324-2048) 55.00 KB 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- (56,320 bytes) 9/8/2005 12:19 PM Miniport) OK c:\windows\system32\tssoft32.acm DSP GROUP, INC. 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- OK C:\WINDOWS\system32\TSSOFT32.ACM Miniport) OK 1.01 29.00 KB (29,696 bytes) 9/8/2005 12:20 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- PM Miniport) OK c:\windows\system32\msgsm32.acm Microsoft Corporation 0xF0040000-0xF007FFFF Smart Array 6400 Controller (Non- OK Miniport) OK C:\WINDOWS\system32\MSGSM32.ACM

HP TPC-H FULL DISCLOSURE REPORT 49 © 2005 Hewlett-Packard Company. All rights reserved. 5.2.3790.0 (srv03_rtm.030324-2048) 66.50 KB Item Value (68,096 bytes) 9/8/2005 12:19 PM Name [00000001] Intel(R) PRO/1000 MT Dual Port Network c:\windows\system32\msg711.acm Microsoft Corporation Connection OK Adapter Type Ethernet 802.3 C:\WINDOWS\system32\MSG711.ACM 5.2.3790.0 Product Type Intel(R) PRO/1000 MT Dual Port Network (srv03_rtm.030324-2048) 33.00 KB (33,792 bytes) Connection 9/8/2005 12:19 PM Installed Yes PNP Device ID [Video Codecs] PCI\VEN_8086&DEV_1010&SUBSYS_00DB0E11&RE V_01\5&26340CF2&0&08 CODEC Manufacturer Description Status File Last Reset 10/29/2005 11:03 AM Version Size Creation Date Index 1 c:\windows\system32\msrle32.dll Microsoft Corporation Service Name E1000 OK IP Address 0.0.0.0 C:\WINDOWS\system32\MSRLE32.DLL 5.2.3790.0 IP Subnet 0.0.0.0 (srv03_rtm.030324-2048) 24.50 KB (25,088 bytes) Default IP Gateway Not Available 9/8/2005 12:19 PM DHCP Enabled Yes c:\windows\system32\msvidc32.dll Microsoft Corporation DHCP Server 172.31.88.3 OK DHCP Lease Expires 10/27/2005 9:02 PM C:\WINDOWS\system32\MSVIDC32.DLL DHCP Lease Obtained 10/19/2005 9:02 PM 5.2.3790.0 (srv03_rtm.030324-2048) 67.00 KB MAC Address 00:11:0A:53:A5:E4 (68,608 bytes) 9/8/2005 12:19 PM Memory Address 0xE0080000-0xE009FFFF Memory Address 0xE0040000-0xE007FFFF [CD-ROM] I/O Port 0x00004000-0x00005FFF IRQ Channel IRQ 68 Item Value Driver c:\windows\system32\drivers\e1000645.sys (6.3.6.31 Drive D: built by: WinDDK, 363.00 KB (371,712 bytes), 9/8/2005 6:35 AM) Description CD-ROM Drive Media Loaded No Media Type CD-ROM Name [00000002] Intel(R) PRO/1000 MT Dual Port Network Name HP DVD-ROM 305 SCSI CdRom Device Connection Manufacturer (Standard CD-ROM drives) Adapter Type Ethernet 802.3 Status OK Product Type Intel(R) PRO/1000 MT Dual Port Network Transfer Rate Not Available Connection SCSI Target ID 3 Installed Yes PNP Device ID SCSI\CDROM&VEN_HP&PROD_DVD- PNP Device ID ROM_305&REV_1.01\6&1BE3D281&0&030 PCI\VEN_8086&DEV_1010&SUBSYS_00DB0E11&RE Driver c:\windows\system32\drivers\cdrom.sys (5.2.3790.1830 V_01\5&26340CF2&0&09 (srv03_sp1_rtm.050324-1447), 144.50 KB (147,968 bytes), Last Reset 10/29/2005 11:03 AM 9/8/2005 12:18 PM) Index 2 Service Name E1000 [Sound Device] IP Address 10.0.0.2 IP Subnet 255.255.255.0 Item Value Default IP Gateway 10.0.0.2 DHCP Enabled No [Display] DHCP Server Not Available DHCP Lease Expires Not Available Item Value DHCP Lease Obtained Not Available MAC Address 00:11:0A:53:A5:E5 [Infrared] Memory Address 0xE00A0000-0xE00BFFFF I/O Port 0x00004040-0x0000407F Item Value IRQ Channel IRQ 69 Driver c:\windows\system32\drivers\e1000645.sys (6.3.6.31 [Input] built by: WinDDK, 363.00 KB (371,712 bytes), 9/8/2005 6:35 AM)

Name [00000003] RAS Async Adapter [Keyboard] Adapter Type Not Available Product Type RAS Async Adapter Item Value Installed Yes PNP Device ID Not Available [Pointing Device] Last Reset 10/29/2005 11:03 AM Index 3 Item Value Service Name AsyncMac IP Address Not Available [Modem] IP Subnet Not Available Default IP Gateway Not Available Item Value DHCP Enabled No DHCP Server Not Available [Network] DHCP Lease Expires Not Available DHCP Lease Obtained Not Available MAC Address Not Available

[Adapter] Name [00000004] WAN Miniport (L2TP) Adapter Type Not Available HP TPC-H FULL DISCLOSURE REPORT 50 © 2005 Hewlett-Packard Company. All rights reserved. Product Type WAN Miniport (L2TP) IP Subnet Not Available Installed Yes Default IP Gateway Not Available PNP Device ID ROOT\MS_L2TPMINIPORT\0000 DHCP Enabled No Last Reset 10/29/2005 11:03 AM DHCP Server Not Available Index 4 DHCP Lease Expires Not Available Service Name Rasl2tp DHCP Lease Obtained Not Available IP Address Not Available MAC Address Not Available IP Subnet Not Available Default IP Gateway Not Available [Protocol] DHCP Enabled No DHCP Server Not Available Item Value DHCP Lease Expires Not Available Name MSAFD Tcpip [TCP/IP] DHCP Lease Obtained Not Available Connectionless Service No MAC Address Not Available Guarantees Delivery Yes Guarantees Sequencing Yes Name [00000005] WAN Miniport (PPTP) Maximum Address Size 16 bytes Adapter Type Wide Area Network (WAN) Maximum Message Size 0 bytes Product Type WAN Miniport (PPTP) Message Oriented No Installed Yes Minimum Address Size 16 bytes PNP Device ID ROOT\MS_PPTPMINIPORT\0000 Pseudo Stream Oriented No Last Reset 10/29/2005 11:03 AM Supports Broadcasting No Index 5 Supports Connect Data No Service Name PptpMiniport Supports Disconnect Data No IP Address Not Available Supports Encryption No IP Subnet Not Available Supports Expedited Data Yes Default IP Gateway Not Available Supports Graceful Closing Yes DHCP Enabled No Supports Guaranteed Bandwidth No DHCP Server Not Available Supports Multicasting No DHCP Lease Expires Not Available DHCP Lease Obtained Not Available Name MSAFD Tcpip [UDP/IP] MAC Address 50:50:54:50:30:30 Connectionless Service Yes Guarantees Delivery No Name [00000006] WAN Miniport (PPPOE) Guarantees Sequencing No Adapter Type Wide Area Network (WAN) Maximum Address Size 16 bytes Product Type WAN Miniport (PPPOE) Maximum Message Size 63.93 KB (65,467 bytes) Installed Yes Message Oriented Yes PNP Device ID ROOT\MS_PPPOEMINIPORT\0000 Minimum Address Size 16 bytes Last Reset 10/29/2005 11:03 AM Pseudo Stream Oriented No Index 6 Supports Broadcasting Yes Service Name RasPppoe Supports Connect Data No IP Address Not Available Supports Disconnect Data No IP Subnet Not Available Supports Encryption No Default IP Gateway Not Available Supports Expedited Data No DHCP Enabled No Supports Graceful Closing No DHCP Server Not Available Supports Guaranteed Bandwidth No DHCP Lease Expires Not Available Supports Multicasting Yes DHCP Lease Obtained Not Available MAC Address 33:50:6F:45:30:30 Name RSVP UDP Service Provider Connectionless Service Yes Name [00000007] Direct Parallel Guarantees Delivery No Adapter Type Not Available Guarantees Sequencing No Product Type Direct Parallel Maximum Address Size 16 bytes Installed Yes Maximum Message Size 63.93 KB (65,467 bytes) PNP Device ID ROOT\MS_PTIMINIPORT\0000 Message Oriented Yes Last Reset 10/29/2005 11:03 AM Minimum Address Size 16 bytes Index 7 Pseudo Stream Oriented No Service Name Raspti Supports Broadcasting Yes IP Address Not Available Supports Connect Data No IP Subnet Not Available Supports Disconnect Data No Default IP Gateway Not Available Supports Encryption Yes DHCP Enabled No Supports Expedited Data No DHCP Server Not Available Supports Graceful Closing No DHCP Lease Expires Not Available Supports Guaranteed Bandwidth No DHCP Lease Obtained Not Available Supports Multicasting Yes MAC Address Not Available Name RSVP TCP Service Provider Name [00000008] WAN Miniport (IP) Connectionless Service No Adapter Type Not Available Guarantees Delivery Yes Product Type WAN Miniport (IP) Guarantees Sequencing Yes Installed Yes Maximum Address Size 16 bytes PNP Device ID ROOT\MS_NDISWANIP\0000 Maximum Message Size 0 bytes Last Reset 10/29/2005 11:03 AM Message Oriented No Index 8 Minimum Address Size 16 bytes Service Name NdisWan Pseudo Stream Oriented No IP Address Not Available Supports Broadcasting No HP TPC-H FULL DISCLOSURE REPORT 51 © 2005 Hewlett-Packard Company. All rights reserved. Supports Connect Data No Compressed No Supports Disconnect Data No File System NTFS Supports Encryption Yes Size 107.42 GB (115,344,404,480 bytes) Supports Expedited Data Yes Free Space 107.26 GB (115,168,407,552 bytes) Supports Graceful Closing Yes Volume Name TempDB-Log Supports Guaranteed Bandwidth No Volume Serial Number 68A63DA8 Supports Multicasting No [Disks] [WinSock] Item Value Item Value Description \\.\PHYSICALDRIVE100 File c:\windows\system32\wsock32.dll Manufacturer Not Available Size 23.00 KB (23,552 bytes) Model Not Available Version 5.2.3790.0 (srv03_rtm.030324-2048) Bytes/Sector 512 Media Loaded Yes [Ports] Media Type Fixed hard disk Partitions 3 SCSI Bus Not Available SCSI Logical Unit Not Available [Serial] SCSI PortNot Available SCSI Target ID Not Available Item Value Sectors/Track 63 Size 107.42 GB (115,343,101,440 bytes) [Parallel] Total Cylinders 14,023 Total Sectors 225,279,495 Item Value Total Tracks 3,575,865 Tracks/Cylinder 255 [Storage] Partition Disk #100, Partition #0 Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 136,314,880 bytes Partition Disk #100, Partition #1 [Drives] Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 51,516,538,880 bytes Item Value Partition Disk #100, Partition #2 Drive C: Partition Size 31.12 GB (33,418,117,120 bytes) Description Local Fixed Disk Partition Starting Offset 81,925,242,880 bytes Compressed No File System NTFS Description \\.\PHYSICALDRIVE101 Size 16.34 GB (17,544,654,848 bytes) Manufacturer Not Available Free Space 5.01 GB (5,380,747,264 bytes) Model Not Available Volume Name Syspart Bytes/Sector 512 Volume Serial Number 3C494C82 Media Loaded Yes Media Type Fixed D: Partitions 2 Description CD-ROM Disc SCSI Bus Not Available SCSI Logical Unit Not Available Drive G: SCSI PortNot Available Description Local Fixed Disk SCSI Target ID Not Available Compressed No Sectors/Track 63 File System NTFS Size 96.05 GB (103,136,785,920 bytes) Size 48.83 GB (52,428,795,904 bytes) Total Cylinders 12,539 Free Space 32.15 GB (34,525,532,160 bytes) Total Sectors 201,439,035 Volume Name G Drive Total Tracks 3,197,445 Volume Serial Number 2C19D7D6 Tracks/Cylinder 255 Partition Disk #101, Partition #0 Drive L: Partition Size 1.00 MB (1,048,576 bytes) Description Local Fixed Disk Partition Starting Offset 17,408 bytes Compressed Not Available Partition Disk #101, Partition #1 File System Not Available Partition Size 95.94 GB (103,010,236,928 bytes) Size Not Available Partition Starting Offset 134,235,136 bytes Free Space Not Available Volume Name Not Available Description \\.\PHYSICALDRIVE102 Volume Serial Number Not Available Manufacturer Not Available Model Not Available Drive P: Bytes/Sector 512 Description Local Fixed Disk Media Loaded Yes Compressed No Media Type Fixed hard disk File System NTFS Partitions 3 Size 38.99 GB (41,864,392,704 bytes) SCSI Bus Not Available Free Space 30.94 GB (33,222,336,512 bytes) SCSI Logical Unit Not Available Volume Name Pagefile SCSI PortNot Available Volume Serial Number 0C341812 SCSI Target ID Not Available Sectors/Track 63 Drive T: Size 107.42 GB (115,343,101,440 bytes) Description Local Fixed Disk Total Cylinders 14,023 HP TPC-H FULL DISCLOSURE REPORT 52 © 2005 Hewlett-Packard Company. All rights reserved. Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #102, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #102, Partition #1 Partition Disk #89, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #102, Partition #2 Partition Disk #89, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE103 Description \\.\PHYSICALDRIVE90 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #103, Partition #0 Partition Disk #90, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #103, Partition #1 Partition Disk #90, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #90, Partition #2 Description \\.\PHYSICALDRIVE88 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE91 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #88, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #88, Partition #1 Partition Disk #91, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #88, Partition #2 Partition Disk #91, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE89 Description \\.\PHYSICALDRIVE124 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available HP TPC-H FULL DISCLOSURE REPORT 53 © 2005 Hewlett-Packard Company. All rights reserved. Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #124, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #124, Partition #1 Partition Disk #127, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #124, Partition #2 Partition Disk #127, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE125 Description \\.\PHYSICALDRIVE24 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #125, Partition #0 Partition Disk #24, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #125, Partition #1 Partition Disk #24, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #24, Partition #2 Description \\.\PHYSICALDRIVE126 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE25 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #126, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #126, Partition #1 Partition Disk #25, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #126, Partition #2 Partition Disk #25, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE127 Description \\.\PHYSICALDRIVE26 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available HP TPC-H FULL DISCLOSURE REPORT 54 © 2005 Hewlett-Packard Company. All rights reserved. SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #26, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #26, Partition #1 Partition Disk #77, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #26, Partition #2 Partition Disk #77, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE27 Description \\.\PHYSICALDRIVE78 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #27, Partition #0 Partition Disk #78, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #27, Partition #1 Partition Disk #78, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #78, Partition #2 Description \\.\PHYSICALDRIVE76 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE79 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #76, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #76, Partition #1 Partition Disk #79, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #76, Partition #2 Partition Disk #79, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE77 Description \\.\PHYSICALDRIVE156 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes HP TPC-H FULL DISCLOSURE REPORT 55 © 2005 Hewlett-Packard Company. All rights reserved. Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #156, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #156, Partition #1 Partition Disk #159, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #156, Partition #2 Partition Disk #159, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE157 Description \\.\PHYSICALDRIVE28 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #157, Partition #0 Partition Disk #28, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #157, Partition #1 Partition Disk #28, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #28, Partition #2 Description \\.\PHYSICALDRIVE158 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE29 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #158, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #158, Partition #1 Partition Disk #29, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #158, Partition #2 Partition Disk #29, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE159 Description \\.\PHYSICALDRIVE30 Manufacturer Not Available Manufacturer Not Available HP TPC-H FULL DISCLOSURE REPORT 56 © 2005 Hewlett-Packard Company. All rights reserved. Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE129 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #30, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #30, Partition #1 Partition Disk #129, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #30, Partition #2 Partition Disk #129, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE31 Description \\.\PHYSICALDRIVE130 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #31, Partition #0 Partition Disk #130, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #31, Partition #1 Partition Disk #130, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #130, Partition #2 Description \\.\PHYSICALDRIVE128 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE131 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #128, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #128, Partition #1 Partition Disk #131, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #128, Partition #2 Partition Disk #131, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes HP TPC-H FULL DISCLOSURE REPORT 57 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #2, Partition #2 Description \\.\PHYSICALDRIVE0 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE3 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #0, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #0, Partition #1 Partition Disk #3, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #0, Partition #2 Partition Disk #3, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE1 Description \\.\PHYSICALDRIVE92 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #1, Partition #0 Partition Disk #92, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #1, Partition #1 Partition Disk #92, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #92, Partition #2 Description \\.\PHYSICALDRIVE2 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE93 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #2, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #2, Partition #1 Partition Disk #93, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes HP TPC-H FULL DISCLOSURE REPORT 58 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #93, Partition #1 Partition Disk #188, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #188, Partition #2 Description \\.\PHYSICALDRIVE94 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE189 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #94, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #94, Partition #1 Partition Disk #189, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #94, Partition #2 Partition Disk #189, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE95 Description \\.\PHYSICALDRIVE190 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #95, Partition #0 Partition Disk #190, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #95, Partition #1 Partition Disk #190, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #190, Partition #2 Description \\.\PHYSICALDRIVE188 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE191 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #188, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 HP TPC-H FULL DISCLOSURE REPORT 59 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #191, Partition #0 Partition Disk #6, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #191, Partition #1 Partition Disk #6, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #6, Partition #2 Description \\.\PHYSICALDRIVE4 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE7 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #4, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #4, Partition #1 Partition Disk #7, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #4, Partition #2 Partition Disk #7, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE5 Description \\.\PHYSICALDRIVE132 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #5, Partition #0 Partition Disk #132, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #5, Partition #1 Partition Disk #132, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #132, Partition #2 Description \\.\PHYSICALDRIVE6 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE133 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 HP TPC-H FULL DISCLOSURE REPORT 60 © 2005 Hewlett-Packard Company. All rights reserved. Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #133, Partition #0 Partition Disk #104, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #133, Partition #1 Partition Disk #104, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #104, Partition #2 Description \\.\PHYSICALDRIVE134 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE105 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #134, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #134, Partition #1 Partition Disk #105, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #134, Partition #2 Partition Disk #105, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE135 Description \\.\PHYSICALDRIVE106 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #135, Partition #0 Partition Disk #106, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #135, Partition #1 Partition Disk #106, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #106, Partition #2 Description \\.\PHYSICALDRIVE104 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE107 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available HP TPC-H FULL DISCLOSURE REPORT 61 © 2005 Hewlett-Packard Company. All rights reserved. Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #107, Partition #0 Partition Disk #34, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #107, Partition #1 Partition Disk #34, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #34, Partition #2 Description \\.\PHYSICALDRIVE32 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE35 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #32, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #32, Partition #1 Partition Disk #35, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #32, Partition #2 Partition Disk #35, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE33 Description \\.\PHYSICALDRIVE112 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #33, Partition #0 Partition Disk #112, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #33, Partition #1 Partition Disk #112, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #112, Partition #2 Description \\.\PHYSICALDRIVE34 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE113 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available HP TPC-H FULL DISCLOSURE REPORT 62 © 2005 Hewlett-Packard Company. All rights reserved. SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #113, Partition #0 Partition Disk #140, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #113, Partition #1 Partition Disk #140, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #140, Partition #2 Description \\.\PHYSICALDRIVE114 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE141 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #114, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #114, Partition #1 Partition Disk #141, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #114, Partition #2 Partition Disk #141, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE115 Description \\.\PHYSICALDRIVE142 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #115, Partition #0 Partition Disk #142, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #115, Partition #1 Partition Disk #142, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #142, Partition #2 Description \\.\PHYSICALDRIVE140 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE143 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes HP TPC-H FULL DISCLOSURE REPORT 63 © 2005 Hewlett-Packard Company. All rights reserved. Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #143, Partition #0 Partition Disk #122, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #143, Partition #1 Partition Disk #122, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #122, Partition #2 Description \\.\PHYSICALDRIVE120 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE123 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #120, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #120, Partition #1 Partition Disk #123, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #120, Partition #2 Partition Disk #123, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE121 Description \\.\PHYSICALDRIVE96 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #121, Partition #0 Partition Disk #96, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #121, Partition #1 Partition Disk #96, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #96, Partition #2 Description \\.\PHYSICALDRIVE122 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE97 Media Loaded Yes Manufacturer Not Available HP TPC-H FULL DISCLOSURE REPORT 64 © 2005 Hewlett-Packard Company. All rights reserved. Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #97, Partition #0 Partition Disk #20, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #97, Partition #1 Partition Disk #20, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #20, Partition #2 Description \\.\PHYSICALDRIVE98 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE21 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #98, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #98, Partition #1 Partition Disk #21, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #98, Partition #2 Partition Disk #21, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE99 Description \\.\PHYSICALDRIVE22 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #99, Partition #0 Partition Disk #22, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #99, Partition #1 Partition Disk #22, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #22, Partition #2 Description \\.\PHYSICALDRIVE20 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes HP TPC-H FULL DISCLOSURE REPORT 65 © 2005 Hewlett-Packard Company. All rights reserved. Description \\.\PHYSICALDRIVE23 Description \\.\PHYSICALDRIVE162 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #23, Partition #0 Partition Disk #162, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #23, Partition #1 Partition Disk #162, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #162, Partition #2 Description \\.\PHYSICALDRIVE160 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE163 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #160, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #160, Partition #1 Partition Disk #163, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #160, Partition #2 Partition Disk #163, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE161 Description \\.\PHYSICALDRIVE136 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #161, Partition #0 Partition Disk #136, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #161, Partition #1 Partition Disk #136, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes HP TPC-H FULL DISCLOSURE REPORT 66 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #136, Partition #2 Partition Disk #139, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE137 Description \\.\PHYSICALDRIVE40 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #137, Partition #0 Partition Disk #40, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 32,256 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #137, Partition #1 Partition Disk #40, Partition #1 Partition Size 95.94 GB (103,012,867,584 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 131,604,480 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #40, Partition #2 Description \\.\PHYSICALDRIVE138 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE41 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #138, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #138, Partition #1 Partition Disk #41, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #138, Partition #2 Partition Disk #41, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE139 Description \\.\PHYSICALDRIVE42 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #139, Partition #0 Partition Disk #42, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes HP TPC-H FULL DISCLOSURE REPORT 67 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #42, Partition #1 Partition Disk #153, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #42, Partition #2 Partition Disk #153, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE43 Description \\.\PHYSICALDRIVE154 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #43, Partition #0 Partition Disk #154, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #43, Partition #1 Partition Disk #154, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #154, Partition #2 Description \\.\PHYSICALDRIVE152 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE155 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #152, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #152, Partition #1 Partition Disk #155, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #152, Partition #2 Partition Disk #155, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE153 Description \\.\PHYSICALDRIVE44 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 HP TPC-H FULL DISCLOSURE REPORT 68 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #44, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #44, Partition #1 Partition Disk #47, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #44, Partition #2 Partition Disk #47, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE45 Description \\.\PHYSICALDRIVE68 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #45, Partition #0 Partition Disk #68, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #45, Partition #1 Partition Disk #68, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #68, Partition #2 Description \\.\PHYSICALDRIVE46 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE69 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #46, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #46, Partition #1 Partition Disk #69, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #46, Partition #2 Partition Disk #69, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE47 Description \\.\PHYSICALDRIVE70 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 HP TPC-H FULL DISCLOSURE REPORT 69 © 2005 Hewlett-Packard Company. All rights reserved. Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #70, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #70, Partition #1 Partition Disk #181, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #70, Partition #2 Partition Disk #181, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE71 Description \\.\PHYSICALDRIVE182 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #71, Partition #0 Partition Disk #182, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #71, Partition #1 Partition Disk #182, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #182, Partition #2 Description \\.\PHYSICALDRIVE180 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE183 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #180, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #180, Partition #1 Partition Disk #183, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #180, Partition #2 Partition Disk #183, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE181 Description \\.\PHYSICALDRIVE48 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available HP TPC-H FULL DISCLOSURE REPORT 70 © 2005 Hewlett-Packard Company. All rights reserved. Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #48, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #48, Partition #1 Partition Disk #51, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #48, Partition #2 Partition Disk #51, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE49 Description \\.\PHYSICALDRIVE64 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #49, Partition #0 Partition Disk #64, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #49, Partition #1 Partition Disk #64, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #64, Partition #2 Description \\.\PHYSICALDRIVE50 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE65 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #50, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #50, Partition #1 Partition Disk #65, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #50, Partition #2 Partition Disk #65, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE51 Description \\.\PHYSICALDRIVE66 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available HP TPC-H FULL DISCLOSURE REPORT 71 © 2005 Hewlett-Packard Company. All rights reserved. SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #66, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #66, Partition #1 Partition Disk #61, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #66, Partition #2 Partition Disk #61, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE67 Description \\.\PHYSICALDRIVE62 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #67, Partition #0 Partition Disk #62, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #67, Partition #1 Partition Disk #62, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #62, Partition #2 Description \\.\PHYSICALDRIVE60 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE63 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #60, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #60, Partition #1 Partition Disk #63, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #60, Partition #2 Partition Disk #63, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE61 Description \\.\PHYSICALDRIVE108 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes HP TPC-H FULL DISCLOSURE REPORT 72 © 2005 Hewlett-Packard Company. All rights reserved. Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #108, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #108, Partition #1 Partition Disk #111, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #108, Partition #2 Partition Disk #111, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE109 Description \\.\PHYSICALDRIVE116 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #109, Partition #0 Partition Disk #116, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #109, Partition #1 Partition Disk #116, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #116, Partition #2 Description \\.\PHYSICALDRIVE110 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE117 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #110, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #110, Partition #1 Partition Disk #117, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #110, Partition #2 Partition Disk #117, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE111 Description \\.\PHYSICALDRIVE118 Manufacturer Not Available Manufacturer Not Available HP TPC-H FULL DISCLOSURE REPORT 73 © 2005 Hewlett-Packard Company. All rights reserved. Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE169 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #118, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #118, Partition #1 Partition Disk #169, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #118, Partition #2 Partition Disk #169, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE119 Description \\.\PHYSICALDRIVE170 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #119, Partition #0 Partition Disk #170, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #119, Partition #1 Partition Disk #170, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #170, Partition #2 Description \\.\PHYSICALDRIVE168 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE171 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #168, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #168, Partition #1 Partition Disk #171, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #168, Partition #2 Partition Disk #171, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes HP TPC-H FULL DISCLOSURE REPORT 74 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #166, Partition #2 Description \\.\PHYSICALDRIVE164 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE167 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #164, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #164, Partition #1 Partition Disk #167, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #164, Partition #2 Partition Disk #167, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE165 Description \\.\PHYSICALDRIVE8 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #165, Partition #0 Partition Disk #8, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #165, Partition #1 Partition Disk #8, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #8, Partition #2 Description \\.\PHYSICALDRIVE166 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE9 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #166, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #166, Partition #1 Partition Disk #9, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes HP TPC-H FULL DISCLOSURE REPORT 75 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #9, Partition #1 Partition Disk #80, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #80, Partition #2 Description \\.\PHYSICALDRIVE10 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE81 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #10, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #10, Partition #1 Partition Disk #81, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #10, Partition #2 Partition Disk #81, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE11 Description \\.\PHYSICALDRIVE82 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #11, Partition #0 Partition Disk #82, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #11, Partition #1 Partition Disk #82, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #82, Partition #2 Description \\.\PHYSICALDRIVE80 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE83 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #80, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 HP TPC-H FULL DISCLOSURE REPORT 76 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #83, Partition #0 Partition Disk #178, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #83, Partition #1 Partition Disk #178, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #178, Partition #2 Description \\.\PHYSICALDRIVE176 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE179 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #176, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #176, Partition #1 Partition Disk #179, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #176, Partition #2 Partition Disk #179, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE177 Description \\.\PHYSICALDRIVE84 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #177, Partition #0 Partition Disk #84, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #177, Partition #1 Partition Disk #84, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #84, Partition #2 Description \\.\PHYSICALDRIVE178 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE85 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 HP TPC-H FULL DISCLOSURE REPORT 77 © 2005 Hewlett-Packard Company. All rights reserved. Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #85, Partition #0 Partition Disk #172, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #85, Partition #1 Partition Disk #172, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #172, Partition #2 Description \\.\PHYSICALDRIVE86 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE173 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #86, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #86, Partition #1 Partition Disk #173, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #86, Partition #2 Partition Disk #173, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE87 Description \\.\PHYSICALDRIVE174 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #87, Partition #0 Partition Disk #174, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #87, Partition #1 Partition Disk #174, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #174, Partition #2 Description \\.\PHYSICALDRIVE172 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE175 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available HP TPC-H FULL DISCLOSURE REPORT 78 © 2005 Hewlett-Packard Company. All rights reserved. Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #175, Partition #0 Partition Disk #58, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #175, Partition #1 Partition Disk #58, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #58, Partition #2 Description \\.\PHYSICALDRIVE56 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE59 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #56, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #56, Partition #1 Partition Disk #59, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #56, Partition #2 Partition Disk #59, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE57 Description \\.\PHYSICALDRIVE184 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #57, Partition #0 Partition Disk #184, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #57, Partition #1 Partition Disk #184, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #184, Partition #2 Description \\.\PHYSICALDRIVE58 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE185 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available HP TPC-H FULL DISCLOSURE REPORT 79 © 2005 Hewlett-Packard Company. All rights reserved. SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #185, Partition #0 Partition Disk #52, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #185, Partition #1 Partition Disk #52, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #52, Partition #2 Description \\.\PHYSICALDRIVE186 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE53 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #186, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #186, Partition #1 Partition Disk #53, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #186, Partition #2 Partition Disk #53, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE187 Description \\.\PHYSICALDRIVE54 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #187, Partition #0 Partition Disk #54, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #187, Partition #1 Partition Disk #54, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #54, Partition #2 Description \\.\PHYSICALDRIVE52 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE55 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes HP TPC-H FULL DISCLOSURE REPORT 80 © 2005 Hewlett-Packard Company. All rights reserved. Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #55, Partition #0 Partition Disk #14, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #55, Partition #1 Partition Disk #14, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #14, Partition #2 Description \\.\PHYSICALDRIVE12 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE15 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #12, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #12, Partition #1 Partition Disk #15, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #12, Partition #2 Partition Disk #15, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE13 Description \\.\PHYSICALDRIVE16 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #13, Partition #0 Partition Disk #16, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #13, Partition #1 Partition Disk #16, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #16, Partition #2 Description \\.\PHYSICALDRIVE14 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE17 Media Loaded Yes Manufacturer Not Available HP TPC-H FULL DISCLOSURE REPORT 81 © 2005 Hewlett-Packard Company. All rights reserved. Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #17, Partition #0 Partition Disk #148, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #17, Partition #1 Partition Disk #148, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #148, Partition #2 Description \\.\PHYSICALDRIVE18 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE149 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #18, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #18, Partition #1 Partition Disk #149, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #18, Partition #2 Partition Disk #149, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE19 Description \\.\PHYSICALDRIVE150 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #19, Partition #0 Partition Disk #150, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #19, Partition #1 Partition Disk #150, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #150, Partition #2 Description \\.\PHYSICALDRIVE148 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes HP TPC-H FULL DISCLOSURE REPORT 82 © 2005 Hewlett-Packard Company. All rights reserved. Description \\.\PHYSICALDRIVE151 Description \\.\PHYSICALDRIVE146 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #151, Partition #0 Partition Disk #146, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #151, Partition #1 Partition Disk #146, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #146, Partition #2 Description \\.\PHYSICALDRIVE144 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE147 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #144, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #144, Partition #1 Partition Disk #147, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #144, Partition #2 Partition Disk #147, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE145 Description \\.\PHYSICALDRIVE36 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #145, Partition #0 Partition Disk #36, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #145, Partition #1 Partition Disk #36, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes HP TPC-H FULL DISCLOSURE REPORT 83 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #36, Partition #2 Partition Disk #39, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE37 Description \\.\PHYSICALDRIVE72 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #37, Partition #0 Partition Disk #72, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes Partition Disk #37, Partition #1 Partition Disk #72, Partition #1 Partition Size 95.94 GB (103,010,236,928 bytes) Partition Size 28.32 GB (30,408,704,000 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 51,516,538,880 bytes Partition Disk #72, Partition #2 Description \\.\PHYSICALDRIVE38 Partition Size 31.12 GB (33,418,117,120 bytes) Manufacturer Not Available Partition Starting Offset 81,925,242,880 bytes Model Not Available Bytes/Sector 512 Description \\.\PHYSICALDRIVE73 Media Loaded Yes Manufacturer Not Available Media Type Fixed hard disk Model Not Available Partitions 3 Bytes/Sector 512 SCSI Bus Not Available Media Loaded Yes SCSI Logical Unit Not Available Media Type Fixed hard disk SCSI PortNot Available Partitions 2 SCSI Target ID Not Available SCSI Bus Not Available Sectors/Track 63 SCSI Logical Unit Not Available Size 107.42 GB (115,343,101,440 bytes) SCSI PortNot Available Total Cylinders 14,023 SCSI Target ID Not Available Total Sectors 225,279,495 Sectors/Track 63 Total Tracks 3,575,865 Size 96.05 GB (103,136,785,920 bytes) Tracks/Cylinder 255 Total Cylinders 12,539 Partition Disk #38, Partition #0 Total Sectors 201,439,035 Partition Size 47.85 GB (51,380,224,000 bytes) Total Tracks 3,197,445 Partition Starting Offset 136,314,880 bytes Tracks/Cylinder 255 Partition Disk #38, Partition #1 Partition Disk #73, Partition #0 Partition Size 28.32 GB (30,408,704,000 bytes) Partition Size 1.00 MB (1,048,576 bytes) Partition Starting Offset 51,516,538,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #38, Partition #2 Partition Disk #73, Partition #1 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 95.94 GB (103,010,236,928 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 134,235,136 bytes

Description \\.\PHYSICALDRIVE39 Description \\.\PHYSICALDRIVE74 Manufacturer Not Available Manufacturer Not Available Model Not Available Model Not Available Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 2 Partitions 3 SCSI Bus Not Available SCSI Bus Not Available SCSI Logical Unit Not Available SCSI Logical Unit Not Available SCSI PortNot Available SCSI PortNot Available SCSI Target ID Not Available SCSI Target ID Not Available Sectors/Track 63 Sectors/Track 63 Size 96.05 GB (103,136,785,920 bytes) Size 107.42 GB (115,343,101,440 bytes) Total Cylinders 12,539 Total Cylinders 14,023 Total Sectors 201,439,035 Total Sectors 225,279,495 Total Tracks 3,197,445 Total Tracks 3,575,865 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #39, Partition #0 Partition Disk #74, Partition #0 Partition Size 1.00 MB (1,048,576 bytes) Partition Size 47.85 GB (51,380,224,000 bytes) Partition Starting Offset 17,408 bytes Partition Starting Offset 136,314,880 bytes HP TPC-H FULL DISCLOSURE REPORT 84 © 2005 Hewlett-Packard Company. All rights reserved. Partition Disk #74, Partition #1 Total Sectors 35,551,845 Partition Size 28.32 GB (30,408,704,000 bytes) Total Tracks 564,315 Partition Starting Offset 51,516,538,880 bytes Tracks/Cylinder 255 Partition Disk #74, Partition #2 Partition Disk #194, Partition #0 Partition Size 31.12 GB (33,418,117,120 bytes) Partition Size 100.00 MB (104,857,600 bytes) Partition Starting Offset 81,925,242,880 bytes Partition Starting Offset 17,408 bytes Partition Disk #194, Partition #1 Description \\.\PHYSICALDRIVE75 Partition Size 400.00 MB (419,430,400 bytes) Manufacturer Not Available Partition Starting Offset 104,875,008 bytes Model Not Available Partition Disk #194, Partition #2 Bytes/Sector 512 Partition Size 16.34 GB (17,544,657,408 bytes) Media Loaded Yes Partition Starting Offset 658,523,136 bytes Media Type Fixed hard disk Partitions 2 Description Disk drive SCSI Bus Not Available Manufacturer (Standard disk drives) SCSI Logical Unit Not Available Model HP LOGICAL VOLUME SCSI Disk Device SCSI PortNot Available Bytes/Sector 512 SCSI Target ID Not Available Media Loaded Yes Sectors/Track 63 Media Type Fixed hard disk Size 96.05 GB (103,136,785,920 bytes) Partitions 0 Total Cylinders 12,539 SCSI Bus 0 Total Sectors 201,439,035 SCSI Logical Unit 0 Total Tracks 3,197,445 SCSI Port4 Tracks/Cylinder 255 SCSI Target ID 5 Partition Disk #75, Partition #0 Sectors/Track 63 Partition Size 1.00 MB (1,048,576 bytes) Size 16.95 GB (18,202,544,640 bytes) Partition Starting Offset 17,408 bytes Total Cylinders 2,213 Partition Disk #75, Partition #1 Total Sectors 35,551,845 Partition Size 95.94 GB (103,010,236,928 bytes) Total Tracks 564,315 Partition Starting Offset 134,235,136 bytes Tracks/Cylinder 255

Description Disk drive Description Disk drive Manufacturer (Standard disk drives) Manufacturer (Standard disk drives) Model MSA1000 VOLUME SCSI Disk Device Model HP LOGICAL VOLUME SCSI Disk Device Bytes/Sector 512 Bytes/Sector 512 Media Loaded Yes Media Loaded Yes Media Type Fixed hard disk Media Type Fixed hard disk Partitions 4 Partitions 1 SCSI Bus 0 SCSI Bus 0 SCSI Logical Unit 1 SCSI Logical Unit 0 SCSI Port0 SCSI Port4 SCSI Target ID 0 SCSI Target ID 6 Sectors/Track 63 Sectors/Track 63 Size 546.93 GB (587,260,316,160 bytes) Size 33.91 GB (36,413,314,560 bytes) Total Cylinders 71,397 Total Cylinders 4,427 Total Sectors 1,146,992,805 Total Sectors 71,119,755 Total Tracks 18,206,235 Total Tracks 1,128,885 Tracks/Cylinder 255 Tracks/Cylinder 255 Partition Disk #193, Partition #0 Partition Disk #196, Partition #0 Partition Size 351.56 GB (377,487,360,000 bytes) Partition Size 33.79 GB (36,279,681,024 bytes) Partition Starting Offset 134,235,136 bytes Partition Starting Offset 134,235,136 bytes Partition Disk #193, Partition #1 Partition Size 107.42 GB (115,344,408,576 bytes) Description Disk drive Partition Starting Offset 377,621,595,136 bytes Manufacturer (Standard disk drives) Partition Disk #193, Partition #2 Model HP LOGICAL VOLUME SCSI Disk Device Partition Size 48.83 GB (52,428,800,000 bytes) Bytes/Sector 512 Partition Starting Offset 492,967,034,880 bytes Media Loaded Yes Partition Disk #193, Partition #3 Media Type Fixed hard disk Partition Size 38.99 GB (41,864,396,800 bytes) Partitions 0 Partition Starting Offset 545,395,834,880 bytes SCSI Bus 0 SCSI Logical Unit 0 Description Disk drive SCSI Port4 Manufacturer (Standard disk drives) SCSI Target ID 7 Model HP LOGICAL VOLUME SCSI Disk Device Sectors/Track 63 Bytes/Sector 512 Size 33.91 GB (36,413,314,560 bytes) Media Loaded Yes Total Cylinders 4,427 Media Type Fixed hard disk Total Sectors 71,119,755 Partitions 3 Total Tracks 1,128,885 SCSI Bus 0 Tracks/Cylinder 255 SCSI Logical Unit 0 SCSI Port4 Description Disk drive SCSI Target ID 4 Manufacturer (Standard disk drives) Sectors/Track 63 Model HP 18.2G ST318452LC SCSI Disk Device Size 16.95 GB (18,202,544,640 bytes) Bytes/Sector 512 Total Cylinders 2,213 Media Loaded Yes HP TPC-H FULL DISCLOSURE REPORT 85 © 2005 Hewlett-Packard Company. All rights reserved. Media Type Fixed hard disk Memory Address 0xD8042000-0xD8043FFF Partitions 3 IRQ Channel IRQ 58 SCSI Bus 0 Driver c:\windows\system32\drivers\sym_hi.sys (4.16.04.00 SCSI Logical Unit 0 (NT.041001-1408), 67.00 KB (68,608 bytes), 9/30/2005 6:06 PM) SCSI Port1 SCSI Target ID 0 Sectors/Track 63 Name Smart Array 6400 Controller (Non-Miniport) Size 16.95 GB (18,202,544,640 bytes) Manufacturer Hewlett-Packard Total Cylinders 2,213 Status OK Total Sectors 35,551,845 PNP Device ID Total Tracks 564,315 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Tracks/Cylinder 255 V_01\6&30B60401&0&2008 Partition Disk #192, Partition #0 Memory Address 0xF0080000-0xF0081FFF Partition Size 100.00 MB (104,857,600 bytes) I/O Port 0x00006000-0x00007FFF Partition Starting Offset 17,408 bytes Memory Address 0xF0040000-0xF007FFFF Partition Disk #192, Partition #1 IRQ Channel IRQ 79 Partition Size 399.99 MB (419,423,744 bytes) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Partition Starting Offset 104,875,008 bytes built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Partition Disk #192, Partition #2 AM) Partition Size 15.63 GB (16,777,216,512 bytes) Partition Starting Offset 658,516,992 bytes Name Smart Array 6400 Controller (Non-Miniport) Manufacturer Hewlett-Packard [SCSI] Status OK PNP Device ID Item Value PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller V_01\6&7E3BA13&0&2008 Manufacturer Hewlett-Packard Company Memory Address 0xE0080000-0xE009FFFF Status OK I/O Port 0x0000C000-0x0000DFFF PNP Device ID Memory Address 0xE0040000-0xE007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 134 V_01\6&2027FCD0&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xC8080000-0xC8081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x00001000-0x00001FFF AM) Memory Address 0xC8040000-0xC807FFFF IRQ Channel IRQ 35 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\cpqcissm.sys (5.62.0.64 Manufacturer Hewlett-Packard Build 2 (ia64) built by: Hewlett-Packard, 50.00 KB (51,200 bytes), Status OK 9/8/2005 12:18 PM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name LSI Logic 53C1010-66 Device V_01\6&B8B6E61&0&2008 Manufacturer LSI Logic Inc. Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x0000E000-0x0000FFFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_1000&DEV_0021&SUBSYS_1330103C&RE IRQ Channel IRQ 145 V_01\5&18833AF&0&08 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00002000-0x00002FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xD0022000-0xD00223FF AM) Memory Address 0xD0020000-0xD0021FFF IRQ Channel IRQ 46 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\sym_u3.sys (5.09.06.00 Manufacturer Hewlett-Packard (NT.041001-1408), 73.00 KB (74,752 bytes), 9/21/2005 4:05 PM) Status OK PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name LSI Logic 53C896 Device V_01\6&11EA3ED1&0&2008 Manufacturer LSI Logic Inc. Memory Address 0xE0080000-0xE009FFFF Status OK I/O Port 0x00004000-0x00005FFF PNP Device ID Memory Address 0xE0040000-0xE007FFFF PCI\VEN_1000&DEV_000B&SUBSYS_10F6103C&RE IRQ Channel IRQ 208 V_07\5&38EDBD97&0&08 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00003000-0x00003FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xD8044000-0xD80443FF AM) Memory Address 0xD8040000-0xD8041FFF IRQ Channel IRQ 57 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\sym_hi.sys (4.16.04.00 Manufacturer Hewlett-Packard (NT.041001-1408), 67.00 KB (68,608 bytes), 9/30/2005 6:06 PM) Status OK PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name LSI Logic 53C896 Device V_01\6&1D793F41&0&2008 Manufacturer LSI Logic Inc. Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x00006000-0x00007FFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_1000&DEV_000B&SUBSYS_10F6103C&RE IRQ Channel IRQ 219 V_07\5&38EDBD97&0&09 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00003100-0x000031FF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xD8045000-0xD80453FF AM) HP TPC-H FULL DISCLOSURE REPORT 86 © 2005 Hewlett-Packard Company. All rights reserved. PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&1245B283&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF PNP Device ID I/O Port 0x00006000-0x00007FFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xF0040000-0xF007FFFF V_01\6&27A7D842&0&2008 IRQ Channel IRQ 499 Memory Address 0xF0080000-0xF0081FFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x0000E000-0x0000FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xF0040000-0xF007FFFF AM) IRQ Channel IRQ 285 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&27277C64&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF PNP Device ID I/O Port 0x0000E000-0x0000FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xF0040000-0xF007FFFF V_01\6&3F8D11E&0&2008 IRQ Channel IRQ 565 Memory Address 0xF0080000-0xF0081FFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00006000-0x00007FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xF0040000-0xF007FFFF AM) IRQ Channel IRQ 359 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&7E57A38&0&2008 Status OK Memory Address 0xE0080000-0xE009FFFF PNP Device ID I/O Port 0x00004000-0x00005FFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xE0040000-0xE007FFFF V_01\6&2A693B4F&0&2008 IRQ Channel IRQ 628 Memory Address 0xE0080000-0xE009FFFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x0000C000-0x0000DFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xE0040000-0xE007FFFF AM) IRQ Channel IRQ 414 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&32E3B72F&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF PNP Device ID I/O Port 0x00006000-0x00007FFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xF0040000-0xF007FFFF V_01\6&1ADDC34E&0&2008 IRQ Channel IRQ 639 Memory Address 0xF0080000-0xF0081FFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x0000E000-0x0000FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xF0040000-0xF007FFFF AM) IRQ Channel IRQ 425 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&1D662FDD&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF PNP Device ID I/O Port 0x0000E000-0x0000FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xF0040000-0xF007FFFF V_01\6&254291F3&0&2008 IRQ Channel IRQ 705 Memory Address 0xE0080000-0xE009FFFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00004000-0x00005FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xE0040000-0xE007FFFF AM) IRQ Channel IRQ 488 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&1A4A5DE5&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF I/O Port 0x00006000-0x00007FFF HP TPC-H FULL DISCLOSURE REPORT 87 © 2005 Hewlett-Packard Company. All rights reserved. Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 779 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&2E866412&0&2008 Manufacturer Hewlett-Packard Memory Address 0xE0080000-0xE009FFFF Status OK I/O Port 0x00004000-0x00005FFF PNP Device ID Memory Address 0xE0040000-0xE007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1048 V_01\6&11924964&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xE0080000-0xE009FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000C000-0x0000DFFF AM) Memory Address 0xE0040000-0xE007FFFF IRQ Channel IRQ 834 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&5008982&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x00006000-0x00007FFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1059 V_01\6&2D909473&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000E000-0x0000FFFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 845 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&20B95737&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x0000E000-0x0000FFFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1125 V_01\6&56B183C&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x00006000-0x00007FFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 919 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&8FDA64E&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x00006000-0x00007FFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1199 V_01\6&2DA307DA&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xE0080000-0xE009FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000C000-0x0000DFFF AM) Memory Address 0xE0040000-0xE007FFFF IRQ Channel IRQ 974 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&2E7F504&0&2008 Manufacturer Hewlett-Packard Memory Address 0xE0080000-0xE009FFFF Status OK I/O Port 0x0000C000-0x0000DFFF PNP Device ID Memory Address 0xE0040000-0xE007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1254 V_01\6&268A2E2C&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000E000-0x0000FFFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 985 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) HP TPC-H FULL DISCLOSURE REPORT 88 © 2005 Hewlett-Packard Company. All rights reserved. PNP Device ID Memory Address 0xE0040000-0xE007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1534 V_01\6&1F5E8437&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000E000-0x0000FFFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 1265 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&1392A499&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x0000E000-0x0000FFFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1545 V_01\6&29499EEE&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xE0080000-0xE009FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x00004000-0x00005FFF AM) Memory Address 0xE0040000-0xE007FFFF IRQ Channel IRQ 1328 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&34DE441&0&2008 Manufacturer Hewlett-Packard Memory Address 0xE0080000-0xE009FFFF Status OK I/O Port 0x00004000-0x00005FFF PNP Device ID Memory Address 0xE0040000-0xE007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1608 V_01\6&E2C15A5&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x00006000-0x00007FFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 1339 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&33CF7C25&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x00006000-0x00007FFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1619 V_01\6&2FD486&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000E000-0x0000FFFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 1405 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&1DAC117C&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x0000E000-0x0000FFFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1685 V_01\6&F54B257&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xF0080000-0xF0081FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x00006000-0x00007FFF AM) Memory Address 0xF0040000-0xF007FFFF IRQ Channel IRQ 1479 Name Smart Array 6400 Controller (Non-Miniport) Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Manufacturer Hewlett-Packard built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Status OK AM) PNP Device ID PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Name Smart Array 6400 Controller (Non-Miniport) V_01\6&2C5BCFD8&0&2008 Manufacturer Hewlett-Packard Memory Address 0xF0080000-0xF0081FFF Status OK I/O Port 0x00006000-0x00007FFF PNP Device ID Memory Address 0xF0040000-0xF007FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE IRQ Channel IRQ 1759 V_01\6&1D9779E8&0&2008 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Memory Address 0xE0080000-0xE009FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 I/O Port 0x0000C000-0x0000DFFF AM) HP TPC-H FULL DISCLOSURE REPORT 89 © 2005 Hewlett-Packard Company. All rights reserved. PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_10DF&DEV_F980&SUBSYS_F98010DF&RE Manufacturer Hewlett-Packard V_01\5&7C4B2E9&0&08 Status OK Memory Address 0xE0000000-0xEFFFFFFF PNP Device ID Memory Address 0xE0001000-0xE00010FF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE I/O Port 0x00004000-0x00005FFF V_01\6&2A94F18F&0&2008 IRQ Channel IRQ 2028 Memory Address 0xE0080000-0xE009FFFF Driver c:\windows\system32\drivers\elxstor.sys (6-1.11A0 I/O Port 0x0000C000-0x0000DFFF 5/6/2005 WS2K3 64 bit IA64 built by: WinDDK, 706.00 KB Memory Address 0xE0040000-0xE007FFFF (722,944 bytes), 1/31/2005 2:01 PM) IRQ Channel IRQ 1814 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&1EE377EE&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF PNP Device ID I/O Port 0x00006000-0x00007FFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xF0040000-0xF007FFFF V_01\6&1AD86F4B&0&2008 IRQ Channel IRQ 2039 Memory Address 0xF0080000-0xF0081FFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x0000E000-0x0000FFFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xF0040000-0xF007FFFF AM) IRQ Channel IRQ 1825 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&F080726&0&2008 Status OK Memory Address 0xE0080000-0xE009FFFF PNP Device ID I/O Port 0x0000C000-0x0000DFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xE0040000-0xE007FFFF V_01\6&32DF8DD&0&2008 IRQ Channel IRQ 2094 Memory Address 0xE0080000-0xE009FFFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00004000-0x00005FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xE0040000-0xE007FFFF AM) IRQ Channel IRQ 1888 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&3938F52B&0&2008 Status OK Memory Address 0xF0080000-0xF0081FFF PNP Device ID I/O Port 0x0000E000-0x0000FFFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xF0040000-0xF007FFFF V_01\6&A54E083&0&2008 IRQ Channel IRQ 2105 Memory Address 0xF0080000-0xF0081FFF Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 I/O Port 0x00006000-0x00007FFF built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Memory Address 0xF0040000-0xF007FFFF AM) IRQ Channel IRQ 1899 Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 Name Smart Array 6400 Controller (Non-Miniport) built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 Manufacturer Hewlett-Packard AM) Status OK PNP Device ID Name Smart Array 6400 Controller (Non-Miniport) PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Manufacturer Hewlett-Packard V_01\6&2F746F0B&0&2008 Status OK Memory Address 0xE0080000-0xE009FFFF PNP Device ID I/O Port 0x00004000-0x00005FFF PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Memory Address 0xE0040000-0xE007FFFF V_01\6&10B98E28&0&2008 IRQ Channel IRQ 2168 Memory Address 0xF0080000-0xF0081FFF I/O Port 0x0000E000-0x0000FFFF Name Smart Array 6400 Controller (Non-Miniport) Memory Address 0xF0040000-0xF007FFFF Manufacturer Hewlett-Packard IRQ Channel IRQ 1965 Status OK Driver c:\windows\system32\drivers\hpqcissb.sys (5.15.64.64 PNP Device ID built by: WinDDK, 113.00 KB (115,712 bytes), 9/20/2005 11:20 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE AM) V_01\6&24BE4FB5&0&2008 Memory Address 0xF0080000-0xF0081FFF Name Emulex LightPulse LP9802, PCI Slot 11104, Storport I/O Port 0x00006000-0x00007FFF Miniport Driver Memory Address 0xF0040000-0xF007FFFF Manufacturer Emulex IRQ Channel IRQ 2179 Status OK HP TPC-H FULL DISCLOSURE REPORT 90 © 2005 Hewlett-Packard Company. All rights reserved. Name Smart Array 6400 Controller (Non-Miniport) Kernel Driver No Manual Stopped OK Manufacturer Hewlett-Packard Normal No No Status OK atapi atapi c:\windows\system32\drivers\atapi.sys PNP Device ID Kernel Driver No Disabled Stopped OK PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Normal No No V_01\6&2F38BEB&0&2008 atdisk Atdisk Not Available Kernel Driver No Memory Address 0xF0080000-0xF0081FFF Disabled Stopped OK Ignore No No I/O Port 0x0000E000-0x0000FFFF Memory Address 0xF0040000-0xF007FFFF atmarpc ATM ARP Client Protocol IRQ Channel IRQ 2245 c:\windows\system32\drivers\atmarpc.sys Kernel Driver No Manual Stopped OK [IDE] Normal No No audstub Audio Stub Driver Item Value c:\windows\system32\drivers\audstub.sys Kernel Driver Yes Manual Running OK [Printing] Normal No Yes beep Beep c:\windows\system32\drivers\beep.sys Name Driver Port Name Server Name Kernel Driver Yes System Running OK Normal No Yes [Problem Devices] cbidf2k cbidf2k c:\windows\system32\drivers\cbidf2k.sys Kernel Driver No Disabled Stopped OK Device PNP Device ID Error Code Normal No No cdfs Cdfs c:\windows\system32\drivers\cdfs.sys File [USB] System Driver Yes Disabled Running OK Normal No Yes Device PNP Device ID cdrom CD-ROM Driver c:\windows\system32\drivers\cdrom.sys Kernel Driver [Software Environment] Yes System Running OK Normal No Yes changer Changer Not Available Kernel Driver No System Stopped OK Ignore No No [System Drivers] clusdisk Cluster Disk Driver Name Description File Type Started Start c:\windows\system32\drivers\clusdisk.sys Mode State Status Error Control Accept Pause Kernel Driver No Disabled Stopped OK Accept Stop Normal No No 4mmdat 4mmdat c:\windows\system32\drivers\4mmdat.sys cmdide CmdIde Not Available Kernel Driver No Kernel Driver Yes Manual Running OK Disabled Stopped OK Normal No No Normal No Yes abiosdsk Abiosdsk Not Available Kernel Driver No cpqarry2 cpqarry2 Not Available Kernel Driver No Disabled Stopped OK Ignore No No Disabled Stopped OK Normal No No acpi Microsoft ACPI Driver cpqcisse CPQCISSE c:\windows\system32\drivers\acpi.sys Kernel Driver c:\windows\system32\drivers\cpqcisse.sys Yes Boot Running OK Normal No Kernel Driver Yes Manual Running OK Yes Normal No Yes acpiec ACPIEC c:\windows\system32\drivers\acpiec.sys cpqcissm cpqcissm c:\windows\system32\drivers\cpqcissm.sys Kernel Driver No Disabled Stopped OK Kernel Driver Yes Boot Running OK Normal No No Normal No Yes adpu160m adpu160m Not Available cpqfcalm cpqfcalm Not Available Kernel Driver No Kernel Driver No Disabled Stopped OK Disabled Stopped OK Normal No No Normal No No adpu320 adpu320 Not Available Kernel Driver No crcdisk CRC Disk Filter Driver Disabled Stopped OK Normal No No c:\windows\system32\drivers\crcdisk.sysKernel Driver Yes Boot Running OK Normal No afcnt afcnt Not Available Kernel Driver No Yes Disabled Stopped OK Normal No No dfsdriver DfsDriver c:\windows\system32\drivers\dfs.sys File System Driver Yes Boot Running OK afd AFD c:\windows\system32\drivers\afd.sys Normal No Yes Kernel Driver Yes System Running OK disk Disk Driver Normal No Yes c:\windows\system32\drivers\disk.sys Kernel Driver aic78u2 aic78u2 Not Available Kernel Driver No Yes Boot Running OK Normal No Disabled Stopped OK Normal No No Yes dmboot dmboot c:\windows\system32\drivers\dmboot.sys aic78xx aic78xx Not Available Kernel Driver No Kernel Driver Yes Disabled Running OK Disabled Stopped OK Normal No No Normal No Yes dmio Logical Disk Manager Driver aliide AliIde Not Available Kernel Driver No c:\windows\system32\drivers\dmio.sys Kernel Driver Disabled Stopped OK Normal No No Yes Boot Running OK Normal No Yes arc arc Not Available Kernel Driver No dmload dmload c:\windows\system32\drivers\dmload.sys Disabled Stopped OK Normal No No Kernel Driver Yes Boot Running OK Normal No Yes asyncmac RAS Asynchronous Media Driver c:\windows\system32\drivers\asyncmac.sys HP TPC-H FULL DISCLOSURE REPORT 91 © 2005 Hewlett-Packard Company. All rights reserved. dpti2o dpti2o Not Available Kernel Driver No ip6fw IPv6 Windows Firewall Driver Disabled Stopped OK Normal No No c:\windows\system32\drivers\ip6fw.sys Kernel Driver No Manual Stopped OK Normal No e1000 Intel(R) PRO/1000 Device Driver No c:\windows\system32\drivers\e1000645.sys ipfilterdriver IP Traffic Filter Driver Kernel Driver Yes Manual Running OK c:\windows\system32\drivers\ipfltdrv.sys Kernel Driver Normal No Yes No Manual Stopped OK Normal No elxadjct elxadjct c:\windows\system32\drivers\elxadjct.sys No Kernel Driver Yes Boot Running OK ipinip IP in IP Tunnel Driver Normal No Yes c:\windows\system32\drivers\ipinip.sys Kernel Driver elxstor elxstor c:\windows\system32\drivers\elxstor.sys No Manual Stopped OK Normal No Kernel Driver Yes Boot Running OK No Normal No Yes ipnat IP Network Address Translator fastfat Fastfat c:\windows\system32\drivers\fastfat.sys File c:\windows\system32\drivers\ipnat.sys Kernel Driver System Driver No Disabled Stopped OK Yes Manual Running OK Normal No Normal No No Yes fdc Fdc c:\windows\system32\drivers\fdc.sys ipsec IPSEC driver Kernel Driver No System Stopped OK c:\windows\system32\drivers\ipsec.sys Kernel Driver Ignore No No Yes System Running OK Normal No fips Fips c:\windows\system32\drivers\fips.sys Yes Kernel Driver Yes System Running OK isapnp isapnp Not Available Kernel Driver No Normal No Yes Disabled Stopped OK Normal No No flpydisk Flpydisk c:\windows\system32\drivers\flpydisk.sys Kernel Driver No System Stopped OK kbdclass Keyboard Class Driver Ignore No No c:\windows\system32\drivers\kbdclass.sys fltmgr FltMgr c:\windows\system32\drivers\fltmgr.sys File Kernel Driver Yes System Running OK System Driver Yes Boot Running OK Normal No Yes Normal No Yes ksecdd KSecDD c:\windows\system32\drivers\ksecdd.sys ftdisk Volume Manager Driver Kernel Driver Yes Boot Running OK c:\windows\system32\drivers\ftdisk.sys Kernel Driver Normal No Yes Yes Boot Running OK Normal No ksthunk Kernel Streaming WOW64 Thunk Service Yes c:\windows\system32\drivers\ksthunk.sys gpc Generic Packet Classifier Kernel Driver Yes Manual Running OK c:\windows\system32\drivers\msgpc.sys Kernel Driver Normal No Yes Yes Manual Running OK Normal No lp6nds35 lp6nds35 c:\windows\system32\drivers\lp6nds35.sys Yes Kernel Driver Yes Boot Running OK hpcisss hpcisss Not Available Kernel Driver No Normal No Yes Disabled Stopped OK Normal No No mnmdd mnmdd Not Available Kernel Driver No System Stopped OK Ignore No No hpcsr HP CSR OpRegion Driver c:\windows\system32\drivers\hpcsr.sys Kernel Driver modem Modem c:\windows\system32\drivers\modem.sys Yes Boot Running OK Normal No Kernel Driver No Manual Stopped OK Yes Ignore No No hphlth HP Baseboard Management Controller Interface Driver mouclass Mouse Class Driver c:\windows\system32\drivers\hphlth.sys Kernel Driver c:\windows\system32\drivers\mouclass.sys Yes Manual Running OK Normal No Kernel Driver Yes System Running OK Yes Normal No Yes hpn hpn Not Available Kernel Driver No mountmgr Mount Point Manager Disabled Stopped OK Normal No No c:\windows\system32\drivers\mountmgr.sys Kernel Driver Yes Boot Running OK hpqcissb Smart Array Controllers Non-Miniport Bus Driver Normal No Yes c:\windows\system32\drivers\hpqcissb.sys mraid35x mraid35x Not Available Kernel Driver No Kernel Driver Yes Boot Running OK Disabled Stopped OK Normal No No Normal No Yes hpqcissd Smart Array Controllers Non-Miniport Disk Driver mr xdav WebDav Client Redirector c:\windows\system32\drivers\hpqcissd.sys c:\windows\system32\drivers\mr xdav.sys File Kernel Driver Yes Boot Running OK System Driver No Manual Stopped OK Normal No Yes Normal No No http HTTP c:\windows\system32\drivers\http.sys mr xsmb MRXSMB c:\windows\system32\drivers\mr xsmb.sys Kernel Driver No Manual Stopped OK File System Driver Yes System Running OK Normal No No Normal No Yes i2omgmt i2omgmt Not Available Kernel Driver No msfs Msfs c:\windows\system32\drivers\msfs.sys File System Stopped OK Normal No No System Driver Yes System Running OK Normal No Yes iirsp iirsp Not Available Kernel Driver No mssmbios Microsoft System Management BIOS Driver Disabled Stopped OK Normal No No c:\windows\system32\drivers\mssmbios.sys Kernel Driver Yes Manual Running OK imapi CD-Burning Filter Driver Normal No Yes c:\windows\system32\drivers\imapi.sys Kernel Driver mup Mup c:\windows\system32\drivers\mup.sys File No System Stopped OK Normal No System Driver Yes Boot Running OK No Normal No Yes intelide IntelIde Not Available Kernel Driver No ndis NDIS System Driver Disabled Stopped OK Normal No No c:\windows\system32\drivers\ndis.sys Kernel Driver Yes Boot Running OK Normal No Yes HP TPC-H FULL DISCLOSURE REPORT 92 © 2005 Hewlett-Packard Company. All rights reserved. ndistapi Remote Access NDIS TAPI Driver ql1080 ql1080 Not Available Kernel Driver No c:\windows\system32\drivers\ndistapi.sys Disabled Stopped OK Normal No No Kernel Driver Yes Manual Running OK Normal No Yes ql12160 ql12160 Not Available Kernel Driver No ndisuio NDIS Usermode I/O Protocol Disabled Stopped OK Normal No No c:\windows\system32\drivers\ndisuio.sysKernel Driver Yes Manual Running OK Normal No ql1240 ql1240 Not Available Kernel Driver No Yes Disabled Stopped OK Normal No No ndiswan Remote Access NDIS WAN Driver c:\windows\system32\drivers\ndiswan.sys ql1280 ql1280 Not Available Kernel Driver No Kernel Driver Yes Manual Running OK Disabled Stopped OK Normal No No Normal No Yes ndproxy NDIS Proxy ql2200 ql2200 Not Available Kernel Driver No c:\windows\system32\drivers\ndproxy.sys Disabled Stopped OK Normal No No Kernel Driver Yes Manual Running OK Normal No Yes ql2300 ql2300 Not Available Kernel Driver No netbios NetBIOS Interface Disabled Stopped OK Normal No No c:\windows\system32\drivers\netbios.sys File System Driver Yes System Running OK rasacd Remote Access Auto Connection Driver Normal No Yes c:\windows\system32\drivers\rasacd.sys Kernel Driver netbt NetBios over Tcpip Yes System Running OK Normal No c:\windows\system32\drivers\netbt.sys Kernel Driver Yes Yes System Running OK Normal No rasl2tp WAN Miniport (L2TP) Yes c:\windows\system32\drivers\rasl2tp.sys Kernel Driver nfrd960 nfrd960 Not Available Kernel Driver No Yes Manual Running OK Normal No Disabled Stopped OK Normal No No Yes raspppoe Remote Access PPPOE Driver npfs Npfs c:\windows\system32\drivers\npfs.sys File c:\windows\system32\drivers\raspppoe.sys System Driver Yes System Running OK Kernel Driver Yes Manual Running OK Normal No Yes Normal No Yes ntfs Ntfs c:\windows\system32\drivers\ntfs.sys File raspti Direct Parallel System Driver Yes Disabled Running OK c:\windows\system32\drivers\raspti.sys Kernel Driver Normal No Yes Yes Manual Running OK Normal No null Null c:\windows\system32\drivers\null.sys Yes Kernel Driver Yes System Running OK rdbss Rdbss c:\windows\system32\drivers\rdbss.sys File Normal No Yes System Driver Yes System Running OK partmgr Partition Manager Normal No Yes c:\windows\system32\drivers\partmgr.sys rdpcdd RDPCDD c:\windows\system32\drivers\rdpcdd.sys Kernel Driver Yes Boot Running OK Kernel Driver Yes System Running OK Normal No Yes Ignore No Yes pci PCI Bus Driver rdpdr Ter minal Server Device Redirector Driver c:\windows\system32\drivers\pci.sys Kernel Driver c:\windows\system32\drivers\rdpdr.sys Kernel Driver Yes Boot Running OK Critical No Yes Manual Running OK Normal No Yes Yes pciide PCIIde Not Available Kernel Driver No rdpwd RDPWD c:\windows\system32\drivers\rdpwd.sys Disabled Stopped OK Normal No No Kernel Driver Yes Manual Running OK Ignore No Yes pcmcia Pcmcia c:\windows\system32\drivers\pcmcia.sys redbook Digital CD Audio Playback Filter Driver Kernel Driver No Disabled Stopped OK c:\windows\system32\drivers\redbook.sys Normal No No Kernel Driver Yes System Running OK pdcomp PDCOMP Not Available Kernel Driver No Normal No Yes Manual Stopped OK Ignore No No serial Serial c:\windows\system32\drivers\serial.sys Kernel Driver No Auto Stopped OK pdframe PDFRAME Not Available Kernel Driver Ignore No No No Manual Stopped OK Ignore No sfloppy Sfloppy c:\windows\system32\drivers\sfloppy.sys No Kernel Driver No System Stopped OK pdreli PDRELI Not Available Kernel Driver No Ignore No No Manual Stopped OK Ignore No No simbad Simbad Not Available Kernel Driver No Disabled Stopped OK Normal No No pdrframe PDRFRAME Not Available Kernel Driver No Manual Stopped OK Ignore No srv Srv c:\windows\system32\drivers\srv.sys File No System Driver Yes Manual Running OK pptpminiport WAN Miniport (PPTP) Normal No Yes c:\windows\system32\drivers\raspptp.sys swenum Software Bus Driver Kernel Driver Yes Manual Running OK c:\windows\system32\drivers\swenum.sys Normal No Yes Kernel Driver Yes Manual Running OK processor Processor Driver Normal No Yes c:\windows\system32\drivers\processr.sys symc8xx symc8xx Not Available Kernel Driver No Kernel Driver Yes Manual Running OK Disabled Stopped OK Normal No No Normal No Yes ptilink Direct Parallel Link Driver symmpi symmpi Not Available Kernel Driver No c:\windows\system32\drivers\ptilink.sys Kernel Driver Disabled Stopped OK Normal No No Yes Manual Running OK Normal No Yes

HP TPC-H FULL DISCLOSURE REPORT 93 © 2005 Hewlett-Packard Company. All rights reserved. sym_hi sym_hi c:\windows\system32\drivers\sym_hi.sys Direct Parallel Yes NET 5.2.3790.1830 Kernel Driver Yes Boot Running OK 10/1/2002Microsoft netrasa.inf Not Available Normal No Yes ROOT\MS_PTIMINIPORT\0000 sym_u3 sym_u3 c:\windows\system32\drivers\sym_u3.sys WAN Miniport (PPTP) Yes NET 5.2.3790.1830 Kernel Driver Yes Boot Running OK 10/1/2002Microsoft netrasa.inf Not Available Normal No Yes ROOT\MS_PPTPMINIPORT\0000 tcpip TCP/IP Protocol Driver WAN Miniport (PPPOE) Yes NET 5.2.3790.1830 c:\windows\system32\drivers\tcpip.sys Kernel Driver 10/1/2002Microsoft netrasa.inf Not Available Yes System Running OK Normal No ROOT\MS_PPPOEMINIPORT\0000 Yes WAN Miniport (IP) Yes NET 5.2.3790.1830 tdpipe TDPIPE c:\windows\system32\drivers\tdpipe.sys 10/1/2002Microsoft netrasa.inf Not Available Kernel Driver No Manual Stopped OK ROOT\MS_NDISWANIP\0000 Ignore No No WAN Miniport (L2TP) Yes NET 5.2.3790.1830 tdtcp TDTCP c:\windows\system32\drivers\tdtcp.sys 10/1/2002Microsoft netrasa.inf Not Available Kernel Driver Yes Manual Running OK ROOT\MS_L2TPMINIPORT\0000 Ignore No Yes Video Codecs Yes MEDIA 5.2.3790.0 termdd Ter minal Device Driver 10/1/2002(Standard system devices) wave.inf Not c:\windows\system32\drivers\termdd.sysKernel Driver Available ROOT\MEDIA\MS_MMVID Yes System Running OK Normal No Legacy Video Capture Devices Yes MEDIA Yes 5.2.3790.0 10/1/2002(Standard system toside TosIde Not Available Kernel Driver No devices) wave.inf Not Available Disabled Stopped OK Normal No No ROOT\MEDIA\MS_MMVCD Media Control Devices Yes MEDIA 5.2.3790.0 udfs Udfs c:\windows\system32\drivers\udfs.sys File 10/1/2002(Standard system devices) wave.inf Not System Driver No Disabled Stopped OK Available ROOT\MEDIA\MS_MMMCI Normal No No Legacy Audio Drivers Yes MEDIA 5.2.3790.0 vgasave VGA Display Controller. 10/1/2002(Standard system devices) wave.inf Not c:\windows\system32\drivers\vga.sys Kernel Driver Available ROOT\MEDIA\MS_MMDRV No System Stopped OK Ignore No Audio Codecs Yes MEDIA 5.2.3790.0 No 10/1/2002(Standard system devices) wave.inf Not viaide ViaIde Not Available Kernel Driver No Available ROOT\MEDIA\MS_MMACM Disabled Stopped OK Normal No No Remote Access IP ARP Driver Not Available LEGACYDRIVER Not Available Not Available volsnap Storage volumes Not Available Not Available Not Available c:\windows\system32\drivers\volsnap.sys ROOT\LEGACY_WANARP\0000 Kernel Driver Yes Boot Running OK volsnap Not Available LEGACYDRIVER Not Available Normal No Yes Not Available Not Available Not Available wanarp Remote Access IP ARP Driver Not Available ROOT\LEGACY_VOLSNAP\0000 c:\windows\system32\drivers\wanarp.sys Kernel Driver Yes Manual Running OK TDTCP Not Available LEGACYDRIVER Not Available Normal No Yes Not Available Not Available Not Available wdica WDICA Not Available Kernel Driver No Not Available ROOT\LEGACY_TDTCP\0000 Manual Stopped OK Ignore No No TCP/IP Protocol Driver Not Available wlbs Network Load Balancing LEGACYDRIVER Not Available Not Available c:\windows\system32\drivers\wlbs.sys Kernel Driver Not Available Not Available Not Available No Manual Stopped OK Normal No ROOT\LEGACY_TCPIP\0000 No sacdrv Not Available LEGACYDRIVER Not Available Not Available Not Available Not Available [Signed Drivers] Not Available ROOT\LEGACY_SACDRV\0000

Device Name Signed Device Class Driver Version RDPWD Not Available LEGACYDRIVER Not Available Driver Date Manufacturer INF Name Not Available Not Available Not Available Driver Name Device ID Not Available ROOT\LEGACY_RDPWD\0000 Microsoft System Management BIOS Driver Yes SYSTEM 5.2.3790.1830 10/1/2002(Standard RDPCDD Not Available LEGACYDRIVER Not Available system devices) machine.inf Not Available Not Available Not Available Not Available ROOT\SYSTEM\0001 Not Available ROOT\LEGACY_RDPCDD\0000 Plug and Play Software Device Enumerator Yes SYSTEM 5.2.3790.1830 10/1/2002(Standard Remote Access Auto Connection Driver Not Available system devices) machine.inf Not Available LEGACYDRIVER Not Available Not Available ROOT\SYSTEM\0000 Not Available Not Available Not Available Ter minal Server Mouse Driver Yes SYSTEM 5.2.3790.1830 ROOT\LEGACY_RASACD\0000 10/1/2002(Standard system devices) machine.inf Partition Manager Not Available LEGACYDRIVER Not Not Available ROOT\RDP_MOU\0000 Available Not Available Not Available Not Available Ter minal Server Keyboard Driver Yes SYSTEM Not Available ROOT\LEGACY_PARTMGR\0000 5.2.3790.1830 10/1/2002(Standard system devices) machine.inf Not Available Null Not Available LEGACYDRIVER Not Available ROOT\RDP_KBD\0000 Not Available Not Available Not Available Ter minal Server Device Redirector Yes SYSTEM Not Available ROOT\LEGACY_NULL\0000 5.2.3790.1830 10/1/2002(Standard system NetBios over Tcpip Not Available LEGACYDRIVER Not devices) machine.inf Not Available Available Not Available Not Available Not Available ROOT\RDPDR\0000 Not Available ROOT\LEGACY_NETBT\0000

HP TPC-H FULL DISCLOSURE REPORT 94 © 2005 Hewlett-Packard Company. All rights reserved. NDProxy Not Available LEGACYDRIVER Not Available Generic volume Yes VOLUME 5.2.3790.1830 Not Available Not Available Not Available 10/1/2002Microsoft volume.inf Not Available Not Available ROOT\LEGACY_NDPROXY\0000 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION {A44E00F6-4B98-42B9-A995-D5C2EB5BBCF9} NDIS Usermode I/O Protocol Not Available Generic volume Yes VOLUME 5.2.3790.1830 LEGACYDRIVER Not Available Not Available 10/1/2002Microsoft volume.inf Not Available Not Available Not Available Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION ROOT\LEGACY_NDISUIO\0000 {4EE78FA8-351C-11DA-B8B6-000000000000} Remote Access NDIS TAPI Driver Not Available Generic volume Yes VOLUME 5.2.3790.1830 LEGACYDRIVER Not Available Not Available 10/1/2002Microsoft volume.inf Not Available Not Available Not Available Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION ROOT\LEGACY_NDISTAPI\0000 {4BECACD4-351C-11DA-B8B6-000000000000} NDIS System DriverNot Available LEGACYDRIVER Not Generic volume Yes VOLUME 5.2.3790.1830 Available Not Available Not Available Not Available 10/1/2002Microsoft volume.inf Not Available Not Available ROOT\LEGACY_NDIS\0000 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION mountmgr Not Available LEGACYDRIVER Not {4B541528-351C-11DA-B8B6-000000000000} Available Not Available Not Available Not Available Generic volume Yes VOLUME 5.2.3790.1830 Not Available 10/1/2002Microsoft volume.inf Not Available ROOT\LEGACY_MOUNTMGR\0000 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION lp6nds35 Not Available LEGACYDRIVER Not Available {4B540B64-351C-11DA-B8B6-000000000000} Not Available Not Available Not Available Generic volume Yes VOLUME 5.2.3790.1830 Not Available ROOT\LEGACY_LP6NDS35\0000 10/1/2002Microsoft volume.inf Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION ksecdd Not Available LEGACYDRIVER Not Available {7C4CE6B7-EF0E-40EF-8C67-5D6307923B85} Not Available Not Available Not Available Generic volume Yes VOLUME 5.2.3790.1830 Not Available ROOT\LEGACY_KSECDD\0000 10/1/2002Microsoft volume.inf Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION IPSEC driver Not Available LEGACYDRIVER Not {969CAB1A-7E01-41E4-B3FE-2D78F3B36C1B} Available Not Available Not Available Not Available Generic volume Yes VOLUME 5.2.3790.1830 Not Available ROOT\LEGACY_IPSEC\0000 10/1/2002Microsoft volume.inf Not Available IP Network Address Translator Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION LEGACYDRIVER Not Available Not Available {7297468F-035E-4FE5-8349-A654192486AF} Not Available Not Available Not Available Generic volume Yes VOLUME 5.2.3790.1830 ROOT\LEGACY_IPNAT\0000 10/1/2002Microsoft volume.inf Not Available Generic Packet Classifier Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION LEGACYDRIVER Not Available Not Available {A2E40794-B4FE-469D-B76E-8C5B59C21D0A} Not Available Not Available Not Available Generic volume Yes VOLUME 5.2.3790.1830 ROOT\LEGACY_GPC\0000 10/1/2002Microsoft volume.inf Not Available Fips Not Available LEGACYDRIVER Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Not Available Not Available Not Available {CC4C69C4-B58D-11D8-BD2A-000000000000} Not Available ROOT\LEGACY_FIPS\0000 Generic volume Yes VOLUME 5.2.3790.1830 dmload Not Available LEGACYDRIVER Not Available 10/1/2002Microsoft volume.inf Not Available Not Available Not Available Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Not Available ROOT\LEGACY_DMLOAD\0000 {B3DC4904-B58D-11D8-BD2A-000000000000} Generic volume Yes VOLUME 5.2.3790.1830 dmboot Not Available LEGACYDRIVER Not Available 10/1/2002Microsoft volume.inf Not Available Not Available Not Available Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Not Available ROOT\LEGACY_DMBOOT\0000 {B3DC4260-B58D-11D8-BD2A-000000000000} Generic volume Yes VOLUME 5.2.3790.1830 CRC Disk Filter Driver Not Available 10/1/2002Microsoft volume.inf Not Available LEGACYDRIVER Not Available Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Not Available Not Available Not Available {B343C8C8-B58D-11D8-BD2A-000000000000} ROOT\LEGACY_CRCDISK\0000 Generic volume Yes VOLUME 5.2.3790.1830 Beep Not Available LEGACYDRIVER Not Available 10/1/2002Microsoft volume.inf Not Available Not Available Not Available Not Available STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Not Available ROOT\LEGACY_BEEP\0000 {08F1DFBE-3F8D-401D-8492-D759D4799C78} AFD Not Available LEGACYDRIVER Not Available Generic volume Yes VOLUME 5.2.3790.1830 Not Available Not Available Not Available 10/1/2002Microsoft volume.inf Not Available Not Available ROOT\LEGACY_AFD\0000 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {FED06C37-C14F-4E5B-92A7-F90397E38046} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7EA92187-C1C0-4156-BF9A-3753E9FE713D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {77CCA69F-FE48-4EF9-BBAB-095137292C30} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5461B318-D6BE-4BCD-9D8D-E79A51B70281} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E0427685-AAF5-4DCF-8551-16C42A812D0F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {24086282-FBF8-45A5-BAEA-4E2C82C9C8D3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {05EB2B40-24D7-4B9F-B492-80C119B5B113} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {88E4534B-436A-44A4-90EC-0862B06ED999} HP TPC-H FULL DISCLOSURE REPORT 95 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4B01E759-8149-4C5A-8D4D-910309DF92E6} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {31A76E15-F276-4BAE-96CC-A1E4265CDE41} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {31EBF678-F129-4AE2-BE20-FEB4FAA6EF92} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A0110C0C-894C-42DA-951B-AB6FF16CF14B} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {65ADE564-20BA-4C27-8CF6-0417C4F3A2B3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7F5E147E-1081-4A3A-B1FF-D0FC7A3D259D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C2C3986E-5B69-433D-A010-6E770A560E97} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EA13A5AD-883C-41E8-A876-84586CC88E0D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {19BBAC8D-F9C6-49D8-A2B7-EF92BBDF2A53} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {99641F36-281F-478D-8240-38AC905B04D6} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {22FAC2F9-6C90-41EE-A195-E5148C21FD85} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F718E36E-C069-44F9-BAA8-5A9678CB0B0D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D7050EEB-9A66-4D41-8106-8A0C8CA9EA52} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EE4811F3-6F71-412E-B6A0-A698A8F25DA6} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {20E85D11-15B9-420B-AA13-A1462F949B01} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2B891796-FE75-461B-A98C-EA9B842EACDE} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C76286B5-36D0-4A18-8114-5675A5CDB62F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E3D91B77-026F-4259-9BA8-0669C6A99203} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {BA37DB21-E535-4E1A-9BF6-0E7ED7D5F5C8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {799D616E-7BB9-460E-BC1E-69DAC8B39D95} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D31A8681-9FD4-4600-AAC3-341F5AB48667} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {0489D23B-F689-4D76-8097-E9B677190689} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {BB76D178-C37B-4E03-8E83-0095728764CF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D6529D77-44E9-4945-9295-6EF83FF1E114} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {74F36C7E-7FF5-4FBD-BCBA-5CA8AE8AEBEE} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {26836B01-925C-4A1E-8CD0-323355624FDA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {0381700D-CA26-40A8-8893-5615D31E07D4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E3243831-DFC4-4716-A1D9-A674367B2F96} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3214A653-41EC-4C08-B1DF-0829AB763878} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {DAF00881-D088-446D-AF2F-98052E76E804} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1AC7A2EE-EFF2-4CEC-9B79-3CA6A7FF39EB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {685BC077-5E6A-45F8-8B51-ED56B247C9EA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D91CA5A4-C70F-434F-ACCE-E7B6ACDC83BA} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F0F566D7-7639-48F4-90BF-4FD023EE94C8} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {251C0747-2122-4244-8160-85B05641F809} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {8B6204C0-6BCA-42E1-B6E2-AACC2DD47138} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5179C279-8B79-433E-9D0E-89CD0061879E} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 96 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {69E7EA85-CC1E-4283-BFEC-3D4371F45747} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {52F95421-B10A-491B-9ED7-9DC873BAEE13} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A062F8DC-17A1-467D-8211-E489EB7D41FB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B0BFB539-5754-4508-A74A-4D44C1B520A0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1131F53A-80BF-41DB-BB48-90F73F1D9C22} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {0F86FFE5-045D-4C1F-BD14-C30F81169372} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {609EE638-5A0A-4072-A94D-B8A133E6BF6E} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {510B5A65-B08E-4D8D-B264-6265CDA6418F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1184E282-7DC9-4612-BDC1-1C0A51765CF0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3692C198-88FA-403D-89BF-5946AA4373D4} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E9C7A4AE-2CA2-4825-BE65-0A75F2023B7F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {DA988FF8-9FC3-44A1-8402-0EDFA6D642CC} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {65FA9F32-E3E3-4A84-B2F9-876509BAF554} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {10A013DA-14D0-49AF-8665-9F87B0CDFE86} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {845F7A26-6F7C-4CA3-9AC8-1202672DD1CD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {05F0AEBA-D749-4B85-B640-60EAF6C064C3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {06283744-D3CE-472E-8FB1-D910390BBE27} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E5028ACD-3ADD-4A74-BE78-32FE3B72C6C4} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {710B5F1F-89CE-4B9A-97E5-C955A54A1944} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2BD96365-A8BC-4A5D-9CF3-FADF21B6C964} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F037A06C-39F5-4777-B294-C60B9CD2983B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {50D177AA-AE87-4612-A1FF-1433FAD7BE25} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {71C5FE72-DEE0-43E3-95AB-CD166691BB33} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {54AC54F6-4585-4E52-9C2C-AF1CB4633A34} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CF8119D7-24CC-496B-B4CE-A5216818D4E7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {68FCE20E-DB72-4F5F-B48B-8EA1B8EA2F8B} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B9BB6D35-3FE5-4A79-A5AD-B8CD0A22CAF9} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7C95F428-5383-4F76-AFF2-0550F0844B07} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8A640E13-2949-48DC-ABEC-B07A1E1D7513} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2F2EFEE9-85CE-4E93-9FC6-084887F6B9BA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4B0A291C-9057-4D49-BA04-B4D9FBE3E57B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7C4AD567-53B1-4ADF-931C-0815C9CE19F8} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {49BE99EC-F60F-463F-9B51-61E9DEF9481F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7446C0EE-DA9F-4F7D-AC5C-241623C1D524} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1D4DF7BD-AB17-4F51-96C5-F83AC201B436} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E7444D82-FB7D-42E3-85C0-2392046278FA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E1BE630F-AFB0-45C7-80A8-7E6E34180934} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 97 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2EB54B19-2690-4556-B731-7AFB32F4AD11} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2530100F-5BB7-4AE8-94E2-D985FACDC110} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {45034084-F2D6-42E4-B08A-01459EEC1742} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {966CD272-E8BE-4443-983F-3D7312A2546A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {72F92C7C-0ECF-4A16-A25C-D612C33AEDC4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {04FDA635-E2E6-4EE5-B46E-FA6263DA3439} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B138B4AD-A077-4DD2-B441-BCE211E1E2B7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {9195917A-4659-461A-948D-FCDAA975CD44} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {19414B4E-B588-43C3-A416-094049136CEB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D0323C60-0081-49BA-BE05-A11101B0FDE6} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1DF54484-9E54-4D09-B1FC-D5341903A9EB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C4ED27A6-7CB9-4AA3-A461-B831BFAA5A14} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3A236752-C2F2-41E1-B611-701B80288C44} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6E0C8866-5572-4BD8-AE50-4A70FF7DB58B} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {FCC5827A-A26B-4FD7-A235-41F501836E81} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {4BD68AF7-2552-4E96-8BCA-FDCAB1802F13} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {92990EAC-99A2-48FA-BE85-915367B7E4CF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5327D32F-DF72-47BA-AD63-6197A73F9590} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9CAC878C-07D1-4252-9A0E-E1C810A28BF3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7C343E2D-E7C7-43E1-847D-158B030C9617} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AE8CCC0E-E437-406B-97E4-FA4A02A1BDB2} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6C2C5DDF-C25A-4D0B-B53E-BB2BE5ED2571} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {49073159-17AD-4A8E-B380-D0C43A922919} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {BC425717-2145-4632-A561-26520AC2885C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8769F125-EB61-4876-A11A-26B21A1FB7D3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {60F91483-ED1F-48C2-8388-179AFD682992} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {053B5DB6-B162-46E6-B76C-CE0055CFEFE1} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E7449FAD-9C94-44E4-8C84-75C9E8A55BD8} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {44ADC924-E1C6-4360-8AB0-D65B9619C82F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {63A23C00-4444-42FE-A82B-C92B85D99644} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B476EB6C-747C-46CD-9A72-7375C1A6B41B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {35507D0C-3961-42B3-8EAB-14E2F4D6CAB1} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8EAEA147-E1A8-4196-A611-5C2924C88744} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {FD5F082A-F903-470F-A7FE-5A2CF0D023A1} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {66FB70B1-D8FC-4D45-BFFA-CDEF78D5A06D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3C3788A2-D91C-4021-A397-C2EE173269FE} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {86F9F7A0-E655-452E-A187-D8A49C23E116} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 98 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2328918E-752F-4727-9DA6-DC28479F1FBD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {208222E0-B475-01C5-92E0-3C772E43AC40} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B56027B9-ABE3-40A8-BF09-BB1E597ACDAD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {BA635CA3-36B1-4EB2-8E5A-503D75598544} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E31FE401-B16F-4E3C-9D81-E498813197D3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C226A8ED-5312-4352-BFE7-22C44E91B1F9} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A337989A-D396-4A64-90D3-A1D676610B9C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2E96CB61-0B71-4585-85AD-21B9EE68EC43} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {FB5BD768-42A5-4B0B-89EA-1165FCBC27FF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3168121F-EEE4-4F2E-A405-DB2EE4C47BF1} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {87D2B1E9-70C1-4670-BEC0-38864DF94E88} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A003A437-8064-4F52-B3BD-52DABA72B6CD} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A2F146F0-A0FF-4392-BBCB-E97C302CA5D6} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {64B61867-4BD2-42B4-828A-64340297847B} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {6F378CA4-1FC7-49AD-AAE8-0AB4ADEC41A0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EA956660-86CA-43F5-8E22-F1186A879785} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {17B4016F-DFF9-41BE-9B13-501E4AF8EB92} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E3CCC410-592A-443E-929E-123DAC905630} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {EB959C78-E6FC-49F1-9BF1-23B3EEF20D30} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5BCA82A2-3EC3-4C1D-959D-90CE818D2041} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {957B3B05-ABB8-46DE-B0D7-FD666A1373A4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E1EE5EDF-A732-46F1-9E0C-E1FE14921E65} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {375C2913-018D-420F-987F-ECB23312302D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F440CAF2-6319-4D26-BA97-92FD71F27E90} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {01799809-A30E-469E-B455-3EC56DC09C31} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A0994143-D5A1-48D2-AB61-610DC3FF5EE3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C910605E-E7D4-426E-979E-1006C4E34B79} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {87057257-D153-4054-8C8C-94D777EC229D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1ABDDB17-F595-4DC0-88A6-26DC33A955AF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F9634425-7789-42C5-AF48-2F220CD0633F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {6B9775DF-379D-4CB0-9082-4D41FF7AB878} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {78947110-B16C-4FDD-9AC3-6E5D28FFF3DA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2A08DF56-4EAD-4CEF-ADBE-CE726DD093AD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B330247B-99C8-451D-9230-9A3F68DF6C46} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4F95D9F9-455C-4D11-9F7F-6E2C5BE9D67E} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F577889A-6D26-4699-946F-AA56B8C484E3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {7C091678-ADE0-49D4-B5B9-2B5FD9C1CE10} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 99 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {30DA6B93-7B7E-4760-9E50-BCA7E4A7A9F1} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {AB4A71E4-7BE0-47A6-B57B-241ECBB36CE2} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {10486B32-90EA-4198-85EC-1ED67DF414AD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5F6C7ECF-D9AF-43F5-BED0-FAB777967E2A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8A95B6D3-FADB-44B4-AA82-E8ECCFFE019F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2BF51E95-D401-492A-A806-108B54D67893} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B13B4101-9B62-4FA9-9F08-E7F5725FD09E} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {4FC555F9-2FEB-4AE6-9926-0C0A0DBD4AEC} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {FEDC8485-1295-4FA7-9EE3-C19B9D6CB95C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {9F01E86C-8A3F-4F5A-B04A-CA26E75F6C6F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AB7D1CEB-3654-41E3-B8AB-066FC9B544B9} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7380E6B1-FCD5-4663-8B9E-63BF924C9A86} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {95046BFC-9307-44E5-9537-8A42CABEDF9E} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F582FF5E-3FA5-4CB8-9BDA-FFC38CC2CDBA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {204CAFBF-34EA-46C3-9FDF-8E5205A195DE} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2A7C734F-B5D2-4A49-B03D-F325ABF85A99} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CBD63998-BD1E-4A57-8F60-EAFBC7367D18} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {283372ED-8B26-484B-B6A6-9CA6CC20BAE3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {BD8FAB73-8732-42D9-A9C1-E07610C09C11} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {994603BB-9B55-414C-8F5F-F8864EE7B4EF} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8A9429D8-86AB-4B9B-99C4-86E72A601FE2} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {ED177CAA-A0BD-4B07-A6CD-4763BDE12E02} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1003F1F5-863C-4A8F-BCFB-C57095D5241C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {8CF47282-3265-45FE-B1E2-E967C8C3ED36} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3F7CC9D4-6F2B-4BC1-9813-5A87F5F61D89} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {8D3FF0F9-3265-42EC-BD3B-4FFF5B9C6B11} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {BB6A680A-57CA-4B9B-9001-E37A7C280A70} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {18DFA484-50A4-4958-98D8-D9B72DDE8B7E} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {0F5BF2B0-3559-4A0B-9F0B-84F9B586E4EF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {0798D5F8-7B5A-4DD6-AA8D-2928E9B691AB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {445F9037-1F2D-4F04-9A56-D6FAA3650DFE} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E4B82F61-586F-4D56-A081-00E2514CC45E} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F45CC944-6911-42D6-B0EF-04D1460C3CC5} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A264F1FD-24A0-4B0B-BBF3-F391C9D48874} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9503AD43-1284-4C58-9B49-0F37105D58B8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C3C2B9F5-A2F1-4DE5-8AD5-6574635D2201} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {26E83FCA-1903-4B81-88AC-6377B7200108} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 100 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {74B6B51C-31FC-40FF-BBE6-0A3B0C5AB298} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F27C49A7-F503-4469-9F26-EB3F191D146F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {805F70BE-31BC-475F-A41F-1ED2698B4376} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E4941D1C-6693-4718-ACE3-A0ABA51C1292} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5C23399B-FB35-4FAB-BC99-5B8A46E3C0BA} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5571E1EA-E265-43C1-A612-7C693856A488} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E3EE312B-590E-4F63-A031-4CCD4EEFA7F5} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {AD97539E-AC56-4705-8712-CEE681D27351} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {066DBE63-4D48-4CDC-B713-18113CDFA86D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3DD03571-0F8D-4678-A8A0-CB715987AA80} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {FEBE3549-FF9C-4CAE-A11E-4C2ACBB528D4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {37BCE1F8-AFD1-4521-ACE2-7FDD963F671E} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {028BA17B-3324-4AEA-84FB-0C0382EABA4D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5E95F9ED-BB53-4C93-B39E-B1992CAC1140} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {051FDBAF-F6F6-4653-A268-79FE44F646DF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTI TION 10/1/2002Microsoft volume.inf Not Available {23B3097A-A95E-4BE7-8635-4B19A46B3232} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F31E9A56-33FC-4888-896D-2A8B055C324C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {84878462-A3A9-4CEB-B377-1CDE559E80D7} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {54EC33DC-91AF-493C-9C7D-411C37B38389} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A1414B2E-6C14-4D93-881B-4BE662BDA263} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {37E23911-EC8E-42EC-B292-B55FB7A05F8F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {4DC21D68-11E2-4C38-8343-7DA10D20AB0A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B0A5A345-3270-4A1F-8CB7-5653834D7A1A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B6FBEEA6-4AFD-431B-A07D-DF932863FC92} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F2ADD729-F391-440E-8225-44C9FAA1DD9A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {AE78343E-E65E-4B5D-A94C-170ED687B27C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {349781C8-B75A-4455-8B80-6907BD4B827D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2AD0261A-B90F-4BB4-807E-648B8BE179DC} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {62C08FED-A5F2-49EC-AC82-94CD4ED1CD9D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B767914A-FB3D-4831-87A4-A1FE42F33152} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AE106228-AC72-4801-AF07-75E41CF9BBB3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C67D1B9A-8289-4763-A613-7DAA6EC9F62E} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D7A21FF3-1EC7-4C14-B741-ECF5E3FD961B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C6A09463-0E79-4A8A-AE78-BD48CE7F396B} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {12713992-036A-4FFA-9A26-3AC1AA3F7AF7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CBF8F969-C5EB-4728-947C-4F2F4F8D8D5F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4445027A-1047-47DF-BA23-9F28CAC23045} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 101 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C6847231-1CA8-4041-8295-E68D213AB633} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {259D936F-5A5C-4316-8665-B90686AE0515} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {EA5D3FDD-4431-406F-A8B9-1651B2FD1407} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {57F979ED-67EF-4ACF-846A-84CCAF3BA2EB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D71F7380-F7D1-4907-9ED0-35C1185F4941} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {0AAAB283-DBB1-4B8D-9606-514686DBCBB9} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C97F7F55-FF9D-4108-80F0-01FCA7879857} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {33404920-B2E2-44E1-8DF5-FE0AE0268938} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {09BB06BF-7B00-4430-8439-A4C77B1893A4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3D958BC1-1C25-4DB5-BF02-E35A2DC3A100} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D007F108-A996-4473-90D4-3E18B871B5F7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {03251DE3-3FDE-466C-814D-81B7E2DB877A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {BB706BBF-B3F3-4793-86AE-76856C8902C3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EC8AF41A-D7C4-47FB-87FF-212F872C78DC} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {64C93C9F-FD44-4A5F-8C87-51630609CF69} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3D538B9D-5294-43A8-B3BD-180E3A97F2F6} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E583AE2C-5A6D-4BDB-A672-3B952F1B2861} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6CF02EDE-7CF8-437F-93B1-22DC56F8D261} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CEB9A171-1788-4381-AC03-8BF59C6635F4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6DF1DEFC-9AFB-4EEB-A001-D685BF18B869} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E8ABC856-78B8-4535-9CB6-0523D0379796} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {DE650D16-38A6-4F46-99C1-895A811A5AE3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {091D75D4-31C5-447C-A6FD-72D7AFC9B406} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F651348F-8540-4CE7-955D-A2C7DE9BC6E2} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {541AF323-8BD3-47E0-ABD4-7CDB21EBC7EF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3C6DB0C1-4217-41C8-B728-2C74800BB54D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CB55D28D-4289-4AA5-839F-47A837A7CE1A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {0FA3D01C-2CCF-4475-ACAD-0F40335D8458} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {009A863D-F692-42A9-82BC-B490D1C46DC9} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A1FFE538-113B-435E-959E-B39BF90CBBB0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {0A7A0116-C91E-4320-8F5B-10C277E930B1} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F32B2D67-C165-439F-853B-7942AED4D614} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {55AFDAE4-4FC3-423F-8E69-BF1C3DAA61FA} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {FFC835CB-41D0-440B-9417-DEA50BA30808} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {29757CAE-35E7-4A5C-AB6C-97E893651173} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CDEE0188-0968-48D4-B0D9-63B7A10FD1BA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {0F61B25F-3B97-49EA-9E26-27B6D887C78F} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 102 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {DE841D08-3B19-4BBB-A73E-57AEBD4C75EB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {99660FD5-6E75-4B76-B6E3-0E36007763D0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D00E5ECF-5145-480A-936D-FAD65AACBFD5} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {63464F67-E9C3-48AE-9B2C-CD7704512C9D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {42350DC2-9FB4-499C-9252-8A83008B65F1} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6D69499C-3016-4A04-B969-05B35B87E9DD} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {DA2F8025-740C-43D7-BDDC-A0E0E2D12C2F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {216B015D-B7C8-4A41-A464-C8CC7D9A781D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {961A9A35-949E-46D8-A420-928B4E8C88D5} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6E82DD03-E763-409D-8941-D1ADF4140830} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9116651B-CF52-4EA4-B044-F6F39B497FEB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {8F7AFBED-66A4-4600-865B-3AED72EA63EE} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1AE9C7E0-37C6-4BD2-8598-BE8A6EA6ACA9} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5CCEB31D-0B52-49D0-83FF-00BBF65C345E} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {73182766-27A3-46CE-9994-5DC4F30131B1} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7E168F52-16F3-4B89-BB4F-24A2AE0E4111} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {DDF77C51-13B8-4479-9ABB-65C3394831E7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {59E62B91-B612-4F5A-8291-3F95A1A9AE25} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {6C98E408-90A7-4BE5-B8F6-5E824E4787F0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {23FE68DE-7DC1-4D91-B9E6-B017388321F1} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AC9E9492-C087-4A87-AB1D-260FA5E1367B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A38C2F3F-EE55-4C02-BD99-B7A5D6AA0F67} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {080C4CDB-1337-4FCF-A0C0-707414E8709A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EE910E06-5F8D-4C45-817B-C909571EEE64} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2FC695E9-9971-4DE5-B31F-132A343DF095} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D0CD78B8-36B9-49ED-8117-F458F7FCFDC3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {86F5BEAD-0586-47E9-AF0F-E148165531FD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CDA8AB3F-1790-49B2-9512-6877278EE9E7} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {ADA6CF91-9253-41B2-8B61-1B4E06D6A2AB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {AE05D92D-1636-4CB9-B08F-B2213D91842F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {32826EC0-83B0-49F9-A2A3-7D1A1206E688} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {96632DD1-A8CF-45FD-8CB1-42E184F95C39} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {6948D1A2-0703-4E91-93EF-3194314E9145} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3AE1A697-60DC-4F57-8B29-A491A443ADC8} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5E4A12F0-7F78-487E-AE28-4B1813C59496} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CEAE41EA-ADF6-4827-BBB5-EF9D7629ABDB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8153252E-6E4B-44AC-B1EE-A8142E97C983} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 103 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {7D0E0B1A-F442-4123-8AA5-A0167E0D44D4} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CE5E17D8-584E-455C-90AA-846767EBC7B4} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9280FC31-B4D0-4366-B1A2-9FC2A9788126} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {4A54681D-235E-4897-98E2-4A56E9DDE656} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5A0D76CA-4D15-4E23-A118-9B2DFC04EA53} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D4760341-8336-4552-BB8E-D9373AAC3624} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AC2C961D-696A-4FC2-AD42-8672F52BB4C6} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F27FB8E8-2456-4A48-A2BA-112953094C83} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {29C93D48-8198-4937-A140-15882FDAA0EB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {BBAA7D5D-86B9-4B42-A9AA-D936D9DD56ED} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F5CA4711-693F-4F43-964A-DB05E8C0CA80} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A71D1D60-D562-4A57-9924-6A6AB64654FB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5AAD4B73-E0C4-4FE5-97FD-56BAAB23FDAD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {11814A53-AA29-430D-8D25-343DA6B15825} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B6760EA9-8E82-4C78-B7B6-08352358C0C0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {AA5DC4C3-061B-4AED-B817-BD63302E341A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9FF872EB-1295-4FE6-917B-A6240133C8B6} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CE490E6C-5131-49AE-ABA3-B819C78A51C5} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4EBAC6A9-13CE-467A-BD23-5BAE3C895010} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {42B0AA75-B295-4205-AC6F-5A46A9367BF9} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {86132881-8A2A-4C10-BAB9-05E71DB4206C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {08CDF4EB-D739-4415-933E-92ED10D9F97A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A66EC817-813B-49BB-9114-A392059A7ECA} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {29222CD6-0907-4887-84B2-1A918B24507D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D8564500-CD33-4D2D-B80C-030F270718CC} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2958347C-51FB-4026-9F9C-EA1CCD8A10A0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {587E6F85-F026-4C99-A669-7BE785B85031} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EE71F5C9-469F-44F1-8012-F88575E13871} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {DED61787-33B9-40C5-ADFA-E092122B8782} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {180AEF1A-48C9-480D-AD31-A9D0805D6BCF} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {13E14CFD-07FF-40B1-8789-7C60B8ECE752} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {BD557C6B-58D5-425B-B456-FFC81854514F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CFD4FD76-9C92-4AAF-A81F-521C05A69A52} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {98B98EC9-BD31-40E0-94A2-17CD4A5BCE0C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5591B52A-11CE-4ED5-AEA1-19A3673474F8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {AFD847A6-4CAE-4DE4-A565-A0B2666D44C9} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {7D672BD4-2620-4F0E-9E88-BF18822F2CED} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 104 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {51439CCD-6B76-43D9-B8E7-74CDBA53FD62} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B5FA9835-EDB4-47EA-804F-86620B18D980} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8F349745-43B6-4FFA-93CB-DEF1AA780A14} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D7462311-4192-4C83-A30C-4E7FC276D321} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {683562E8-E585-41C5-9E66-F259DFBD92AE} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D70F9143-AAAA-4B74-BE01-9B4CB48C8923} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {0969F481-DE15-43A7-A08F-C02A39873D61} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3FEF7B6F-C982-48E1-9948-37C8ED90B762} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1ABBFF76-3357-42C8-913A-4EA8ABA610FC} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {8ABAF10E-27F8-4CA0-B816-E5D1876113D4} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F1AD2F44-5DC2-4104-97B7-1F2BBF7B5E77} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {42961255-9614-4A76-B8DF-3C228CEC0FD7} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5AAD0BC1-67CB-4974-BEA1-D6BEC5F61692} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {ABFE9C94-924A-464A-89BE-7DC1DB4D592A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AC9D72EA-4033-4C23-8752-298D638326B5} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {497A49FE-97F1-4BD4-A8EF-41BA2EA4606A} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E577E762-AADE-4F08-B95E-34AB984040BC} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A4BFD9D6-C72E-4F55-AB5E-3A422DFDDD69} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {389E6265-C3EB-454B-A090-B8ABDB3AF2BF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6CE9F93F-B3EC-4BE5-BA1C-66080CFE93E9} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {DD187265-6A10-4CCB-84A0-FE33FCF662ED} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3BF54F91-6C37-40FA-B824-FCB054684BE0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CCAC147A-1EAC-4952-BBA4-49ECDB3339AA} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3265716D-2360-4E30-B0C3-80DA11AD8079} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E3D1E783-11F3-4538-BB07-82852540C324} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {9157CE6F-2616-43C3-A8D8-08E11827CC20} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {EAD8D054-F134-4151-A421-AF0D54365AB7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6CAE3612-7E2F-44AE-BB9E-FD5CADC04B66} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {62DBD97C-171C-484A-9C14-9DAFD7367B98} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {782E749B-8592-4D03-9AFC-1E938BB37DC0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {41A83EDA-5C0E-4F9A-9F2A-F53353C76EEE} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D161513A-06B9-43DB-9543-57C7FDE14DB9} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4760577D-DE28-4709-B3D1-96C9DD47AE5A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {DFA1F146-FD78-4FB2-A2FE-3EBD0A02FBFB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {AD7A9889-4555-4DAF-BA62-B82B81F6A0D3} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C96A6172-16BC-45BD-AA7A-15D144F6332C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {FA660424-2099-4D54-9DBF-33A039F1838B} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 105 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3213E5B5-8675-4983-8857-9A38585796D6} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7111AD3F-90AA-4858-A91C-0D4422EFBB7F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E8CFB4B5-B53C-4196-85ED-7B716CEFD34A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {95F17411-5939-4483-9567-87E6BEA45640} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2B9B6A9E-B7A5-4E04-9F83-59E7D6FB9315} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C2E1FA20-CC25-4F05-A27E-BD47700408A5} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3AD189D2-6A6E-4CB1-816A-BB141DF0C535} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {46D1DEE0-E7B4-4AE1-AF8C-3F1078DD7E44} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3706A10C-2A49-4F82-9FAE-FAB930997ABD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {920FA00F-2535-419A-9DD2-1510D07F0240} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9910A531-E4BC-493F-8064-1F4FCA5160E0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {30529A4F-0F95-4D23-B295-862CB52693FB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2157CCC3-FED7-4CD3-86B7-DD18B34A31A1} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A2402408-26B3-4293-BC3F-53DD1B902D3F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {7BF3F892-FB07-4F8E-A427-CA58E39506EF} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {40E6B83E-F984-44AC-A4F4-05989ECAF3DA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {357F3D62-7521-42BA-9E3E-776EA09DBF51} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3D287127-0ED0-4A17-A32B-FE0BB54F7AA3} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {2A04DB44-4BBE-43A5-83FD-A550CC27E9D0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {86E6C07B-3C93-42A7-B4A3-4D640D4838A0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3DB1399C-05A5-445E-BC6E-456CCF87F956} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D890C659-2967-4A04-8949-BE95B6E24993} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A17CF88E-EB2F-4B54-889E-C7410BDB5E6A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {6D6F8263-9CCA-4AF9-8640-3E78ED9C5982} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C261B5EA-0F54-4F28-B2A5-A0ECD670B129} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {863E0EA2-B842-44E8-8671-47086623DD69} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E20A4CA9-ABE9-4FC7-89C8-D3453D7579EE} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {1CEC1984-F9BF-4151-93BE-8C34C00650FF} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E05B7B19-CC97-4F9E-AFE1-F77F8826C604} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {52CF1ECB-CD3E-4E4B-A869-2EF320EC213B} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F91DAF7C-9E98-4D5C-8118-31070CAD0C23} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {00E32BE2-CA70-4F73-BE3C-53DAE461E284} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {93B274AF-BF7C-4525-9559-696C580503B8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {38D4FA9E-7E60-4640-918E-BE5310E1A65D} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {98AEAC81-2992-489D-B66F-6885CBB1326D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3735A05F-48D2-4A18-908E-B69D356439FF} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1FBB2481-1BF4-4D8D-B478-D0F4F251EDCE} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 106 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {060DFAAD-EE9D-453B-B4A9-7122E9D90609} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {2785AE9B-B87B-4971-96BB-8D7E1D4C11EB} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E630AEA0-6C7D-431C-A698-A8575A5190B8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {49809CD3-5879-4822-B22D-241657588980} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {C68E1A18-A860-416A-97D0-45FA83D09C31} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {083006CF-7F6D-47D3-99A7-56E87F20F42C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {9828DA0F-A22D-4AB1-B10A-261A835BAB2B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CF000C41-FA88-4803-8D6D-F66CB0C5E876} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {3BFBE5CF-F417-4ECD-85EF-A6996D784A6D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {CF4988B6-1C33-4D6F-8393-6B40D7A3D053} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {117F53A0-0CA6-4FFC-9999-832D43B6BA75} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {9B4065E1-0BBE-4EDC-9724-0E853835E3CA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {CCA865B4-0892-4829-833B-22140A9B1A88} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3449D879-7D69-4802-9C74-FABD5211A3F8} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {06556401-6F83-4AB0-A60C-C29DEB68B21B} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {7F6B195B-E4F3-4E26-A5CA-F12420127E51} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B038EBCE-1E19-4959-8578-A4DDA097C417} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {8F7E23A3-192B-4618-A3B4-D76F6BE1C360} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {29AD272D-30AB-456C-A016-D25A66B2BC40} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {C238E969-66F0-4911-A482-94BD08CF4981} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4022659D-DC64-4C2D-8585-5E8B4159EF2C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {3238FE9E-AA60-48FB-9F81-CFBE1D1D41B0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {D4A144D7-A409-4309-9CDF-B4B01DD626C2} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D8905B6A-193C-4334-8306-5B3B32530853} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A477BF7F-83C7-4801-B4D0-0CCBE27D877F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {F8FC3547-A97D-4DB1-8576-EAAD3AD41F85} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1EFFD8CF-F4DF-4A3F-99E6-5F24F4171417} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {93ECF9E8-A771-41AA-BB88-7588EADF57D8} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {7CDAB3B4-FF0A-4D13-870F-B2CF74C39756} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {696CF330-7E2A-49D8-A527-3E7DF1BC784E} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {1089EDFD-90E2-4DDD-8605-EA0AD38B633F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {1D48262D-D000-4EFF-A840-235E155A4DE1} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {A0CDFFBE-C834-4FC7-A1E3-C2D1E3C2E6A7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {9C28D2B9-98A2-48C6-9795-FC5B90250408} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {944E5D12-427B-4BE4-88CA-7DF9F066AC35} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B4439CB0-FCF4-40F0-91D4-7105830820CD} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {49C3202B-787D-4354-A0CB-02AA1F74FEF0} 10/1/2002Microsoft volume.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 107 © 2005 Hewlett-Packard Company. All rights reserved. STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8FF81ACA-9B69-4DA1-8B82-198B22477D04} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {59A30521-3DF1-4FA9-BBB2-CC0860842329} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {5B96CD57-2112-4980-91B6-7A31EE89992A} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {125E5D35-FF4D-4B3B-809F-2E3F602014CA} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {E70CC962-DCA0-4CF4-ADE4-F529C78F8ABD} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {0CB94503-2C26-4648-A658-E22CBFF5FBCC} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {F2DC860F-0DA7-4C78-9F46-5589EC753D98} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {85F67549-7C43-462F-8681-AF1CEB6D2747} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {B2C28F8F-2507-474D-920A-A8928E71FA76} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTI TION 10/1/2002Microsoft volume.inf Not Available {7C289B96-16EA-4C4A-AB45-3DE8B618AAB6} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {8C6AAFD6-E196-461C-8421-D4E1BB31D3A0} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E0E29DEC-9375-41C0-842A-8A832A4B37E5} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {7BAE4B69-3EB2-4B1A-B2D2-535C053C15D8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {87F5DF55-B368-4525-B98B-A7DB8BF5278C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {65A4BEDA-1079-4515-8ACF-5E744536EC8E} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {04A8AAB2-E41B-46B6-8E0C-40AEFCEFD10F} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {4D94BFBD-29C2-48A4-9158-59F85A979FB7} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {5285633B-804A-4E28-9404-1918AD25444C} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {250BA889-2EA6-4C0F-ACA8-D353FF90819D} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {4551BDAE-2B8C-431A-AA38-D38F80BE9B96} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {272EA0FE-7A7A-471D-AE31-3E2F8A35BAF2} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {ECF30DBF-FB10-460C-8D12-DC88F9864644} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Generic volume Yes VOLUME 5.2.3790.1830 {836E9AC1-6B3F-45CD-83AC-F4BEE6CCB72C} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {396F3F56-DE42-4875-8701-D598135171A0} STORAGE\VOLUME\1&30A96598&0&GPTPARTITION Volume Manager Yes SYSTEM 5.2.3790.1830 {EB05434C-A6BD-41AC-B34A-D086D9E96D57} 10/1/2002(Standard system devices) machine.inf Generic volume Yes VOLUME 5.2.3790.1830 Not Available ROOT\FTDISK\0000 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {D4BB1AF1-F862-44BD-959F-7BD71990DF23} STORAGE\VOLUME\1&3735C57B&0&LDM#{AA319A3 Generic volume Yes VOLUME 5.2.3790.1830 D-78B7-4274-961D-217B0499024F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {A2613313-939F-4944-BB22-AF3588FEE2C0} STORAGE\VOLUME\1&3735C57B&0&LDM#{5022319 Generic volume Yes VOLUME 5.2.3790.1830 5-3A87-43B5-AE4A-085B5D97DB3F} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {B9DDA4D4-3648-47B5-92F6-A14E90FC058E} STORAGE\VOLUME\1&3735C57B&0&LDM#{F1F2328 Generic volume Yes VOLUME 5.2.3790.1830 A-C900-4B7B-A523-1D664B672490} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {E57FD6E4-2F5F-419B-B1CF-E8178CFA56A6} STORAGE\VOLUME\1&3735C57B&0&LDM#{9359C00 Generic volume Yes VOLUME 5.2.3790.1830 2-BBC9-49A2-B60B-478BB0B3F6F8} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {EAD0AECC-C33D-458E-88F4-26BF83440F38} STORAGE\VOLUME\1&3735C57B&0&LDM#{3E43935 Generic volume Yes VOLUME 5.2.3790.1830 7-EA48-4762-949F-E3FEFBEC8FEB} 10/1/2002Microsoft volume.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 STORAGE\VOLUME\1&30A96598&0&GPTPARTITION 10/1/2002Microsoft volume.inf Not Available {174F77A0-488C-490A-B70A-97B65F087CD4} STORAGE\VOLUME\1&3735C57B&0&LDM#{F987413 4-A054-400F-AC9A-0BE6C8114985} HP TPC-H FULL DISCLOSURE REPORT 108 © 2005 Hewlett-Packard Company. All rights reserved. Generic volume Yes VOLUME 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002Microsoft volume.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- STORAGE\VOLUME\1&3735C57B&0&LDM#{69EE315 Packard oem9.inf Not Available 8-3A84-4CA4-ACEA-E254BDF745D2} HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic volume Yes VOLUME 5.2.3790.1830 E\7&1C3F1BE&0&0300004000000000 10/1/2002Microsoft volume.inf Not Available Smart Array Logical Volume Augusta Golden No STORAGE\VOLUME\1&3735C57B&0&LDM#{C1CCDD DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 53-CF1E-4B0F-BD9F-A7DA2B8DDBFF} Packard oem9.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 10/1/2002Microsoft volume.inf Not Available E\7&1C3F1BE&0&0200004000000000 STORAGE\VOLUME\1&3735C57B&0&LDM#{721F515 Smart Array Logical Volume Augusta Golden No 3-F3C9-4969-AD9D-84523A7CC524} DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Generic volume Yes VOLUME 5.2.3790.1830 Packard oem9.inf Not Available 10/1/2002Microsoft volume.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM STORAGE\VOLUME\1&3735C57B&0&LDM#{B15EE38 E\7&1C3F1BE&0&0100004000000000 0-4728-47F4-8626-0ACF600395C9} Smart Array Logical Volume Augusta Golden No Generic volume Yes VOLUME 5.2.3790.1830 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 10/1/2002Microsoft volume.inf Not Available Packard oem9.inf Not Available STORAGE\VOLUME\1&3735C57B&0&LDM#{F7B4DB HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM A9-74E4-450C-A390-24E9B129F9F0} E\7&1C3F1BE&0&0000004000000000 Generic volume Yes VOLUME 5.2.3790.1830 Smart Array 6400 Controller (Non-Miniport) No 10/1/2002Microsoft volume.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- STORAGE\VOLUME\1&3735C57B&0&LDM#{B101DC Packard oem6.inf Not Available C7-3D78-4A5F-89EA-415E802A0A1F} PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Generic volume Yes VOLUME 5.2.3790.1830 V_01\6&2F38BEB&0&2008 10/1/2002Microsoft volume.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM STORAGE\VOLUME\1&3735C57B&0&LDM#{7D9EF5 5.2.3790.1830 10/1/2002(Standard system EC-623D-4272-83C7-893C87A5EADF} devices) machine.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 10/1/2002Microsoft volume.inf Not Available V_03\5&1499701B&0&08 STORAGE\VOLUME\1&3735C57B&0&LDM#{6339CA0 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 D-B738-4FCF-AE9D-7FD3BE5A9AB6} (Standard system devices) machine.inf Not Generic volume Yes VOLUME 5.2.3790.1830 Available ACPI\HW P0002\FE 10/1/2002Microsoft volume.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 STORAGE\VOLUME\1&3735C57B&0&LDM#{1A784D8 (Standard system devices) machine.inf Not 9-6DA1-4E7B-A771-D045217A5466} Available ACPI\HW P0002\FC Generic volume Yes VOLUME 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002Microsoft volume.inf Not Available (Standard system devices) machine.inf Not STORAGE\VOLUME\1&3735C57B&0&LDM#{C5EE96 Available ACPI\HW P0002\FB 80-DF4F-498F-A4EF-6E36000869F5} PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic volume Yes VOLUME 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002Microsoft volume.inf Not Available Available ACPI\HW P0002\FA STORAGE\VOLUME\1&3735C57B&0&LDM#{1A97FF9 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 B-411C-48D1-AA03-7D9ABE2B9556} (Standard system devices) machine.inf Not Generic volume Yes VOLUME 5.2.3790.1830 Available ACPI\HW P0002\F9 10/1/2002Microsoft volume.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 STORAGE\VOLUME\1&3735C57B&0&LDM#{EDAD05 (Standard system devices) machine.inf Not E9-6FCC-4ADF-97A1-57A0C0349574} Available ACPI\HW P0002\F8 Generic volume Yes VOLUME 5.2.3790.1830 Generic Bus Yes SYSTEM 5.2.3790.1830 10/1/2002Microsoft volume.inf Not Available 10/1/2002(Standard system devices) machine.inf STORAGE\VOLUME\1&3735C57B&0&LDM#{3ECCA7 Not Available ACPI\HW P0004\F01 FF-E49D-45B5-8A9C-C1DEE3DDCF5C} Smart Array Logical Volume Augusta Golden No Generic volume Yes VOLUME 5.2.3790.1830 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 10/1/2002Microsoft volume.inf Not Available Packard oem9.inf Not Available STORAGE\VOLUME\1&3735C57B&0&LDM#{0162431 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 4-73A5-437B-B83C-339F3B94F69C} E\7&52D30FC&0&0300004000000000 Generic volume Yes VOLUME 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002Microsoft volume.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- STORAGE\VOLUME\1&3735C57B&0&LDM#{CC0BB1 Packard oem9.inf Not Available 3F-ACD8-4281-BF4C-90447DE516A4} HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic volume Yes VOLUME 5.2.3790.1830 E\7&52D30FC&0&0200004000000000 10/1/2002Microsoft volume.inf Not Available Smart Array Logical Volume Augusta Golden No STORAGE\VOLUME\1&3735C57B&0&LDM#{B10ED7 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- C2-91E4-4E30-A4A1-A84F2455B387} Packard oem9.inf Not Available Generic volume Yes VOLUME 5.2.3790.1830 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 10/1/2002Microsoft volume.inf Not Available E\7&52D30FC&0&0100004000000000 STORAGE\VOLUME\1&3735C57B&0&LDM#{4241AD9 Smart Array Logical Volume Augusta Golden No 9-F68E-4AD6-A19F-1E603EEF919C} DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Generic volume Yes VOLUME 5.2.3790.1830 Packard oem9.inf Not Available 10/1/2002Microsoft volume.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM STORAGE\VOLUME\1&3735C57B&0&LDM#{E29CBD E\7&52D30FC&0&0000004000000000 1D-32F9-4123-B109-6A39380ADF01} Smart Array 6400 Controller (Non-Miniport) No Logical Disk Manager Yes SYSTEM 5.2.3790.1830 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- 10/1/2002(Standard system devices) machine.inf Packard oem6.inf Not Available Not Available ROOT\DMIO\0000 HP TPC-H FULL DISCLOSURE REPORT 109 © 2005 Hewlett-Packard Company. All rights reserved. PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Smart Array Logical Volume Augusta Golden No V_01\6&24BE4FB5&0&2008 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI standard PCI-to-PCI bridge Yes SYSTEM Packard oem9.inf Not Available 5.2.3790.1830 10/1/2002(Standard system HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM devices) machine.inf Not Available E\7&3A27FE5C&0&0200004000000000 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Smart Array Logical Volume Augusta Golden No V_03\5&2D7AC9C6&0&08 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\F6 E\7&3A27FE5C&0&0100004000000000 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&3105053C&0&0300004000000000 E\7&3A27FE5C&0&0000004000000000 Smart Array Logical Volume Augusta Golden No Smart Array 6400 Controller (Non-Miniport) No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem6.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE E\7&3105053C&0&0200004000000000 V_01\6&3938F52B&0&2008 Smart Array Logical Volume Augusta Golden No PCI standard PCI-to-PCI bridge Yes SYSTEM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.2.3790.1830 10/1/2002(Standard system Packard oem9.inf Not Available devices) machine.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE E\7&3105053C&0&0100004000000000 V_02\5&3690080C&0&08 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\EE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&3105053C&0&0000004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array 6400 Controller (Non-Miniport) No Packard oem9.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem6.inf Not Available E\7&4CDCB49&0&0300004000000000 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Smart Array Logical Volume Augusta Golden No V_01\6&2F746F0B&0&2008 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI standard PCI-to-PCI bridge Yes SYSTEM Packard oem9.inf Not Available 5.2.3790.1830 10/1/2002(Standard system HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM devices) machine.inf Not Available E\7&4CDCB49&0&0200004000000000 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Smart Array Logical Volume Augusta Golden No V_03\5&17536109&0&08 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\F4 E\7&4CDCB49&0&0100004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\F3 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&4CDCB49&0&0000004000000000 Available ACPI\HW P0002\F2 Smart Array 6400 Controller (Non-Miniport) No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem6.inf Not Available Available ACPI\HW P0002\F1 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&F080726&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\F0 5.2.3790.1830 10/1/2002(Standard system Generic Bus Yes SYSTEM 5.2.3790.1830 devices) machine.inf Not Available 10/1/2002(Standard system devices) machine.inf PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Not Available ACPI\HW P0004\F00 V_02\5&111CA6C2&0&08 Generic Bus Yes SYSTEM 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard system devices) machine.inf (Standard system devices) machine.inf Not Not Available ACPI\HW P0005\F Available ACPI\HW P0002\EC Processor Yes PROCESSOR 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard processor types) cpu.inf Not (Standard system devices) machine.inf Not Available ACPI\GENUINEINTEL_- Available ACPI\HW P0002\EA _IA64_FAMILY_31_MODEL_2\31 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\E9 Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\30 (Standard system devices) machine.inf Not Smart Array Logical Volume Augusta Golden No Available ACPI\HW P0002\E8 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\E7 E\7&3A27FE5C&0&0300004000000000

HP TPC-H FULL DISCLOSURE REPORT 110 © 2005 Hewlett-Packard Company. All rights reserved. Generic Bus Yes SYSTEM 5.2.3790.1830 Processor Yes PROCESSOR 5.2.3790.1830 10/1/2002(Standard system devices) machine.inf 10/1/2002(Standard processor types) cpu.inf Not Not Available ACPI\HW P0004\E01 Available ACPI\GENUINEINTEL_- Smart Array Logical Volume Augusta Golden No _IA64_FAMILY_31_MODEL_2\28 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&359C23B5&0&0300004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&3632554B&0&0300004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&359C23B5&0&0200004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&3632554B&0&0200004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&359C23B5&0&0100004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&3632554B&0&0100004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&359C23B5&0&0000004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array 6400 Controller (Non-Miniport) No E\7&3632554B&0&0000004000000000 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Smart Array 6400 Controller (Non-Miniport) No Packard oem6.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Packard oem6.inf Not Available V_01\6&1EE377EE&0&2008 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI standard PCI-to-PCI bridge Yes SYSTEM V_01\6&10B98E28&0&2008 5.2.3790.1830 10/1/2002(Standard system PCI standard PCI-to-PCI bridge Yes SYSTEM devices) machine.inf Not Available 5.2.3790.1830 10/1/2002(Standard system PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE devices) machine.inf Not Available V_02\5&AF4FDBC&0&08 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_03\5&710EBBF&0&08 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\E5 (Standard system devices) machine.inf Not Disk drive Yes DISKDRIVE 5.2.3790.0 Available ACPI\HWP0002\DE 10/1/2002(Standard disk drives) disk.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available (Standard system devices) machine.inf Not SCSI\DISK&VEN_COMPAQ&PROD_MSA1000_VOLU Available ACPI\HW P0002\DC ME&REV_4.32\6&16E535F1&0&001 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HP MSA1000 Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002Compaq scsidev.inf Not Available Available ACPI\HW P0002\DB SCSI\ARRAY&VEN_COMPAQ&PROD_MSA1000&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_4.32\6&16E535F1&0&000 (Standard system devices) machine.inf Not Emulex LightPulse HBA - Storport Miniport Driver Yes Available ACPI\HW P0002\DA SCSIADAPTER 6.1.11.0 5/6/2005 Emulex PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 oem10.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_10DF&DEV_F980&SUBSYS_F98010DF&RE Available ACPI\HW P0002\D9 V_01\5&7C4B2E9&0&08 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\D8 Available ACPI\HW P0002\E4 Generic Bus Yes SYSTEM 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard system devices) machine.inf (Standard system devices) machine.inf Not Not Available ACPI\HW P0004\D01 Available ACPI\HW P0002\E3 Smart Array Logical Volume No DISKDRIVE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not (Standard system devices) machine.inf Not Available Available ACPI\HW P0002\E2 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&2CB7316B&0&0300004000000000 (Standard system devices) machine.inf Not Smart Array Logical Volume No DISKDRIVE Available ACPI\HW P0002\E1 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\E0 E\7&2CB7316B&0&0200004000000000 Generic Bus Yes SYSTEM 5.2.3790.1830 Smart Array Logical Volume No DISKDRIVE 10/1/2002(Standard system devices) machine.inf 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Not Available ACPI\HW P0004\E00 Available Generic Bus Yes SYSTEM 5.2.3790.1830 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 10/1/2002(Standard system devices) machine.inf E\7&2CB7316B&0&0100004000000000 Not Available ACPI\HW P0005\E Smart Array Logical Volume No DISKDRIVE Processor Yes PROCESSOR 5.2.3790.1830 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available Available ACPI\GENUINEINTEL_- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM _IA64_FAMILY_31_MODEL_2\29 E\7&2CB7316B&0&0000004000000000 HP TPC-H FULL DISCLOSURE REPORT 111 © 2005 Hewlett-Packard Company. All rights reserved. Smart Array 6400 Controller (Non-Miniport) No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- E\7&2F592266&0&0300004000000000 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&A54E083&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&2F592266&0&0200004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_03\5&2D3D5C81&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&2F592266&0&0100004000000000 Available ACPI\HW P0002\D6 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&2F592266&0&0000004000000000 E\7&16DDD973&0&0300004000000000 Smart Array 6400 Controller (Non-Miniport) No Smart Array Logical Volume Augusta Golden No SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem6.inf Not Available Packard oem9.inf Not Available PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_01\6&1AD86F4B&0&2008 E\7&16DDD973&0&0200004000000000 PCI standard PCI-to-PCI bridge Yes SYSTEM Smart Array Logical Volume Augusta Golden No 5.2.3790.1830 10/1/2002(Standard system DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- devices) machine.inf Not Available Packard oem9.inf Not Available PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_02\5&331D07A6&0&08 E\7&16DDD973&0&0100004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\CE Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&16DDD973&0&0000004000000000 Packard oem9.inf Not Available Smart Array 6400 Controller (Non-Miniport) No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- E\7&990E5A9&0&0300004000000000 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&32DF8DD&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&990E5A9&0&0200004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_02\5&7C9FB37&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&990E5A9&0&0100004000000000 Available ACPI\HW P0002\D4 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\D3 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&990E5A9&0&0000004000000000 (Standard system devices) machine.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\HW P0002\D2 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem6.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Available ACPI\HW P0002\D1 V_01\6&2A94F18F&0&2008 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI standard PCI-to-PCI bridge Yes SYSTEM (Standard system devices) machine.inf Not 5.2.3790.1830 10/1/2002(Standard system Available ACPI\HW P0002\D0 devices) machine.inf Not Available Generic Bus Yes SYSTEM 5.2.3790.1830 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 10/1/2002(Standard system devices) machine.inf V_02\5&1CF59EE9&0&08 Not Available ACPI\HW P0004\D00 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\CC Not Available ACPI\HW P0005\D PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\CA Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\27 (Standard system devices) machine.inf Not Processor Yes PROCESSOR 5.2.3790.1830 Available ACPI\HW P0002\C9 10/1/2002(Standard processor types) cpu.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\GENUINEINTEL_- (Standard system devices) machine.inf Not _IA64_FAMILY_31_MODEL_2\26 Available ACPI\HW P0002\C8 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\C7 HP TPC-H FULL DISCLOSURE REPORT 112 © 2005 Hewlett-Packard Company. All rights reserved. Generic Bus Yes SYSTEM 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002(Standard system devices) machine.inf DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Not Available ACPI\HW P0004\C01 Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&24254F5&0&0100004000000000 Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&ADDF479&0&0300004000000000 Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&24254F5&0&0000004000000000 Packard oem9.inf Not Available Smart Array 6400 Controller (Non-Miniport) No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- E\7&ADDF479&0&0200004000000000 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&1DAC117C&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&ADDF479&0&0100004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_02\5&180C7081&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&ADDF479&0&0000004000000000 Available ACPI\HW P0002\BE Smart Array 6400 Controller (Non-Miniport) No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem6.inf Not Available Available ACPI\HW P0002\BC PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&2C5BCFD8&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\BB 5.2.3790.1830 10/1/2002(Standard system PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 devices) machine.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Available ACPI\HW P0002\BA V_02\5&231D47EF&0&08 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\B9 Available ACPI\HW P0002\C5 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\B8 Available ACPI\HW P0002\C4 Generic Bus Yes SYSTEM 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard system devices) machine.inf (Standard system devices) machine.inf Not Not Available ACPI\HW P0004\B01 Available ACPI\HW P0002\C3 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\C2 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&2E40C483&0&0300004000000000 (Standard system devices) machine.inf Not Smart Array Logical Volume Augusta Golden No Available ACPI\HW P0002\C1 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\C0 E\7&2E40C483&0&0200004000000000 Generic Bus Yes SYSTEM 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002(Standard system devices) machine.inf DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Not Available ACPI\HW P0004\C00 Packard oem9.inf Not Available Generic Bus Yes SYSTEM 5.2.3790.1830 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 10/1/2002(Standard system devices) machine.inf E\7&2E40C483&0&0100004000000000 Not Available ACPI\HW P0005\C Smart Array Logical Volume Augusta Golden No Processor Yes PROCESSOR 5.2.3790.1830 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 10/1/2002(Standard processor types) cpu.inf Not Packard oem9.inf Not Available Available ACPI\GENUINEINTEL_- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM _IA64_FAMILY_31_MODEL_2\25 E\7&2E40C483&0&0000004000000000 Processor Yes PROCESSOR 5.2.3790.1830 Smart Array 6400 Controller (Non-Miniport) No 10/1/2002(Standard processor types) cpu.inf Not SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Available ACPI\GENUINEINTEL_- Packard oem6.inf Not Available _IA64_FAMILY_31_MODEL_2\24 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Smart Array Logical Volume Augusta Golden No V_01\6&33CF7C25&0&2008 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI standard PCI-to-PCI bridge Yes SYSTEM Packard oem9.inf Not Available 5.2.3790.1830 10/1/2002(Standard system HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM devices) machine.inf Not Available E\7&24254F5&0&0300004000000000 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Smart Array Logical Volume Augusta Golden No V_02\5&D4E92A&0&08 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\B6 E\7&24254F5&0&0200004000000000 HP TPC-H FULL DISCLOSURE REPORT 113 © 2005 Hewlett-Packard Company. All rights reserved. Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&1EB5CC40&0&0300004000000000 E\7&18AE348B&0&0000004000000000 Smart Array Logical Volume Augusta Golden No Smart Array 6400 Controller (Non-Miniport) No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem6.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE E\7&1EB5CC40&0&0200004000000000 V_01\6&1392A499&0&2008 Smart Array Logical Volume Augusta Golden No PCI standard PCI-to-PCI bridge Yes SYSTEM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.2.3790.1830 10/1/2002(Standard system Packard oem9.inf Not Available devices) machine.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE E\7&1EB5CC40&0&0100004000000000 V_02\5&279B1EA1&0&08 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\AE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&1EB5CC40&0&0000004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array 6400 Controller (Non-Miniport) No Packard oem9.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem6.inf Not Available E\7&14FC6D2&0&0300004000000000 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Smart Array Logical Volume Augusta Golden No V_01\6&34DE441&0&2008 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI standard PCI-to-PCI bridge Yes SYSTEM Packard oem9.inf Not Available 5.2.3790.1830 10/1/2002(Standard system HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM devices) machine.inf Not Available E\7&14FC6D2&0&0200004000000000 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Smart Array Logical Volume Augusta Golden No V_02\5&26484A74&0&08 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\B4 E\7&14FC6D2&0&0100004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\B3 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&14FC6D2&0&0000004000000000 Available ACPI\HW P0002\B2 Smart Array 6400 Controller (Non-Miniport) No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem6.inf Not Available Available ACPI\HW P0002\B1 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&1D9779E8&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\B0 5.2.3790.1830 10/1/2002(Standard system Generic Bus Yes SYSTEM 5.2.3790.1830 devices) machine.inf Not Available 10/1/2002(Standard system devices) machine.inf PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Not Available ACPI\HW P0004\B00 V_02\5&227BD57&0&08 Generic Bus Yes SYSTEM 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard system devices) machine.inf (Standard system devices) machine.inf Not Not Available ACPI\HW P0005\B Available ACPI\HW P0002\AC Processor Yes PROCESSOR 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard processor types) cpu.inf Not (Standard system devices) machine.inf Not Available ACPI\GENUINEINTEL_- Available ACPI\HW P0002\AA _IA64_FAMILY_31_MODEL_2\23 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\A9 Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\22 (Standard system devices) machine.inf Not Smart Array Logical Volume Augusta Golden No Available ACPI\HW P0002\A8 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\A7 E\7&18AE348B&0&0300004000000000 Generic Bus Yes SYSTEM 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002(Standard system devices) machine.inf DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Not Available ACPI\HW P0004\A01 Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&18AE348B&0&0200004000000000 Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&25254EE&0&0300004000000000 Packard oem9.inf Not Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&18AE348B&0&0100004000000000 Packard oem9.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 114 © 2005 Hewlett-Packard Company. All rights reserved. HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array 6400 Controller (Non-Miniport) No E\7&25254EE&0&0200004000000000 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem6.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Packard oem9.inf Not Available V_01\6&2FD486&0&2008 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI standard PCI-to-PCI bridge Yes SYSTEM E\7&25254EE&0&0100004000000000 5.2.3790.1830 10/1/2002(Standard system Smart Array Logical Volume Augusta Golden No devices) machine.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem9.inf Not Available V_02\5&7E38C19&0&08 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&25254EE&0&0000004000000000 (Standard system devices) machine.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\HW P0002\9E SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem6.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Available ACPI\HW P0002\9C V_01\6&F54B257&0&2008 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI standard PCI-to-PCI bridge Yes SYSTEM (Standard system devices) machine.inf Not 5.2.3790.1830 10/1/2002(Standard system Available ACPI\HW P0002\9B devices) machine.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE (Standard system devices) machine.inf Not V_02\5&379ADE58&0&08 Available ACPI\HW P0002\9A PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\A5 Available ACPI\HW P0002\99 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\A4 Available ACPI\HW P0002\98 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\A3 Not Available ACPI\HW P0004\901 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\A2 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&2044A15F&0&0300004000000000 Available ACPI\HW P0002\A1 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\A0 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&2044A15F&0&0200004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume Augusta Golden No Not Available ACPI\HW P0004\A00 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Generic Bus Yes SYSTEM 5.2.3790.1830 Packard oem9.inf Not Available 10/1/2002(Standard system devices) machine.inf HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Not Available ACPI\HW P0005\A E\7&2044A15F&0&0100004000000000 Processor Yes PROCESSOR 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002(Standard processor types) cpu.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\GENUINEINTEL_- Packard oem9.inf Not Available _IA64_FAMILY_31_MODEL_2\21 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Processor Yes PROCESSOR 5.2.3790.1830 E\7&2044A15F&0&0000004000000000 10/1/2002(Standard processor types) cpu.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\GENUINEINTEL_- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- _IA64_FAMILY_31_MODEL_2\20 Packard oem6.inf Not Available Smart Array Logical Volume No DISKDRIVE PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not V_01\6&E2C15A5&0&2008 Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&32AC9C3E&0&0300004000000000 devices) machine.inf Not Available Smart Array Logical Volume No DISKDRIVE PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not V_03\5&20C4E5C4&0&08 Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&32AC9C3E&0&0200004000000000 Available ACPI\HW P0002\96 Smart Array Logical Volume No DISKDRIVE Smart Array Logical Volume Augusta Golden No 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&32AC9C3E&0&0100004000000000 E\7&323A2B2F&0&0300004000000000 Smart Array Logical Volume No DISKDRIVE Smart Array Logical Volume Augusta Golden No 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&32AC9C3E&0&0000004000000000 E\7&323A2B2F&0&0200004000000000

HP TPC-H FULL DISCLOSURE REPORT 115 © 2005 Hewlett-Packard Company. All rights reserved. Smart Array Logical Volume Augusta Golden No PCI standard PCI-to-PCI bridge Yes SYSTEM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.2.3790.1830 10/1/2002(Standard system Packard oem9.inf Not Available devices) machine.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE E\7&323A2B2F&0&0100004000000000 V_02\5&7AB2207&0&08 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\8E HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&323A2B2F&0&0000004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array 6400 Controller (Non-Miniport) No Packard oem9.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem6.inf Not Available E\7&11F564FD&0&0300004000000000 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Smart Array Logical Volume Augusta Golden No V_01\6&29499EEE&0&2008 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI standard PCI-to-PCI bridge Yes SYSTEM Packard oem9.inf Not Available 5.2.3790.1830 10/1/2002(Standard system HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM devices) machine.inf Not Available E\7&11F564FD&0&0200004000000000 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Smart Array Logical Volume Augusta Golden No V_03\5&6F75ADD&0&08 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\94 E\7&11F564FD&0&0100004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\93 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&11F564FD&0&0000004000000000 Available ACPI\HW P0002\92 Smart Array 6400 Controller (Non-Miniport) No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem6.inf Not Available Available ACPI\HW P0002\91 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&2E7F504&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\90 5.2.3790.1830 10/1/2002(Standard system Generic Bus Yes SYSTEM 5.2.3790.1830 devices) machine.inf Not Available 10/1/2002(Standard system devices) machine.inf PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Not Available ACPI\HW P0004\900 V_02\5&1DC83F43&0&08 Generic Bus Yes SYSTEM 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard system devices) machine.inf (Standard system devices) machine.inf Not Not Available ACPI\HW P0005\9 Available ACPI\HW P0002\8C Processor Yes PROCESSOR 5.2.3790.1830 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard processor types) cpu.inf Not (Standard system devices) machine.inf Not Available ACPI\GENUINEINTEL_- Available ACPI\HW P0002\8A _IA64_FAMILY_31_MODEL_2\19 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\89 Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\18 (Standard system devices) machine.inf Not Smart Array Logical Volume No DISKDRIVE Available ACPI\HW P0002\88 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\87 E\7&1F0D9623&0&0300004000000000 Generic Bus Yes SYSTEM 5.2.3790.1830 Smart Array Logical Volume No DISKDRIVE 10/1/2002(Standard system devices) machine.inf 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Not Available ACPI\HW P0004\801 Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&1F0D9623&0&0200004000000000 Packard oem9.inf Not Available Smart Array Logical Volume No DISKDRIVE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not E\7&2750FA52&0&0300004000000000 Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&1F0D9623&0&0100004000000000 Packard oem9.inf Not Available Smart Array Logical Volume No DISKDRIVE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not E\7&2750FA52&0&0200004000000000 Available Smart Array Logical Volume Augusta Golden No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- E\7&1F0D9623&0&0000004000000000 Packard oem9.inf Not Available Smart Array 6400 Controller (Non-Miniport) No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- E\7&2750FA52&0&0100004000000000 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&1F5E8437&0&2008 Packard oem9.inf Not Available

HP TPC-H FULL DISCLOSURE REPORT 116 © 2005 Hewlett-Packard Company. All rights reserved. HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&2750FA52&0&0000004000000000 (Standard system devices) machine.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\HW P0002\7E SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem6.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Available ACPI\HW P0002\7C V_01\6&8FDA64E&0&2008 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI standard PCI-to-PCI bridge Yes SYSTEM (Standard system devices) machine.inf Not 5.2.3790.1830 10/1/2002(Standard system Available ACPI\HW P0002\7B devices) machine.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE (Standard system devices) machine.inf Not V_02\5&23EFE849&0&08 Available ACPI\HW P0002\7A PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\85 Available ACPI\HW P0002\79 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 (Standard system devices) machine.inf Not (Standard system devices) machine.inf Not Available ACPI\HW P0002\84 Available ACPI\HW P0002\78 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\83 Not Available ACPI\HW P0004\701 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\82 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&14C3B263&0&0300004000000000 Available ACPI\HW P0002\81 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\80 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&14C3B263&0&0200004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume Augusta Golden No Not Available ACPI\HW P0004\800 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Generic Bus Yes SYSTEM 5.2.3790.1830 Packard oem9.inf Not Available 10/1/2002(Standard system devices) machine.inf HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Not Available ACPI\HW P0005\8 E\7&14C3B263&0&0100004000000000 Processor Yes PROCESSOR 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002(Standard processor types) cpu.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\GENUINEINTEL_- Packard oem9.inf Not Available _IA64_FAMILY_31_MODEL_2\17 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Processor Yes PROCESSOR 5.2.3790.1830 E\7&14C3B263&0&0000004000000000 10/1/2002(Standard processor types) cpu.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\GENUINEINTEL_- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- _IA64_FAMILY_31_MODEL_2\16 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&5008982&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&1BDEA3EA&0&0300004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_02\5&39F34083&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&1BDEA3EA&0&0200004000000000 Available ACPI\HW P0002\76 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&1BDEA3EA&0&0100004000000000 E\7&3AF6481B&0&0300004000000000 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&1BDEA3EA&0&0000004000000000 E\7&3AF6481B&0&0200004000000000 Smart Array 6400 Controller (Non-Miniport) No Smart Array Logical Volume Augusta Golden No SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem6.inf Not Available Packard oem9.inf Not Available PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_01\6&20B95737&0&2008 E\7&3AF6481B&0&0100004000000000 PCI standard PCI-to-PCI bridge Yes SYSTEM Smart Array Logical Volume Augusta Golden No 5.2.3790.1830 10/1/2002(Standard system DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- devices) machine.inf Not Available Packard oem9.inf Not Available PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_03\5&1739D027&0&08 E\7&3AF6481B&0&0000004000000000

HP TPC-H FULL DISCLOSURE REPORT 117 © 2005 Hewlett-Packard Company. All rights reserved. Smart Array 6400 Controller (Non-Miniport) No HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- E\7&160C808&0&0300004000000000 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&2E866412&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&160C808&0&0200004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_03\5&147FDF39&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&160C808&0&0100004000000000 Available ACPI\HW P0002\74 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\73 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&160C808&0&0000004000000000 (Standard system devices) machine.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\HW P0002\72 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem6.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Available ACPI\HW P0002\71 V_01\6&2DA307DA&0&2008 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI standard PCI-to-PCI bridge Yes SYSTEM (Standard system devices) machine.inf Not 5.2.3790.1830 10/1/2002(Standard system Available ACPI\HW P0002\70 devices) machine.inf Not Available Generic Bus Yes SYSTEM 5.2.3790.1830 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 10/1/2002(Standard system devices) machine.inf V_02\5&1551CFD&0&08 Not Available ACPI\HW P0004\700 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\6C Not Available ACPI\HW P0005\7 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\6A Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\15 (Standard system devices) machine.inf Not Processor Yes PROCESSOR 5.2.3790.1830 Available ACPI\HW P0002\69 10/1/2002(Standard processor types) cpu.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\GENUINEINTEL_- (Standard system devices) machine.inf Not _IA64_FAMILY_31_MODEL_2\14 Available ACPI\HW P0002\68 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\67 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&38B4535&0&0300004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume Augusta Golden No Not Available ACPI\HW P0004\601 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&38B4535&0&0200004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&DB0BEC7&0&0300004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&38B4535&0&0100004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&DB0BEC7&0&0200004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&38B4535&0&0000004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array 6400 Controller (Non-Miniport) No E\7&DB0BEC7&0&0100004000000000 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem6.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Packard oem9.inf Not Available V_01\6&268A2E2C&0&2008 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI standard PCI-to-PCI bridge Yes SYSTEM E\7&DB0BEC7&0&0000004000000000 5.2.3790.1830 10/1/2002(Standard system Smart Array 6400 Controller (Non-Miniport) No devices) machine.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem6.inf Not Available V_02\5&266723A4&0&08 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&56B183C&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\6E 5.2.3790.1830 10/1/2002(Standard system Smart Array Logical Volume Augusta Golden No devices) machine.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem9.inf Not Available V_02\5&36C83DFE&0&08 HP TPC-H FULL DISCLOSURE REPORT 118 © 2005 Hewlett-Packard Company. All rights reserved. PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\65 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&31523533&0&0100004000000000 Available ACPI\HW P0002\64 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\63 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&31523533&0&0000004000000000 (Standard system devices) machine.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\HW P0002\62 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem6.inf Not Available (Standard system devices) machine.inf Not PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Available ACPI\HW P0002\61 V_01\6&11924964&0&2008 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI standard PCI-to-PCI bridge Yes SYSTEM (Standard system devices) machine.inf Not 5.2.3790.1830 10/1/2002(Standard system Available ACPI\HW P0002\60 devices) machine.inf Not Available Generic Bus Yes SYSTEM 5.2.3790.1830 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 10/1/2002(Standard system devices) machine.inf V_02\5&B10CC7&0&08 Not Available ACPI\HW P0004\600 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\5C Not Available ACPI\HW P0005\6 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\5A Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\13 (Standard system devices) machine.inf Not Processor Yes PROCESSOR 5.2.3790.1830 Available ACPI\HW P0002\59 10/1/2002(Standard processor types) cpu.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\GENUINEINTEL_- (Standard system devices) machine.inf Not _IA64_FAMILY_31_MODEL_2\12 Available ACPI\HW P0002\58 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\57 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&30C438B8&0&0300004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume Augusta Golden No Not Available ACPI\HW P0004\501 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&30C438B8&0&0200004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&31DA214E&0&0300004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&30C438B8&0&0100004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&31DA214E&0&0200004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&30C438B8&0&0000004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array 6400 Controller (Non-Miniport) No E\7&31DA214E&0&0100004000000000 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem6.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Packard oem9.inf Not Available V_01\6&2D909473&0&2008 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI standard PCI-to-PCI bridge Yes SYSTEM E\7&31DA214E&0&0000004000000000 5.2.3790.1830 10/1/2002(Standard system Smart Array 6400 Controller (Non-Miniport) No devices) machine.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem6.inf Not Available V_02\5&16D87584&0&08 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&1A4A5DE5&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\5E 5.2.3790.1830 10/1/2002(Standard system Smart Array Logical Volume Augusta Golden No devices) machine.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem9.inf Not Available V_02\5&6D8B5CD&0&08 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&31523533&0&0300004000000000 (Standard system devices) machine.inf Not Smart Array Logical Volume Augusta Golden No Available ACPI\HW P0002\55 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\54 E\7&31523533&0&0200004000000000 HP TPC-H FULL DISCLOSURE REPORT 119 © 2005 Hewlett-Packard Company. All rights reserved. PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\53 Not Available ACPI\HW P0004\401 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume No DISKDRIVE (Standard system devices) machine.inf Not 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Available ACPI\HW P0002\52 Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&54E2297&0&0300004000000000 Available ACPI\HW P0002\51 Smart Array Logical Volume No DISKDRIVE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not (Standard system devices) machine.inf Not Available Available ACPI\HW P0002\50 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&54E2297&0&0200004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume No DISKDRIVE Not Available ACPI\HW P0004\500 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Generic Bus Yes SYSTEM 5.2.3790.1830 Available 10/1/2002(Standard system devices) machine.inf HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Not Available ACPI\HW P0005\5 E\7&54E2297&0&0100004000000000 Processor Yes PROCESSOR 5.2.3790.1830 Smart Array Logical Volume No DISKDRIVE 10/1/2002(Standard processor types) cpu.inf Not 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Available ACPI\GENUINEINTEL_- Available _IA64_FAMILY_31_MODEL_2\11 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Processor Yes PROCESSOR 5.2.3790.1830 E\7&54E2297&0&0000004000000000 10/1/2002(Standard processor types) cpu.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\GENUINEINTEL_- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- _IA64_FAMILY_31_MODEL_2\10 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&32E3B72F&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&4FC594E&0&0300004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_02\5&1B6FA8F8&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&4FC594E&0&0200004000000000 Available ACPI\HW P0002\46 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume No DISKDRIVE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Packard oem9.inf Not Available Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&4FC594E&0&0100004000000000 E\7&313C02A5&0&0300004000000000 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume No DISKDRIVE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Packard oem9.inf Not Available Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&4FC594E&0&0000004000000000 E\7&313C02A5&0&0200004000000000 Smart Array 6400 Controller (Non-Miniport) No Smart Array Logical Volume No DISKDRIVE SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Packard oem6.inf Not Available Available PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_01\6&1D662FDD&0&2008 E\7&313C02A5&0&0100004000000000 PCI standard PCI-to-PCI bridge Yes SYSTEM Smart Array Logical Volume No DISKDRIVE 5.2.3790.1830 10/1/2002(Standard system 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not devices) machine.inf Not Available Available PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_03\5&345102A3&0&08 E\7&313C02A5&0&0000004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array 6400 Controller (Non-Miniport) No (Standard system devices) machine.inf Not SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Available ACPI\HW P0002\4E Packard oem6.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE (Standard system devices) machine.inf Not V_01\6&7E57A38&0&2008 Available ACPI\HW P0002\4C PCI standard PCI-to-PCI bridge Yes SYSTEM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 5.2.3790.1830 10/1/2002(Standard system (Standard system devices) machine.inf Not devices) machine.inf Not Available Available ACPI\HW P0002\4B PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_03\5&A03B852&0&08 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\4A (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\44 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\49 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\43 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\48 (Standard system devices) machine.inf Not Available ACPI\HW P0002\42 HP TPC-H FULL DISCLOSURE REPORT 120 © 2005 Hewlett-Packard Company. All rights reserved. PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&2EB04E43&0&0300004000000000 Available ACPI\HW P0002\41 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\40 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&2EB04E43&0&0200004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume Augusta Golden No Not Available ACPI\HW P0004\400 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Generic Bus Yes SYSTEM 5.2.3790.1830 Packard oem9.inf Not Available 10/1/2002(Standard system devices) machine.inf HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Not Available ACPI\HW P0005\4 E\7&2EB04E43&0&0100004000000000 Processor Yes PROCESSOR 5.2.3790.1830 Smart Array Logical Volume Augusta Golden No 10/1/2002(Standard processor types) cpu.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\GENUINEINTEL_- Packard oem9.inf Not Available _IA64_FAMILY_31_MODEL_2\_9 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Processor Yes PROCESSOR 5.2.3790.1830 E\7&2EB04E43&0&0000004000000000 10/1/2002(Standard processor types) cpu.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\GENUINEINTEL_- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- _IA64_FAMILY_31_MODEL_2\_8 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&1245B283&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&304E36D7&0&0300004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_02\5&2AFE5718&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&304E36D7&0&0200004000000000 Available ACPI\HW P0002\36 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&304E36D7&0&0100004000000000 E\7&D195DE6&0&0300004000000000 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume Augusta Golden No DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem9.inf Not Available Packard oem9.inf Not Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&304E36D7&0&0000004000000000 E\7&D195DE6&0&0200004000000000 Smart Array 6400 Controller (Non-Miniport) No Smart Array Logical Volume Augusta Golden No SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Packard oem6.inf Not Available Packard oem9.inf Not Available PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_01\6&27277C64&0&2008 E\7&D195DE6&0&0100004000000000 PCI standard PCI-to-PCI bridge Yes SYSTEM Smart Array Logical Volume Augusta Golden No 5.2.3790.1830 10/1/2002(Standard system DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- devices) machine.inf Not Available Packard oem9.inf Not Available PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_02\5&844E6BC&0&08 E\7&D195DE6&0&0000004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array 6400 Controller (Non-Miniport) No (Standard system devices) machine.inf Not SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Available ACPI\HW P0002\3E Packard oem6.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE (Standard system devices) machine.inf Not V_01\6&254291F3&0&2008 Available ACPI\HW P0002\3C PCI standard PCI-to-PCI bridge Yes SYSTEM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 5.2.3790.1830 10/1/2002(Standard system (Standard system devices) machine.inf Not devices) machine.inf Not Available Available ACPI\HW P0002\3B PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_03\5&58AF5CE&0&08 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\3A (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\34 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\39 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\33 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\38 (Standard system devices) machine.inf Not Generic Bus Yes SYSTEM 5.2.3790.1830 Available ACPI\HW P0002\32 10/1/2002(Standard system devices) machine.inf PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Not Available ACPI\HW P0004\301 (Standard system devices) machine.inf Not Smart Array Logical Volume Augusta Golden No Available ACPI\HW P0002\31 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not Available ACPI\HW P0002\30 HP TPC-H FULL DISCLOSURE REPORT 121 © 2005 Hewlett-Packard Company. All rights reserved. Generic Bus Yes SYSTEM 5.2.3790.1830 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 10/1/2002(Standard system devices) machine.inf V_02\5&1F34A452&0&08 Not Available ACPI\HW P0004\300 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Generic Bus Yes SYSTEM 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard system devices) machine.inf Available ACPI\HW P0002\2C Not Available ACPI\HW P0005\3 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Processor Yes PROCESSOR 5.2.3790.1830 (Standard system devices) machine.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available ACPI\HW P0002\2A Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\_7 (Standard system devices) machine.inf Not Processor Yes PROCESSOR 5.2.3790.1830 Available ACPI\HW P0002\29 10/1/2002(Standard processor types) cpu.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\GENUINEINTEL_- (Standard system devices) machine.inf Not _IA64_FAMILY_31_MODEL_2\_6 Available ACPI\HW P0002\28 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\27 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&1FB58CA0&0&0300004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume Augusta Golden No Not Available ACPI\HW P0004\201 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&1FB58CA0&0&0200004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&15801FB5&0&0300004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&1FB58CA0&0&0100004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume Augusta Golden No E\7&15801FB5&0&0200004000000000 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem9.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Packard oem9.inf Not Available E\7&1FB58CA0&0&0000004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array 6400 Controller (Non-Miniport) No E\7&15801FB5&0&0100004000000000 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Smart Array Logical Volume Augusta Golden No Packard oem6.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Packard oem9.inf Not Available V_01\6&1ADDC34E&0&2008 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI standard PCI-to-PCI bridge Yes SYSTEM E\7&15801FB5&0&0000004000000000 5.2.3790.1830 10/1/2002(Standard system Smart Array 6400 Controller (Non-Miniport) No devices) machine.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem6.inf Not Available V_02\5&355C0D0F&0&08 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&3F8D11E&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\2E 5.2.3790.1830 10/1/2002(Standard system Smart Array Logical Volume Augusta Golden No devices) machine.inf Not Available DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem9.inf Not Available V_02\5&255C4D58&0&08 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&185A2E4D&0&0300004000000000 (Standard system devices) machine.inf Not Smart Array Logical Volume Augusta Golden No Available ACPI\HW P0002\25 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Packard oem9.inf Not Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\24 E\7&185A2E4D&0&0200004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array Logical Volume Augusta Golden No (Standard system devices) machine.inf Not DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- Available ACPI\HW P0002\23 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&185A2E4D&0&0100004000000000 Available ACPI\HW P0002\22 Smart Array Logical Volume Augusta Golden No PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- (Standard system devices) machine.inf Not Packard oem9.inf Not Available Available ACPI\HW P0002\21 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&185A2E4D&0&0000004000000000 (Standard system devices) machine.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\HW P0002\20 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Generic Bus Yes SYSTEM 5.2.3790.1830 Packard oem6.inf Not Available 10/1/2002(Standard system devices) machine.inf PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Not Available ACPI\HW P0004\200 V_01\6&2A693B4F&0&2008 Generic Bus Yes SYSTEM 5.2.3790.1830 PCI standard PCI-to-PCI bridge Yes SYSTEM 10/1/2002(Standard system devices) machine.inf 5.2.3790.1830 10/1/2002(Standard system Not Available ACPI\HW P0005\2 devices) machine.inf Not Available HP TPC-H FULL DISCLOSURE REPORT 122 © 2005 Hewlett-Packard Company. All rights reserved. Processor Yes PROCESSOR 5.2.3790.1830 Smart Array Logical Volume No DISKDRIVE 10/1/2002(Standard processor types) cpu.inf Not 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Available ACPI\GENUINEINTEL_- Available _IA64_FAMILY_31_MODEL_2\_5 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Processor Yes PROCESSOR 5.2.3790.1830 E\7&830A57A&0&0000004000000000 10/1/2002(Standard processor types) cpu.inf Not Smart Array 6400 Controller (Non-Miniport) No Available ACPI\GENUINEINTEL_- SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- _IA64_FAMILY_31_MODEL_2\_4 Packard oem6.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_01\6&1D793F41&0&2008 Packard oem9.inf Not Available PCI standard PCI-to-PCI bridge Yes SYSTEM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 5.2.3790.1830 10/1/2002(Standard system E\7&293A419E&0&0300004000000000 devices) machine.inf Not Available Smart Array Logical Volume Augusta Golden No PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- V_02\5&313EE93&0&08 Packard oem9.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM (Standard system devices) machine.inf Not E\7&293A419E&0&0200004000000000 Available ACPI\HW P0002\16 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume No DISKDRIVE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Packard oem9.inf Not Available Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&293A419E&0&0100004000000000 E\7&7C98472&0&0300004000000000 Smart Array Logical Volume Augusta Golden No Smart Array Logical Volume No DISKDRIVE DISKDRIVE 5.6.56.64 4/8/2003 Hewlett- 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Packard oem9.inf Not Available Available HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM E\7&293A419E&0&0000004000000000 E\7&7C98472&0&0200004000000000 Smart Array 6400 Controller (Non-Miniport) No Smart Array Logical Volume No DISKDRIVE SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Packard oem6.inf Not Available Available PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_01\6&27A7D842&0&2008 E\7&7C98472&0&0100004000000000 PCI standard PCI-to-PCI bridge Yes SYSTEM Smart Array Logical Volume No DISKDRIVE 5.2.3790.1830 10/1/2002(Standard system 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not devices) machine.inf Not Available Available PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM V_02\5&15CD6B18&0&08 E\7&7C98472&0&0000004000000000 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Smart Array 6400 Controller (Non-Miniport) No (Standard system devices) machine.inf Not SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Available ACPI\HW P0002\1E Packard oem6.inf Not Available PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE (Standard system devices) machine.inf Not V_01\6&11EA3ED1&0&2008 Available ACPI\HW P0002\1C PCI standard PCI-to-PCI bridge Yes SYSTEM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 5.2.3790.1830 10/1/2002(Standard system (Standard system devices) machine.inf Not devices) machine.inf Not Available Available ACPI\HW P0002\1B PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_03\5&28874FDD&0&08 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\1A (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\14 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\19 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\13 (Standard system devices) machine.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available ACPI\HW P0002\18 (Standard system devices) machine.inf Not Generic Bus Yes SYSTEM 5.2.3790.1830 Available ACPI\HW P0002\12 10/1/2002(Standard system devices) machine.inf PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Not Available ACPI\HW P0004\101 (Standard system devices) machine.inf Not Smart Array Logical Volume No DISKDRIVE Available ACPI\HW P0002\11 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\10 E\7&830A57A&0&0300004000000000 Generic Bus Yes SYSTEM 5.2.3790.1830 Smart Array Logical Volume No DISKDRIVE 10/1/2002(Standard system devices) machine.inf 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Not Available ACPI\HW P0004\100 Available Generic Bus Yes SYSTEM 5.2.3790.1830 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM 10/1/2002(Standard system devices) machine.inf E\7&830A57A&0&0200004000000000 Not Available ACPI\HW P0005\1 Smart Array Logical Volume No DISKDRIVE Processor Yes PROCESSOR 5.2.3790.1830 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not 10/1/2002(Standard processor types) cpu.inf Not Available Available ACPI\GENUINEINTEL_- HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM _IA64_FAMILY_31_MODEL_2\_3 E\7&830A57A&0&0100004000000000 Processor Yes PROCESSOR 5.2.3790.1830 10/1/2002(Standard processor types) cpu.inf Not HP TPC-H FULL DISCLOSURE REPORT 123 © 2005 Hewlett-Packard Company. All rights reserved. Available ACPI\GENUINEINTEL_- PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 _IA64_FAMILY_31_MODEL_2\_2 (Standard system devices) machine.inf Not ACPI Fixed Feature Button Yes SYSTEM 5.2.3790.1830 Available ACPI\HW P0002\A 10/1/2002(Standard system devices) machine.inf PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Not Available (Standard system devices) machine.inf Not ACPI\FIXEDBUTTON\2&DABA3FF&0 Available ACPI\HW P0002\9 Smart Array Logical Volume No DISKDRIVE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not (Standard system devices) machine.inf Not Available Available ACPI\HW P0002\8 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Generic Bus Yes SYSTEM 5.2.3790.1830 E\7&3893EB60&0&0300004000000000 10/1/2002(Standard system devices) machine.inf Smart Array Logical Volume No DISKDRIVE Not Available ACPI\HW P0004\1 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Smart Array Logical Volume No DISKDRIVE Available 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available E\7&3893EB60&0&0200004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume No DISKDRIVE E\7&1B8DF546&0&0300004000000000 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Smart Array Logical Volume No DISKDRIVE Available 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available E\7&3893EB60&0&0100004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array Logical Volume No DISKDRIVE E\7&1B8DF546&0&0200004000000000 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Smart Array Logical Volume No DISKDRIVE Available 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available E\7&3893EB60&0&0000004000000000 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Smart Array 6400 Controller (Non-Miniport) No E\7&1B8DF546&0&0100004000000000 SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- Smart Array Logical Volume No DISKDRIVE Packard oem6.inf Not Available 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE Available V_01\6&B8B6E61&0&2008 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI standard PCI-to-PCI bridge Yes SYSTEM E\7&1B8DF546&0&0000004000000000 5.2.3790.1830 10/1/2002(Standard system Smart Array 6400 Controller (Non-Miniport) No devices) machine.inf Not Available SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Packard oem6.inf Not Available V_02\5&3633CCA9&0&08 PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 V_01\6&30B60401&0&2008 (Standard system devices) machine.inf Not PCI standard PCI-to-PCI bridge Yes SYSTEM Available ACPI\HW P0002\E 5.2.3790.1830 10/1/2002(Standard system Smart Array Logical Volume No DISKDRIVE devices) machine.inf Not Available 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE Available V_02\5&137A5C4D&0&08 HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 E\7&1D279CE2&0&0300004000000000 (Standard system devices) machine.inf Not Smart Array Logical Volume No DISKDRIVE Available ACPI\HW P0002\6 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Intel(R) PRO/1000 MT Dual Port Network Connection Yes Available NET 6.3.6.31 10/1/2002Intel nete1000.inf HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Not Available E\7&1D279CE2&0&0200004000000000 PCI\VEN_8086&DEV_1010&SUBSYS_00DB0E11&RE Smart Array Logical Volume No DISKDRIVE V_01\5&26340CF2&0&09 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not Intel(R) PRO/1000 MT Dual Port Network Connection Yes Available NET 6.3.6.31 10/1/2002Intel nete1000.inf HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Not Available E\7&1D279CE2&0&0100004000000000 PCI\VEN_8086&DEV_1010&SUBSYS_00DB0E11&RE Smart Array Logical Volume No DISKDRIVE V_01\5&26340CF2&0&08 5.6.56.64 4/8/2003 Hewlett-Packard oem7.inf Not PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Available (Standard system devices) machine.inf Not HPQCISS\DISK&VEN_HP&PROD_LOGICAL_VOLUM Available ACPI\HW P0002\5 E\7&1D279CE2&0&0000004000000000 LSI Logic 53C896 Device Yes SCSIADAPTER Smart Array 6400 Controller (Non-Miniport) No 5.2.3790.1830 10/1/2002LSI Logic Inc. SCSIADAPTER 5.6.59.64 4/8/2003 Hewlett- pnpscsi.inf Not Available Packard oem6.inf Not Available PCI\VEN_1000&DEV_000B&SUBSYS_10F6103C&RE PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE V_07\5&38EDBD97&0&09 V_01\6&7E3BA13&0&2008 4 millimeter DAT drive Yes TAPEDRIVE PCI standard PCI-to-PCI bridge Yes SYSTEM 5.2.3790.0 10/1/2002(Standard tape drives) 5.2.3790.1830 10/1/2002(Standard system tape.inf Not Available devices) machine.inf Not Available SCSI\SEQUENTIAL&VEN_HP&PROD_C5683A&REV_ PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE C111\6&1BE3D281&0&0A0 V_02\5&200C63EC&0&08 CD-ROM Drive Yes CDROM 5.2.3790.0 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 10/1/2002(Standard CD-ROM drives) cdrom.inf Not (Standard system devices) machine.inf Not Available SCSI\CDROM&VEN_HP&PROD_DVD- Available ACPI\HW P0002\C ROM_305&REV_1.01\6&1BE3D281&0&030 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 LSI Logic 53C896 Device Yes SCSIADAPTER (Standard system devices) machine.inf Not 5.2.3790.1830 10/1/2002LSI Logic Inc. Available ACPI\HW P0002\B pnpscsi.inf Not Available HP TPC-H FULL DISCLOSURE REPORT 124 © 2005 Hewlett-Packard Company. All rights reserved. PCI\VEN_1000&DEV_000B&SUBSYS_10F6103C&RE Generic Bus Yes SYSTEM 5.2.3790.1830 V_07\5&38EDBD97&0&08 10/1/2002(Standard system devices) machine.inf PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 Not Available ACPI\HW P0005\0 (Standard system devices) machine.inf Not Processor Yes PROCESSOR 5.2.3790.1830 Available ACPI\HW P0002\4 10/1/2002(Standard processor types) cpu.inf Not Disk drive Yes DISKDRIVE 5.2.3790.0 Available ACPI\GENUINEINTEL_- 10/1/2002(Standard disk drives) disk.inf Not _IA64_FAMILY_31_MODEL_2\_1 Available Processor Yes PROCESSOR 5.2.3790.1830 SCSI\DISK&VEN_HP_18.2G&PROD_ST318452LC&R 10/1/2002(Standard processor types) cpu.inf Not EV_HP02\6&1D2E1E10&0&000 Available ACPI\GENUINEINTEL_- LSI Logic 53C1010-66 Device Yes SCSIADAPTER _IA64_FAMILY_31_MODEL_2\_0 5.2.3790.1830 10/1/2002LSI Logic Inc. HP System Memory Device Yes SYSTEM 5.0.0.2 pnpscsi.inf Not Available 6/19/2003HP oem8.inf Not Available PCI\VEN_1000&DEV_0021&SUBSYS_1330103C&RE ACPI\HW P1000\A56E03647373 V_01\5&18833AF&0&08 HP System Memory Device Yes SYSTEM 5.0.0.2 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 6/19/2003HP oem8.inf Not Available (Standard system devices) machine.inf Not ACPI\HW P1000\A56E03647439 Available ACPI\HW P0002\3 HP System Memory Device Yes SYSTEM 5.0.0.2 Disk drive Yes DISKDRIVE 5.2.3790.0 6/19/2003HP oem8.inf Not Available 10/1/2002(Standard disk drives) disk.inf Not ACPI\HW P1000\A56E03647374 Available HP System Memory Device Yes SYSTEM 5.0.0.2 SCSI\DISK&VEN_HP&PROD_LOGICAL_VOLUME&R 6/19/2003HP oem8.inf Not Available EV_2.48\7&1502F021&0&070 ACPI\HW P1000\A56E03647249 Disk drive Yes DISKDRIVE 5.2.3790.0 HP System Memory Device Yes SYSTEM 5.0.0.2 10/1/2002(Standard disk drives) disk.inf Not 6/19/2003HP oem8.inf Not Available Available ACPI\HW P1000\A56E03647371 SCSI\DISK&VEN_HP&PROD_LOGICAL_VOLUME&R HP System Memory Device Yes SYSTEM 5.0.0.2 EV_2.48\7&1502F021&0&060 6/19/2003HP oem8.inf Not Available Disk drive Yes DISKDRIVE 5.2.3790.0 ACPI\HW P1000\A56E03647257 10/1/2002(Standard disk drives) disk.inf Not HP System Memory Device Yes SYSTEM 5.0.0.2 Available 6/19/2003HP oem8.inf Not Available SCSI\DISK&VEN_HP&PROD_LOGICAL_VOLUME&R ACPI\HW P1000\A56E03639042 EV_2.48\7&1502F021&0&050 HP System Memory Device Yes SYSTEM 5.0.0.2 Disk drive Yes DISKDRIVE 5.2.3790.0 6/19/2003HP oem8.inf Not Available 10/1/2002(Standard disk drives) disk.inf Not ACPI\HW P1000\A56E03638798 Available HP System Memory Device Yes SYSTEM 5.0.0.2 SCSI\DISK&VEN_HP&PROD_LOGICAL_VOLUME&R 6/19/2003HP oem8.inf Not Available EV_2.48\7&1502F021&0&040 ACPI\HW P1000\A56E03647305 Smart Array 5x and 6x Notification Driver Yes HP System Memory Device Yes SYSTEM 5.0.0.2 SYSTEM 5.62.0.64 6/16/2004Hewlett-Packard 6/19/2003HP oem8.inf Not Available Company oem1.inf Not Available ACPI\HW P1000\A56E03647379 SCSI\OTHER&VEN_COMPAQ&PROD_SCSI_COMMU HP System Memory Device Yes SYSTEM 5.0.0.2 NICATE&REV_CISS\7&1502F021&0&000 6/19/2003HP oem8.inf Not Available Smart Array 6400 Controller Yes SCSIADAPTER ACPI\HW P1000\A56E03647380 5.62.0.64 6/14/2004Hewlett-Packard Company HP System Memory Device Yes SYSTEM 5.0.0.2 oem0.inf Not Available 6/19/2003HP oem8.inf Not Available PCI\VEN_0E11&DEV_0046&SUBSYS_409C0E11&RE ACPI\HW P1000\A56E03647235 V_01\6&2027FCD0&0&2008 HP System Memory Device Yes SYSTEM 5.0.0.2 PCI standard PCI-to-PCI bridge Yes SYSTEM 6/19/2003HP oem8.inf Not Available 5.2.3790.1830 10/1/2002(Standard system ACPI\HW P1000\A56E03653455 devices) machine.inf Not Available HP System Memory Device Yes SYSTEM 5.0.0.2 PCI\VEN_1014&DEV_01A7&SUBSYS_00000000&RE 6/19/2003HP oem8.inf Not Available V_02\5&17AF9C6C&0&08 ACPI\HW P1000\A56E03647227 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HP System Memory Device Yes SYSTEM 5.0.0.2 (Standard system devices) machine.inf Not 6/19/2003HP oem8.inf Not Available Available ACPI\HW P0002\1 ACPI\HW P1000\A56E03647233 HP Baseboard Management Controller Interface Driver Yes HP System Memory Device Yes SYSTEM 5.0.0.2 SYSTEM 7.1.3790.0 3/18/2004Hewlett 6/19/2003HP oem8.inf Not Available Packard Co. oem5.inf Not Available ACPI\HW P1000\A56E03647309 ACPI\IPI0001\0 HP System Memory Device Yes SYSTEM 5.0.0.2 HP Core-Io Device 01 Yes SYSTEM 5.0.0.2 6/19/2003HP oem8.inf Not Available 3/12/2003HP oem2.inf Not Available ACPI\HW P1000\A56E03660745 PCI\VEN_1011&DEV_0019&SUBSYS_104F103C&RE HP System Memory Device Yes SYSTEM 5.0.0.2 V_41\5&4F5EBC7&0&08 6/19/2003HP oem8.inf Not Available HP Management Processor Yes SYSTEM 5.0.3790.0 ACPI\HW P1000\A56E03638802 7/10/2003Hewlett-Packard Cooem3.inf Not Available HP System Memory Device Yes SYSTEM 5.0.0.2 PCI\VEN_103C&DEV_1048&SUBSYS_1223103C&RE 6/19/2003HP oem8.inf Not Available V_02\5&4F5EBC7&0&00 ACPI\HW P1000\A56E03653054 PCI bus Yes SYSTEM 5.2.3790.1830 10/1/2002 HP System Memory Device Yes SYSTEM 5.0.0.2 (Standard system devices) machine.inf Not 6/19/2003HP oem8.inf Not Available Available ACPI\HW P0002\0 ACPI\HW P1000\A56E03925023 Generic Bus Yes SYSTEM 5.2.3790.1830 HP System Memory Device Yes SYSTEM 5.0.0.2 10/1/2002(Standard system devices) machine.inf 6/19/2003HP oem8.inf Not Available Not Available ACPI\HW P0004\0 ACPI\HW P1000\A56E03652978

HP TPC-H FULL DISCLOSURE REPORT 125 © 2005 Hewlett-Packard Company. All rights reserved. HP System Memory Device Yes SYSTEM 5.0.0.2 NUMBER_OF_PROCESSORS 32 6/19/2003HP oem8.inf Not Available ACPI\HW P1000\A56E03652971 ClusterLog C:\WINDOWS\Cluster\cluster.log HP System Memory Device Yes SYSTEM 5.0.0.2 6/19/2003HP oem8.inf Not Available PATHEXT ACPI\HW P1000\A56E03652977 .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WS HP System Memory Device Yes SYSTEM 5.0.0.2 H 6/19/2003HP oem8.inf Not Available TEMP %SystemRoot%\TEMP ACPI\HW P1000\A56E03647466 TMP %SystemRoot%\TEMP HP System Memory Device Yes SYSTEM 5.0.0.2 lib C:\Program Files\SQLXML 4.0\bin\ 6/19/2003HP oem8.inf Not Available ACPI\HW P1000\A56E03647468 TEMP %USERPROFILE%\Local Settings\Temp NT HP System Memory Device Yes SYSTEM 5.0.0.2 AUTHORITY\SYSTEM 6/19/2003HP oem8.inf Not Available TMP %USERPROFILE%\Local Settings\Temp NT ACPI\HW P1000\A56E03647477 AUTHORITY\SYSTEM HP System Memory Device Yes SYSTEM 5.0.0.2 TEMP %USERPROFILE%\Local Settings\Temp NT 6/19/2003HP oem8.inf Not Available AUTHORITY\LOCAL SERVICE ACPI\HW P1000\A56E03660767 TMP %USERPROFILE%\Local Settings\Temp NT HP System Memory Device Yes SYSTEM 5.0.0.2 AUTHORITY\LOCAL SERVICE 6/19/2003HP oem8.inf Not Available TEMP %USERPROFILE%\Local Settings\Temp NT ACPI\HW P1000\A56E03660765 AUTHORITY\NETWORK SERVICE HP System Memory Device Yes SYSTEM 5.0.0.2 TMP %USERPROFILE%\Local Settings\Temp NT 6/19/2003HP oem8.inf Not Available AUTHORITY\NETWORK SERVICE ACPI\HW P1000\A56E03647421 Path C:\Program Files\Microsoft SQL HP System Memory Device Yes SYSTEM 5.0.0.2 Server\MSSQL.1\MSSQL\Binn 6/19/2003HP oem8.inf Not Available SQLORCAH\Administrator ACPI\HW P1000\A56E03652933 TEMP %USERPROFILE%\Local Settings\Temp HP System Memory Device Yes SYSTEM 5.0.0.2 SQLORCAH\Administrator 6/19/2003HP oem8.inf Not Available TMP %USERPROFILE%\Local Settings\Temp ACPI\HW P1000\A56E03652968 SQLORCAH\Administrator HP System Memory Device Yes SYSTEM 5.0.0.2 6/19/2003HP oem8.inf Not Available [Print Jobs] ACPI\HW P1000\A56E03647422 HP CSR OpRegion Driver No SYSTEM 1.1.0.0 Document Size Owner Notify Status Ti me 6/5/2003 Hewlett-Packard oem4.inf Not Available Submitted Start Time Until Time ACPI\HW P5003\2&DABA3FF&0 Elapsed Time Pages Printed Job ID ACPI Power Button Yes SYSTEM 5.2.3790.1830 Priority Parameters Driver Print 10/1/2002(Standard system devices) machine.inf Processor Host Print Queue Data Type Not Available ACPI\PNP0C0C\2&DABA3FF&0 Name

Microsoft ACPI-Compliant System Yes SYSTEM [Network Connections] 5.2.3790.0 10/1/2002Microsoft acpi.inf Not Available ACPI_HAL\PNP0C08\0 Local Name Remote Name Type Status User ACPI IA64-based PC Yes COMPUTER Name 5.2.3790.1830 10/1/2002(Standard computers) hal.inf Not Available ROOT\ACPI_HAL\0000 [Running Tasks]

Not Available Not Available Not Available Not Name Path Process ID Priority Min Working Available Not Available Not Available Not Available Set Max Working Set Start Time Version Size Not Available HTREE\ROOT\0 File Date system idle process Not Available 0 0 Not [Environment Variables] Available Not Available Not Available Not Available Not Available Not Available Variable Value User Name system Not Available 4 8 0 ComSpec %SystemRoot%\system32\cmd.exe 2826240 Not Available Not Available Not Available Not Available Path smss.exe Not Available 1252 11 409600 %SystemRoot%\system32;%SystemRoot%;%SystemR 2826240 10/29/2005 11:06 AM Not Available oot%\System32\Wbem;C:\Program Files (x86)\Microsoft SQL Not Available Not Available Server\80\Tools\Binn\;C:\Program Files\Microsoft SQL csrss.exe Not Available 1628 13 Not Available Server\90\Tools\binn\;C:\Program Files (x86)\Microsoft SQL Not Available 10/29/2005 11:06 AM Not Server\90\Tools\binn\;C:\Program Files (x86)\Microsoft SQL Available Not Available Not Available Server\90\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL winlogon.exe c:\windows\system32\winlogon.exe 1668 Server\90\Tools\Binn\VSShell\Common7\IDE\ 13 409600 2826240 10/29/2005 11:06 AM 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) windir %SystemRoot% 664.50 KB (680,448 bytes) 9/8/2005 12:20 PM FP_NO_HOST_CHECK NO services.exe c:\windows\system32\services.exe 1776 OS Windows_NT 9 409600 2826240 10/29/2005 11:06 AM PROCESSOR_ARCHITECTURE IA64 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 300.00 KB (307,200 bytes) 9/8/2005 12:20 PM PROCESSOR_LEVEL 31 lsass.exe c:\windows\system32\lsass.exe 1788 9 PROCESSOR_IDENTIFIER ia64 Family 31 Model 2 Stepping 1, 409600 2826240 10/29/2005 11:06 AM GenuineIntel 5.2.3790.0 (srv03_rtm.030324-2048) 15.00 KB PROCESSOR_REVISION 0201 (15,360 bytes) 9/8/2005 12:19 PM

HP TPC-H FULL DISCLOSURE REPORT 126 © 2005 Hewlett-Packard Company. All rights reserved. svchost.exe c:\windows\system32\svchost.exe 2028 PTDBITN02_F_Yukon_YukonSP1 70.66 MB (74,093,056 8 409600 2826240 10/29/2005 11:06 AM bytes) 9/25/2005 4:38 PM 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) stepmaster.exe c:\program files 36.00 KB (36,864 bytes) 9/8/2005 12:20 PM (x86)\stepmaster\stepmaster.exe 3260 8 svchost.exe Not Available 348 8 Not 409600 2826240 10/29/2005 11:16 AM Available Not Available 10/29/2005 11:06 AM Not 2.05.00051.92 MB (2,015,285 bytes) 6/27/2005 Available Not Available Not Available 12:14 PM svchost.exe Not Available 452 8 Not isqlw.exe g:\isqlw\isqlw.exe 2584 8 409600 Available Not Available 10/29/2005 11:06 AM Not 2826240 10/29/2005 11:16 AM Available Not Available Not Available 2000.080.0725.00 344.56 KB (352,828 bytes) svchost.exe Not Available 472 8 Not 8/23/2005 1:20 PM Available Not Available 10/29/2005 11:06 AM Not logon.scr Not Available 3144 4 Not Available Available Not Available Not Available Not Available 10/29/2005 11:22 AM Not svchost.exe c:\windows\system32\svchost.exe 548 Available Not Available Not Available 8 409600 2826240 10/29/2005 11:06 AM helpctr.exe 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\pchealth\helpctr\binaries\helpctr.exe 616 36.00 KB (36,864 bytes) 9/8/2005 12:20 PM 8 409600 2826240 10/29/2005 11:25 AM spoolsv.exe c:\windows\system32\spoolsv.exe 980 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.01 8 409600 2826240 10/29/2005 11:06 AM MB (2,105,344 bytes) 9/8/2005 1:58 PM 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) wmiprvse.exe Not Available 2464 8 Not 144.00 KB (147,456 bytes) 9/8/2005 12:20 PM Available Not Available 10/29/2005 11:25 AM Not msdtc.exe Not Available 1016 8 Not Available Not Available Not Available Available Not Available 10/29/2005 11:06 AM Not helpsvc.exe Available Not Available Not Available c:\windows\pchealth\helpctr\binaries\helpsvc.exe 1996 rmserver.exe c:\program files 8 409600 2826240 10/29/2005 11:25 AM (x86)\hbanyware\rmserver.exe 1188 8 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.21 409600 2826240 10/29/2005 11:06 AM X MB (2,320,384 bytes) 9/8/2005 1:58 PM 312.00 KB (319,488 bytes) 7/28/2005 11:16 AM [Loaded Modules] hbahsmgr.exe c:\program files (x86)\hbanyware\hbahsmgr.exe 1304 8 Name Version Size File Date Manufacturer Path 409600 2826240 10/29/2005 11:06 AM X 84.00 KB (86,016 bytes) 7/28/2005 11:17 AM winlogon 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 664.50 KB (680,448 bytes) 9/8/2005 12:20 PM svchost.exe c:\windows\system32\svchost.exe 1316 Microsoft Corporation 8 409600 2826240 10/29/2005 11:06 AM c:\windows\system32\winlogon.exe 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) ntdll 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.56 36.00 KB (36,864 bytes) 9/8/2005 12:20 PM MB (1,638,400 bytes) 9/8/2005 12:19 PM Microsoft svchost.exe Not Available 1360 8 Not Corporation c:\windows\system32\ntdll.dll Available Not Available 10/29/2005 11:06 AM Not kernel32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.87 Available Not Available Not Available MB (1,965,056 bytes) 9/8/2005 12:19 PM Microsoft msftesql.exe c:\program files\microsoft sql Corporation c:\windows\system32\kernel32.dll server\mssql.1\mssql\binn\msftesql.exe 1404 8 msvcrt 7.0.3790.1830 (srv03_sp1_rtm.050324-1447) 409600 2826240 10/29/2005 11:06 AM 932.00 KB (954,368 bytes) 9/8/2005 12:19 PM 12.0.5626.1 285.20 KB (292,048 bytes) Microsoft Corporation 8/26/2005 4:37 PM c:\windows\system32\msvcrt.dll svchost.exe c:\windows\system32\svchost.exe 772 advapi32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.41 8 409600 2826240 10/29/2005 11:06 AM MB (1,482,752 bytes) 9/8/2005 12:18 PM Microsoft 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\advapi32.dll 36.00 KB (36,864 bytes) 9/8/2005 12:20 PM rpcrt4 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.34 alg.exe Not Available 1240 8 Not Available MB (2,457,600 bytes) 9/8/2005 12:19 PM Microsoft Not Available 10/29/2005 11:06 AM Not Corporation c:\windows\system32\rpcrt4.dll Available Not Available Not Available user32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.41 wmiprvse.exe Not Available 1396 8 Not MB (1,476,096 bytes) 9/8/2005 12:20 PM Microsoft Available Not Available 10/29/2005 11:06 AM Not Corporation c:\windows\system32\user32.dll Available Not Available Not Available gdi32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) csrss.exe Not Available 3520 13 Not Available 882.00 KB (903,168 bytes) 9/8/2005 12:19 PM Not Available 10/29/2005 11:12 AM Not Microsoft Corporation Available Not Available Not Available c:\windows\system32\gdi32.dll winlogon.exe c:\windows\system32\winlogon.exe 3544 userenv 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.49 13 409600 2826240 10/29/2005 11:12 AM MB (1,563,648 bytes) 9/8/2005 12:20 PM Microsoft 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\userenv.dll 664.50 KB (680,448 bytes) 9/8/2005 12:20 PM nddeapi 5.2.3790.0 (srv03_rtm.030324-2048) 39.50 KB rdpclip.exe c:\windows\system32\rdpclip.exe 3784 (40,448 bytes) 9/8/2005 12:19 PM Microsoft Corporation 8 409600 2826240 10/29/2005 11:12 AM c:\windows\system32\nddeapi.dll 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) crypt32 5.131.3790.1830 (srv03_sp1_rtm.050324-1447) 1.68 211.00 KB (216,064 bytes) 9/8/2005 1:57 PM MB (1,759,232 bytes) 9/8/2005 12:18 PM Microsoft explorer.exe c:\windows\explorer.exe 3872 8 Corporation c:\windows\system32\crypt32.dll 409600 2826240 10/29/2005 11:12 AM msasn1 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 1.64 179.50 KB (183,808 bytes) 9/8/2005 12:19 PM MB (1,720,320 bytes) 9/8/2005 12:19 PM Microsoft Corporation sqlservr.exe c:\program files\microsoft sql c:\windows\system32\msasn1.dll server\mssql.1\mssql\binn\sqlservr.exe 2084 8 secur32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 409600 2826240 10/29/2005 11:12 AM 186.00 KB (190,464 bytes) 9/8/2005 12:20 PM 2005.090.1399.00 built by sqlperft from HP TPC-H FULL DISCLOSURE REPORT 127 © 2005 Hewlett-Packard Company. All rights reserved. Microsoft Corporation winmm 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\secur32.dll 428.00 KB (438,272 bytes) 9/8/2005 12:20 PM winsta 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 143.50 KB (146,944 bytes) 9/8/2005 12:20 PM c:\windows\system32\winmm.dll Microsoft Corporation shell32 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\winsta.dll 12.63 MB (13,243,392 bytes) 9/8/2005 12:20 PM netapi32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 885.50 KB (906,752 bytes) 9/8/2005 12:19 PM c:\windows\system32\shell32.dll Microsoft Corporation setupapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.99 c:\windows\system32\netapi32.dll MB (2,086,400 bytes) 9/8/2005 12:20 PM Microsoft profmap 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\setupapi.dll 59.50 KB (60,928 bytes) 9/8/2005 12:19 PM wldap32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 441.50 KB (452,096 bytes) 9/8/2005 12:20 PM c:\windows\system32\profmap.dll Microsoft Corporation regapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wldap32.dll 141.50 KB (144,896 bytes) 9/8/2005 12:19 PM cscdll 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 207.00 KB (211,968 bytes) 9/8/2005 12:18 PM c:\windows\system32\regapi.dll Microsoft Corporation ws2_32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\cscdll.dll 248.00 KB (253,952 bytes) 9/8/2005 12:20 PM dimsntfy 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 51.50 KB (52,736 bytes) 9/8/2005 12:18 PM c:\windows\system32\ws2_32.dll Microsoft Corporation ws2help 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\dimsntfy.dll 51.00 KB (52,224 bytes) 9/8/2005 12:20 PM wlnotify 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 239.50 KB (245,248 bytes) 9/8/2005 12:20 PM c:\windows\system32\ws2help.dll Microsoft Corporation msgina 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.40 c:\windows\system32\wlnotify.dll MB (1,465,344 bytes) 9/8/2005 12:19 PM Microsoft winspool 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\msgina.dll 400.50 KB (410,112 bytes) 9/8/2005 12:20 PM shsvcs 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 354.50 KB (363,008 bytes) 9/8/2005 12:20 PM c:\windows\system32\winspool.drv Microsoft Corporation mpr 5.2.3790.0 (srv03_rtm.030324-2048) 163.00 KB c:\windows\system32\shsvcs.dll (166,912 bytes) 9/8/2005 12:19 PM Microsoft Corporation shlwapi 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\mpr.dll 804.00 KB (823,296 bytes) 9/8/2005 12:20 PM oleaut32 5.2.3790.1830 3.75 MB (3,930,624 bytes) Microsoft Corporation 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\shlwapi.dll c:\windows\system32\oleaut32.dll sfc 5.2.3790.0 (srv03_rtm.030324-2048) 7.50 KB (7,680 comctl32 5.82 (srv03_sp1_rtm.050324-1447) 1.72 MB bytes) 9/8/2005 12:20 PM Microsoft Corporation (1,806,336 bytes) 9/8/2005 6:18 AM Microsoft Corporation c:\windows\system32\sfc.dll c:\windows\winsxs\ia64_microsoft.windows.common- sfc_os 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) controls_6595b64144ccf1df_5.82.3790.1830_x- 273.00 KB (279,552 bytes) 9/8/2005 12:20 PM ww_4aca2dea\comctl32.dll Microsoft Corporation uxtheme 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\sfc_os.dll 543.00 KB (556,032 bytes) 9/8/2005 12:20 PM wintrust 5.131.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 459.50 KB (470,528 bytes) 9/8/2005 12:20 PM c:\windows\system32\uxtheme.dll Microsoft Corporation scredir 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wintrust.dll 69.00 KB (70,656 bytes) 9/8/2005 12:19 PM imagehlp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 140.50 KB (143,872 bytes) 9/8/2005 12:19 PM c:\windows\system32\scredir.dll Microsoft Corporation samlib 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\imagehlp.dll 106.50 KB (109,056 bytes) 9/8/2005 12:19 PM ole32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 3.81 Microsoft Corporation MB (3,992,064 bytes) 9/8/2005 12:19 PM Microsoft c:\windows\system32\samlib.dll Corporation c:\windows\system32\ole32.dll clbcatq 2001.12.4720.1830 (srv03_sp1_rtm.050324-1447) 1.30 comctl32 6.0 (srv03_sp1_rtm.050324-1447) 2.50 MB MB (1,359,360 bytes) 9/8/2005 1:57 PM Microsoft (2,622,976 bytes) 9/8/2005 6:18 AM Microsoft Corporation Corporation c:\windows\system32\clbcatq.dll c:\windows\winsxs\ia64_microsoft.windows.common- comres 2001.12.4720.0 (srv03_rtm.030324-2048) controls_6595b64144ccf1df_6.0.3790.1830_x- 779.50 KB (798,208 bytes) 9/8/2005 12:18 PM ww_aa3e736f\comctl32.dll Microsoft Corporation version 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\comres.dll 51.00 KB (52,224 bytes) 9/8/2005 12:20 PM cscui 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 628.00 KB (643,072 bytes) 9/8/2005 12:18 PM c:\windows\system32\version.dll Microsoft Corporation sxs 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.82 c:\windows\system32\cscui.dll MB (1,904,640 bytes) 9/8/2005 12:20 PM Microsoft rdpsnd 5.2.3790.0 (srv03_rtm.030324-2048) 63.00 KB Corporation c:\windows\system32\sxs.dll (64,512 bytes) 9/8/2005 12:19 PM Microsoft Corporation winscard 5.2.3790.0 (srv03_rtm.030324-2048) 291.50 KB c:\windows\system32\rdpsnd.dll (298,496 bytes) 9/8/2005 12:20 PM Microsoft Corporation psapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\winscard.dll 53.00 KB (54,272 bytes) 9/8/2005 12:19 PM wtsapi32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 54.00 KB (55,296 bytes) 9/8/2005 12:20 PM c:\windows\system32\psapi.dll Microsoft Corporation ntmarta 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wtsapi32.dll 366.00 KB (374,784 bytes) 9/8/2005 12:19 PM

HP TPC-H FULL DISCLOSURE REPORT 128 © 2005 Hewlett-Packard Company. All rights reserved. Microsoft Corporation Microsoft Corporation c:\windows\system32\ntmarta.dll c:\windows\system32\scesrv.dll xpsp2res 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.76 authz 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (2,897,920 bytes) 9/8/2005 12:20 PM Microsoft 220.50 KB (225,792 bytes) 9/8/2005 12:18 PM Corporation c:\windows\system32\xpsp2res.dll Microsoft Corporation printui 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.13 c:\windows\system32\authz.dll MB (1,186,304 bytes) 9/8/2005 12:19 PM Microsoft umpnpmgr 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\printui.dll 323.50 KB (331,264 bytes) 9/8/2005 12:20 PM activeds 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 581.50 KB (595,456 bytes) 9/8/2005 12:18 PM c:\windows\system32\umpnpmgr.dll Microsoft Corporation ncobjapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\activeds.dll 121.00 KB (123,904 bytes) 9/8/2005 12:19 PM adsldpc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 326.00 KB (333,824 bytes) 9/8/2005 12:18 PM c:\windows\system32\ncobjapi.dll Microsoft Corporation msvcp60 6.10.2240.8 941.50 KB (964,096 bytes) c:\windows\system32\adsldpc.dll 9/8/2005 12:19 PM Microsoft Corporation credui 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\msvcp60.dll 311.00 KB (318,464 bytes) 9/8/2005 12:18 PM eventlog 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 180.00 KB (184,320 bytes) 9/8/2005 12:19 PM c:\windows\system32\credui.dll Microsoft Corporation atl 3.00.2282348.00 KB (356,352 bytes) 9/8/2005 12:18 c:\windows\system32\eventlog.dll PM Microsoft Corporation lsass 5.2.3790.0 (srv03_rtm.030324-2048) 15.00 KB c:\windows\system32\atl.dll (15,360 bytes) 9/8/2005 12:19 PM Microsoft Corporation cfgmgr32 5.2.3790.0 (srv03_rtm.030324-2048) 16.00 KB c:\windows\system32\lsass.exe (16,384 bytes) 9/8/2005 12:18 PM Microsoft Corporation lsasrv 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.07 c:\windows\system32\cfgmgr32.dll MB (2,166,784 bytes) 9/8/2005 12:19 PM Microsoft msacm32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\lsasrv.dll 87.00 KB (89,088 bytes) 9/8/2005 12:19 PM ntdsapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 204.50 KB (209,408 bytes) 9/8/2005 12:19 PM c:\windows\system32\msacm32.drv Microsoft Corporation msacm32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\ntdsapi.dll 276.50 KB (283,136 bytes) 9/8/2005 12:19 PM dnsapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 428.00 KB (438,272 bytes) 9/8/2005 12:19 PM c:\windows\system32\msacm32.dll Microsoft Corporation drprov 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\dnsapi.dll 32.50 KB (33,280 bytes) 9/8/2005 12:19 PM samsrv 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.09 Microsoft Corporation MB (1,142,784 bytes) 9/8/2005 12:19 PM Microsoft c:\windows\system32\drprov.dll Corporation c:\windows\system32\samsrv.dll ntlanman 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) cryptdll 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 117.00 KB (119,808 bytes) 9/8/2005 12:19 PM 68.50 KB (70,144 bytes) 9/8/2005 12:18 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\ntlanman.dll c:\windows\system32\cryptdll.dll netui0 5.2.3790.0 (srv03_rtm.030324-2048) 181.50 KB msprivs 5.2.3790.0 (srv03_rtm.030324-2048) 46.00 KB (185,856 bytes) 9/8/2005 12:19 PM Microsoft Corporation (47,104 bytes) 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\netui0.dll c:\windows\system32\msprivs.dll netui1 5.2.3790.0 (srv03_rtm.030324-2048) 482.00 KB kerberos 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) (493,568 bytes) 9/8/2005 12:19 PM Microsoft Corporation 932.00 KB (954,368 bytes) 9/8/2005 12:19 PM c:\windows\system32\netui1.dll Microsoft Corporation davclnt 5.2.3790.0 (srv03_rtm.030324-2048) 59.00 KB c:\windows\system32\kerberos.dll (60,416 bytes) 9/8/2005 12:18 PM Microsoft Corporation msv1_0 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\davclnt.dll 380.00 KB (389,120 bytes) 9/8/2005 12:19 PM imaadp32 5.2.3790.0 (srv03_rtm.030324-2048) 55.00 KB Microsoft Corporation (56,320 bytes) 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\msv1_0.dll c:\windows\system32\imaadp32.acm iphlpapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) msadp32 5.2.3790.0 (srv03_rtm.030324-2048) 49.00 KB 254.50 KB (260,608 bytes) 9/8/2005 12:19 PM (50,176 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\msadp32.acm c:\windows\system32\iphlpapi.dll msg711 5.2.3790.0 (srv03_rtm.030324-2048) 33.00 KB netlogon 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) (33,792 bytes) 9/8/2005 12:19 PM Microsoft Corporation 956.00 KB (978,944 bytes) 9/8/2005 12:19 PM c:\windows\system32\msg711.acm Microsoft Corporation msgsm32 5.2.3790.0 (srv03_rtm.030324-2048) 66.50 KB c:\windows\system32\netlogon.dll (68,096 bytes) 9/8/2005 12:19 PM Microsoft Corporation w32time 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\msgsm32.acm 565.00 KB (578,560 bytes) 9/8/2005 12:20 PM tssoft32 1.01 29.00 KB (29,696 bytes) 9/8/2005 12:20 Microsoft Corporation PM DSP GROUP, INC. c:\windows\system32\tssoft32.acm c:\windows\system32\w32time.dll schannel 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) tsd32 1.03 38.00 KB (38,912 bytes) 9/8/2005 12:20 456.00 KB (466,944 bytes) 9/8/2005 12:19 PM PM DSP GROUP, INC. c:\windows\system32\tsd32.dll Microsoft Corporation services 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\schannel.dll 300.00 KB (307,200 bytes) 9/8/2005 12:20 PM wdigest 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 210.00 KB (215,040 bytes) 9/8/2005 12:20 PM c:\windows\system32\services.exe Microsoft Corporation scesrv 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wdigest.dll 806.50 KB (825,856 bytes) 9/8/2005 12:19 PM rsaenh 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 415.98 KB (425,960 bytes) 9/8/2005 12:19 PM HP TPC-H FULL DISCLOSURE REPORT 129 © 2005 Hewlett-Packard Company. All rights reserved. Microsoft Corporation Microsoft Corporation c:\windows\system32\rsaenh.dll c:\windows\system32\wzcsvc.dll rassfm 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) rtutils 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 68.50 KB (70,144 bytes) 9/8/2005 12:19 PM 91.50 KB (93,696 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\rassfm.dll c:\windows\system32\rtutils.dll kdcsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) wmi 5.2.3790.0 (srv03_rtm.030324-2048) 5.00 KB (5,120 596.00 KB (610,304 bytes) 9/8/2005 12:19 PM bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\wmi.dll c:\windows\system32\kdcsvc.dll dhcpcsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) ntdsa 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 4.04 299.50 KB (306,688 bytes) 9/8/2005 12:18 PM MB (4,239,360 bytes) 9/8/2005 12:19 PM Microsoft Microsoft Corporation Corporation c:\windows\system32\ntdsa.dll c:\windows\system32\dhcpcsvc.dll esent 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.65 rastls 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (2,776,064 bytes) 9/8/2005 12:19 PM Microsoft 426.00 KB (436,224 bytes) 9/8/2005 12:19 PM Corporation c:\windows\system32\esent.dll Microsoft Corporation ntdsatq 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\rastls.dll 79.50 KB (81,408 bytes) 9/8/2005 12:19 PM cryptui 5.131.3790.1830 (srv03_sp1_rtm.050324-1447) 1.11 Microsoft Corporation MB (1,159,168 bytes) 9/8/2005 12:18 PM Microsoft c:\windows\system32\ntdsatq.dll Corporation c:\windows\system32\cryptui.dll mswsock 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) mprapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 763.00 KB (781,312 bytes) 9/8/2005 12:19 PM 265.00 KB (271,360 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\mswsock.dll c:\windows\system32\mprapi.dll scecli 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) rasapi32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 459.50 KB (470,528 bytes) 9/8/2005 12:19 PM 632.50 KB (647,680 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\scecli.dll c:\windows\system32\rasapi32.dll ws03res 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) rasman 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 792.50 KB (811,520 bytes) 9/8/2005 12:20 PM 170.00 KB (174,080 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\ws03res.dll c:\windows\system32\rasman.dll hnetcfg 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.04 tapi32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (1,094,144 bytes) 9/8/2005 12:19 PM Microsoft 518.00 KB (530,432 bytes) 9/8/2005 12:20 PM Corporation c:\windows\system32\hnetcfg.dll Microsoft Corporation wshtcpip 5.2.3790.0 (srv03_rtm.030324-2048) 38.00 KB c:\windows\system32\tapi32.dll (38,912 bytes) 9/8/2005 12:20 PM Microsoft Corporation raschap 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wshtcpip.dll 226.50 KB (231,936 bytes) 9/8/2005 12:19 PM ipsecsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 465.00 KB (476,160 bytes) 9/8/2005 12:19 PM c:\windows\system32\raschap.dll Microsoft Corporation schedsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\ipsecsvc.dll 567.00 KB (580,608 bytes) 9/8/2005 1:58 PM oakley 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 516.50 KB (528,896 bytes) 9/8/2005 12:19 PM c:\windows\system32\schedsvc.dll Microsoft Corporation msidle 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\oakley.dll 11.50 KB (11,776 bytes) 9/8/2005 12:19 PM winipsec 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 83.00 KB (84,992 bytes) 9/8/2005 12:20 PM c:\windows\system32\msidle.dll Microsoft Corporation wkssvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\winipsec.dll 315.50 KB (323,072 bytes) 9/8/2005 12:20 PM pstorsvc 5.2.3790.0 (srv03_rtm.030324-2048) 56.00 KB Microsoft Corporation (57,344 bytes) 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\wkssvc.dll c:\windows\system32\pstorsvc.dll wiarpc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) psbase 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 76.00 KB (77,824 bytes) 9/8/2005 12:20 PM 167.50 KB (171,520 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\wiarpc.dll c:\windows\system32\psbase.dll aelupsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) dssenh 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 55.50 KB (56,832 bytes) 9/8/2005 12:18 PM 363.98 KB (372,712 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\aelupsvc.dll c:\windows\system32\dssenh.dll apphelp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) wlbsctrl 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 301.50 KB (308,736 bytes) 9/8/2005 12:18 PM 207.00 KB (211,968 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\apphelp.dll c:\windows\system32\wlbsctrl.dll cryptsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) svchost 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 139.00 KB (142,336 bytes) 9/8/2005 12:18 PM 36.00 KB (36,864 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\cryptsvc.dll c:\windows\system32\svchost.exe certcli 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) rpcss 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 580.00 KB (593,920 bytes) 9/8/2005 12:18 PM 823.50 KB (843,264 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\certcli.dll c:\windows\system32\rpcss.dll vssapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.57 wzcsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (1,642,496 bytes) 9/8/2005 12:20 PM Microsoft 818.00 KB (837,632 bytes) 3/24/2005 9:52 AM Corporation c:\windows\system32\vssapi.dll HP TPC-H FULL DISCLOSURE REPORT 130 © 2005 Hewlett-Packard Company. All rights reserved. dmserver 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) sens 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 52.00 KB (53,248 bytes) 9/8/2005 12:19 PM 98.00 KB (100,352 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\dmserver.dll c:\windows\system32\sens.dll es 2001.12.4720.1830 (srv03_sp1_rtm.050324-1447) ipnathlp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 685.50 KB (701,952 bytes) 9/8/2005 12:19 PM 945.50 KB (968,192 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\es.dll c:\windows\system32\ipnathlp.dll pchsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) comsvcs 2001.12.4720.1830 (srv03_sp1_rtm.050324-1447) 3.15 113.00 KB (115,712 bytes) 9/8/2005 1:58 PM MB (3,300,352 bytes) 9/8/2005 1:57 PM Microsoft Microsoft Corporation Corporation c:\windows\system32\comsvcs.dll c:\windows\pchealth\helpctr\binaries\pchsvc.dll browser 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) srvsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 200.50 KB (205,312 bytes) 9/8/2005 12:18 PM 197.50 KB (202,240 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\browser.dll c:\windows\system32\srvsvc.dll rasadhlp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) sacsvr 5.2.3790.0 (srv03_rtm.030324-2048) 27.50 KB 18.00 KB (18,432 bytes) 9/8/2005 12:19 PM (28,160 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\sacsvr.dll c:\windows\system32\rasadhlp.dll seclogon 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) wbemcomn 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 47.00 KB (48,128 bytes) 9/8/2005 12:20 PM 665.50 KB (681,472 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\seclogon.dll c:\windows\system32\wbem\wbemcomn.dll trkwks 5.2.3790.0 (srv03_rtm.030324-2048) 246.00 KB wbemcore 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) (251,904 bytes) 9/8/2005 12:20 PM Microsoft Corporation 1.94 MB (2,038,784 bytes) 9/8/2005 1:56 PM c:\windows\system32\trkwks.dll Microsoft Corporation wmisvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wbem\wbemcore.dll 445.50 KB (456,192 bytes) 9/8/2005 1:56 PM esscli 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.01 Microsoft Corporation MB (1,057,280 bytes) 9/8/2005 1:56 PM Microsoft c:\windows\system32\wbem\wmisvc.dll Corporation c:\windows\system32\wbem\esscli.dll wuauserv 5.7.3790.1830 (srv03_sp1_rtm.050324-1447) fastprox 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.63 24.50 KB (25,088 bytes) 9/8/2005 1:58 PM MB (1,710,592 bytes) 9/8/2005 1:56 PM Microsoft Microsoft Corporation Corporation c:\windows\system32\wbem\fastprox.dll c:\windows\system32\wuauserv.dll wbemsvc 5.2.3790.0 (srv03_rtm.030324-2048) 62.50 KB wuaueng 5.7.3790.1830 (srv03_sp1_rtm.050324-1447) 3.08 (64,000 bytes) 9/8/2005 1:57 PM Microsoft Corporation MB (3,225,088 bytes) 9/8/2005 1:58 PM Microsoft c:\windows\system32\wbem\wbemsvc.dll Corporation c:\windows\system32\wuaueng.dll wmiutils 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) advpack 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 302.00 KB (309,248 bytes) 9/8/2005 1:56 PM 259.50 KB (265,728 bytes) 9/8/2005 12:18 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\wbem\wmiutils.dll c:\windows\system32\advpack.dll repdrvfs 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) shfolder 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 649.00 KB (664,576 bytes) 9/8/2005 1:56 PM 42.50 KB (43,520 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\wbem\repdrvfs.dll c:\windows\system32\shfolder.dll wmiprvsd 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.39 winhttp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (1,454,592 bytes) 9/8/2005 1:56 PM Microsoft 995.00 KB (1,018,880 bytes) 9/8/2005 6:18 AM Corporation c:\windows\system32\wbem\wmiprvsd.dll Microsoft Corporation c:\windows\winsxs\ia64_microsoft.windows.winhttp_659 wbemess 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.02 5b64144ccf1df_5.1.3790.1830_x-ww_a36ff59b\winhttp.dll MB (1,070,080 bytes) 9/8/2005 1:56 PM Microsoft cabinet 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\wbem\wbemess.dll 250.50 KB (256,512 bytes) 9/8/2005 12:18 PM Microsoft Corporation ncprov 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\cabinet.dll 146.00 KB (149,504 bytes) 9/8/2005 1:56 PM mspatcha 5.2.3790.0 (srv03_rtm.030324-2048) 80.00 KB Microsoft Corporation (81,920 bytes) 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\wbem\ncprov.dll c:\windows\system32\mspatcha.dll rasdlg 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.44 netman 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (1,509,888 bytes) 9/8/2005 12:19 PM Microsoft 706.50 KB (723,456 bytes) 9/8/2005 12:19 PM Corporation c:\windows\system32\rasdlg.dll Microsoft Corporation spoolsv 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\netman.dll 144.00 KB (147,456 bytes) 9/8/2005 12:20 PM netshell 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.95 Microsoft Corporation MB (3,094,528 bytes) 9/8/2005 12:19 PM Microsoft c:\windows\system32\spoolsv.exe Corporation c:\windows\system32\netshell.dll spoolss 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) clusapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 246.50 KB (252,416 bytes) 9/8/2005 12:20 PM 158.00 KB (161,792 bytes) 9/8/2005 12:18 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\spoolss.dll c:\windows\system32\clusapi.dll localspl 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) wininet 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 1.62 943.50 KB (966,144 bytes) 9/8/2005 12:19 PM MB (1,697,280 bytes) 9/8/2005 12:20 PM Microsoft Microsoft Corporation Corporation c:\windows\system32\wininet.dll c:\windows\system32\localspl.dll wzcsapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) cnbjmon 5.2.3790.1224 (dnsrv(skatari).040514-1058) 86.50 KB (88,576 bytes) 3/24/2005 9:52 AM 100.00 KB (102,400 bytes) 3/24/2005 9:31 AM Microsoft Corporation Microsoft Corporation c:\windows\system32\wzcsapi.dll c:\windows\system32\cnbjmon.dll HP TPC-H FULL DISCLOSURE REPORT 131 © 2005 Hewlett-Packard Company. All rights reserved. pjlmon 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 42.50 KB (43,520 bytes) 3/24/2005 9:39 AM c:\windows\system32\ersvc.dll Microsoft Corporation msftesql 12.0.5626.1 285.20 KB (292,048 bytes) c:\windows\system32\pjlmon.dll 8/26/2005 4:37 PM Microsoft Corporation tcpmon 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\program files\microsoft sql 143.00 KB (146,432 bytes) 9/8/2005 12:20 PM server\mssql.1\mssql\binn\msftesql.exe Microsoft Corporation msfte 12.0.5626.1 6.74 MB (7,067,856 bytes) c:\windows\system32\tcpmon.dll 8/26/2005 4:37 PM Microsoft Corporation wsnmp32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\program files\microsoft sql 128.50 KB (131,584 bytes) 9/8/2005 12:20 PM server\mssql.1\mssql\binn\msfte.dll Microsoft Corporation dbghelp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.15 c:\windows\system32\wsnmp32.dll MB (2,257,920 bytes) 9/8/2005 12:18 PM Microsoft tcpmib 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\system32\dbghelp.dll 47.00 KB (48,128 bytes) 9/8/2005 12:20 PM msftepxy 12.0.5626.1 129.70 KB (132,816 bytes) Microsoft Corporation 8/26/2005 4:37 PM Microsoft Corporation c:\windows\system32\tcpmib.dll c:\program files\microsoft sql wsock32 5.2.3790.0 (srv03_rtm.030324-2048) 23.00 KB server\mssql.1\mssql\binn\msftepxy.dll (23,552 bytes) 9/8/2005 12:20 PM Microsoft Corporation termsrv 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\wsock32.dll 680.00 KB (696,320 bytes) 9/8/2005 1:57 PM mgmtapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 47.00 KB (48,128 bytes) 9/8/2005 12:19 PM c:\windows\system32\termsrv.dll Microsoft Corporation icaapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\mgmtapi.dll 33.50 KB (34,304 bytes) 9/8/2005 1:57 PM snmpapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 61.00 KB (62,464 bytes) 9/8/2005 12:20 PM c:\windows\system32\icaapi.dll Microsoft Corporation mstlsapi 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\snmpapi.dll 340.50 KB (348,672 bytes) 9/8/2005 12:19 PM usbmon 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 49.00 KB (50,176 bytes) 9/8/2005 12:20 PM c:\windows\system32\mstlsapi.dll Microsoft Corporation rdpwsx 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\usbmon.dll 325.13 KB (332,936 bytes) 9/8/2005 1:57 PM winrnr 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 47.50 KB (48,640 bytes) 9/8/2005 12:20 PM c:\windows\system32\rdpwsx.dll Microsoft Corporation rdpclip 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\winrnr.dll 211.00 KB (216,064 bytes) 9/8/2005 1:57 PM win32spl 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 276.00 KB (282,624 bytes) 9/8/2005 12:20 PM c:\windows\system32\rdpclip.exe Microsoft Corporation urlmon 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 1.53 c:\windows\system32\win32spl.dll MB (1,600,000 bytes) 9/8/2005 12:20 PM Microsoft netrap 5.2.3790.0 (srv03_rtm.030324-2048) 30.00 KB Corporation c:\windows\system32\urlmon.dll (30,720 bytes) 9/8/2005 12:19 PM Microsoft Corporation explorer 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 1.64 c:\windows\system32\netrap.dll MB (1,720,320 bytes) 9/8/2005 12:19 PM Microsoft inetpp 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Corporation c:\windows\explorer.exe 214.50 KB (219,648 bytes) 9/8/2005 12:19 PM browseui 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 2.42 Microsoft Corporation MB (2,542,592 bytes) 9/8/2005 12:18 PM Microsoft c:\windows\system32\inetpp.dll Corporation c:\windows\system32\browseui.dll icmp 5.2.3790.0 (srv03_rtm.030324-2048) 2.50 KB (2,560 shdocvw 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 3.49 bytes) 9/8/2005 12:19 PM Microsoft Corporation MB (3,658,240 bytes) 9/8/2005 12:20 PM Microsoft c:\windows\system32\icmp.dll Corporation c:\windows\system32\shdocvw.dll rmserver X 312.00 KB (319,488 bytes) 7/28/2005 themeui 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 11:16 AM Emulex Corporation c:\program files 891.00 KB (912,384 bytes) 9/8/2005 12:20 PM (x86)\hbanyware\rmserver.exe Microsoft Corporation wow64 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\themeui.dll 487.00 KB (498,688 bytes) 9/8/2005 12:20 PM msimg32 5.2.3790.0 (srv03_rtm.030324-2048) 7.00 KB (7,168 Microsoft Corporation bytes) 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\wow64.dll c:\windows\system32\msimg32.dll wow64win 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) linkinfo 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 567.50 KB (581,120 bytes) 9/8/2005 12:20 PM 46.50 KB (47,616 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\wow64win.dll c:\windows\system32\linkinfo.dll wow64cpu 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) ntshrui 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 44.00 KB (45,056 bytes) 9/8/2005 12:20 PM 244.00 KB (249,856 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\wow64cpu.dll c:\windows\system32\ntshrui.dll wowia32x5,3,5021,0 54.00 KB (55,296 bytes) msi 3.1.4000.1830 5.71 MB (5,984,768 bytes) 3/24/2005 9:52 AM Intel Corporation 9/8/2005 12:19 PM Microsoft Corporation c:\windows\system32\wowia32x.dll c:\windows\system32\msi.dll ia32exec 5,3,5337,0 7.13 MB (7,471,104 bytes) webcheck6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 3/24/2005 9:36 AM Intel Corporation 699.00 KB (715,776 bytes) 9/8/2005 12:20 PM c:\windows\system32\ia32exec.bin Microsoft Corporation hbahsmgrX 84.00 KB (86,016 bytes) 7/28/2005 c:\windows\system32\webcheck.dll 11:17 AM Emulex Corporation c:\program files stobject 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) (x86)\hbanyware\hbahsmgr.exe 175.00 KB (179,200 bytes) 9/8/2005 12:20 PM ersvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 66.50 KB (68,096 bytes) 9/8/2005 12:19 PM c:\windows\system32\stobject.dll HP TPC-H FULL DISCLOSURE REPORT 132 © 2005 Hewlett-Packard Company. All rights reserved. batmeter 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) Microsoft Corporation 61.00 KB (62,464 bytes) 9/8/2005 12:18 PM c:\windows\system32\comdlg32.dll Microsoft Corporation sqlnclir 2005.090.1355.00 200.21 KB (205,016 bytes) c:\windows\system32\batmeter.dll 9/25/2005 4:32 PM Microsoft Corporation powrprof 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\sqlnclir.rll 44.00 KB (45,056 bytes) 9/8/2005 12:19 PM StepMaster 2.05.00051.92 MB (2,015,285 bytes) Microsoft Corporation 6/27/2005 12:14 PM Microsoft Corporation c:\windows\system32\powrprof.dll c:\program files (x86)\stepmaster\stepmaster.exe browselc 6.00.3790.0 (srv03_rtm.030324-2048) 61.50 KB isqlw 2000.080.0725.00 344.56 KB (352,828 bytes) (62,976 bytes) 9/8/2005 12:18 PM Microsoft Corporation 8/23/2005 1:20 PM Microsoft Corporation c:\windows\system32\browselc.dll g:\isqlw\isqlw.exe duser 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) helpctr 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.01 756.00 KB (774,144 bytes) 9/8/2005 12:19 PM MB (2,105,344 bytes) 9/8/2005 1:58 PM Microsoft Microsoft Corporation Corporation c:\windows\system32\duser.dll c:\windows\pchealth\helpctr\binaries\helpctr.exe sqlservr 2005.090.1399.00 built by sqlperft from hcappres 5.2.3790.0 (srv03_rtm.030324-2048) 6.00 KB (6,144 PTDBITN02_F_Yukon_YukonSP1 70.66 MB (74,093,056 bytes) 9/8/2005 1:58 PM Microsoft Corporation bytes) 9/25/2005 4:38 PM Microsoft Corporation c:\windows\pchealth\helpctr\binaries\hcappres.dll c:\program files\microsoft sql itss 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) server\mssql.1\mssql\binn\sqlservr.exe 410.00 KB (419,840 bytes) 9/8/2005 12:19 PM msvcr80 8.00.50727.42 1.42 MB (1,484,800 bytes) Microsoft Corporation 9/22/2005 11:28 PM Microsoft Corporation c:\windows\system32\itss.dll c:\windows\winsxs\ia64_microsoft.vc80.crt_1fc8b3b9a1 msxml3 8.70.1104.0 3.33 MB (3,488,768 bytes) e18e3b_8.0.50727.42_x-ww_3d3b516d\msvcr80.dll 9/8/2005 12:19 PM Microsoft Corporation msvcp80 8.00.50727.42 1.32 MB (1,385,472 bytes) c:\windows\system32\msxml3.dll 9/22/2005 11:31 PM Microsoft Corporation pchshell 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\winsxs\ia64_microsoft.vc80.crt_1fc8b3b9a1 290.50 KB (297,472 bytes) 9/8/2005 1:58 PM e18e3b_8.0.50727.42_x-ww_3d3b516d\msvcp80.dll Microsoft Corporation opends60 2005.090.1355.00 38.21 KB (39,128 bytes) c:\windows\pchealth\helpctr\binaries\pchshell.dll 9/25/2005 4:32 PM Microsoft Corporation mlang 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\program files\microsoft sql 813.50 KB (833,024 bytes) 9/8/2005 12:19 PM server\mssql.1\mssql\binn\opends60.dll Microsoft Corporation instapi 2005.090.1355.00 98.21 KB (100,568 bytes) c:\windows\system32\mlang.dll 9/25/2005 4:27 PM Microsoft Corporation mshtml 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 8.85 c:\program files\microsoft sql MB (9,282,048 bytes) 9/8/2005 12:19 PM Microsoft server\90\shared\instapi.dll Corporation c:\windows\system32\mshtml.dll sqlevn70 2005.090.1355.00 1.57 MB (1,641,688 bytes) msls31 3.10.349.0 502.50 KB (514,560 bytes) 9/25/2005 4:32 PM Microsoft Corporation 9/8/2005 12:19 PM Microsoft Corporation c:\program files\microsoft sql c:\windows\system32\msls31.dll server\mssql.1\mssql\binn\resources\1033\sqlevn70.rll msimtf 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) sqlos 2005.090.1355.00 21.71 KB (22,232 bytes) 586.50 KB (600,576 bytes) 9/8/2005 12:20 PM 9/25/2005 4:36 PM Microsoft Corporation Microsoft Corporation c:\program files\microsoft sql c:\windows\system32\msimtf.dll server\mssql.1\mssql\binn\sqlos.dll msctf 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) mscoree 2.0.50727.42 (RTM.050727-4200) 864.50 KB 983.50 KB (1,007,104 bytes) 9/8/2005 12:20 PM (885,248 bytes) 9/22/2005 11:40 PM Microsoft Microsoft Corporation Corporation c:\windows\system32\mscoree.dll c:\windows\system32\msctf.dll xolehlp 2001.12.4720.1830 (srv03_sp1_rtm.050324-1447) shdoclc 6.00.3790.0 (srv03_rtm.030324-2048) 588.00 KB 18.00 KB (18,432 bytes) 9/8/2005 1:57 PM (602,112 bytes) 9/8/2005 12:20 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\shdoclc.dll c:\windows\system32\xolehlp.dll jscript 5.6.0.8827 1.24 MB (1,304,576 bytes) msdtcprx 2001.12.4720.1830 (srv03_sp1_rtm.050324-1447) 1.27 9/8/2005 12:19 PM Microsoft Corporation MB (1,329,152 bytes) 9/8/2005 1:57 PM Microsoft c:\windows\system32\jscript.dll Corporation c:\windows\system32\msdtcprx.dll imm32 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) mtxclu 2001.12.4720.1830 (srv03_sp1_rtm.050324-1447) 322.50 KB (330,240 bytes) 9/8/2005 12:19 PM 203.00 KB (207,872 bytes) 9/8/2005 12:19 PM Microsoft Corporation Microsoft Corporation c:\windows\system32\imm32.dll c:\windows\system32\mtxclu.dll mshtmled 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) 1.46 resutils 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) MB (1,531,392 bytes) 9/8/2005 12:19 PM Microsoft 154.00 KB (157,696 bytes) 9/8/2005 12:19 PM Corporation c:\windows\system32\mshtmled.dll Microsoft Corporation vbscript 5.6.0.8827 1.07 MB (1,118,208 bytes) c:\windows\system32\resutils.dll 9/8/2005 12:20 PM Microsoft Corporation security 5.2.3790.0 (srv03_rtm.030324-2048) 7.00 KB (7,168 c:\windows\system32\vbscript.dll bytes) 9/8/2005 12:20 PM Microsoft Corporation msinfo 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 1.26 c:\windows\system32\security.dll MB (1,321,472 bytes) 9/8/2005 1:58 PM Microsoft dbghelp 6.5.0003.7 (vbl_core_fbrel(jshay).050527-1915) 3.66 Corporation MB (3,834,584 bytes) 9/25/2005 4:28 PM Microsoft c:\windows\pchealth\helpctr\binaries\msinfo.dll Corporation c:\program files\microsoft sql mfc42u 6.50.4245.0 3.35 MB (3,510,272 bytes) server\90\shared\dbghelp.dll 9/8/2005 12:19 PM Microsoft Corporation sqlncli 2005.090.1355.00 5.13 MB (5,383,440 bytes) c:\windows\system32\mfc42u.dll 9/25/2005 4:37 PM Microsoft Corporation riched32 5.2.3790.0 (srv03_rtm.030324-2048) 5.00 KB (5,120 c:\windows\system32\sqlncli.dll bytes) 9/8/2005 12:19 PM Microsoft Corporation comdlg32 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) c:\windows\system32\riched32.dll 745.50 KB (763,392 bytes) 9/8/2005 12:18 PM

HP TPC-H FULL DISCLOSURE REPORT 133 © 2005 Hewlett-Packard Company. All rights reserved. riched20 5.31.23.1224 1.38 MB (1,451,008 bytes) DCOM Server Process Launcher DcomLaunch 9/8/2005 12:19 PM Microsoft Corporation Running Auto Share Process c:\windows\system32\riched20.dll c:\windows\system32\svchost.exe -k dcomlaunch wbemprox 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) Normal LocalSystem 0 65.00 KB (66,560 bytes) 9/8/2005 1:56 PM Distributed File System Dfs Stopped Manual Own Microsoft Corporation Process c:\windows\system32\dfssvc.exe Normal c:\windows\system32\wbem\wbemprox.dll LocalSystem 0 mydocs 6.00.3790.1830 (srv03_sp1_rtm.050324-1447) DHCP Client Dhcp Running Auto Share Process 130.50 KB (133,632 bytes) 9/8/2005 12:19 PM c:\windows\system32\svchost.exe -k networkservice Microsoft Corporation Normal NT AUTHORITY\NetworkService 0 c:\windows\system32\mydocs.dll helpsvc 5.2.3790.1830 (srv03_sp1_rtm.050324-1447) 2.21 Logical Disk Manager Administrative Service dmadmin MB (2,320,384 bytes) 9/8/2005 1:58 PM Microsoft Stopped Manual Share Process Corporation c:\windows\system32\dmadmin.exe /com c:\windows\pchealth\helpctr\binaries\helpsvc.exe Normal LocalSystem 0 Logical Disk Manager dmserver Running Auto [Services] Share Process c:\windows\system32\svchost.exe - k netsvcs Normal LocalSystem 0 Display Name Name State Start Mode DNS Client DnscacheRunning Auto Share Process Service Type Path Error Control Start c:\windows\system32\svchost.exe -k networkservice Name Tag ID Normal NT AUTHORITY\NetworkService 0 Application Experience Lookup Service AeLookupSvc Running Auto Share Process Emulex HBAnyware Discovery Emulex HBAnyware c:\windows\system32\svchost.exe -k netsvcs Discovery Stopped Manual Own Process "c:\program Normal LocalSystem 0 files (x86)\hbanyware\hbadiscsrvr.exe" Normal LocalSystem Alerter Alerter Stopped Disabled Share Process 0 c:\windows\system32\svchost.exe -k localservice Emulex HBAnyware SvcMgr Emulex HBAnyware SvcMgr Normal NT AUTHORITY\LocalService0 Running Auto Own Process "c:\program Application Layer Gateway Service ALG Running files (x86)\hbanyware\hbahsmgr.exe" Normal LocalSystem Manual Own Process 0 c:\windows\system32\alg.exe Normal NT Emulex HBAnyware Emulex HBAnyware Running Auto Own AUTHORITY\LocalService 0 Process "c:\program files (x86)\hbanyware\rmserver.exe" Application Management AppMgmt Stopped Manual Normal LocalSystem 0 Share Process c:\windows\system32\svchost.exe - Error Reporting Service ERSvc Running Auto k netsvcs Normal LocalSystem 0 Share Process c:\windows\system32\svchost.exe - ASP.NET State Service aspnet_state Stopped k winerr Ignore LocalSystem 0 Manual Own Process Event Log Eventlog Running Auto Share Process c:\windows\microsoft.net\framework64\v2.0.50727\aspn c:\windows\system32\services.exe Normal et_state.exe Normal NT AUTHORITY\NetworkService LocalSystem 0 0 COM+ Event System EventSystem Running Auto Windows Audio AudioSrv Stopped Disabled Share Process Share Process c:\windows\system32\svchost.exe - c:\windows\system32\svchost.exe -k netsvcs k netsvcs Normal LocalSystem 0 Normal LocalSystem 0 Help and Support helpsvc Running Auto Share Process Background Intelligent Transfer Service BITS Stopped c:\windows\system32\svchost.exe -k netsvcs Manual Share Process Normal LocalSystem 0 c:\windows\system32\svchost.exe -k netsvcs Human Interface Device Access HidServ Stopped Normal LocalSystem 0 Disabled Share Process Computer Browser Browser Running Auto Share Process c:\windows\system32\svchost.exe -k netsvcs c:\windows\system32\svchost.exe -k netsvcs Normal LocalSystem 0 Normal LocalSystem 0 HTTP SSL HTTPFilter Stopped Manual Indexing Service CiSvc Stopped Disabled Share Process Share Process c:\windows\system32\lsass.exe c:\windows\system32\cisvc.exe Normal Normal LocalSystem 0 LocalSystem 0 IAS Jet Database Access IASJet Stopped Manual ClipBook ClipSrv Stopped Disabled Own Process Share Process c:\windows\syswow64\svchost.exe c:\windows\system32\clipsrv.exe Normal -k iasjet Normal LocalSystem 0 LocalSystem 0 IMAPI CD-Burning COM Service ImapiService .NET Runtime Optimization Service v2.0.50727_X86 Stopped Disabled Own Process clr_optimization_v2.0.50727_32 Stopped c:\windows\system32\imapi.exe Normal Manual Own Process LocalSystem 0 c:\windows\microsoft.net\framework\v2.0.50727\mscors Intersite Messaging IsmServ Stopped Disabled Own Process vw.exe Ignore LocalSystem 0 c:\windows\system32\ismserv.exe Normal .NET Runtime Optimization Service v2.0.50727_I64 LocalSystem 0 clr_optimization_v2.0.50727_64 Stopped Kerberos Key Distribution Center kdc Stopped Manual Own Process Disabled Share Process c:\windows\microsoft.net\framework64\v2.0.50727\msc c:\windows\system32\lsass.exe Normal orsvw.exe Ignore LocalSystem 0 LocalSystem 0 COM+ System Application COMSysApp Stopped Server lanmanserver Running Auto Share Process Manual Own Process c:\windows\system32\svchost.exe -k netsvcs c:\windows\system32\dllhost.exe /processid:{02d4b3f1- Normal LocalSystem 0 fd88-11d1-960d-00805fc79235} Normal LocalSystem Workstation lanmanworkstation Running Auto 0 Share Process c:\windows\system32\svchost.exe - Cryptographic Services CryptSvc Running Auto k netsvcs Normal LocalSystem 0 Share Process c:\windows\system32\svchost.exe - License Logging LicenseService Stopped Disabled Own k netsvcs Normal LocalSystem 0 Process c:\windows\system32\llssrv.exe Normal NT AUTHORITY\NetworkService 0 HP TPC-H FULL DISCLOSURE REPORT 134 © 2005 Hewlett-Packard Company. All rights reserved. TCP/IP NetBIOS Helper LmHosts Running Auto c:\windows\system32\svchost.exe -k netsvcs Share Process c:\windows\system32\svchost.exe - Normal LocalSystem 0 k localservice Normal NT AUTHORITY\LocalService0 Remote Access Connection Manager RasMan Stopped Manual Share Process Messenger Messenger Stopped Disabled c:\windows\system32\svchost.exe -k netsvcs Share Process c:\windows\system32\svchost.exe - Normal LocalSystem 0 k netsvcs Normal LocalSystem 0 Remote Desktop Help Session Manager RDSessMgr NetMeeting Remote Desktop Sharing mnmsrvc Stopped Stopped Manual Own Process Disabled Own Process c:\windows\system32\sessmgr.exe Normal c:\windows\system32\mnmsrvc.exe Normal LocalSystem 0 LocalSystem 0 Routing and Remote Access RemoteAccess Stopped Distributed Transaction Coordinator MSDTC Running Auto Disabled Share Process Own Process c:\windows\system32\msdtc.exe c:\windows\system32\svchost.exe -k netsvcs Normal NT AUTHORITY\NetworkService 0 Normal LocalSystem 0 Remote Registry RemoteRegistry Running Auto SQL Server FullText Search (MSSQLSERVER) msftesql Share Process c:\windows\system32\svchost.exe - Running Auto Own Process "c:\program k regsvc Normal NT AUTHORITY\LocalService0 files\microsoft sql server\mssql.1\mssql\binn\msftesql.exe" - Remote Procedure Call (RPC) Locator RpcLocator s:mssql.1 -f:mssqlserver Normal LocalSystem 0 Stopped Manual Own Process c:\windows\system32\locator.exe Normal NT Windows Installer MSIServer Stopped Manual AUTHORITY\NetworkService 0 Share Process c:\windows\system32\msiexec.exe Remote Procedure Call (RPC)RpcSs Running Auto /v Normal LocalSystem 0 Share Process c:\windows\system32\svchost.exe - SQL Server (MSSQLSERVER) MSSQLSERVER k rpcss Normal NT AUTHORITY\NetworkService 0 Stopped Manual Own Process "c:\program files\microsoft sql server\mssql.1\mssql\binn\sqlservr.exe" - Resultant Set of Policy Provider RSoPProv smssqlserver Normal LocalSystem 0 Stopped Manual Share Process SQL Server Active Directory Helper MSSQLServerADHelper c:\windows\system32\rsopprov.exe Normal Stopped Disabled Own Process "c:\program LocalSystem 0 files\microsoft sql server\90\shared\sqladhlp90.exe" Special Administration Console Helper sacsvr Running Normal NT AUTHORITY\NetworkService 0 Manual Share Process c:\windows\system32\svchost.exe -k netsvcs Network DDE NetDDE Stopped Disabled Share Process Normal LocalSystem 0 c:\windows\system32\netdde.exe Normal Security Accounts Manager SamSs Running Auto LocalSystem 0 Share Process c:\windows\system32\lsass.exe Network DDE DSDM NetDDEdsdm Stopped Normal LocalSystem 0 Disabled Share Process Smart Card SCardSvr Stopped Manual Share Process c:\windows\system32\netdde.exe Normal c:\windows\system32\scardsvr.exe Ignore NT LocalSystem 0 AUTHORITY\LocalService 0 Net Logon Netlogon Stopped Manual Share Process Task Scheduler Schedule Running Auto Share Process c:\windows\system32\lsass.exe Normal c:\windows\system32\svchost.exe -k netsvcs LocalSystem 0 Normal LocalSystem 0 Network Connections Netman Running Manual Secondary Logon seclogon Running Auto Share Process Share Process c:\windows\system32\svchost.exe - c:\windows\system32\svchost.exe -k netsvcs k netsvcs Normal LocalSystem 0 Ignore LocalSystem 0 Network Location Awareness (NLA) Nla Running System Event Notification SENS Running Auto Manual Share Process Share Process c:\windows\system32\svchost.exe - c:\windows\system32\svchost.exe -k netsvcs k netsvcs Normal LocalSystem 0 Normal LocalSystem 0 Windows Firewall/Internet Connection Sharing (ICS) File Replication NtFrs Stopped Manual Own Process SharedAccess Running Auto Share Process c:\windows\system32\ntfrs.exe Ignore c:\windows\system32\svchost.exe -k netsvcs LocalSystem 0 Normal LocalSystem 0 NT LM Security Support Provider NtLmSsp Running Shell Hardware Detection ShellHWDetection Running Auto Manual Share Process Share Process c:\windows\system32\svchost.exe - c:\windows\system32\lsass.exe Normal k netsvcs Ignore LocalSystem 0 LocalSystem 0 Print Spooler Spooler Running Auto Own Process Removable Storage NtmsSvc Stopped Manual Share Process c:\windows\system32\spoolsv.exe Normal c:\windows\system32\svchost.exe -k netsvcs LocalSystem 0 Normal LocalSystem 0 SQL Server Browser SQLBrowser Stopped Office Source Engine ose Stopped Manual Own Disabled Own Process "c:\program Process "c:\program files (x86)\common files\microsoft files\microsoft sql server\90\shared\sqlbrowser.exe" shared\source engine\ose.exe" Normal LocalSystem Normal LocalSystem 0 0 SQL Server Agent (MSSQLSERVER) SQLSERVERAGENT Plug and Play PlugPlay Running Auto Share Process Stopped Manual Own Process "c:\program c:\windows\system32\services.exe Normal files\microsoft sql server\mssql.1\mssql\binn\sqlagent90.exe" -i LocalSystem 0 mssqlserver Normal LocalSystem 0 IPSEC Services PolicyAgent Running Auto SQL Server VSS Writer SQLWriter Stopped Share Process c:\windows\system32\lsass.exe Manual Own Process "c:\program Normal LocalSystem 0 files\microsoft sql server\90\shared\sqlwriter.exe" Normal Protected Storage ProtectedStorage Running Auto LocalSystem 0 Share Process c:\windows\system32\lsass.exe Windows Image Acquisition (WIA) stisvc Stopped Normal LocalSystem 0 Disabled Share Process Remote Access Auto Connection Manager RasAuto c:\windows\system32\svchost.exe -k imgsvc Stopped Manual Share Process Normal NT AUTHORITY\LocalService0

HP TPC-H FULL DISCLOSURE REPORT 135 © 2005 Hewlett-Packard Company. All rights reserved. Microsoft Software Shadow Copy Provider swprv Volume Shadow Copy VSS Stopped Manual Own Stopped Manual Own Process Process c:\windows\system32\vssvc.exe Normal c:\windows\system32\svchost.exe -k swprv LocalSystem 0 Normal LocalSystem 0 Windows Time W32Time Running Auto Share Process Performance Logs and Alerts SysmonLog Stopped c:\windows\system32\svchost.exe -k localservice Manual Own Process Normal NT AUTHORITY\LocalService0 c:\windows\system32\smlogsvc.exe Normal NT WebClient WebClient Stopped Disabled Authority\NetworkService 0 Share Process c:\windows\system32\svchost.exe - Telephony TapiSrv Stopped Manual Share Process k localservice Normal NT AUTHORITY\LocalService0 c:\windows\system32\svchost.exe -k tapisrv Normal LocalSystem 0 WinHTTP Web Proxy Auto-Discovery Service Ter minal Services TermService Running Manual WinHttpAutoProxySvc Stopped Manual Share Process c:\windows\system32\svchost.exe - Share Process c:\windows\system32\svchost.exe - k termsvcs Normal LocalSystem 0 k localservice Normal NT AUTHORITY\LocalService0 Themes Themes Stopped Disabled Share Process c:\windows\system32\svchost.exe -k netsvcs Windows Management Instrumentation winmgmt Running Auto Normal LocalSystem 0 Share Process c:\windows\system32\svchost.exe - Distributed Link Tracking Server TrkSvr Stopped k netsvcs Ignore LocalSystem 0 Disabled Share Process Windows Management Instrumentation Driver Extensions Wmi c:\windows\system32\svchost.exe -k netsvcs Stopped Manual Share Process Normal LocalSystem 0 c:\windows\system32\svchost.exe -k netsvcs Distributed Link Tracking Client TrkWks Running Auto Normal LocalSystem 0 Share Process c:\windows\system32\svchost.exe - WMI Performance Adapter WmiApSrv Stopped k netsvcs Normal LocalSystem 0 Manual Own Process Ter minal Services Session Directory Tssdis Stopped c:\windows\system32\wbem\wmiapsrv.exe Disabled Own Process Normal LocalSystem 0 c:\windows\system32\tssdis.exe Normal Automatic Updates wuauserv Running Auto Share Process LocalSystem 0 c:\windows\system32\svchost.exe -k netsvcs Uninterruptible Power Supply UPS Stopped Manual Own Normal LocalSystem 0 Process c:\windows\system32\ups.exe Normal NT Wireless Configuration WZCSVC Running Auto AUTHORITY\LocalService 0 Share Process c:\windows\system32\svchost.exe - Virtual Disk Service vds Stopped Manual Own Process k netsvcs Normal LocalSystem 0 c:\windows\system32\vds.exe Normal LocalSystem Network Provisioning Service xmlprov Stopped Manual 0 Share Process c:\windows\system32\svchost.exe - k netsvcs Normal LocalSystem 0

HP TPC-H FULL DISCLOSURE REPORT 136 © 2005 Hewlett-Packard Company. All rights reserved. Appendix B: Database Build Scripts Create Database

-- CreateDatabase if exists (select name from sysdatabases where NAME='tpch3000g') drop database tpch3000g

CREATE DATABASE tpch3000g ON PRIMARY (NAME=tpch3000g_root, FILENAME="G:\TPCH_Roots\tpch3000g.mdf", SIZE = 10MB, FILEGROWTH = 10MB),

FILEGROUP STAGING_FG (NAME=tpch3000g_stage1, FILENAME='G:\mnt\ntfs\1\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage2, FILENAME='G:\mnt\ntfs\2\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage3, FILENAME='G:\mnt\ntfs\3\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage4, FILENAME='G:\mnt\ntfs\4\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage5, FILENAME='G:\mnt\ntfs\5\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage6, FILENAME='G:\mnt\ntfs\6\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage7, FILENAME='G:\mnt\ntfs\7\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage8, FILENAME='G:\mnt\ntfs\8\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage9, FILENAME='G:\mnt\ntfs\9\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage10,FILENAME='G:\mnt\ntfs\10\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage11,FILENAME='G:\mnt\ntfs\11\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage12,FILENAME='G:\mnt\ntfs\12\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage13,FILENAME='G:\mnt\ntfs\13\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage14,FILENAME='G:\mnt\ntfs\14\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage15,FILENAME='G:\mnt\ntfs\15\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage16,FILENAME='G:\mnt\ntfs\16\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage17,FILENAME='G:\mnt\ntfs\17\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage18,FILENAME='G:\mnt\ntfs\18\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage19,FILENAME='G:\mnt\ntfs\19\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage20,FILENAME='G:\mnt\ntfs\20\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage21,FILENAME='G:\mnt\ntfs\21\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage22,FILENAME='G:\mnt\ntfs\22\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage23,FILENAME='G:\mnt\ntfs\23\stage.mdf',SIZE=150000MB), (NAME=tpch3000g_stage24,FILENAME='G:\mnt\ntfs\24\stage.mdf',SIZE=150000MB),

FILEGROUP LINEITEM_FG (NAME=tpch3000g_li1, FILENAME='G:\mnt\li\1\',SIZE=48000MB), (NAME=tpch3000g_li2, FILENAME='G:\mnt\li\2\',SIZE=48000MB), (NAME=tpch3000g_li3, FILENAME='G:\mnt\li\3\',SIZE=48000MB), (NAME=tpch3000g_li4, FILENAME='G:\mnt\li\4\',SIZE=48000MB), (NAME=tpch3000g_li5, FILENAME='G:\mnt\li\5\',SIZE=48000MB), (NAME=tpch3000g_li6, FILENAME='G:\mnt\li\6\',SIZE=48000MB), (NAME=tpch3000g_li7, FILENAME='G:\mnt\li\7\',SIZE=48000MB), (NAME=tpch3000g_li8, FILENAME='G:\mnt\li\8\',SIZE=48000MB), (NAME=tpch3000g_li9, FILENAME='G:\mnt\li\9\',SIZE=48000MB), (NAME=tpch3000g_li10,FILENAME='G:\mnt\li\10\',SIZE=48000MB), (NAME=tpch3000g_li11,FILENAME='G:\mnt\li\11\',SIZE=48000MB), (NAME=tpch3000g_li12,FILENAME='G:\mnt\li\12\',SIZE=48000MB), (NAME=tpch3000g_li13,FILENAME='G:\mnt\li\13\',SIZE=48000MB), (NAME=tpch3000g_li14,FILENAME='G:\mnt\li\14\',SIZE=48000MB), (NAME=tpch3000g_li15,FILENAME='G:\mnt\li\15\',SIZE=48000MB), (NAME=tpch3000g_li16,FILENAME='G:\mnt\li\16\',SIZE=48000MB), (NAME=tpch3000g_li17,FILENAME='G:\mnt\li\17\',SIZE=48000MB), (NAME=tpch3000g_li18,FILENAME='G:\mnt\li\18\',SIZE=48000MB), (NAME=tpch3000g_li19,FILENAME='G:\mnt\li\19\',SIZE=48000MB), (NAME=tpch3000g_li20,FILENAME='G:\mnt\li\20\',SIZE=48000MB), (NAME=tpch3000g_li21,FILENAME='G:\mnt\li\21\',SIZE=48000MB), (NAME=tpch3000g_li22,FILENAME='G:\mnt\li\22\',SIZE=48000MB), (NAME=tpch3000g_li23,FILENAME='G:\mnt\li\23\',SIZE=48000MB), (NAME=tpch3000g_li24,FILENAME='G:\mnt\li\24\',SIZE=48000MB), (NAME=tpch3000g_li25,FILENAME='G:\mnt\li\25\',SIZE=48000MB), (NAME=tpch3000g_li26,FILENAME='G:\mnt\li\26\',SIZE=48000MB), (NAME=tpch3000g_li27,FILENAME='G:\mnt\li\27\',SIZE=48000MB), (NAME=tpch3000g_li28,FILENAME='G:\mnt\li\28\',SIZE=48000MB), (NAME=tpch3000g_li29,FILENAME='G:\mnt\li\29\',SIZE=48000MB), (NAME=tpch3000g_li30,FILENAME='G:\mnt\li\30\',SIZE=48000MB), (NAME=tpch3000g_li31,FILENAME='G:\mnt\li\31\',SIZE=48000MB),

HP TPC-H FULL DISCLOSURE REPORT 137 © 2005 Hewlett-Packard Company. All rights reserved. (NAME=tpch3000g_li32,FILENAME='G:\mnt\li\32\',SIZE=48000MB), (NAME=tpch3000g_li33,FILENAME='G:\mnt\li\33\',SIZE=48000MB), (NAME=tpch3000g_li34,FILENAME='G:\mnt\li\34\',SIZE=48000MB), (NAME=tpch3000g_li35,FILENAME='G:\mnt\li\35\',SIZE=48000MB), (NAME=tpch3000g_li36,FILENAME='G:\mnt\li\36\',SIZE=48000MB), (NAME=tpch3000g_li37,FILENAME='G:\mnt\li\37\',SIZE=48000MB), (NAME=tpch3000g_li38,FILENAME='G:\mnt\li\38\',SIZE=48000MB), (NAME=tpch3000g_li39,FILENAME='G:\mnt\li\39\',SIZE=48000MB), (NAME=tpch3000g_li40,FILENAME='G:\mnt\li\40\',SIZE=48000MB), (NAME=tpch3000g_li41,FILENAME='G:\mnt\li\41\',SIZE=48000MB), (NAME=tpch3000g_li42,FILENAME='G:\mnt\li\42\',SIZE=48000MB), (NAME=tpch3000g_li43,FILENAME='G:\mnt\li\43\',SIZE=48000MB), (NAME=tpch3000g_li44,FILENAME='G:\mnt\li\44\',SIZE=48000MB), (NAME=tpch3000g_li45,FILENAME='G:\mnt\li\45\',SIZE=48000MB), (NAME=tpch3000g_li46,FILENAME='G:\mnt\li\46\',SIZE=48000MB), (NAME=tpch3000g_li47,FILENAME='G:\mnt\li\47\',SIZE=48000MB), (NAME=tpch3000g_li48,FILENAME='G:\mnt\li\48\',SIZE=48000MB), (NAME=tpch3000g_li49,FILENAME='G:\mnt\li\49\',SIZE=48000MB), (NAME=tpch3000g_li50,FILENAME='G:\mnt\li\50\',SIZE=48000MB), (NAME=tpch3000g_li51,FILENAME='G:\mnt\li\51\',SIZE=48000MB), (NAME=tpch3000g_li52,FILENAME='G:\mnt\li\52\',SIZE=48000MB), (NAME=tpch3000g_li53,FILENAME='G:\mnt\li\53\',SIZE=48000MB), (NAME=tpch3000g_li54,FILENAME='G:\mnt\li\54\',SIZE=48000MB), (NAME=tpch3000g_li55,FILENAME='G:\mnt\li\55\',SIZE=48000MB), (NAME=tpch3000g_li56,FILENAME='G:\mnt\li\56\',SIZE=48000MB), (NAME=tpch3000g_li57,FILENAME='G:\mnt\li\57\',SIZE=48000MB), (NAME=tpch3000g_li58,FILENAME='G:\mnt\li\58\',SIZE=48000MB), (NAME=tpch3000g_li59,FILENAME='G:\mnt\li\59\',SIZE=48000MB), (NAME=tpch3000g_li60,FILENAME='G:\mnt\li\60\',SIZE=48000MB), (NAME=tpch3000g_li61,FILENAME='G:\mnt\li\61\',SIZE=48000MB), (NAME=tpch3000g_li62,FILENAME='G:\mnt\li\62\',SIZE=48000MB), (NAME=tpch3000g_li63,FILENAME='G:\mnt\li\63\',SIZE=48000MB), (NAME=tpch3000g_li64,FILENAME='G:\mnt\li\64\',SIZE=48000MB), (NAME=tpch3000g_li65,FILENAME='G:\mnt\li\65\',SIZE=48000MB), (NAME=tpch3000g_li66,FILENAME='G:\mnt\li\66\',SIZE=48000MB), (NAME=tpch3000g_li67,FILENAME='G:\mnt\li\67\',SIZE=48000MB), (NAME=tpch3000g_li68,FILENAME='G:\mnt\li\68\',SIZE=48000MB), (NAME=tpch3000g_li69,FILENAME='G:\mnt\li\69\',SIZE=48000MB), (NAME=tpch3000g_li70,FILENAME='G:\mnt\li\70\',SIZE=48000MB), (NAME=tpch3000g_li71,FILENAME='G:\mnt\li\71\',SIZE=48000MB), (NAME=tpch3000g_li72,FILENAME='G:\mnt\li\72\',SIZE=48000MB), (NAME=tpch3000g_li73,FILENAME='G:\mnt\li\73\',SIZE=48000MB), (NAME=tpch3000g_li74,FILENAME='G:\mnt\li\74\',SIZE=48000MB), (NAME=tpch3000g_li75,FILENAME='G:\mnt\li\75\',SIZE=48000MB), (NAME=tpch3000g_li76,FILENAME='G:\mnt\li\76\',SIZE=48000MB), (NAME=tpch3000g_li77,FILENAME='G:\mnt\li\77\',SIZE=48000MB), (NAME=tpch3000g_li78,FILENAME='G:\mnt\li\78\',SIZE=48000MB), (NAME=tpch3000g_li79,FILENAME='G:\mnt\li\79\',SIZE=48000MB), (NAME=tpch3000g_li80,FILENAME='G:\mnt\li\80\',SIZE=48000MB), (NAME=tpch3000g_li81,FILENAME='G:\mnt\li\81\',SIZE=48000MB), (NAME=tpch3000g_li82,FILENAME='G:\mnt\li\82\',SIZE=48000MB), (NAME=tpch3000g_li83,FILENAME='G:\mnt\li\83\',SIZE=48000MB), (NAME=tpch3000g_li84,FILENAME='G:\mnt\li\84\',SIZE=48000MB), (NAME=tpch3000g_li85,FILENAME='G:\mnt\li\85\',SIZE=48000MB), (NAME=tpch3000g_li86,FILENAME='G:\mnt\li\86\',SIZE=48000MB), (NAME=tpch3000g_li87,FILENAME='G:\mnt\li\87\',SIZE=48000MB), (NAME=tpch3000g_li88,FILENAME='G:\mnt\li\88\',SIZE=48000MB), (NAME=tpch3000g_li89,FILENAME='G:\mnt\li\89\',SIZE=48000MB), (NAME=tpch3000g_li90,FILENAME='G:\mnt\li\90\',SIZE=48000MB), (NAME=tpch3000g_li91,FILENAME='G:\mnt\li\91\',SIZE=48000MB), (NAME=tpch3000g_li92,FILENAME='G:\mnt\li\92\',SIZE=48000MB), (NAME=tpch3000g_li93,FILENAME='G:\mnt\li\93\',SIZE=48000MB), (NAME=tpch3000g_li94,FILENAME='G:\mnt\li\94\',SIZE=48000MB), (NAME=tpch3000g_li95,FILENAME='G:\mnt\li\95\',SIZE=48000MB), (NAME=tpch3000g_li96,FILENAME='G:\mnt\li\96\',SIZE=48000MB),

FILEGROUP GENERAL_FG (NAME=tpch3000g_gen1, FILENAME='G:\mnt\gen\1\',SIZE=28000MB), (NAME=tpch3000g_gen2, FILENAME='G:\mnt\gen\2\',SIZE=28000MB), (NAME=tpch3000g_gen3, FILENAME='G:\mnt\gen\3\',SIZE=28000MB), (NAME=tpch3000g_gen4, FILENAME='G:\mnt\gen\4\',SIZE=28000MB), (NAME=tpch3000g_gen5, FILENAME='G:\mnt\gen\5\',SIZE=28000MB), (NAME=tpch3000g_gen6, FILENAME='G:\mnt\gen\6\',SIZE=28000MB), (NAME=tpch3000g_gen7, FILENAME='G:\mnt\gen\7\',SIZE=28000MB), (NAME=tpch3000g_gen8, FILENAME='G:\mnt\gen\8\',SIZE=28000MB), HP TPC-H FULL DISCLOSURE REPORT 138 © 2005 Hewlett-Packard Company. All rights reserved. (NAME=tpch3000g_gen9, FILENAME='G:\mnt\gen\9\',SIZE=28000MB), (NAME=tpch3000g_gen10,FILENAME='G:\mnt\gen\10\',SIZE=28000MB), (NAME=tpch3000g_gen11,FILENAME='G:\mnt\gen\11\',SIZE=28000MB), (NAME=tpch3000g_gen12,FILENAME='G:\mnt\gen\12\',SIZE=28000MB), (NAME=tpch3000g_gen13,FILENAME='G:\mnt\gen\13\',SIZE=28000MB), (NAME=tpch3000g_gen14,FILENAME='G:\mnt\gen\14\',SIZE=28000MB), (NAME=tpch3000g_gen15,FILENAME='G:\mnt\gen\15\',SIZE=28000MB), (NAME=tpch3000g_gen16,FILENAME='G:\mnt\gen\16\',SIZE=28000MB), (NAME=tpch3000g_gen17,FILENAME='G:\mnt\gen\17\',SIZE=28000MB), (NAME=tpch3000g_gen18,FILENAME='G:\mnt\gen\18\',SIZE=28000MB), (NAME=tpch3000g_gen19,FILENAME='G:\mnt\gen\19\',SIZE=28000MB), (NAME=tpch3000g_gen20,FILENAME='G:\mnt\gen\20\',SIZE=28000MB), (NAME=tpch3000g_gen21,FILENAME='G:\mnt\gen\21\',SIZE=28000MB), (NAME=tpch3000g_gen22,FILENAME='G:\mnt\gen\22\',SIZE=28000MB), (NAME=tpch3000g_gen23,FILENAME='G:\mnt\gen\23\',SIZE=28000MB), (NAME=tpch3000g_gen24,FILENAME='G:\mnt\gen\24\',SIZE=28000MB), (NAME=tpch3000g_gen25,FILENAME='G:\mnt\gen\25\',SIZE=28000MB), (NAME=tpch3000g_gen26,FILENAME='G:\mnt\gen\26\',SIZE=28000MB), (NAME=tpch3000g_gen27,FILENAME='G:\mnt\gen\27\',SIZE=28000MB), (NAME=tpch3000g_gen28,FILENAME='G:\mnt\gen\28\',SIZE=28000MB), (NAME=tpch3000g_gen29,FILENAME='G:\mnt\gen\29\',SIZE=28000MB), (NAME=tpch3000g_gen30,FILENAME='G:\mnt\gen\30\',SIZE=28000MB), (NAME=tpch3000g_gen31,FILENAME='G:\mnt\gen\31\',SIZE=28000MB), (NAME=tpch3000g_gen32,FILENAME='G:\mnt\gen\32\',SIZE=28000MB), (NAME=tpch3000g_gen33,FILENAME='G:\mnt\gen\33\',SIZE=28000MB), (NAME=tpch3000g_gen34,FILENAME='G:\mnt\gen\34\',SIZE=28000MB), (NAME=tpch3000g_gen35,FILENAME='G:\mnt\gen\35\',SIZE=28000MB), (NAME=tpch3000g_gen36,FILENAME='G:\mnt\gen\36\',SIZE=28000MB), (NAME=tpch3000g_gen37,FILENAME='G:\mnt\gen\37\',SIZE=28000MB), (NAME=tpch3000g_gen38,FILENAME='G:\mnt\gen\38\',SIZE=28000MB), (NAME=tpch3000g_gen39,FILENAME='G:\mnt\gen\39\',SIZE=28000MB), (NAME=tpch3000g_gen40,FILENAME='G:\mnt\gen\40\',SIZE=28000MB), (NAME=tpch3000g_gen41,FILENAME='G:\mnt\gen\41\',SIZE=28000MB), (NAME=tpch3000g_gen42,FILENAME='G:\mnt\gen\42\',SIZE=28000MB), (NAME=tpch3000g_gen43,FILENAME='G:\mnt\gen\43\',SIZE=28000MB), (NAME=tpch3000g_gen44,FILENAME='G:\mnt\gen\44\',SIZE=28000MB), (NAME=tpch3000g_gen45,FILENAME='G:\mnt\gen\45\',SIZE=28000MB), (NAME=tpch3000g_gen46,FILENAME='G:\mnt\gen\46\',SIZE=28000MB), (NAME=tpch3000g_gen47,FILENAME='G:\mnt\gen\47\',SIZE=28000MB), (NAME=tpch3000g_gen48,FILENAME='G:\mnt\gen\48\',SIZE=28000MB), (NAME=tpch3000g_gen49,FILENAME='G:\mnt\gen\49\',SIZE=28000MB), (NAME=tpch3000g_gen50,FILENAME='G:\mnt\gen\50\',SIZE=28000MB), (NAME=tpch3000g_gen51,FILENAME='G:\mnt\gen\51\',SIZE=28000MB), (NAME=tpch3000g_gen52,FILENAME='G:\mnt\gen\52\',SIZE=28000MB), (NAME=tpch3000g_gen53,FILENAME='G:\mnt\gen\53\',SIZE=28000MB), (NAME=tpch3000g_gen54,FILENAME='G:\mnt\gen\54\',SIZE=28000MB), (NAME=tpch3000g_gen55,FILENAME='G:\mnt\gen\55\',SIZE=28000MB), (NAME=tpch3000g_gen56,FILENAME='G:\mnt\gen\56\',SIZE=28000MB), (NAME=tpch3000g_gen57,FILENAME='G:\mnt\gen\57\',SIZE=28000MB), (NAME=tpch3000g_gen58,FILENAME='G:\mnt\gen\58\',SIZE=28000MB), (NAME=tpch3000g_gen59,FILENAME='G:\mnt\gen\59\',SIZE=28000MB), (NAME=tpch3000g_gen60,FILENAME='G:\mnt\gen\60\',SIZE=28000MB), (NAME=tpch3000g_gen61,FILENAME='G:\mnt\gen\61\',SIZE=28000MB), (NAME=tpch3000g_gen62,FILENAME='G:\mnt\gen\62\',SIZE=28000MB), (NAME=tpch3000g_gen63,FILENAME='G:\mnt\gen\63\',SIZE=28000MB), (NAME=tpch3000g_gen64,FILENAME='G:\mnt\gen\64\',SIZE=28000MB), (NAME=tpch3000g_gen65,FILENAME='G:\mnt\gen\65\',SIZE=28000MB), (NAME=tpch3000g_gen66,FILENAME='G:\mnt\gen\66\',SIZE=28000MB), (NAME=tpch3000g_gen67,FILENAME='G:\mnt\gen\67\',SIZE=28000MB), (NAME=tpch3000g_gen68,FILENAME='G:\mnt\gen\68\',SIZE=28000MB), (NAME=tpch3000g_gen69,FILENAME='G:\mnt\gen\69\',SIZE=28000MB), (NAME=tpch3000g_gen70,FILENAME='G:\mnt\gen\70\',SIZE=28000MB), (NAME=tpch3000g_gen71,FILENAME='G:\mnt\gen\71\',SIZE=28000MB), (NAME=tpch3000g_gen72,FILENAME='G:\mnt\gen\72\',SIZE=28000MB), (NAME=tpch3000g_gen73,FILENAME='G:\mnt\gen\73\',SIZE=28000MB), (NAME=tpch3000g_gen74,FILENAME='G:\mnt\gen\74\',SIZE=28000MB), (NAME=tpch3000g_gen75,FILENAME='G:\mnt\gen\75\',SIZE=28000MB), (NAME=tpch3000g_gen76,FILENAME='G:\mnt\gen\76\',SIZE=28000MB), (NAME=tpch3000g_gen77,FILENAME='G:\mnt\gen\77\',SIZE=28000MB), (NAME=tpch3000g_gen78,FILENAME='G:\mnt\gen\78\',SIZE=28000MB), (NAME=tpch3000g_gen79,FILENAME='G:\mnt\gen\79\',SIZE=28000MB), (NAME=tpch3000g_gen80,FILENAME='G:\mnt\gen\80\',SIZE=28000MB), (NAME=tpch3000g_gen81,FILENAME='G:\mnt\gen\81\',SIZE=28000MB), (NAME=tpch3000g_gen82,FILENAME='G:\mnt\gen\82\',SIZE=28000MB), (NAME=tpch3000g_gen83,FILENAME='G:\mnt\gen\83\',SIZE=28000MB), HP TPC-H FULL DISCLOSURE REPORT 139 © 2005 Hewlett-Packard Company. All rights reserved. (NAME=tpch3000g_gen84,FILENAME='G:\mnt\gen\84\',SIZE=28000MB), (NAME=tpch3000g_gen85,FILENAME='G:\mnt\gen\85\',SIZE=28000MB), (NAME=tpch3000g_gen86,FILENAME='G:\mnt\gen\86\',SIZE=28000MB), (NAME=tpch3000g_gen87,FILENAME='G:\mnt\gen\87\',SIZE=28000MB), (NAME=tpch3000g_gen88,FILENAME='G:\mnt\gen\88\',SIZE=28000MB), (NAME=tpch3000g_gen89,FILENAME='G:\mnt\gen\89\',SIZE=28000MB), (NAME=tpch3000g_gen90,FILENAME='G:\mnt\gen\90\',SIZE=28000MB), (NAME=tpch3000g_gen91,FILENAME='G:\mnt\gen\91\',SIZE=28000MB), (NAME=tpch3000g_gen92,FILENAME='G:\mnt\gen\92\',SIZE=28000MB), (NAME=tpch3000g_gen93,FILENAME='G:\mnt\gen\93\',SIZE=28000MB), (NAME=tpch3000g_gen94,FILENAME='G:\mnt\gen\94\',SIZE=28000MB), (NAME=tpch3000g_gen95,FILENAME='G:\mnt\gen\95\',SIZE=28000MB), (NAME=tpch3000g_gen96,FILENAME='G:\mnt\gen\96\',SIZE=28000MB)

LOG ON (NAME=tpch3000g_log1,FILENAME="L:\\",SIZE=340000MB,FILEGROWTH = 0)

Create Base Tables create table LINEITEM create table ORDERS (L_ORDERKEY bigint not null, (O_ORDERKEY bigint not null, L_PARTKEY int not null, O_CUSTKEY int not null, L_SUPPKEY int not null, O_ORDERSTATUS char(1) not null, L_LINENUMBER int not null, O_TOTALPRICE float not null, L_QUANTITY float not null, O_ORDERDATE datetime not null, L_EXTENDEDPRICE float not null, O_ORDERPRIORITY char(15) not null, L_DISCOUNT float not null, O_CLERK char(15) not null, L_TAX float not null, O_SHIPPRIORITY int not null, L_RETURNFLAG char(1) not null, O_COMMENT varchar(79) not null) L_LINESTATUS char(1) not null, on STAGING_FG L_SHIPDATE datetime not null, L_COMMITDATE datetime not null, create table SUPPLIER L_RECEIPTDATE datetime not null, (S_SUPPKEY int not null, L_SHIPINSTRUCT char(25) not null, S_NAME char(25) not null, L_SHIPMODE char(10) not null, S_ADDRESS varchar(40) not null, L_COMMENT varchar(44) not null) S_NATIONKEY int not null, on STAGING_FG S_PHONE char(15) not null, S_ACCTBAL float not null, create table PARTSUPP S_COMMENT varchar(101) not null) (PS_PARTKEY int not null, on STAGING_FG PS_SUPPKEY int not null, PS_AVAILQTY int not null, create table CUSTOMER PS_SUPPLYCOSTfloat not null, (C_CUSTKEY int not null, PS_COMMENT varchar(199) not null) C_NAME varchar(25) not null, on STAGING_FG C_ADDRESS varchar(40) not null, C_NATIONKEY int not null, create table PART C_PHONE char(15) not null, (P_PARTKEY int not null, C_ACCTBAL float not null, P_NAME varchar(55) not null, C_MKTSEGMENT char(10) not null, P_MFGR char(25) not null, C_COMMENT varchar(117) not null) P_BRAND char(10) not null, on STAGING_FG P_TYPE varchar(25) not null, P_SIZE int not null, create table NATION P_CONTAINER char(10) not null, (N_NATIONKEY int not null, P_RETAILPRICE float not null, N_NAME char(25) not null, P_COMMENT varchar(23) not null) N_REGIONKEY int not null, on STAGING_FG N_COMMENT varchar(152) not null) on STAGING_FG

create table REGION (R_REGIONKEY int not null, R_NAME char(25) not null, R_COMMENT varchar(152) not null) on STAGING_FG

HP TPC-H FULL DISCLOSURE REPORT 140 © 2005 Hewlett-Packard Company. All rights reserved. Create Indexes create index L_SUPPKEY_IDX create index S_NATIONKEY_IDX on LINEITEM(L_SUPPKEY) on SUPPLIER(S_NATIONKEY) with fillfactor = 95,SORT_IN_TEMPDB with fillfactor=100, SORT_IN_TEMPDB on LINEITEM_FG on GENERAL_FG create index PS_SUPPKEY_IDX create index L_ORDERKEY_IDX on PARTSUPP(PS_SUPPKEY) on LINEITEM(L_ORDERKEY) with fillfactor=100, SORT_IN_TEMPDB with FILLFACTOR=95,SORT_IN_TEMPDB on GENERAL_FG on LINEITEM_FG create index N_REGIONKEY_IDX create index L_PARTKEY_SUPPKEY_IDX on NATION(N_REGIONKEY) on LINEITEM(L_PARTKEY) with fillfactor=100, SORT_IN_TEMPDB with FILLFACTOR=95,SORT_IN_TEMPDB on GENERAL_FG on LINEITEM_FG

Foreign Keys alter table SUPPLIER add constraint FK_S_NATIONKEY foreign key (S_NATIONKEY) references NATION(N_NATIONKEY) alter table PARTSUPP add constraint FK_PS_PARTKEY foreign key (PS_PARTKEY) references PART(P_PARTKEY) alter table PARTSUPP add constraint FK_PS_SUPPKEY foreign key (PS_SUPPKEY) references SUPPLIER(S_SUPPKEY) alter table CUSTOMER add constraint FK_C_NATIONKEY foreign key (C_NATIONKEY) references NATION (N_NATIONKEY) alter table ORDERS add constraint FK_O_CUSTKEY foreign key (O_CUSTKEY) references CUSTOMER (C_CUSTKEY) alter table LINEITEM add constraint FK_L_ORDERKEY foreign key (L_ORDERKEY) references ORDERS (O_ORDERKEY) alter table LINEITEM add constraint FK_L_PARTKEY foreign key (L_PARTKEY) references PART (P_PARTKEY) alter table LINEITEM add constraint FK_L_SUPPKEY foreign key (L_SUPPKEY) references SUPPLIER (S_SUPPKEY) alter table LINEITEM add constraint FK_L_PARTKEY_SUPPKEY foreign key (L_PARTKEY,L_SUPPKEY) references PARTSUPP(PS_PARTKEY, PS_SUPPKEY) alter table NATION add constraint FK_N_REGIONKEY foreign key (N_REGIONKEY) references REGION (R_REGIONKEY)

Primary Keys

ALTER table NATION ADD constraint PK_N_NATIONKEY primary key (N_NATIONKEY) ON GENERAL_FG ALTER table REGION ADD constraint PK_R_REGIONKEY primary key (R_REGIONKEY) ON GENERAL_FG ALTER table SUPPLIER ADD constraint PK_S_SUPPKEY primary key (S_SUPPKEY) ON GENERAL_FG ALTER table CUSTOMER ADD constraint PK_C_CUSTKEY primary key (C_CUSTKEY) ON GENERAL_FG ALTER table ORDERS ADD constraint PK_O_ORDERKEY primary key (O_ORDERKEY) WITH (FILLFACTOR = 95) ON GENERAL_FG ALTER table PARTSUPP ADD constraint PK_PS_PARTKEY_PS_SUPPKEY primary key (PS_PARTKEY, PS_SUPPKEY) ON GENERAL_FG ALTER table PART ADD constraint PK_P_PARTKEY primary key (P_PARTKEY) ON GENERAL_FG

Backup backup database tpch3000g to DISK = 'G:\mnt\ntfs\13\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\14\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\1\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\15\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\2\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\16\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\3\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\17\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\4\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\18\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\5\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\19\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\6\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\20\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\7\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\21\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\8\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\22\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\9\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\23\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\10\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\24\backup\tpch3000g.bak' DISK = 'G:\mnt\ntfs\11\backup\tpch3000g.bak', DISK = 'G:\mnt\ntfs\12\backup\tpch3000g.bak', with init, maxtransfersize=1048576, BUFFERCOUNT=100, stats = 1

HP TPC-H FULL DISCLOSURE REPORT 141 © 2005 Hewlett-Packard Company. All rights reserved. Appendix C: Query Text and Output Using Standard Substitutions

/* TPC_H Query 1 - Pricing Summary Report */ SELECT L_RETURNFLAG, L_LINESTATUS, SUM(L_QUANTITY) AS SUM_QTY, SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS SUM_DISC_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)*(1+L_TAX)) AS SUM_CHARGE, AVG(L_QUANTITY) AS AVG_QTY, AVG(L_EXTENDEDPRICE) AS AVG_PRICE, AVG(L_DISCOUNT) AS AVG_DISC, COUNT(*) AS COUNT_ORDER FROM LINEITEM WHERE L_SHIPDATE <= dateadd(dd, -90, '1998-12-01') GROUP BY L_RETURNFLAG, L_LINESTATUS ORDER BY L_RETURNFLAG, L_LINESTATUS

L_RETURNFLAG L_LINESTATUS SUM_QTY SUM_BASE_PRICE SUM_DISC_PRICE SUM_CHARGE AVG_QTY AVG_PRICE AVG_DISC COUNT_ORDER ------A F 37734107.000000 56586554400.729996 53758257134.870041 55909065222.827736 25.522006 38273.129735 0.049985 1478493 N F 991417.000000 1487504710.380001 1413082168.054097 1469649223.194378 25.516472 38284.467761 0.050093 38854 N O 74476040.000000 111701729697.739810 106118230307.605550 110367043872.496840 25.502227 38249.117989 0.049997 2920374 R F 37719753.000000 56568041380.900070 53741292684.603920 55889619119.832001 25.505794 38250.854626 0.050009 1478870

(4 row(s) affected)

/* TPC_H Query 2 - Minimum Cost Supplier */ SELECT TOP 100 S_ACCTBAL, S_NAME, N_NAME, P_PARTKEY, P_MFGR, S_ADDRESS, S_PHONE, S_COMMENT FROM PART, SUPPLIER, PARTSUPP,NATION, REGION WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY AND P_SIZE = 15 AND P_TYPE LIKE '%%BRASS' AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND R_NAME = 'EUROPE' AND PS_SUPPLYCOST = (SELECT MIN(PS_SUPPLYCOST) FROM PARTSUPP, SUPPLIER, NATION, REGION WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY AND S_NATIONKEY= N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND R_NAME = 'EUROPE') ORDER BY S_ACCTBAL DESC, N_NAME, S_NAME, P_PARTKEY

S_ACCTBAL S_NAME N_NAME P_PARTKEY P_MFGR S_ADDRESS S_PHONE S_COMMENT ------9938.530000 Supplier#000005359 UNITED KINGDOM 185358 Manufacturer#4 QKuHYh,vZGi wu2FWEJoLDx04 33-429-790-6131 blithely silent pinto beans are furiously. slyly final deposits acros 9937.840000 Supplier#000005969 ROMANIA 108438 Manufacturer#1 ANDENSOSmk,miq23Xfb5RWt6dvUcvt6Qa 29-520-692-3537 carefully slow deposits use furiously. slyly ironic platelets above the ironic 9936.220000 Supplier#000005250 UNITED KINGDOM 249 Manufacturer#4 B3rqp0xbSEim4Mpy2RH J 33-320-228-2957 blithely special packages are. stealthily express deposits across the closely final instructi 9923.770000 Supplier#000002324 GERMANY 29821 Manufacturer#4 y3OD9UywSTOk 17-779-299-1839 quickly express packages breach quiet pinto beans. requ 9871.220000 Supplier#000006373 GERMANY 43868 Manufacturer#5 J8fcXWsTqM 17-813-485-8637 never silent deposits integrate furiously blit 9870.780000 Supplier#000001286 GERMANY 81285 Manufacturer#2 YKA,E2fjiVd7eUrzp2Ef8j1QxGo2DFnosaTEH 17-516-924-4574 final theodolites cajole slyly special, 9870.780000 Supplier#000001286 GERMANY 181285 Manufacturer#4 YKA,E2fjiVd7eUrzp2Ef8j1QxGo2DFnosaTEH 17-516-924-4574 final theodolites cajole slyly special, 9852.520000 Supplier#000008973 RUSSIA 18972 Manufacturer#2 t5L67YdBYYH6o,Vz24jpDyQ9 32-188-594-7038 quickly regular instructions wake-- carefully unusual braids into the expres 9847.830000 Supplier#000008097 RUSSIA 130557 Manufacturer#2 xMe97bpE69NzdwLoX 32-375-640-3593 slyly regular dependencies sleep slyly furiously express dep 9847.570000 Supplier#000006345 FRANCE 86344 Manufacturer#1 VSt3rzk3qG698u6ld8HhOByvrTcSTSvQlDQDag 16-886-766-7945 silent pinto beans should have to snooze carefully along the final reques . . 7843.520000 Supplier#000006683 FRANCE 11680 Manufacturer#4 2Z0JGkiv01Y00oCFwUGfviIbhzCdy 16-464-517-8943 carefully bold accounts doub (100 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 142 © 2005 Hewlett-Packard Company. All rights reserved. /* TPC_H Query 3 - Shipping Priority */ SELECT TOP 10 L_ORDERKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT))AS REVENUE, O_ORDERDATE, O_SHIPPRIORITY FROM CUSTOMER, ORDERS, LINEITEM WHERE C_MKTSEGMENT = 'BUILDING' AND C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND O_ORDERDATE < '1995-03-15' AND L_SHIPDATE > '1995-03-15' GROUP BY L_ORDERKEY, O_ORDERDATE, O_SHIPPRIORITY ORDER BY REVENUE DESC, O_ORDERDATE

L_ORDERKEY REVENUE O_ORDERDATE O_SHIPPRIORITY ------2456423 406181.011100 1995-03-05 00:00:00.000 0 3459808 405838.698900 1995-03-04 00:00:00.000 0 492164 390324.061000 1995-02-19 00:00:00.000 0 1188320 384537.935900 1995-03-09 00:00:00.000 0 2435712 378673.055800 1995-02-26 00:00:00.000 0 4878020 378376.795200 1995-03-12 00:00:00.000 0 5521732 375153.921500 1995-03-13 00:00:00.000 0 2628192 373133.309400 1995-02-22 00:00:00.000 0 993600 371407.459500 1995-03-05 00:00:00.000 0 2300070 367371.145200 1995-03-13 00:00:00.000 0

(10 row(s) affected)

/* TPC_H Query 4 - Order Priority Checking */ SELECT O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT FROM ORDERS WHERE O_ORDERDATE >= '1993-07-01' AND O_ORDERDATE < dateadd (mm, 3, '1993-07-01') AND EXISTS (SELECT * FROM LINEITEM WHERE L_ORDERKEY = O_ORDERKEY AND L_COMMITDATE < L_RECEIPTDATE) GROUP BY O_ORDERPRIORITY ORDER BY O_ORDERPRIORITY

O_ORDERPRIORITY ORDER_COUNT ------1-URGENT 10594 2-HIGH 10476 3-MEDIUM 10410 4-NOT SPECIFIED 10556 5-LOW 10487

(5 row(s) affected)

/* TPC_H Query 5 - Local Supplier Volume */ SELECT N_NAME, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE FROM CUSTOMER, ORDERS, LINEITEM, SUPPLIER, NATION, REGION WHERE C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND L_SUPPKEY = S_SUPPKEY AND C_NATIONKEY = S_NATIONKEY AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND R_NAME = 'ASIA' AND O_ORDERDATE >= '1994-01-01' AND O_ORDERDATE < DATEADD(YY, 1, '1994-01-01') GROUP BY N_NAME ORDER BY REVENUE DESC

N_NAME REVENUE ------INDONESIA 55502041.169700 VIETNAM 55295086.996700 CHINA 53724494.256600 INDIA 52035512.000200 JAPAN 45410175.695400

(5 row(s) affected)

/* TPC_H Query 6 - Forecasting Revenue Change */ SELECT SUM(L_EXTENDEDPRICE*L_DISCOUNT) AS REVENUE FROM LINEITEM WHERE L_SHIPDATE >= '1994-01-01' AND L_SHIPDATE < dateadd (yy, 1, '1994-01-01') AND L_DISCOUNT BETWEEN .06 - 0.01 AND .06 + 0.01 AND L_QUANTITY < 24

REVENUE ------123141078.228300

(1 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 143 © 2005 Hewlett-Packard Company. All rights reserved. /* TPC_H Query 7 - Volume Shipping */ SELECT SUPP_NATION, CUST_NATION, L_YEAR, SUM(VOLUME) AS REVENUE FROM ( SELECT N1.N_NAME AS SUPP_NATION, N2.N_NAME AS CUST_NATION, datepart(yy, L_SHIPDATE) AS L_YEAR, L_EXTENDEDPRICE*(1-L_DISCOUNT) AS VOLUME FROM SUPPLIER, LINEITEM, ORDERS, CUSTOMER, NATION N1, NATION N2 WHERE S_SUPPKEY = L_SUPPKEY AND O_ORDERKEY = L_ORDERKEY AND C_CUSTKEY = O_CUSTKEY AND S_NATIONKEY = N1.N_NATIONKEY AND C_NATIONKEY = N2.N_NATIONKEY AND ((N1.N_NAME = 'FRANCE' AND N2.N_NAME = 'GERMANY') OR (N1.N_NAME = 'GERMANY' AND N2.N_NAME = 'FRANCE')) AND L_SHIPDATE BETWEEN '1995-01-01' AND '1996-12-31' ) AS SHIPPING GROUP BY SUPP_NATION, CUST_NATION, L_YEAR ORDER BY SUPP_NATION, CUST_NATION, L_YEAR

SUPP_NATION CUST_NATION L_YEAR REVENUE ------FRANCE GERMANY 1995 54639732.733600 FRANCE GERMANY 1996 54633083.307600 GERMANY FRANCE 1995 52531746.669700 GERMANY FRANCE 1996 52520549.022400

(4 row(s) affected)

/* TPC_H Query 8 - National Market Share */ SELECT O_YEAR, SUM(CASE WHEN NATION = 'BRAZIL' THEN VOLUME ELSE 0 END) / SUM(VOLUME) AS MKT_SHARE FROM (SELECT datepart(yy, O_ORDERDATE) AS O_YEAR, L_EXTENDEDPRICE * (1-L_DISCOUNT) AS VOLUME, N2.N_NAME AS NATION FROM PART, SUPPLIER, LINEITEM, ORDERS, CUSTOMER, NATION N1, NATION N2, REGION WHERE P_PARTKEY = L_PARTKEY AND S_SUPPKEY = L_SUPPKEY AND L_ORDERKEY = O_ORDERKEY AND O_CUSTKEY = C_CUSTKEY AND C_NATIONKEY = N1.N_NATIONKEY AND N1.N_REGIONKEY = R_REGIONKEY AND R_NAME = 'AMERICA' AND S_NATIONKEY = N2.N_NATIONKEY AND O_ORDERDATE BETWEEN '1995-01-01' AND '1996-12-31' AND P_TYPE= 'ECONOMY ANODIZED STEEL') AS ALL_NATIONS GROUP BY O_YEAR ORDER BY O_YEAR

O_YEAR MKT_SHARE ------1995 0.034436 1996 0.041486

(2 row(s) affected)

/* TPC_H Query 9 - Product Type Profit Measure */ SELECT NATION, O_YEAR, SUM(AMOUNT) AS SUM_PROFIT FROM (SELECT N_NAME AS NATION, datepart(yy, O_ORDERDATE) AS O_YEAR, L_EXTENDEDPRICE*(1-L_DISCOUNT)-PS_SUPPLYCOST*L_QUANTITY AS AMOUNT FROM PART, SUPPLIER, LINEITEM, PARTSUPP, ORDERS, NATION WHERE S_SUPPKEY = L_SUPPKEY AND PS_SUPPKEY= L_SUPPKEY AND PS_PARTKEY = L_PARTKEY AND P_PARTKEY= L_PARTKEY AND O_ORDERKEY = L_ORDERKEY AND S_NATIONKEY = N_NATIONKEY AND P_NAME LIKE '%%green%%') AS PROFIT GROUP BY NATION, O_YEAR ORDER BY NATION, O_YEAR DESC

NATION O_YEAR SUM_PROFIT ------ALGERIA 1998 31342867.234500 ALGERIA 1997 57138193.023300 ALGERIA 1996 56140140.133000 ALGERIA 1995 53051469.653400 ALGERIA 1994 53867582.128600 ALGERIA 1993 54942718.132400 ALGERIA 1992 54628034.712700 ARGENTINA 1998 30211185.708100 . . VIETNAM 1992 49613838.315100

(175 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 144 © 2005 Hewlett-Packard Company. All rights reserved. /* TPC_H Query 10 - Returned Item Reporting */ SELECT TOP 20 C_CUSTKEY, C_NAME, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE, C_ACCTBAL, N_NAME, C_ADDRESS, C_PHONE, C_COMMENT FROM CUSTOMER, ORDERS, LINEITEM, NATION WHERE C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND O_ORDERDATE>= '1993-10-01 AND O_ORDERDATE < dateadd(mm, 3, '1993-10-01') AND L_RETURNFLAG = 'R' AND C_NATIONKEY= N_NATIONKEY GROUP BY C_CUSTKEY, C_NAME, C_ACCTBAL, C_PHONE, N_NAME, C_ADDRESS, C_COMMENT ORDER BY REVENUE DESC

C_CUSTKEY C_NAME REVENUE C_ACCTBAL N_NAME C_ADDRESS C_PHONE C_COMMENT ------57040 Customer#000057040 734235.245500 632.870000 JAPAN Eioyzjf4pp 22-895-641-3466 requests sleep blithely about the furiously i 143347 Customer#000143347 721002.694800 2557.470000 EGYPT 1aReFYv,Kw4 14-742-935-3718 fluffily bold excuses haggle finally after the u 60838 Customer#000060838 679127.307700 2454.770000 BRAZIL 64EaJ5vMAHWJlBOxJklpNc2RJiWE 12-913-494-9813 furiously even pinto beans integrate under the ruthless foxes; ironic, even dolphins across the slyl 101998 Customer#000101998 637029.566700 3790.890000 UNITED KINGDOM 01c9CILnNtfOQYmZj 33-593-865-6378 accounts doze blithely! enticing, final deposits sleep blithely special accounts. slyly express accounts pla . . 23431 Customer#000023431 554269.536000 3381.860000 ROMANIA HgiV0phqhaIa9aydNoIlb 29-915-458-2654 instructions nag quickly. furiously bold accounts cajol

(20 row(s) affected)

/* TPC_H Query 11 - Important Stock Indentification */ SELECT PS_PARTKEY, SUM(PS_SUPPLYCOST*PS_AVAILQTY) AS VALUE FROM PARTSUPP, SUPPLIER, NATION WHERE PS_SUPPKEY = S_SUPPKEY AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'GERMANY' GROUP BY PS_PARTKEY HAVING SUM(PS_SUPPLYCOST*PS_AVAILQTY) > (SELECT SUM(PS_SUPPLYCOST*PS_AVAILQTY) * 0.0001000000 FROM PARTSUPP, SUPPLIER, NATION WHERE PS_SUPPKEY = S_SUPPKEY AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'GERMANY') ORDER BY VALUE DESC

PS_PARTKEY VALUE ------129760 17538456.860000 166726 16503353.920000 191287 16474801.970000 161758 16101755.540000 . . 72073 7877736.110000 5182 7874521.730000

(1048 row(s) affected)

/* TPC_H Query 12 - Shipping Modes and Order Priority */ SELECT L_SHIPMODE, SUM(CASE WHEN O_ORDERPRIORITY = '1-URGENT' OR O_ORDERPRIORITY = '2-HIGH' THEN 1 ELSE 0 END) AS HIGH_LINE_COUNT, SUM(CASE WHEN O_ORDERPRIORITY <> '1-URGENT' AND O_ORDERPRIORITY <> '2-HIGH' THEN 1 ELSE 0 END) AS LOW_LINE_COUNT FROM ORDERS, LINEITEM WHERE O_ORDERKEY = L_ORDERKEY AND L_SHIPMODE IN ('MAIL','SHIP') AND L_COMMITDATE < L_RECEIPTDATE AND L_SHIPDATE < L_COMMITDATE AND L_RECEIPTDATE >= '1994-01-01' AND L_RECEIPTDATE < dateadd(yy, 1, '1994-01-01') GROUP BY L_SHIPMODE ORDER BY L_SHIPMODE

L_SHIPMODE HIGH_LINE_COUNT LOW_LINE_COUNT ------MAIL 6202 9324 SHIP 6200 9262

(2 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 145 © 2005 Hewlett-Packard Company. All rights reserved. /* TPC_H Query 13 - Customer Distribution */ SELECT C_COUNT, COUNT(*) AS CUSTDIST FROM (SELECT C_CUSTKEY, COUNT(O_ORDERKEY) FROM CUSTOMER left outer join ORDERS on C_CUSTKEY = O_CUSTKEY AND O_COMMENT not like '%%special%%requests%%' GROUP BY C_CUSTKEY) AS C_ORDERS (C_CUSTKEY, C_COUNT) GROUP BY C_COUNT ORDER BY CUSTDIST DESC, C_COUNT DESC

C_COUNT CUSTDIST ------0 50004 9 6641 10 6566 11 6058 8 5949 12 5553 13 4989 19 4748 7 4707 18 4625 . . 39 2 41 1

(42 row(s) affected)

/* TPC_H Query 14 - Promotion Effect */ SELECT 100.00 * SUM (CASE WHEN P_TYPE LIKE 'PROMO%% THEN L_EXTENDEDPRICE*(1-L_DISCOUNT) ELSE 0 END) / SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS PROMO_REVENUE FROM LINEITEM, PART WHERE L_PARTKEY = P_PARTKEY AND L_SHIPDATE >= '1995-09-01' AND L_SHIPDATE < dateadd(mm, 1, '1995-09-01')

PROMO_REVENUE ------16.380779

(1 row(s) affected)

/* TPC_H Query 15 - Create View for Top Supplier Query */ CREATE VIEW REVENUE0 (SUPPLIER_NO, TOTAL_REVENUE) AS SELECT L_SUPPKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) FROM LINEITEM WHERE L_SHIPDATE >= '1996-01-01' AND L_SHIPDATE < dateadd(mm, 3, '1996-01-01') GROUP BY L_SUPPKEY GO

/* TPC_H Query 15 - Top Supplier */

SELECT S_SUPPKEY, S_NAME, S_ADDRESS, S_PHONE, TOTAL_REVENUE FROM SUPPLIER, REVENUE0 WHERE S_SUPPKEY = SUPPLIER_NO AND TOTAL_REVENUE = ( SELECT MAX(TOTAL_REVENUE) FROM REVENUE0) ORDER BY S_SUPPKEY

DROP VIEW REVENUE0

S_SUPPKEY S_NAME S_ADDRESS S_PHONE TOTAL_REVENUE ------8449 Supplier#000008449 Wp34zim9qYFbVctdW 20-469-856-8873 1772627.208700

(1 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 146 © 2005 Hewlett-Packard Company. All rights reserved. /* TPC_H Query 16 - Parts/Supplier Relationship */ SELECT P_BRAND, P_TYPE, P_SIZE, COUNT(DISTINCT PS_SUPPKEY) AS SUPPLIER_CNT FROM PARTSUPP, PART WHERE P_PARTKEY = PS_PARTKEY AND P_BRAND <> 'Brand#45' AND P_TYPE NOT LIKE 'MEDIUM POLISHED%%' AND P_SIZE IN (49, 14, 23, 45, 19, 3, 36, 9) AND PS_SUPPKEY NOT IN (SELECT S_SUPPKEY FROM SUPPLIER WHERE S_COMMENT LIKE '%%Customer%%Complaints%%') GROUP BY P_BRAND, P_TYPE, P_SIZE ORDER BY SUPPLIER_CNT DESC, P_BRAND, P_TYPE, P_SIZE

P_BRAND P_TYPE P_SIZE SUPPLIER_CNT ------Brand#41 MEDIUM BRUSHED TIN 3 28 Brand#54 STANDARD BRUSHED COPPER 14 27 Brand#11 STANDARD BRUSHED TIN 23 24 Brand#11 STANDARD BURNISHED BRASS 36 24 Brand#15 MEDIUM ANODIZED NICKEL 3 24

. Brand#55 STANDARD PLATED TIN 49 3

(18314 row(s) affected)

/* TPC_H Query 17 - Small-Quantity-Order Revenue */ SELECT SUM(L_EXTENDEDPRICE)/7.0 AS AVG_YEARLY FROM LINEITEM, PART WHERE P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#23' AND P_CONTAINER = 'MED BOX' AND L_QUANTITY<(SELECT 0.2 * AVG(L_QUANTITY) FROM LINEITEM WHERE L_PARTKEY = P_PARTKEY)

AVG_YEARLY ------348406.054286

(1 row(s) affected)

/* TPC_H Query 18 - Large Volume Customer */ SELECT TOP 100 C_NAME, C_CUSTKEY, O_ORDERKEY, O_ORDERDATE, O_TOTALPRICE, SUM(L_QUANTITY) FROM CUSTOMER, ORDERS, LINEITEM WHERE O_ORDERKEY IN (SELECT L_ORDERKEY FROM LINEITEM GROUP BY L_ORDERKEY HAVING SUM(L_QUANTITY) > 300) AND C_CUSTKEY = O_CUSTKEY AND O_ORDERKEY = L_ORDERKEY GROUP BY C_NAME, C_CUSTKEY, O_ORDERKEY, O_ORDERDATE, O_TOTALPRICE ORDER BY O_TOTALPRICE DESC, O_ORDERDATE

C_NAME C_CUSTKEY O_ORDERKEY O_ORDERDATE O_TOTALPRICE ------Customer#000128120 128120 4722021 1994-04-07 00:00:00.000 544089.090000 323.000000 Customer#000144617 144617 3043270 1997-02-12 00:00:00.000 530604.440000 317.000000 Customer#000013940 13940 2232932 1997-04-13 00:00:00.000 522720.610000 304.000000 Customer#000066790 66790 2199712 1996-09-30 00:00:00.000 515531.820000 327.000000 . Customer#000088703 88703 2995076 1994-01-30 00:00:00.000 363812.120000 302.000000

(57 row(s) affected)

/* TPC_H Query 19 - Discounted Revenue */ SELECT SUM(L_EXTENDEDPRICE* (1 - L_DISCOUNT)) AS REVENUE FROM LINEITEM, PART WHERE (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#12' AND P_CONTAINER IN ( 'SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') AND L_QUANTITY >= 1 AND L_QUANTITY <= 1 + 10 AND P_SIZE BETWEEN 1 AND 5 AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON') OR (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#23' AND P_CONTAINER IN ( 'MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') AND L_QUANTITY >= 10 AND L_QUANTITY <= 10 + 10 AND P_SIZE BETWEEN 1 AND 10 AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON') OR (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#34' AND P_CONTAINER IN ( 'LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') AND L_QUANTITY >= 20 AND L_QUANTITY <= 20 + 10 AND P_SIZE BETWEEN 1 AND 15 AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON')

REVENUE ------3083843.057800 (1 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 147 © 2005 Hewlett-Packard Company. All rights reserved. /* TPC_H Query 20 - Potential Part Promotion */ SELECT S_NAME, S_ADDRESS FROM SUPPLIER, NATION WHERE S_SUPPKEY IN ( SELECT PS_SUPPKEY FROM PARTSUPP WHERE PS_PARTKEY in (SELECT P_PARTKEY FROM PART WHERE P_NAME like 'forest%%') AND PS_AVAILQTY (SELECT 0.5 * sum(L_QUANTITY) FROM LINEITEM WHERE L_PARTKEY = PS_PARTKEY AND L_SUPPKEY = PS_SUPPKEY AND L_SHIPDATE >= '1994-01-01' AND L_SHIPDATE < dateadd(yy,1,'1994-01-01')) AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'CANADA' ORDER BY S_NAME

S_NAME S_ADDRESS ------Supplier#000000020 iybAE,RmTymrZVYaFZva2SH,j Supplier#000000091 YV45D7TkfdQanOOZ7q9QxkyGUapU1oOWU6q3 Supplier#000000197 YC2Acon6kjY3zj3Fbxs2k4Vdf7X0cd2F Supplier#000000226 83qOdU2EYRdPQAQhEtn GRZEd Supplier#000000285 Br7e1nnt1yxrw6ImgpJ7YdhFDjuBf Supplier#000000378 FfbhyCxWvcPrO8ltp9 . . Supplier#000009899 7XdpAHrzr1t,UQFZE Supplier#000009974 7wJ,J5DKcxSU4Kp1cQLpbcAvB5AsvKT

(204 row(s) affected)

/* TPC_H Query 21 - Suppliers Who Kept Orders Waiting */ SELECT TOP 100 S_NAME, COUNT(*) AS NUMWAIT FROM SUPPLIER, LINEITEM L1, ORDERS, NATION WHERE S_SUPPKEY = L1.L_SUPPKEY AND O_ORDERKEY = L1.L_ORDERKEY AND O_ORDERSTATUS = 'F' AND L1.L_RECEIPTDATE> L1.L_COMMITDATE AND EXISTS (SELECT * FROM LINEITEM L2 WHERE L2.L_ORDERKEY = L1.L_ORDERKEY AND L2.L_SUPPKEY <> L1.L_SUPPKEY) AND NOT EXISTS (SELECT * FROM LINEITEM L3 WHERE L3.L_ORDERKEY = L1.L_ORDERKEY AND L3.L_SUPPKEY <> L1.L_SUPPKEY AND L3.L_RECEIPTDATE > L3.L_COMMITDATE) AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'SAUDI ARABIA' GROUP BY S_NAME ORDER BY NUMWAIT DESC, S_NAME

S_NAME NUMWAIT ------Supplier#000002829 20 Supplier#000005808 18 Supplier#000000262 17 Supplier#000000496 17 Supplier#000002160 17 . Supplier#000002357 12 Supplier#000002483 12

(100 row(s) affected)

/* TPC_H Query 22 - Global Sales Opportunity */ SELECT CNTRYCODE, COUNT(*) AS NUMCUST, SUM(C_ACCTBAL) AS TOTACCTBAL FROM (SELECT SUBSTRING(C_PHONE,1,2) AS CNTRYCODE, C_ACCTBAL FROM CUSTOMER WHERE SUBSTRING(C_PHONE,1,2) IN ('13', '31', '23', '29', '30', '18', '17') AND C_ACCTBAL > (SELECT AVG(C_ACCTBAL) FROM CUSTOMER WHERE C_ACCTBAL > 0.00 AND SUBSTRING(C_PHONE,1,2) IN ('13', '31', '23', '29', '30', '18', '17')) AND NOT EXISTS ( SELECT * FROM ORDERS WHERE O_CUSTKEY = C_CUSTKEY)) AS CUSTSALE GROUP BY CNTRYCODE ORDER BY CNTRYCODE

CNTRYCODE NUMCUST TOTACCTBAL ------13 888 6737713.990000 17 861 6460573.720000 18 964 7236687.400000 23 892 6701457.950000 29 948 7158866.630000 30 909 6808436.130000 31 922 6806670.180000 (7 row(s) affected)

HP TPC-H FULL DISCLOSURE REPORT 148 © 2005 Hewlett-Packard Company. All rights reserved. Appendix D: Seeds and Query Substitution Parameters

Stream0 Substitution Parameters Seed 1021145008 Stream1 Substitution Parameters Seed 1021145009

14 1996-10-01 21 JORDAN 2 39 COPPER MIDDLE EAST 3 AUTOMOBILE 1995-03-14 9 pink 18 312 20 powder 1997-01-01 PERU 5 AMERICA 1993-01-01 6 1993-01-01 0.07 25 11 UNITED 0.0000000333 17 Brand#34 SM CAN 7 IRAN IRAQ 18 315 6 1993-01-01 0.05 24 8 ROMANIA EUROPE ECONOMY BURNISHED 20 chartreuse 1995-01-01 FRANCE TIN 17 Brand#31 LG BOX 21 VIETNAM 12 FOB REG AIR 1996-01-01 13 special accounts 16 Brand#53 STANDARD BRUSHED 12 6 22 14 3 HOUSEHOLD 1995-03-29 18 42 7 11 22 27 31 12 29 17 32 32 15 1996-06-01 16 Brand#13 ECONOMY PLATED 9 37 43 35 13 special deposits 32 8 41 25 10 1993-10-01 4 1997-06-01 2 27 STEEL ASIA 11 IRAN 0.0000000333 8 IRAQ MIDDLE EAST LARGE BRUSHED TIN 15 1993-11-01 14 1997-01-01 1 104 19 Brand#21 Brand#32 Brand#41 4 4 12 10 1995-01-01 9 orange 19 Brand#14 Brand#54 Brand#51 9 9 11 22 12 28 20 18 15 27 27 5 AFRICA 1993-01-01 1 112 7 CHINA ROMANIA 4 1995-03-01 12 REG AIR FOB 1993-01-01

Stream2 Substitution Parameters Seed 1021145010 Stream3 Substitution Parameters Seed 1021145011

6 1993-01-01 0.02 24 8 SAUDI ARABIA MIDDLE EAST LARGE 17 Brand#33 LG JAR ANODIZED NICKEL 14 1997-05-01 5 EUROPE 1993-01-01 16 Brand#33 LARGE ANODIZED 15 30 40 43 4 1995-07-01 36 44 9 1 6 1993-01-01 0.08 25 19 Brand#23 Brand#25 Brand#45 9 9 13 17 Brand#35 LG CAN 10 1994-08-01 7 SAUDI ARABIA = ROMANIA 9 mint 1 67 2 15 BRASS MIDDLE EAST 18 315 15 1994-02-01 22 21 26 20 22 14 33 33 8 CANADA AMERICA LARGE PLATED TIN 14 1997-08-01 5 ASIA 1993-01-01 9 Linen 22 31 27 10 18 16 14 14 10 1993-05-01 12 MAIL AIR 1997-01-01 15 1996-09-01 7 BRAZIL CANADA 11 UNITED 0.0000000333 13 special deposits 20 white 1997-01-01 IRAQ 18 314 2 3 NICKEL ASIA 1 120 21 RUSSIA 4 1997-10-01 19 Brand#25 Brand#53 Brand#44 4 4 14 20 midnight 1994-01-01 VIETNAM 13 special deposits 3 FURNITURE 1995-03-31 16 Brand#13 PROMO PLATED 30 50 46 23 33 11 IRAQ 0.0000000333 11 16 7 21 ETHIOPIA 12 TRUCK AIR 1997-01-01 3 AUTOMOBILE 1995-03-16

HP TPC-H FULL DISCLOSURE REPORT 149 © 2005 Hewlett-Packard Company. All rights reserved. Stream4 Substitution Parameters Seed 1021145012 Stream5 Substitution Parameters Seed 1021145013

5 MIDDLE EAST 1993-01-01 21 GERMANY 21 MOROCCO 15 1996-12-01 14 1997-11-01 4 1995-11-01 19 Brand#32 Brand#41 Brand#33 10 10 15 6 1994-01-01 0.03 24 15 1994-06-01 7 CANADA EGYPT 17 Brand#32 MED BOX 16 Brand#33 ECONOMY ANODIZED 35 41 2 32 12 RAIL AIR 1997-01-01 26 17 36 9 6 1993-01-01 0.05 24 19 Brand#35 Brand#24 Brand#33 5 5 16 4 1993-04-01 18 314 9 lace 14 1993-02-01 8 JAPAN ASIA MEDIUM POLISHED NICKEL 22 25 28 23 19 24 16 16 16 Brand#53 SMALL POLISHED 22 11 31 9 29 11 ALGERIA 0.0000000333 5 46 8 13 pending packages 11 JAPAN 0.0000000333 3 MACHINERY 1995-03-18 2 41 TIN AFRICA 1 83 10 1994-02-01 2 28 STEEL ASIA 18 313 5 AFRICA 1994-01-01 1 75 8 EGYPT MIDDLE EAST MEDIUM BURNISHED 13 special deposits NICKEL 7 IRAQ JAPAN 20 salmon 1994-01-01 MOROCCO 22 10 24 11 22 21 25 25 12 AIR REG AIR 1997-01-01 3 FURNITURE 1995-03-02 17 Brand#34 MED JAR 20 hot 1996-01-01 ALGERIA 10 1994-11-01 9 grey

Stream6 Substitution Parameters Seed 1021145014 Stream7 Substitution Parameters Seed 1021145015

10 1993-08-01 18 313 3 BUILDING 1995-03-04 8 JORDAN MIDDLE EAST SMALL PLATED 15 1994-09-01 NICKEL 13 pending packages 20 orchid 1996-01-01 SAUDI ARABIA 6 1994-01-01 0.08 25 21 MOZAMBIQUE 8 VIETNAM ASIA SMALL BRUSHED NICKEL 2 4 NICKEL EUROPE 9 forest 4 1996-03-01 7 VIETNAM SAUDI ARABIA 22 33 16 18 20 28 24 24 4 1993-08-01 17 Brand#33 JUMBO BOX 11 JORDAN 0.0000000333 1 99 22 27 14 16 11 18 32 32 11 ARGENTINA 0.0000000333 18 312 9 deep 12 SHIPRAIL 1993-01-01 19 Brand#44 Brand#45 Brand#21 5 5 18 1 91 3 MACHINERY 1995-03-20 5 AMERICA 1994-01-01 13 pending packages 16 Brand#13 STANDARD BURNISHED 29 21 28 5 EUROPE 1994-01-01 24 22 41 15 34 7 JAPAN JORDAN 2 16 BRASS AFRICA 10 1994-06-01 14 1993-05-01 16 Brand#53 MEDIUM POLISHED 32 27 34 15 19 Brand#32 Brand#52 Brand#32 10 10 17 11 30 25 14 20 dark 1997-01-01 ETHIOPIA 6 1994-01-01 0.05 25 17 Brand#31 MED CAN 14 1993-09-01 21 UNITED STATES 15 1997-04-01 12 FOB RAIL 1993-01-01

HP TPC-H FULL DISCLOSURE REPORT 150 © 2005 Hewlett-Packard Company. All rights reserved. Stream8 Substitution Parameters 1021145016

19 Brand#41 Brand#22 Brand#25 1 1 19 1 107 15 1995-01-01 17 Brand#35 JUMBO PACK 5 MIDDLE EAST 1994-01-01 8 ETHIOPIA AFRICA SMALL ANODIZED BRASS 9 coral 12 MAIL RAIL 1993-01-01 14 1993-12-01 7 EGYPT ETHIOPIA 4 1993-11-01 3 BUILDING 1995-03-06 20 black 1994-01-01 INDONESIA 16 Brand#33 ECONOMY BRUSHED 12 4 1 20 6 3 36 43 6 1994-01-01 0.03 24 22 18 17 12 19 14 15 15 10 1993-03-01 13 pending packages 2 42 TIN AFRICA 21 INDIA 18 315 11 KENYA 0.0000000333

HP TPC-H FULL DISCLOSURE REPORT 151 © 2005 Hewlett-Packard Company. All rights reserved. Appendix E: Refresh Function Source Code

RF1 if exists (select name from sysobjects where name = 'RF1') drop procedure RF1 GO -- -- Create a stored Refresh Insert procedure which will catch the deadlock -- victim abort and restart the insert transaction. -- CREATE PROCEDURE RF1 @current_execution INTEGER, @insert_sets INTEGER, @parallel_executions INTEGER, @total_executions INTEGER AS BEGIN

DECLARE @startdate DATETIME DECLARE @enddate DATETIME DECLARE @edate DATETIME DECLARE @rangeStart INTEGER DECLARE @rangeSize INTEGER DECLARE @range INTEGER declare @index integer declare @div integer declare @mod integer declare @skip integer declare @i integer declare @rangeSum integer declare @totRangeSize integer declare @stmt nchar(1000) declare @orderSql nchar(1000) declare @liSql nchar(1000) set @skip = @total_executions/@parallel_executions set @div = (@current_execution - 1)/@parallel_executions set @mod = (@current_execution - 1) - @div * @parallel_executions set @index = @mod*@skip + @div + 1

-- -- Get the range for this execution -- set @stmt = N'select @sdate = dateadd(day,-1,min(O_ORDERDATE)), @edate = max(O_ORDERDATE) from NEWORDERS' exec sp_executesql @stmt,N'@sdate datetime output, @edate datetime output',@startdate output, @enddate output if (@total_executions > @parallel_executions) begin set @div = (@index-1)/@skip set @mod = (@index-1) - @div * @skip set @rangeSize = datediff(day, @startdate, @enddate)/@parallel_executions + 1 set @totRangeSize = @rangeSize set @rangeSum = 0 set @rangeStart = @div * @rangeSize set @i = @mod while (@i > 0) begin set @rangeSize = (@totRangeSize - @rangeSum)/2 set @rangeSum = @rangeSum + @rangeSize set @rangeStart = @rangeStart + @rangeSize set @insert_sets = @insert_sets/2 set @i = @i - 1 end

if (@mod + 1 = @skip) set @rangeSize = @totRangeSize - @rangeSum else set @rangeSize = (@totRangeSize - @rangeSum)/2 if (@rangeSize < 0) set @rangeSize = 0 if (@insert_sets <= 0) set @insert_sets = 1 end else

HP TPC-H FULL DISCLOSURE REPORT 152 © 2005 Hewlett-Packard Company. All rights reserved. begin set @rangeSize = datediff(day, @startdate, @enddate)/@total_executions set @rangeStart = @rangeSize * (@index - 1) end set @startdate = dateadd(day, @rangeStart, @startdate) if (@index < @total_executions) set @enddate = dateadd(day, @rangeSize, @startdate) -- print @startdate -- print @enddate

SET @range = datediff(day, @startdate, @enddate) / @insert_sets -- -- This handles the case when the max-min/insert_sets is less that 1 -- IF @range = 0 SET @range = 1 -- -- Loop through the order keys only inserting a sets into the -- ORDERS and LINTEITEM tables -- SET @edate = dateadd(day, @range, @startdate) SET @orderSql = N'insert into ORDERS (O_ORDERKEY, O_CUSTKEY, O_ORDERSTATUS, O_TOTALPRICE, O_ORDERDATE, O_ORDERPRIORITY, O_CLERK, O_SHIPPRIORITY, O_COMMENT) (select O_ORDERKEY, O_CUSTKEY, O_ORDERSTATUS, O_TOTALPRICE, O_ORDERDATE, O_ORDERPRIORITY, O_CLERK, O_SHIPPRIORITY, O_COMMENT from NEWORDERS where O_ORDERDATE > @startdate AND O_ORDERDATE <= @edate) ' SET @liSql = N'insert into LINEITEM (L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_QUANTITY, L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, L_RETURNFLAG, L_LINESTATUS, L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE, L_SHIPINSTRUCT, L_SHIPMODE, L_COMMENT) (select L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_QUANTITY, L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, L_RETURNFLAG, L_LINESTATUS, L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE, L_SHIPINSTRUCT, L_SHIPMODE, L_COMMENT from NEWLINEITEM, NEWORDERS where L_ORDERKEY = O_ORDERKEY AND O_ORDERDATE > @startdate AND O_ORDERDATE <= @edate)'

WHILE @startdate < @enddate BEGIN INSERT_TRANS: begin transaction exec sp_executesql @orderSql, N'@startdate datetime, @edate datetime', @startdate, @edate if (@@error = 1205) begin print 'Insert deadlock - restarting RF2_' + RTRIM(CONVERT(varchar(30),@current_execution)) + ' transaction' rollback transaction goto INSERT_TRANS end exec sp_executesql @liSql, N'@startdate datetime, @edate datetime', @startdate, @edate if (@@error = 1205) begin print 'Insert deadlock - restarting RF2_' + RTRIM(CONVERT(varchar(30),@current_execution)) + ' transaction' rollback transaction goto INSERT_TRANS end commit transaction set @startdate = @edate set @edate = dateadd(day, @range, @edate) if (@edate > @enddate) set @edate = @enddate END END GO

HP TPC-H FULL DISCLOSURE REPORT 153 © 2005 Hewlett-Packard Company. All rights reserved. RF2 if exists (select name from sysobjects where name = 'RF2') drop procedure RF2 GO

-- -- Create a stored Refresh Delete procedure which will catch the deadlock -- victim abort and restart the delete transaction. -- CREATE PROCEDURE RF2 @current_execution INTEGER, @delete_sets INTEGER, @parallel_executions INTEGER, @total_executions INTEGER AS BEGIN

DECLARE @startdate DATETIME DECLARE @enddate DATETIME DECLARE @edate DATETIME DECLARE @rangeStart INTEGER DECLARE @rangeSize INTEGER DECLARE @range INTEGER declare @index integer declare @div integer declare @mod integer declare @skip integer declare @i integer declare @rangeSum integer declare @totRangeSize integer declare @sql nchar(1000) declare @orderSql nchar(1000) declare @liSql nchar(1000) set @skip = @total_executions/@parallel_executions set @div = floor((@current_execution-1)/@parallel_executions) set @mod = (@current_execution - 1) - @div * @parallel_executions set @index = @mod*@skip + @div + 1 set @sql = N'select @sdate = dateadd(day,-1,min(O_ORDERDATE)), @edate = max(O_ORDERDATE) from MOD_OLDORDERS' exec sp_executesql @sql,N'@sdate datetime output, @edate datetime output',@startdate output, @enddate output if (@total_executions > @parallel_executions) begin set @div = (@index-1)/@skip set @mod = (@index-1) - @div * @skip set @rangeSize = datediff(day, @startdate, @enddate)/@parallel_executions + 1 set @totRangeSize = @rangeSize set @rangeSum = 0 set @rangeStart = @div * @rangeSize set @i = @mod while (@i > 0) begin set @rangeSize = (@totRangeSize - @rangeSum)/2 set @rangeSum = @rangeSum + @rangeSize set @rangeStart = @rangeStart + @rangeSize set @delete_sets = @delete_sets/2 set @i = @i - 1 end if (@mod + 1 = @skip) -- last allocation set @rangeSize = @totRangeSize - @rangeSum else set @rangeSize = (@totRangeSize - @rangeSum)/2 if (@rangeSize < 0) set @rangeSize = 0 if (@delete_sets <= 0) set @delete_sets = 1 end else begin set @rangeSize = datediff(day, @startdate, @enddate)/@total_executions set @rangeStart = @rangeSize * (@index - 1) end set @startdate = dateadd(day, @rangeStart, @startdate) if (@index < @total_executions) set @enddate = dateadd(day, @rangeSize, @startdate)

HP TPC-H FULL DISCLOSURE REPORT 154 © 2005 Hewlett-Packard Company. All rights reserved. SET @range = datediff(day, @startdate, @enddate) / @delete_sets -- -- This handles the case when the max-min/delete_sets is less that 1 -- IF @range = 0 SET @range = 1

-- -- Loop through the order keys only deleting sets from orders -- and lineitem tables -- SET @edate = dateadd(day, @range, @startdate) SET @liSql = N'delete from LINEITEM where L_ORDERKEY in (select O_ORDERKEY from MOD_OLDORDERS WHERE O_ORDERDATE > @startdate AND O_ORDERDATE <= @edate)'

SET @orderSql = N'delete from ORDERS where O_ORDERKEY in (select O_ORDERKEY from MOD_OLDORDERS WHERE O_ORDERDATE > @startdate AND O_ORDERDATE <= @edate)'

WHILE @startdate < @enddate BEGIN -- -- Delete from ORDERS and LINEITEM table -- DELETE_TRANS: begin transaction

exec sp_executesql @liSql, N'@startdate datetime, @edate datetime', @startdate, @edate

-- -- If deadlock victim abort then restart the transaction -- if (@@error = 1205) begin print 'Delete deadlock - restarting RF2_' + RTRIM(CONVERT(varchar(30),@current_execution)) + 'transaction' rollback transaction goto DELETE_TRANS end

exec sp_executesql @orderSql, N'@startdate datetime, @edate datetime', @startdate, @edate

-- -- If deadlock victim abort then restart the transaction -- if (@@error = 1205) begin print 'Delete deadlock - restarting RF2_' + RTRIM(CONVERT(varchar(30),@current_execution)) + 'transaction' rollback transaction goto DELETE_TRANS end

commit transaction

set @startdate = @edate set @edate = dateadd(day, @range, @edate)

if (@edate > @enddate) set @edate = @enddate

END END GO

HP TPC-H FULL DISCLOSURE REPORT 155 © 2005 Hewlett-Packard Company. All rights reserved. Appendix F: Implementation Specific Layer and Source Code

VERSION 1.0 CLASS Public Sub gstrSource = mstrModuleName & BEGIN CreateNewConstraintVersion(ByVal lngStepId "CreateNewConstraintVersion" MultiUse = -1 'True As Long, _ On Error GoTo 0 END ByVal strNewVersion As String, _ Err.Raise vbObjectError + Attribute VB_Name = "cArrConstraints" ByVal strOldVersion As String, _ errCreateNewConstraintVersionFailed, _ Attribute VB_GlobalNameSpace = False ByVal intStepType As Integer) mstrSource, _ Attribute VB_Creatable = True Attribute VB_PredeclaredId = False ' Does all the processing needed to create LoadResString(errCreateNewConstraintVersionFail Attribute VB_Exposed = False new versions of ed) ' FILE: cArrConstraints.cls ' all the constraints for a given step ' Microsoft TPC-H Kit Ver. 1.00 ' It inserts new constraint records in the End Sub ' Copyright Microsoft, 1999 database with Private Sub Class_Initialize() ' All Rights Reserved ' the new version numbers on them ' ' It also updates the version number on all Set mcarrConstraints = New cNodeCollections ' constraints BugMessage "cArrConstraints: Initialize event - ' PURPOSE: Implements an array of ' for the step in the array to the new version setting Constraint count to 0" cConstraint objects. passed in ' Type-safe wrapper around ' Since it handles both global and End Sub cNodeCollections. manager/worker steps, ' Also contains additional functions ' it checks for the step_id or global_step_id Private Sub Class_Terminate() that determine all the fields, ' constraints for a step, all ' depending on the type of step Set mcarrConstraints = Nothing constraints in a workspace, BugMessage "cArrConstraints: Terminate event ' validation functions, etc. Dim lngIndex As Long triggered" ' Contact: Reshma Tharamal Dim cUpdateConstraint As cConstraint ([email protected]) End Sub ' On Error GoTo Option Explicit CreateNewConstraintVersionErr Public Sub Add(ByVal cConstraintToAdd As mstrSource = mstrModuleName & cConstraint) Private mcarrConstraints As "CreateNewConstraintVersion" cNodeCollections Set cConstraintToAdd.NodeDB = ' Update the version/global version on mcarrConstraints.NodeDB ' Used to indicate the source module name Constraint with the when errors ' passed in step/global step id ' Retrieve a unique constraint identifier ' are raised by this class For lngIndex = 0 To mcarrConstraints.Count cConstraintToAdd.ConstraintId = Private mstrSource As String - 1 cConstraintToAdd.NextIdentifier Private Const mstrModuleName As String = Set cUpdateConstraint = "c ArrConstraints." mcarrConstraints(lngIndex) ' Call a procedure to load the constraint record in Public Sub SaveWspConstraints(ByVal If intStepType = gintGlobalStep Then the array lngWorkspace As Long) If cUpdateConstraint.GlobalStepId = Call mcarrConstraints.Add(cConstraintToAdd) ' Calls a procedure to commit all changes lngStepId And _ to the constraints cUpdateConstraint.IndOperation End Sub ' in the passed in workspace. <> DeleteOp Then Public Sub Delete(ByVal cOldConstraint As cUpdateConstraint.GlobalVersionNo cConstraint) Call = strNewVersion mcarrConstraints.Save(lngWorkspace) Dim lngDeleteElement As Long ' Set the operation to indicate an Dim cConsToDelete As cConstraint End Sub insert Public Property Set ConstraintDB(vdata As cUpdateConstraint.IndOperation = lngDeleteElement = Database) InsertOp QueryConstraintIndex(cOldConstraint.ConstraintId) End If Set cConsToDelete = Set mcarrConstraints.NodeDB = vdata Else mcarrConstraints(lngDeleteElement) If cUpdateConstraint.StepId = End Property lngStepId And _ Call Public Property Get ConstraintDB() As cUpdateConstraint.IndOperation mcarrConstraints.Delete(cConsToDelete.Position) Database <> DeleteOp Then cUpdateConstraint.VersionNo = Set cConsToDelete = Nothing Set ConstraintDB = strNewVersion mcarrConstraints.NodeDB End Sub ' Set the operation to indicate an Private Function End Property insert QueryConstraintIndex(lngConstraintId As Long) _ cUpdateConstraint.IndOperation = As Long Public Sub Modify(cConsToUpdate As InsertOp cConstraint) End If Dim lngIndex As Integer End If ' Modify the constraint record Next lngIndex ' Find the element in the array to be deleted Call For lngIndex = 0 To mcarrConstraints.Count - 1 mcarrConstraints.Modify(cConsToUpdate) Exit Sub CreateNewConstraintVersionErr: ' Note: The constraint id is not a primary key End Sub LogErrors Errors field in HP TPC-H FULL DISCLOSURE REPORT 156 © 2005 Hewlett-Packard Company. All rights reserved. ' the database - there can be multiple Err.Raise vbObjectError + qyCons.Parameters("archived").Value = False records with the errSetDBBeforeLoad, _ ' same constraint_id but for different mstrSource, _ rstStepsInWsp.MoveFirst versions of a step ' However, since we'll always load the LoadResString(errSetDBBeforeLoad) While Not rstStepsInWsp.EOF constraint information End If ' for the latest version of a step, we'll If Not (rstStepsInWsp!global_flag) Then have just one dtStart = Now qyCons.Close ' constraint record with a given BugMessage "Query constraints Read + constraint_id ' Select based on the global step id since load took: " & CStr(DateDiff("s", dtStart, Now)) If there might Exit Sub mcarrConstraints(lngIndex).ConstraintId = ' be constraints for a global step that run are End If lngConstraintId Then executed QueryConstraintIndex = lngIndex ' for the workspace qyCons.Parameters("g_s_id").Value = Exit Function ' This method has the advantage that if the rstStepsInWsp!step_id End If steps are queried right, everything else follows qyCons.Parameters("g_ver_no").Value = strSql = "Select a.constraint_id, a.step_id, rstStepsInWsp!version_no Next lngIndex a.version_no, " & _ " a.constraint_type, a.global_step_id, Set recConstraints = ' Raise error that Constraint has not been a.global_version_no, " & _ qyCons.OpenRecordset(dbOpenSnapshot) found " a.sequence_no, b.workspace_id " & _ ShowError errConstraintNotFound " from step_constraints a, att_steps b " & Call On Error GoTo 0 _ LoadRecordsetInConstraintArray(recConstraints) Err.Raise vbObjectError + " where a.global_step_id = b.step_id " & recConstraints.Close errConstraintNotFound, mstrSource, _ _ LoadResString(errConstraintNotFound) " and a.global_version_no = b.version_no rstStepsInWsp.MoveNext " & _ Wend End Function " and a.global_step_id = [g_s_id] " & _ " and a.global_version_no = [g_ver_no] " qyCons.Close Public Function QueryConstraint(ByVal & _ BugMessage "Query constraints Read + load lngConstraintId As Long) _ " and b.archived_flag = [archived] " took: " & CStr(DateDiff("s", dtStart, Now)) As cConstraint ' Find the highest X-component of the Exit Sub ' Returns a cConstraint object with the version number property values strSql = strSql & " AND ( a.step_id = 0 or ( LoadConstraintsErr: ' corresponding to the Constraint cint( mid( a.version_no, 1, instr( a.version_no, LogErrors Errors Identifier, lngConstraintId " & gstrDQ & gstrVerSeparator & gstrDQ & " gstrSource = mstrModuleName & ) - 1 ) ) = "& _ "LoadConstraints" Dim lngQueryElement As Long " ( select max( cint( mid( version_no, 1, On Error GoTo 0 instr( version_no, " & gstrDQ & Err.Raise vbObjectError + errLoadDataFailed, _ lngQueryElement = gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ mstrSource, _ QueryConstraintIndex(lngConstraintId) " from att_steps AS d " & _ LoadResString(errLoadDataFailed) " WHERE a.step_id = d.step_id " & _ ' Set the return value to the queried " and d.archived_flag = [archived] ) " End Sub Constraint Public Sub UnloadStepConstraints(ByVal lngStepId Set QueryConstraint = ' Find the highest Y-component of the As Long) mcarrConstraints(lngQueryElement) version number for the highest X-component strSql = strSql & " AND cint( mid( ' Unloads all the constraints for the workspace End Function a.version_no, instr( a.version_no, " & gstrDQ from & gstrVerSeparator & gstrDQ & " ) + 1 ) ) = " ' the constraints array Public Sub LoadConstraints(ByVal & _ lngWorkspaceId As Long, rstStepsInWsp " ( select max( cint( mid( version_no, Dim lngIndex As Long As Recordset) instr( version_no, " & gstrDQ & gstrVerSeparator & gstrDQ & " ) + 1 ) ) ) " & ' Find all constraints in the array with a matching ' Loads the constraints array with all the _ step id constraints " from att_steps AS y " & _ ' It is important to step in reverse order through ' for the workspace " Where a.step_id = y.step_id " & _ the array, Dim recConstraints As Recordset " AND cint( mid( version_no, 1, instr( ' since we delete constraint records! Dim qyCons As DAO.QueryDef version_no, " & gstrDQ & gstrVerSeparator & For lngIndex = mcarrConstraints.Count - 1 To 0 Dim strSql As String gstrDQ & " ) - 1 ) ) = "& _ Step -1 Dim dtStart As Date " ( select max( cint( mid( version_no, 1, If mcarrConstraints(lngIndex).GlobalStepId = instr( version_no, " & gstrDQ & lngStepId Then On Error GoTo LoadConstraintsErr gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ mstrSource = mstrModuleName & " from att_steps AS c " & _ ' Unload the constraint from the array "LoadConstraints" " WHERE y.step_id = c.step_id " & _ Call mcarrConstraints.Unload(lngIndex) " and c.archived_flag = [archived] ) ) ) ) " If rstStepsInWsp.RecordCount = 0 Then End If Exit Sub ' Order the constraints by sequence within a Next lngIndex End If given step strSql = strSql & " order by a.sequence_no " End Sub ' First check if the database object has Public Sub UnloadConstraint(cOldConstraint As been set Set qyCons = cConstraint) If mcarrConstraints.NodeDB Is Nothing mcarrConstraints.NodeDB.CreateQueryDef(gst ' Unloads the constraint from the constraints array Then rEmptyString, strSql) On Error GoTo 0 Dim lngDeleteElement As Long HP TPC-H FULL DISCLOSURE REPORT 157 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + cTempConstraint.IndOperation <> lngDeleteElement = errLoadRsInArrayFailed, _ DeleteOp Then QueryConstraintIndex(cOldConstraint.Const mstrSource, _ If blnGlobalConstraintsOnly = False Or _ raintId) (blnGlobalConstraintsOnly And _ LoadResString(errLoadRsInArrayFailed) cTempConstraint.StepId = 0 And _ Call cTempConstraint.VersionNo = mcarrConstraints.Unload(lngDeleteElement) End Sub gstrMinVersion) Then

End Sub Public Function ConstraintsForStep( _ ' We have a matching constraint for the Private Sub ByVal lngStepId As Long, _ global step LoadRecordsetInConstraintArray(ByVal ByVal strVersionNo As String, _ AddArrayElement cStepConstraint, _ recConstraints As Recordset) Optional ByVal intConstraintType As cTempConstraint, ' Loads all the constraint records in the ConstraintType = 0, _ lngConstraintCount passed in Optional ByVal blnSort As Boolean = End If ' recordset into the array True, _ End If Optional ByVal blnGlobal As Boolean = End If Dim cNewConstraint As cConstraint False, _ Optional ByVal Next lngIndex On Error GoTo blnGlobalConstraintsOnly As Boolean = False) LoadRecordsetInConsArrayErr _ ' Set the return value of the function to the array mstrSource = mstrModuleName & As Variant of "LoadRecordsetInConstraintArray" ' constraints that has been built above ' Returns a variant containing an array of If lngConstraintCount = 0 Then If recConstraints.RecordCount = 0 Then cConstraint objects, ConstraintsForStep = Empty Exit Sub ' containing all the constraints that have been Else End If defined for the ConstraintsForStep = cStepConstraint() ' given step. If the Global flag is set to true, End If recConstraints.MoveFirst the While Not recConstraints.EOF ' search will be made for all the constraints ' Sort the constraints Set cNewConstraint = New cConstraint that have If blnSort Then ' a matching global_step_id Call QuickSort(ConstraintsForStep) ' Initialize Constraint values End If cNewConstraint.ConstraintId = Dim lngIndex As Long CLng(ErrorOnNullField(recConstraints, Dim cStepConstraint() As cConstraint Exit Function "Constraint_id")) Dim lngConstraintCount As Long cNewConstraint.StepId = Dim cTempConstraint As cConstraint ConstraintsForStepErr: CLng(ErrorOnNullField(recConstraints, LogErrors Errors "s tep_id")) On Error GoTo ConstraintsForStepErr On Error GoTo 0 cNewConstraint.VersionNo = mstrSource = mstrModuleName & Err.Raise vbObjectError + CStr(ErrorOnNullField(recConstraints, "ConstraintsForStep" errConstraintsForStepFailed, _ "version_no")) mstrSource, _ lngConstraintCount = 0 cNewConstraint.GlobalStepId = LoadResString(errConstraintsForStepFailed) CLng(ErrorOnNullField(recConstraints, ' Find each element in the constraints array "global_step_id")) For lngIndex = 0 To mcarrConstraints.Count End Function cNewConstraint.GlobalVersionNo = - 1 Private Sub AddArrayElement(ByRef arrNodes() CStr(ErrorOnNullField(recConstraints, ' If a constraint type has been specified As cConstraint, _ "global_version_no")) then check ByVal objToAdd As cConstraint, _ cNewConstraint.SequenceNo = ' if the constraint type for the record ByRef lngCount As Long) CInt(ErrorOnNullField(recConstraints, matches the ' Adds the passed in object to the array "s equence_no")) ' passed in type Set cTempConstraint = ' Increase the array dimension and add the object cNewConstraint.WorkspaceId = mcarrConstraints(lngIndex) to it CLng(ErrorOnNullField(recConstraints, If Not blnGlobal Then ReDim Preserve arrNodes(lngCount) FLD_ID_WORKSPACE)) If cTempConstraint.StepId = lngStepId Set arrNodes(lngCount) = objToAdd cNewConstraint.ConstraintType = And _ lngCount = lngCount + 1 CInt(ErrorOnNullField(recConstraints, cTempConstraint.VersionNo = "c onstraint_type")) strVersionNo And _ End Sub cTempConstraint.IndOperation <> ' Add this record to the array of DeleteOp And _ Public Function ConstraintsForWsp( _ Constraints (intConstraintType = 0 Or _ ByVal lngWorkspaceId As Long, _ mcarrConstraints.Load cNewConstraint cTempConstraint.ConstraintType Optional ByVal intConstraintType As Integer = intConstraintType) Then = 0, _ Set cNewConstraint = Nothing ' We have a matching constraint for Optional ByVal blnSort As Boolean = True, _ recConstraints.MoveNext the given step Optional ByVal blnGlobalConstraintsOnly As Wend AddArrayElement cStepConstraint, _ Boolean = False) _ cTempConstraint, As Variant Exit Sub lngConstraintCount End If ' Returns a variant containing an array of LoadRecordsetInConsArrayErr: Else cConstraint objects, LogErrors Errors If cTempConstraint.GlobalStepId = ' containing all the constraints that have been gstrSource = mstrModuleName & lngStepId And _ defined for the "LoadRecordsetInConstraintArray" ' given workspace. On Error GoTo 0 cTempConstraint.GlobalVersionNo = strVersionNo And _ Dim lngIndex As Long HP TPC-H FULL DISCLOSURE REPORT 158 © 2005 Hewlett-Packard Company. All rights reserved. Dim cWspConstraint() As cConstraint Public Function PreConstraintsForStep( _ PreConstraintsForWsp = Dim lngConstraintCount As Long ByVal lngStepId As Long, _ ConstraintsForWsp(lngWorkspaceId, _ Dim cTempConstraint As cConstraint ByVal strVersionNo As String, _ gintPreStep, blnSort, True) Optional ByVal blnSort As Boolean) As On Error GoTo ConstraintsForWspErr Variant End Function mstrSource = mstrModuleName & Public Property Get ConstraintCount() As Long "ConstraintsForWsp" ' Returns a variant containing an array of cConstraint objects, ConstraintCount = mcarrConstraints.Count lngConstraintCount = 0 ' containing all the pre-execution constraints that have End Property ' Find each element in the constraints ' been defined for the given step_id and array version VERSION 1.0 CLASS For lngIndex = 0 To BEGIN mcarrConstraints.Count - 1 ' Call a function that will return a variant MultiUse = -1 'True ' If a constraint type has been specified containing END then check ' all the constraints of the passed in type Attribute VB_Name = "cArrParameters" ' if the constraint type for the record PreConstraintsForStep = Attribute VB_GlobalNameSpace = False matches the ConstraintsForStep(lngStepId, _ Attribute VB_Creatable = True ' passed in type strVersionNo, gintPreStep, blnSort) Attribute VB_PredeclaredId = False Set cTempConstraint = Attribute VB_Exposed = False mcarrConstraints(lngIndex) End Function ' FILE: cArrParameters.cls If cTempConstraint.WorkspaceId = Public Function PostConstraintsForStep( _ ' Microsoft TPC-H Kit Ver. 1.00 lngWorkspaceId And _ ByVal lngStepId As Long, _ ' Copyright Microsoft, 1999 cTempConstraint.IndOperation <> ByVal strVersionNo As String, _ ' All Rights Reserved DeleteOp And _ Optional ByVal blnSort As Boolean) As ' (intConstraintType = 0 Or _ Variant ' cTempConstraint.ConstraintType ' PURPOSE: Implements an array of cParameter = intConstraintType) Then ' Returns a variant containing an array of objects. cConstraint objects, ' Type-safe wrapper around If blnGlobalConstraintsOnly = False ' containing all the Post-execution cNodeCollections. Or _ constraints that have ' Also contains additional functions to (blnGlobalConstraintsOnly And ' been defined for the given step_id and determine parameter _ version ' values, validation functions, etc. cTempConstraint.StepId = 0 ' Contact: Reshma Tharamal And _ ' Call a function that will return a variant ([email protected]) cTempConstraint.VersionNo = containing ' gstrMinVersion) Then ' all the constraints of the passed in type Option Explicit PostConstraintsForStep = ' We have a matching constraint ConstraintsForStep(lngStepId, _ Private mcarrParameters As cNodeCollections for the workspace strVersionNo, gintPostStep, blnSort) AddArrayElement ' Used to indicate the source module name when cWspConstraint, _ End Function errors cTempConstraint, Public Function PostConstraintsForWsp( _ ' are raised by this class lngConstraintCount ByVal lngWorkspaceId As Long, _ Private mstrSource As String End If Optional ByVal blnSort As Boolean) As Private Const mstrModuleName As String = End If Variant "c ArrParameters." Next lngIndex ' Returns a variant containing an array of Public Sub InitBuiltInsForRun(lWspId As Long, ' Set the return value of the function to the cConstraint objects, lRunId As Long) array of ' containing all the Post-execution globals ' constraints that has been built above that have Dim cParamRec As cParameter If lngConstraintCount = 0 Then ' been defined for the workspace ConstraintsForWsp = Empty ' Initialize the values of the run_id and output_dir Else ' Call a function that will return a variant built-in parameters and save them ConstraintsForWsp = cWspConstraint() containing ' to the database End If ' all the constraints of the passed in type Set cParamRec = GetParameterValue(lWspId, PostConstraintsForWsp = PARAM_RUN_ID) ' Sort the constraints ConstraintsForWsp(lngWorkspaceId, _ cParamRec.ParameterValue = CStr(lRunId) If blnSort Then gintPostStep, blnSort, True) Call Modify(cParamRec) Call QuickSort(ConstraintsForWsp) End If End Function Set cParamRec = GetParameterValue(lWspId, Public Function PreConstraintsForWsp( _ PARAM_OUTPUT_DIR) Exit Function ByVal lngWorkspaceId As Long, _ cParamRec.ParameterValue = Optional ByVal blnSort As Boolean) As GetDefaultDir(lWspId, Me) ConstraintsForWspErr: Variant cParamRec.ParameterValue = LogErrors Errors cParamRec.ParameterValue & gstrFileSeparator & On Error GoTo 0 ' Returns a variant containing an array of CStr(lRunId) Err.Raise vbObjectError + cConstraint objects, Call Modify(cParamRec) errConstraintsForWspFailed, _ ' containing all the Pre-execution globals that mstrSource, _ have Call SaveParametersInWsp(lWspId) ' been defined for the workspace LoadResString(errConstraintsForWspFailed End Sub ) ' Call a function that will return a variant containing End Function ' all the constraints of the passed in type HP TPC-H FULL DISCLOSURE REPORT 159 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Set ParamDatabase(vdata ' Returns the value for the passed in If mcarrParameters(lngIndex).ParameterId = As Database) workspace parameter lngParameterId And _ mcarrParameters(lngIndex).IndOperation Set mcarrParameters.NodeDB = vdata Dim cParamRec As cParameter <> DeleteOp Then Dim lngIndex As Long QueryIndex = lngIndex End Property Exit Function Public Sub Modify(cModifiedParam As On Error GoTo GetParameterValueErr End If cParameter) Next lngIndex ' Find all parameters in the array with a ' First check if the parameter record is matching workspace id ' Raise error that parameter has not been found valid For lngIndex = 0 To mcarrParameters.Count On Error GoTo 0 Call - 1 Err.Raise vbObjectError + errParamNotFound, CheckDupParamName(cModifiedParam) Set cParamRec = "c ArrParameters.QueryIndex", _ mcarrParameters(lngIndex) LoadResString(errParamNotFound) Call If cParamRec.WorkspaceId = mcarrParameters.Modify(cModifiedParam) lngWorkspace And _ End Function cParamRec.ParameterName = End Sub strParamName Then Public Function QueryParameter(lngParameterId Public Sub Load(ByRef cParamToAdd As As Long) _ cParameter) Set GetParameterValue = cParamRec As cParameter Exit For Call End If Dim lngQueryElement As Long mcarrParameters.Load(cParamToAdd) Next lngIndex lngQueryElement = QueryIndex(lngParameterId) End Sub If lngIndex > mcarrParameters.Count - 1 Public Sub Add(ByRef cParamToAdd As Then ' Return the queried parameter object cParameter) ' The parameter has not been defined for Set QueryParameter = the workspace mcarrParameters(lngQueryElement) Set cParamToAdd.NodeDB = ' Raise an error mcarrParameters.NodeDB On Error GoTo 0 End Function Err.Raise vbObjectError + Public Property Get ParameterCount() As Long ' First check if the parameter record is errParamNameInvalid, _ valid mstrModuleName & ParameterCount = mcarrParameters.Count Call Validate(cParamToAdd) "GetParameterValue", _ End Property ' Retrieve a unique parameter identifier LoadResString(errParamNameInvalid) Public Property Get Item(lngIndex As Long) As cParamToAdd.ParameterId = End If cParameter cParamToAdd.NextIdentifier Attribute Item.VB_UserMemId = 0 Exit Function Call Set Item = mcarrParameters(lngIndex) mcarrParameters.Add(cParamToAdd) GetParameterValueErr: ' Log the error code raised by Visual Basic End Property End Sub Call LogErrors(Errors) gstrSource = mstrModuleName & Public Sub Validate(ByVal cParamToValidate As Public Sub Unload(lngParamToDelete As "GetParameterValue" cParameter) Long) On Error GoTo 0 ' This procedure is necessary since the class Err.Raise vbObjectError + cannot validate Dim lngDeleteElement As Long errGetParamValueFailed, _ ' all the parameter properties on it's own. This is gstrSource, _ 'coz we lngDeleteElement = ' might have created new parameters in the QueryIndex(lngParamToDelete) LoadResString(errGetParamValueFailed) workspace, but not ' saved them to the database yet - hence the Call End Function duplicate check mcarrParameters.Unload(lngDeleteElement) Public Sub Delete(lngParamToDelete As ' has to be repeated in the array Long) End Sub ' Delete the passed in parameter Dim lngIndex As Long Dim cTempParam As cParameter Public Sub SaveParametersInWsp(ByVal Dim lngDeleteElement As Long lngWorkspace As Long) On Error GoTo ValidateErr ' Calls a procedure to commit all changes lngDeleteElement = to the parameters QueryIndex(lngParamToDelete) ' Check if the parameter name already exists in ' for the passed in workspace. Call the workspace mcarrParameters.Delete(lngDeleteElement) For lngIndex = 0 To mcarrParameters.Count - 1 ' Call a procedure to save all parameter Set cTempParam = mcarrParameters(lngIndex) records for the End Sub If cTempParam.WorkspaceId = ' workspace Private Function QueryIndex(lngParameterId cParamToValidate.WorkspaceId And _ Call As Long) As Long cTempParam.ParameterName = mcarrParameters.Save(lngWorkspace) cParamToValidate.ParameterName And _ Dim lngIndex As Long cTempParam.IndOperation <> DeleteOp End Sub Then Public Function GetParameterValue(ByVal ' Find the matching parameter record in the On Error GoTo 0 lngWorkspace As Long, _ array Err.Raise vbObjectError + ByVal strParamName As String) As For lngIndex = 0 To mcarrParameters.Count errDuplicateParameterName, _ cParameter - 1 mstrSource, LoadResString(errDuplicateParameterName) HP TPC-H FULL DISCLOSURE REPORT 160 © 2005 Hewlett-Packard Company. All rights reserved. End If ' Copyright Microsoft, 1999 Err.Raise vbObjectError + errModifyStepFailed, Next lngIndex ' All Rights Reserved _ ' gstrSource, _ Exit Sub ' LoadResString(errModifyStepFailed) ' PURPOSE: Implements an array of cStep ValidateErr: objects. End Sub LogErrors Errors ' Type-safe wrapper around Public Sub UpdateParentVersion(ByVal lngStepId mstrSource = mstrModuleName & cNodeCollections. As Long, _ "Validate" ' Also contains additional functions to ByVal strNewVersion As String, _ On Error GoTo 0 update parent version ByVal strOldVersion As String, _ Err.Raise vbObjectError + ' on substeps, validation functions, etc. ByVal intStepType As Integer) errValidateFailed, _ ' Contact: Reshma Tharamal mstrSource, ([email protected]) ' Does all the processing needed to update the LoadResString(errValidateFailed) ' parent version Option Explicit ' number on all the sub-steps for a given step End Sub ' It updates the parent version no in the database Public Sub CheckDupParamName(ByVal Private mcarrSteps As cNodeCollections for all cParamToValidate As cParameter) ' sub-steps of the passed in step id ' Used to indicate the source module name ' It also updates the parent version number on all Dim lngIndex As Long when errors sub-steps Dim cTempParam As cParameter ' are raised by this class ' in the array to the new version passed in Private mstrSource As String ' Check if the parameter name already Private Const mstrModuleName As String = Dim lngIndex As Long exists in the workspace "c ArrSteps." Dim cUpdateStep As cStep For lngIndex = 0 To mcarrParameters.Count - 1 Public Sub Unload(lngStepToDelete As Long) On Error GoTo UpdateParentVersionErr Set cTempParam = mcarrParameters(lngIndex) Dim lngDeleteElement As Long If intStepType <> gintManagerStep Then If cTempParam.WorkspaceId = Dim cUnloadStep As cStep ' Only a manager can have sub-steps - if the cParamToValidate.WorkspaceId And _ passed cTempParam.ParameterName = lngDeleteElement = ' in step is not a manager, exit cParamToValidate.ParameterName And _ QueryStepIndex(lngStepToDelete) Exit Sub cTempParam.ParameterId <> Set cUnloadStep = End If cParamToValidate.ParameterId And _ QueryStep(lngStepToDelete) cTempParam.IndOperation <> ' For all steps in the array DeleteOp Then ' First unload all iterators for the step For lngIndex = 0 To mcarrSteps.Count - 1 ShowError Call cUnloadStep.UnloadIterators errDuplicateParameterName Set cUpdateStep = mcarrSteps(lngIndex) On Error GoTo 0 ' Unload the step from the collection Err.Raise vbObjectError + Call mcarrSteps.Unload(lngDeleteElement) ' If the current step is a sub-step of the passed errDuplicateParameterName, _ in step mstrSource, End Sub If cUpdateStep.ParentStepId = lngStepId And LoadResString(errDuplicateParameterName Public Sub Modify(cModifiedStep As cStep) _ ) cUpdateStep.ParentVersionNo = End If Dim iAppend As Integer strOldVersion And _ Next lngIndex Dim sLabel As String Not cUpdateStep.ArchivedFlag Then

End Sub On Error GoTo ModifyErr ' Update the parent version number for the sub-step Private Sub Class_Initialize() iAppend = 0 ' in the array sLabel = cModifiedStep.StepLabel cUpdateStep.ParentVersionNo = 'bugmessage "cArrParameters: Initialize strNewVersion event - setting parameter count to 0" Validate cModifiedStep Set mcarrParameters = New ' Update the parent version number for the cNodeCollections Call mcarrSteps.Modify(cModifiedStep) sub-step ' in the array End Sub Exit Sub Call Modify(cUpdateStep)

ModifyErr: End If Private Sub Class_Terminate() ' If the error raised by the add function is due Next lngIndex to a duplication Set mcarrParameters = Nothing ' of the step label, then try to generate a Exit Sub unique label End Sub If Err.Number - vbObjectError = UpdateParentVersionErr: VERSION 1.0 CLASS errStepLabelUnique Then LogErrors Errors BEGIN iAppend = iAppend + 1 mstrSource = mstrModuleName & MultiUse = -1 'True cModifiedStep.StepLabel = sLabel & "UpdateParentVersion" END CStr(iAppend) On Error GoTo 0 Attribute VB_Name = "cArrSteps" ' Try to insert the step record again Err.Raise vbObjectError + Attribute VB_GlobalNameSpace = False Resume errUpdateParentVersionFailed, _ Attribute VB_Creatable = True End If mstrSource, _ Attribute VB_PredeclaredId = False Attribute VB_Exposed = False ' Log the error code raised by Visual Basic LoadResString(errUpdateParentVersionFailed) ' FILE: cArrSteps.cls Call LogErrors(Errors) ' Microsoft TPC-H Kit Ver. 1.00 On Error GoTo 0 End Sub HP TPC-H FULL DISCLOSURE REPORT 161 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Validate(cCheckStep As cStep) On Error GoTo AddErr End If ' Step validations that depend on other Next lngIndex steps in the collection iAppend = 0 sLabel = cStepToAdd.StepLabel End Sub Dim lngIndex As Long Private Sub CommitStep(ByVal cCommitStep As Set cStepToAdd.NodeDB = cStep, _ ' Ensure that the step label is unique in the mcarrSteps.NodeDB ByVal intIndex As Integer) workspace ' This procedure checks if any changes have been For lngIndex = 0 To mcarrSteps.Count - 1 ' Retrieve a unique step identifier made to the cStepToAdd.StepId = ' passed in Step. If so, it calls the step methods to ' If the current step is a sub-step of the cStepToAdd.NextStepId commit passed in step ' the changes. If mcarrSteps(lngIndex).WorkspaceId Validate cStepToAdd = cCheckStep.WorkspaceId And _ ' First commit all changes to the iterator records mcarrSteps(lngIndex).StepLabel = ' Call a procedure to add the step record for cCheckStep.StepLabel And _ Call mcarrSteps.Add(cStepToAdd) ' the step mcarrSteps(lngIndex).StepId <> cCommitStep.SaveIterators cCheckStep.StepId And _ ' Call a procedure to add all iterators for the step Call mcarrSteps.Commit(cCommitStep, intIndex) mcarrSteps(lngIndex).IndOperation <> cStepToAdd.AddAllIterators DeleteOp Then End Sub On Error GoTo 0 Exit Sub Public Sub Delete(lngStepToDelete As Long) Err.Raise vbObjectError + errStepLabelUnique, _ AddErr: Dim lngDeleteElement As Long mstrModuleName & ' If the error raised by the add function is due "Validate", _ to a duplication lngDeleteElement = ' of the step label, then try to generate a QueryStepIndex(lngStepToDelete) LoadResString(errStepLabelUnique) unique label Call mcarrSteps.Delete(lngDeleteElement) End If If Err.Number - vbObjectError = Next lngIndex errStepLabelUnique Then End Sub iAppend = iAppend + 1 Public Function QueryStepIndex(lngStepId As End Sub cStepToAdd.StepLabel = sLabel & Long) As Long CStr(iAppend) Public Sub ValidateStep(cCheckStep As ' Try to insert the step record again Dim lngIndex As Long cStep) Resume End If ' Find the element in the array that corresponds to On Error GoTo ValidateStepErr the ' Log the error code raised by Visual Basic ' passed in step id - note that while there will be 'Public wrapper for Validate function (2 Call LogErrors(Errors) multiple many Validates) On Error GoTo 0 ' versions of a step in the database, only one Call Validate(cCheckStep) Err.Raise vbObjectError + version will errInsertStepFailed, _ ' be currently loaded in the array - meaning that Exit Sub gstrSource, _ the stepid LoadResString(errInsertStepFailed) ' is enough to uniquely identify a step ValidateStepErr: For lngIndex = 0 To mcarrSteps.Count - 1 ShowError errStepLabelUnique End Sub If mcarrSteps(lngIndex).StepId = lngStepId On Error GoTo 0 Public Sub Load(cStepToLoad As cStep) Then Err.Raise vbObjectError + QueryStepIndex = lngIndex errValidateFailed, _ Call mcarrSteps.Load(cStepToLoad) Exit Function gstrSource, _ End If LoadResString(errValidateFailed) End Sub Next lngIndex End Sub Public Sub SaveStepsInWsp(ByVal lngWorkspace As Long) ' Raise error that step has not been found Private Sub Class_Initialize() ' Calls a procedure to commit all changes to On Error GoTo 0 the steps Err.Raise vbObjectError + errStepNotFound, BugMessage "cArrSteps: Initialize event - ' in the passed in workspace. mstrSource, _ setting step count to 0" LoadResString(errStepNotFound) Set mcarrSteps = New cNodeCollections Dim lngIndex As Integer End Function End Sub ' Find all steps in the array with a matching workspace id Public Function QueryStep(ByVal lngStepId As Private Sub Class_Terminate() ' It is important to step in reverse order Long) As cStep through the array, BugMessage "cArrSteps: Terminate event ' since we delete step records sometimes! ' Populates the passed in cStep object with the triggered" For lngIndex = mcarrSteps.Count - 1 To 0 property Set mcarrSteps = Nothing Step -1 ' values corresponding to the Step Identifier, If mcarrSteps(lngIndex).WorkspaceId = lngStepId End Sub lngWorkspace Then Dim lngQueryElement As Integer Public Sub Add(ByVal cStepToAdd As ' Call a procedure to commit all cStep) changes to the lngQueryElement = QueryStepIndex(lngStepId) ' Step record, if any Dim iAppend As Integer Call ' Initialize the passed in step object to the queried Dim sLabel As String CommitStep(mcarrSteps(lngIndex), lngIndex) step HP TPC-H FULL DISCLOSURE REPORT 162 © 2005 Hewlett-Packard Company. All rights reserved. Set QueryStep = ' match the passed in step '------mcarrSteps(lngQueryElement) If mcarrSteps(intIndex).ParentStepId = ------lngStepId And _ End Function Option Explicit Public Property Get Item(ByVal Position As mcarrSteps(intIndex).ParentVersionNo = Long) As cStep strVersionNo And _ ' Used to indicate the source module name when Attribute Item.VB_UserMemId = 0 errors mcarrSteps(intIndex).IndOperation <> ' are raised by this class ' Returns the element at the passed in DeleteOp Then Private mstrSource As String position in the array Private Const mstrModuleName As String = If Position >= 0 And Position < ' Increase the array dimension and "c AsyncShell." mcarrSteps.Count Then add the step Set Item = mcarrSteps(Position) ' to it Public Event Terminated() Else ReDim Preserve On Error GoTo 0 cSubSteps(lngStepCount) Private WithEvents moTimer As cTimerSM Err.Raise vbObjectError + Set cSubSteps(lngStepCount) = Attribute moTimer.VB_VarHelpID = -1 errItemDoesNotExist, mstrSource, _ mcarrSteps(intIndex) Private proc As PROCESS_INFORMATION lngStepCount = lngStepCount + 1 Private mfShelling As Boolean LoadResString(errItemDoesNotExist) End If End If Next intIndex '------End Property ------Public Property Set Item(ByVal Position As End If 'Initialization and cleanup: Long, _ ByVal cStepRec As cStep) ' Set the return value of the function to the Private Sub Class_Initialize() array of Set moTimer = New cTimerSM ' Returns the element at the passed in ' Steps that has been built above End Sub position in the array If lngStepCount = 0 Then If Position >= 0 And Position < SubSteps = Empty Private Sub Class_Terminate() mcarrSteps.Count Then Else If mfShelling Then CloseHandle proc.hProcess Set mcarrSteps(Position) = cStepRec SubSteps = cSubSteps() End Sub Else End If On Error GoTo 0 '------Err.Raise vbObjectError + Exit Function ------errItemDoesNotExist, mstrSource, _ 'Shelling: SubStepsErr: LoadResString(errItemDoesNotExist) LogErrors Errors Public Sub Shell(CommandLine As String, End If mstrSource = mstrModuleName & Optional PollingInterval As Long = 1000) "SubSteps" Dim Start As STARTUPINFO End Property On Error GoTo 0 Public Property Set StepDB(vdata As Err.Raise vbObjectError + If mfShelling Then Database) errSubStepsFailed, _ On Error GoTo 0 mstrSource, _ Err.Raise vbObjectError + errInstanceInUse, _ Set mcarrSteps.NodeDB = vdata LoadResString(errSubStepsFailed) mstrSource, _ LoadResString(errInstanceInUse) End Property End Function End If Public Function SubSteps(ByVal lngStepId mfShelling = True As Long, _ Public Property Get StepCount() As Integer ByVal strVersionNo As String) As ' Initialize the STARTUPINFO structure: Variant StepCount = mcarrSteps.Count Start.cb = Len(Start) Start.dwFlags = ' Returns a variant containing an array of End Property STARTF_USESHOWWINDOW all the substeps Start.wShowWindow = ' for the passed in step VERSION 1.0 CLASS SW_SHOWMINNOACTIVE BEGIN Dim intIndex As Integer MultiUse = -1 'True ' Start the shelled application: Dim cSubSteps() As cStep END CreateProcessA 0&, CommandLine, 0&, 0&, Dim lngStepCount As Long Attribute VB_Name = "cAsyncShell" 1&, _ Dim cQueryStep As cStep Attribute VB_GlobalNameSpace = False NORMAL_PRIORITY_CLASS, 0&, 0&, Attribute VB_Creatable = True Start, proc On Error GoTo SubStepsErr Attribute VB_PredeclaredId = False Attribute VB_Exposed = False With moTimer lngStepCount = 0 '------If PollingInterval > 0 Then ------.Interval = PollingInterval Set cQueryStep = QueryStep(lngStepId) ' Copyright © 1997 Microsoft Corporation. All Else rights reserved. .Interval = 1000 ' Only a manager can have sub-steps ' End If If cQueryStep.StepType = ' You have a royalty-free right to use, modify, .Enabled = True gintManagerStep Then reproduce and distribute the End With ' Sample Application Files (and/or any End Sub ' For each element in the Steps array modified version) in any way you find '------For intIndex = 0 To mcarrSteps.Count - ' useful, provided that you agree that Microsoft ------1 has no warranty, obligations or 'Aborting: ' Check if the parent step id and ' liability for any Sample Application Files. Public Sub Abort() parent version number Dim nCode As Long HP TPC-H FULL DISCLOSURE REPORT 163 © 2005 Hewlett-Packard Company. All rights reserved. ' Dim X As Integer ' Dim ReturnVal As Integer GetExitCodeProcess proc.hProcess, nCode For Each prmParam In qyExec.Parameters If nCode <> STILL_ACTIVE Then Select Case prmParam.Name On Error GoTo AbortErr CloseHandle proc.hProcess Case "[w_id]" moTimer.Enabled = False prmParam.Value = WorkspaceId If Not mfShelling Then mfShelling = False Call WriteError(errProgramError, RaiseEvent Terminated Case "[c_id]" mstrSource) End If prmParam.Value = ConnNameId Else End Sub ' If IsWindow(proc.hProcess) = False VERSION 1.0 CLASS Case "[c_name]" Then Exit Sub BEGIN prmParam.Value = ConnName ' MultiUse = -1 'True ' If (GetWindowLong(proc.hProcess, END Case "[c_str]" GWL_STYLE) And WS_DISABLED) Attribute VB_Name = "cConnDtl" prmParam.Value = ConnectionString Then Exit Sub Attribute VB_GlobalNameSpace = False ' Attribute VB_Creatable = True Case "[c_type]" ' If IsWindow(proc.hProcess) Then Attribute VB_PredeclaredId = False prmParam.Value = ConnType ' If Not Attribute VB_Exposed = False (GetWindowLong(proc.hProcess, ' FILE: cConnDtl.cls Case Else GWL_STYLE) And WS_DISABLED) ' Microsoft TPC-H Kit Ver. 1.00 ' Write the parameter name that is faulty Then ' Copyright Microsoft, 1999 WriteError errInvalidParameter, ' X = PostMessage(proc.hProcess, ' All Rights Reserved mstrSource, prmParam.Name WM_CANCELMODE, 0, 0&) ' On Error GoTo 0 ' X = PostMessage(proc.hProcess, ' Err.Raise errInvalidParameter, WM_CLOSE, 0, 0&) ' PURPOSE: Encapsulates the properties mstrModuleName & "AssignParameters", _ ' End If and methods of a connection. LoadResString(errInvalidParameter) ' End If ' Contains functions to insert, update End Select and delete Next prmParam If TerminateProcess(proc.hProcess, ' connection_dtls records from the 0&) = 0 Then database. Exit Sub Debug.Print "Unable to terminate ' Contact: Reshma Tharamal process: " & proc.hProcess ([email protected]) AssignParametersErr: Call ' WriteError(errTerminateProcessFailed, Option Explicit Call LogErrors(Errors) mstrSource, _ Option Base 0 On Error GoTo 0 ApiError(GetLastError())) Err.Raise vbObjectError + Else ' Local variable(s) to hold property value(s) errAssignParametersFailed, _ ' Should always come here! Public WorkspaceId As Long mstrModuleName & "AssignParameters", GetExitCodeProcess proc.hProcess, Public ConnNameId As Long LoadResString(errAssignParametersFailed) nCode Public ConnName As String If nCode = STILL_ACTIVE Then Public ConnectionString As String End Sub ' Write an error and close the Public ConnType As ConnectionType handles to the Public Position As Long Public Function Clone() As cConnDtl ' process anyway Public NodeDB As Database Call ' Creates a copy of a given Connection WriteError(errTerminateProcessFailed, Private mintOperation As Operation mstrSource) Dim cCloneConn As cConnDtl End If ' Used to indicate the source module name End If when errors On Error GoTo CloneErr ' are raised by this class ' Close all open handles to the shelled Private mstrSource As String Set cCloneConn = New cConnDtl process, even Private Const mstrModuleName As String = ' if any of the above calls error out "c ConnDtl." ' Copy all the Connection properties to the newly CloseHandle proc.hProcess created Connection moTimer.Enabled = False ' The cSequence class is used to generate cCloneConn.WorkspaceId = WorkspaceId mfShelling = False unique Connection identifiers cCloneConn.ConnNameId = ConnNameId RaiseEvent Terminated Private mConnectionSeq As cSequence cCloneConn.ConnName = ConnName cCloneConn.ConnectionString = End If ' The StringSM class is used to carry out string ConnectionString operations cCloneConn.ConnType = ConnType Exit Sub Private mFieldValue As cStringSM cCloneConn.IndOperation = mintOperation cCloneConn.Position = Position AbortErr: Private Sub AssignParameters(qyExec As Call LogErrors(Errors) DAO.QueryDef) ' And set the return value to the newly created mstrSource = mstrModuleName & ' Assigns values to the parameters in the Connection "Abort" querydef object Set Clone = cCloneConn On Error GoTo 0 ' The parameter names are cryptic to Set cCloneConn = Nothing Err.Raise vbObjectError + differentiate them from the field names. errProgramError, _ ' When the parameter names are the same as Exit Function mstrSource, _ the field names, parameters in the where LoadResString(errProgramError) ' clause do not get created. CloneErr: LogErrors Errors End Sub Dim prmParam As DAO.Parameter mstrSource = mstrModuleName & "Clone" Private Sub moTimer_Timer() On Error GoTo 0 Dim nCode As Long On Error GoTo AssignParametersErr HP TPC-H FULL DISCLOSURE REPORT 164 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + Select Case vdata qy.Execute dbFailOnError errCloneFailed, mstrSource, Case QueryOp, InsertOp, UpdateOp, qy.Close LoadResString(errCloneFailed) DeleteOp mintOperation = vdata Exit Sub End Function Private Sub CheckDupConnectionName() Case Else AddErr: ' Check if the Connection name already BugAssert True exists in the workspace End Select Call LogErrors(Errors) On Error GoTo 0 Dim rstConnection As Recordset End Property Err.Raise vbObjectError + errInsertFailed, _ Dim strSql As String Public Sub Validate() mstrModuleName & "Add", Dim qy As DAO.QueryDef ' Each distinct object will have a Validate LoadResString(errInsertFailed) method which On Error GoTo ' will check if the class properties are valid. End Sub CheckDupConnectionNameErr This method Public Sub Delete() mstrSource = mstrModuleName & ' will be used to check interdependant "CheckDupConnectionName" properties that Dim strDelete As String ' cannot be validated by the let procedures. Dim qy As DAO.QueryDef ' Create a recordset object to retrieve the ' It should be called by the add and modify count of all Connections methods of the class On Error GoTo DeleteErr ' for the workspace with the same name strSql = "Select count(*) as If ConnName = gstrEmptyString Then strDelete = "delete from " & Connection_count " & _ TBL_CONNECTION_DTLS & _ " from "& ShowError " where " & FLD_ID_CONN_NAME & " = TBL_CONNECTION_DTLS & _ errConnectionNameMandatory [c_id]" " where " & FLD_ID_WORKSPACE On Error GoTo 0 Set qy = & " = [w_id]" & _ ' Propogate this error back to the caller dbsAttTool.CreateQueryDef(gstrEmptyString, " and " & Err.Raise vbObjectError + strDelete) FLD_CONN_DTL_CONNECTION_NAM errConnectionNameMandatory, _ E & " = [c_name]" & _ mstrSource, Call AssignParameters(qy) " and " & FLD_ID_CONN_NAME & " LoadResString(errConnectionNameMandatory qy.Execute dbFailOnError <> [c_id]" ) End If qy.Close Set qy = dbsAttTool.CreateQueryDef(gstrEmptyStrin ' Raise an error if the Connection name Exit Sub g, strSql) already exists in the workspace Call AssignParameters(qy) Call CheckDupConnectionName DeleteErr: LogErrors Errors Set rstConnection = End Sub On Error GoTo 0 qy.OpenRecordset(dbOpenForwardOnly) Public Sub Add() Err.Raise vbObjectError + errDeleteFailed, _ mstrModuleName & "Delete", If rstConnection![Connection_count] > 0 Dim strInsert As String LoadResString(errDeleteFailed) Then Dim qy As DAO.QueryDef rstConnection.Close End Sub qy.Close On Error GoTo AddErr ShowError errDupConnDtlName Public Sub Modify() On Error GoTo 0 ' Validate the record before trying to insert Err.Raise vbObjectError + the record Dim strUpdate As String errDupConnDtlName, _ Call Validate Dim qy As QueryDef mstrSource, LoadResString(errDupConnDtlName) ' Create a temporary querydef object On Error GoTo ModifyErr End If strInsert = "insert into "& TBL_CONNECTION_DTLS & _ ' Validate the updated values before trying to rstConnection.Close "( " & FLD_ID_WORKSPACE & _ modify the db qy.Close ", " & FLD_ID_CONN_NAME & _ Call Validate ", " & Exit Sub FLD_CONN_DTL_CONNECTION_NAME ' Create a temporary querydef object with the & _ modify string CheckDupConnectionNameErr: ", " & strUpdate = "update " & LogErrors Errors FLD_CONN_DTL_CONNECTION_STRING TBL_CONNECTION_DTLS & _ mstrSource = mstrModuleName & & _ " set " & FLD_ID_WORKSPACE & " = "CheckDupConnectionName" ", " & [w_id], " & _ On Error GoTo 0 FLD_CONN_DTL_CONNECTION_TYPE & Err.Raise vbObjectError + " ) " & _ FLD_CONN_DTL_CONNECTION_NAME & " = errProgramError, _ " values ( [w_id], [c_id], " & _ [c_name], " & _ mstrSource, " [c_name], [c_str], [c_type] ) " LoadResString(errProgramError) FLD_CONN_DTL_CONNECTION_STRING & " Set qy = = [c_str], " & _ End Sub dbsAttTool.CreateQueryDef(gstrEmptyString, FLD_CONN_DTL_CONNECTION_TYPE Public Property Let IndOperation(ByVal strInsert) & " = [c_type] " & _ vdata As Operation) " where " & FLD_ID_CONN_NAME & " = ' Call a procedure to assign the Connection [c_id]" ' The valid operations are define in the values Set qy = cOperations Call AssignParameters(qy) dbsAttTool.CreateQueryDef(gstrEmptyString, ' class. Check if the operation is valid strUpdate) HP TPC-H FULL DISCLOSURE REPORT 165 © 2005 Hewlett-Packard Company. All rights reserved.

' Call a procedure to assign the End Sub Dim lngDeleteElement As Long Connection values to the VERSION 1.0 CLASS ' querydef object BEGIN lngDeleteElement = QueryIndex(lConnNameId) Call AssignParameters(qy) MultiUse = -1 'True qy.Execute dbFailOnError END Call mcarrConnDtls.Unload(lngDeleteElement) Attribute VB_Name = "cConnDtls" qy.Close Attribute VB_GlobalNameSpace = False End Sub Attribute VB_Creatable = True Exit Sub Attribute VB_PredeclaredId = False Public Sub SaveConnDtlsInWsp(ByVal Attribute VB_Exposed = False lngWorkspace As Long) ModifyErr: ' FILE: cConnDtls.cls ' Call a procedure to save all connection details ' Microsoft TPC-H Kit Ver. 1.00 records for the workspace Call LogErrors(Errors) ' Copyright Microsoft, 1999 Call mcarrConnDtls.Save(lngWorkspace) On Error GoTo 0 ' All Rights Reserved Err.Raise vbObjectError + ' End Sub errModifyFailed, _ ' Public Function GetConnectionDtl(ByVal mstrModuleName & "Modify", ' PURPOSE: Implements an array of lngWorkspace As Long, _ LoadResString(errModifyFailed) cConnDtl objects. ByVal strConnectionName As String) As ' Type-safe wrapper around cConnDtl End Sub cNodeCollections. ' Returns the connection dtl for the passed in Public Property Get NextIdentifier() As ' Also contains additional functions to connection name Long determine the connection ' string value, validation functions, etc. Dim lngIndex As Long Dim lngNextId As Long ' Contact: Reshma Tharamal ([email protected]) ' Find all parameters in the array with a matching On Error GoTo NextIdentifierErr ' workspace id Option Explicit For lngIndex = 0 To mcarrConnDtls.Count - 1 ' Retrieve the next identifier using the If mcarrConnDtls(lngIndex).WorkspaceId = sequence class Private mcarrConnDtls As cNodeCollections lngWorkspace And _ Set mConnectionSeq = New cSequence mcarrConnDtls(lngIndex).ConnName = Set mConnectionSeq.IdDatabase = ' Used to indicate the source module name strConnectionName Then dbsAttTool when errors mConnectionSeq.IdentifierColumn = ' are raised by this class Set GetConnectionDtl = FLD_ID_CONN_NAME Private mstrSource As String mcarrConnDtls(lngIndex) lngNextId = mConnectionSeq.Identifier Private Const mstrModuleName As String = Exit For Set mConnectionSeq = Nothing "c ConnDtls." End If Next lngIndex NextIdentifier = lngNextId Public Property Set ConnDb(vdata As Exit Property Database) If lngIndex > mcarrConnDtls.Count - 1 Then ' The parameter has not been defined for the NextIdentifierErr: Set mcarrConnDtls.NodeDB = vdata workspace LogErrors Errors ' Raise an error On Error GoTo 0 End Property On Error GoTo 0 Err.Raise vbObjectError + errIdGetFailed, Public Sub Modify(cModifiedConn As Err.Raise vbObjectError + _ cConnDtl) errConnNameInvalid, mstrModuleName & mstrModuleName & "NextIdentifier", "GetConnection", _ LoadResString(errIdGetFailed) ' First check if the parameter record is valid LoadResString(errConnNameInvalid) Call CheckDupConnName(cModifiedConn) End If End Property Public Property Get IndOperation() As Call End Function Operation mcarrConnDtls.Modify(cModifiedConn) Public Sub Delete(lConnNameId As Long) ' Delete the passed in parameter IndOperation = mintOperation End Sub Public Sub Load(ByRef cConnToAdd As Dim lngDeleteElement As Long End Property cConnDtl) lngDeleteElement = QueryIndex(lConnNameId) Private Sub Class_Initialize() Call mcarrConnDtls.Load(cConnToAdd) Call mcarrConnDtls.Delete(lngDeleteElement)

Set mFieldValue = New cStringSM End Sub End Sub Public Sub Add(ByRef cConnToAdd As Private Function QueryIndex(lConnNameId As ' Initialize the operation indicator variable cConnDtl) Long) As Long to Query ' It will be modified later by the collection ' First check if the record is valid Dim lngIndex As Long class when Call Validate(cConnToAdd) ' inserts, updates or deletes are performed ' Find the matching parameter record in the array mintOperation = QueryOp ' Retrieve a unique identifier For lngIndex = 0 To mcarrConnDtls.Count - 1 cConnToAdd.ConnNameId = If mcarrConnDtls(lngIndex).ConnNameId = ConnType = giDefaultConnType cConnToAdd.NextIdentifier lConnNameId And _ mcarrConnDtls(lngIndex).IndOperation End Sub Call mcarrConnDtls.Add(cConnToAdd) <> DeleteOp Then QueryIndex = lngIndex Private Sub Class_Terminate() End Sub Exit Function End If Set mFieldValue = Nothing Public Sub Unload(lConnNameId As Long) Next lngIndex HP TPC-H FULL DISCLOSURE REPORT 166 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub CheckDupConnName(ByVal Public Position As Long ' Raise error that parameter has not been cConnToValidate As cConnDtl) Public NoCountDisplay As Boolean found Public NoExecute As Boolean On Error GoTo 0 Dim lngIndex As Long Public ParseQueryOnly As Boolean Err.Raise vbObjectError + Dim cTempParam As cConnDtl Public QuotedIdentifiers As Boolean errQueryIndexFailed, Public AnsiNulls As Boolean "c ArrParameters.QueryIndex", _ ' Check if the parameter name already exists Public ShowQueryPlan As Boolean LoadResString(errQueryIndexFailed) in the workspace Public ShowStatsTime As Boolean For lngIndex = 0 To mcarrConnDtls.Count - Public ShowStatsIO As Boolean End Function 1 Public ParseOdbcMsg As Boolean Set cTempParam = Public RowCount As Long Public Function mcarrConnDtls(lngIndex) Public TsqlBatchSeparator As String QueryConnDtl(lConnNameId As Long) As If cTempParam.WorkspaceId = Public QueryTimeOut As Long cConnDtl cConnToValidate.WorkspaceId And _ Public ServerLanguage As String cTempParam.ConnName = Public CharacterTranslation As Boolean Dim lngQueryElement As Long cConnToValidate.ConnName And _ Public RegionalSettings As Boolean cTempParam.ConnNameId <> lngQueryElement = cConnToValidate.ConnNameId And _ Private mstrConnectionName As String QueryIndex(lConnNameId) cTempParam.IndOperation <> Private mintOperation As Operation DeleteOp Then ' Return the queried connection object ShowError errDupConnDtlName ' Used to indicate the source module name when Set QueryConnDtl = On Error GoTo 0 errors mcarrConnDtls(lngQueryElement) Err.Raise vbObjectError + ' are raised by this class errDupConnDtlName, _ Private mstrSource As String End Function mstrSource, Private Const mstrModuleName As String = Public Property Get Count() As Long LoadResString(errDupConnDtlName) "c Connection." End If Count = mcarrConnDtls.Count Next lngIndex ' The cSequence class is used to generate unique Connection identifiers End Property End Sub Private mConnectionSeq As cSequence Public Property Get Item(lngIndex As Long) As cConnDtl Private Sub Class_Initialize() ' The StringSM class is used to carry out string Attribute Item.VB_UserMemId = 0 operations Set mcarrConnDtls = New cNodeCollections Private mFieldValue As cStringSM Set Item = mcarrConnDtls(lngIndex) End Sub Private Sub AssignParameters(qyExec As End Property DAO.QueryDef) Private Sub Class_Terminate() ' Assigns values to the parameters in the querydef Private Sub Validate(ByVal object cConnToValidate As cConnDtl) Set mcarrConnDtls = Nothing ' The parameter names are cryptic to differentiate ' This procedure is necessary since the them from the field names. class cannot validate End Sub ' When the parameter names are the same as the ' all the connection_dtl properties on it's VERSION 1.0 CLASS field names, parameters in the where own. This is 'coz we BEGIN ' clause do not get created. ' might have created new connections in MultiUse = -1 'True the workspace, but not END Dim prmParam As DAO.Parameter ' saved them to the database yet - hence Attribute VB_Name = "cConnection" the duplicate check Attribute VB_GlobalNameSpace = False On Error GoTo AssignParametersErr ' has to be repeated in the array Attribute VB_Creatable = True Attribute VB_PredeclaredId = False For Each prmParam In qyExec.Parameters Dim lngIndex As Long Attribute VB_Exposed = False Select Case prmParam.Name Dim cTempParam As cConnDtl ' FILE: cConnection.cls Case "[w_id]" ' Microsoft TPC-H Kit Ver. 1.00 prmParam.Value = WorkspaceId ' Check if the parameter name already ' Copyright Microsoft, 1999 exists in the workspace ' All Rights Reserved Case "[c_id]" For lngIndex = 0 To ' prmParam.Value = ConnectionId mcarrConnDtls.Count - 1 ' Set cTempParam = ' PURPOSE: Encapsulates the properties Case "[c_name]" mcarrConnDtls(lngIndex) and methods of a connection string. prmParam.Value = mstrConnectionName If cTempParam.WorkspaceId = ' Contains functions to insert, update cConnToValidate.WorkspaceId And _ and delete Case "[c_value]" cTempParam.ConnName = ' workspace_connections records from prmParam.Value = ConnectionValue cConnToValidate.ConnName And _ the database. cTempParam.IndOperation <> ' Contact: Reshma Tharamal Case "[desc]" DeleteOp Then ([email protected]) prmParam.Value = Description On Error GoTo 0 ' Err.Raise vbObjectError + Option Explicit Case "[no_count]" errDupConnDtlName, _ Option Base 0 prmParam.Value = NoCountDisplay mstrSource, LoadResString(errDupConnDtlName) ' Local variable(s) to hold property value(s) Case "[no_exec]" End If Public WorkspaceId As Long prmParam.Value = NoExecute Next lngIndex Public ConnectionId As Long Public ConnectionValue As String Case "[parse_only]" End Sub Public Description As String prmParam.Value = ParseQueryOnly Public NodeDB As Database HP TPC-H FULL DISCLOSURE REPORT 167 © 2005 Hewlett-Packard Company. All rights reserved. Case "[quoted_id]" ' for the workspace with the same name prmParam.Value = On Error GoTo CloneErr strSql = "Select count(*) as Connection_count " QuotedIdentifiers & _ Set cCloneConn = New cConnection " from workspace_connections " & _ Case "[a_nulls]" " where workspace_id = [w_id]" & _ prmParam.Value = AnsiNulls ' Copy all the Connection properties to the " and connection_name = [c_name]" & _ newly " and connection_id <> [c_id]" Case "[show_qp]" ' created Connection prmParam.Value = Set cCloneConn.NodeDB = NodeDB Set qy = ShowQueryPlan cCloneConn.WorkspaceId = WorkspaceId NodeDB.CreateQueryDef(gstrEmptyString, strSql) cCloneConn.ConnectionId = ConnectionId Call AssignParameters(qy) Case "[stats_tm]" cCloneConn.ConnectionName = prmParam.Value = mstrConnectionName Set rstConnection = ShowStatsTime cCloneConn.ConnectionValue = qy.OpenRecordset(dbOpenForwardOnly) ConnectionValue Case "[stats_io]" cCloneConn.Description = Description If rstConnection![Connection_count] > 0 Then prmParam.Value = ShowStatsIO cCloneConn.IndOperation = mintOperation rstConnection.Close cCloneConn.Position = Position qy.Close Case "[parse_odbc]" cCloneConn.NoCountDisplay = ShowError errDuplicateConnectionName prmParam.Value = ParseOdbcMsg NoCountDisplay On Error GoTo 0 cCloneConn.NoExecute = NoExecute Err.Raise vbObjectError + Case "[row_cnt]" cCloneConn.ParseQueryOnly = errDuplicateConnectionName, _ prmParam.Value = RowCount ParseQueryOnly mstrSource, cCloneConn.QuotedIdentifiers = LoadResString(errDuplicateConnectionName) Case "[batch_sep]" QuotedIdentifiers End If prmParam.Value = cCloneConn.AnsiNulls = AnsiNulls TsqlBatchSeparator cCloneConn.ShowQueryPlan = rstConnection.Close ShowQueryPlan qy.Close Case "[qry_tmout]" cCloneConn.ShowStatsTime = prmParam.Value = QueryTimeOut ShowStatsTime Exit Sub cCloneConn.ShowStatsIO = ShowStatsIO Case "[lang]" cCloneConn.ParseOdbcMsg = CheckDupConnectionNameErr: prmParam.Value = ParseOdbcMsg LogErrors Errors ServerLanguage cCloneConn.RowCount = RowCount mstrSource = mstrModuleName & cCloneConn.TsqlBatchSeparator = "CheckDupConnectionName" Case "[char_trans]" TsqlBatchSeparator On Error GoTo 0 prmParam.Value = cCloneConn.QueryTimeOut = Err.Raise vbObjectError + errProgramError, _ CharacterTranslation QueryTimeOut mstrSource, LoadResString(errProgramError) cCloneConn.ServerLanguage = Case "[reg_settings]" ServerLanguage End Sub prmParam.Value = cCloneConn.CharacterTranslation = Private Sub CheckDB() RegionalSettings CharacterTranslation ' Check if the database object has been initialized cCloneConn.RegionalSettings = Case Else RegionalSettings If NodeDB Is Nothing Then ' Write the parameter name that is On Error GoTo 0 faulty ' And set the return value to the newly Err.Raise vbObjectError + errInvalidDB, _ WriteError errInvalidParameter, created Connection mstrModuleName & "CheckDB", mstrSource, prmParam.Name Set Clone = cCloneConn LoadResString(errInvalidDB) On Error GoTo 0 Set cCloneConn = Nothing End If Err.Raise errInvalidParameter, mstrModuleName & "AssignParameters", _ Exit Function End Sub Public Property Let ConnectionName(vdata As LoadResString(errInvalidParameter) CloneErr: String) End Select LogErrors Errors Next prmParam mstrSource = mstrModuleName & "Clone" If vdata = gstrEmptyString Then On Error GoTo 0 Exit Sub Err.Raise vbObjectError + errCloneFailed, ShowError errConnectionNameMandatory mstrSource, LoadResString(errCloneFailed) On Error GoTo 0 AssignParametersErr: ' Propogate this error back to the caller End Function Err.Raise vbObjectError + Call LogErrors(Errors) Private Sub CheckDupConnectionName() errConnectionNameMandatory, _ On Error GoTo 0 ' Check if the Connection name already mstrSource, Err.Raise vbObjectError + exists in the workspace LoadResString(errConnectionNameMandatory) errAssignParametersFailed, _ Else mstrModuleName & Dim rstConnection As Recordset mstrConnectionName = vdata "AssignParameters", Dim strSql As String End If LoadResString(errAssignParametersFailed) Dim qy As DAO.QueryDef End Property End Sub On Error GoTo CheckDupConnectionNameErr Public Property Let IndOperation(ByVal vdata As Public Function Clone() As cConnection mstrSource = mstrModuleName & Operation) "CheckDupConnectionName" ' Creates a copy of a given Connection ' The valid operations are define in the ' Create a recordset object to retrieve the cOperations Dim cCloneConn As cConnection count of all Connections ' class. Check if the operation is valid HP TPC-H FULL DISCLOSURE REPORT 168 © 2005 Hewlett-Packard Company. All rights reserved. Select Case vdata Set qy = "no_execute = [no_exec], " & _ Case QueryOp, InsertOp, UpdateOp, NodeDB.CreateQueryDef(gstrEmptyString, "parse_query_only = [parse_only], " & _ DeleteOp strInsert) "ANSI_quoted_identifiers = [quoted_id], " mintOperation = vdata & _ ' Call a procedure to assign the Connection "ANSI_nulls = [a_nulls], " & _ Case Else values "s how_query_plan = [show_qp], " & _ BugAssert True Call AssignParameters(qy) "s how_stats_time = [stats_tm], " & _ End Select "s how_stats_io = [stats_io], " & _ qy.Execute dbFailOnError "parse_odbc_msg_prefixes = [parse_odbc], End Property qy.Close " & _ Public Sub Validate() "r ow_count = [row_cnt], " & _ ' Each distinct object will have a Validate Exit Sub "t sql_batch_separator = [batch_sep], " & _ method which "query_time_out = [qry_tmout], " & _ ' will check if the class properties are AddErr: "s erver_language = [lang], " & _ valid. This method "c haracter_translation = [char_trans], " & _ ' will be used to check interdependant Call LogErrors(Errors) "r egional_settings = [reg_settings] " & _ properties that On Error GoTo 0 " where connection_id = [c_id]" ' cannot be validated by the let Err.Raise vbObjectError + errInsertFailed, _ Set qy = procedures. mstrModuleName & "Add", NodeDB.CreateQueryDef(gstrEmptyString, ' It should be called by the add and LoadResString(errInsertFailed) strUpdate) modify methods of the class End Sub ' Call a procedure to assign the Connection values ' Check if the db object is valid Public Sub Delete() to the Call CheckDB ' querydef object Dim strDelete As String Call AssignParameters(qy) ' Raise an error if the Connection name Dim qy As DAO.QueryDef qy.Execute dbFailOnError already exists in the workspace Call CheckDupConnectionName On Error GoTo DeleteErr qy.Close

End Sub ' Check if the db object is valid Exit Sub Public Sub Add() Call CheckDB ModifyErr: Dim strInsert As String strDelete = "delete from Dim qy As DAO.QueryDef workspace_connections " & _ Call LogErrors(Errors) " where connection_id = [c_id]" On Error GoTo 0 On Error GoTo AddErr Set qy = Err.Raise vbObjectError + errModifyFailed, _ NodeDB.CreateQueryDef(gstrEmptyString, mstrModuleName & "Modify", ' Validate the record before trying to strDelete) LoadResString(errModifyFailed) insert the record Call Validate Call AssignParameters(qy) End Sub qy.Execute dbFailOnError Public Property Get ConnectionName() As String ' Create a temporary querydef object strInsert = "insert into qy.Close ConnectionName = mstrConnectionName workspace_connections " & _ "( workspace_id, connection_id, " & Exit Sub End Property _ "c onnection_name, DeleteErr: Public Property Get NextIdentifier() As Long connection_value, " & _ LogErrors Errors "description, no_count_display, " & On Error GoTo 0 Dim lngNextId As Long _ Err.Raise vbObjectError + errDeleteFailed, _ "no_execute, parse_query_only, " & mstrModuleName & "Delete", On Error GoTo NextIdentifierErr _ LoadResString(errDeleteFailed) "ANSI_quoted_identifiers, ' First check if the database object is valid ANSI_nulls, " & _ End Sub Call CheckDB "s how_query_plan, show_stats_time, " & _ Public Sub Modify() ' Retrieve the next identifier using the sequence "s how_stats_io, class parse_odbc_msg_prefixes, " & _ Dim strUpdate As String Set mConnectionSeq = New cSequence "row_count, tsql_batch_separator, " Dim qy As QueryDef Set mConnectionSeq.IdDatabase = NodeDB & _ mConnectionSeq.IdentifierColumn = "query_time_out, server_language, " On Error GoTo ModifyErr "c onnection_id" & _ lngNextId = mConnectionSeq.Identifier "c haracter_translation, ' Validate the updated values before trying to Set mConnectionSeq = Nothing regional_settings ) " & _ modify the db " values ( [w_id], [c_id], [c_name], Call Validate NextIdentifier = lngNextId [c_value], " & _ Exit Property " [desc], [no_count], [no_exec], ' Create a temporary querydef object with [parse_only], " & _ the modify string NextIdentifierErr: " [quoted_id], [a_nulls], [show_qp], strUpdate = "update workspace_connections LogErrors Errors [stats_tm], " & _ " & _ On Error GoTo 0 " [stats_io], [parse_odbc], [row_cnt], " set workspace_id = [w_id], " & _ Err.Raise vbObjectError + errIdGetFailed, _ [batch_sep], " & _ "c onnection_name = [c_name], " & _ mstrModuleName & "NextIdentifier", " [qry_tmout], [lang], [char_trans], "c onnection_value = [c_value], " & _ LoadResString(errIdGetFailed) [reg_settings] ) " "description = [desc], " & _ "no_count_display = [no_count], " & _ End Property HP TPC-H FULL DISCLOSURE REPORT 169 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Get IndOperation() As ' Also contains validation functions, Public Function GetConnection(ByVal Operation etc. lngWorkspace As Long, _ ' Contact: Reshma Tharamal ByVal strConnectionName As String) As IndOperation = mintOperation ([email protected]) cConnection ' ' Returns the connection string for the passed in End Property Option Explicit connection name

Private Sub Class_Initialize() Private mcarrConnections As Dim lngIndex As Long cNodeCollections Set mFieldValue = New cStringSM ' Find all parameters in the array with a matching ' Used to indicate the source module name workspace id ' Initialize the operation indicator variable when errors For lngIndex = 0 To mcarrConnections.Count - 1 to Query ' are raised by this class If mcarrConnections(lngIndex).WorkspaceId = ' It will be modified later by the collection Private mstrSource As String lngWorkspace And _ class when Private Const mstrModuleName As String = ' inserts, updates or deletes are performed "c Connections." mcarrConnections(lngIndex).ConnectionName = mintOperation = QueryOp strConnectionName Then Public Property Set ConnDb(vdata As ' Initialize connection properties to their Database) Set GetConnection = default values mcarrConnections(lngIndex) NoCountDisplay = Set mcarrConnections.NodeDB = vdata Exit For DEF_NO_COUNT_DISPLAY End If NoExecute = DEF_NO_EXECUTE End Property Next lngIndex ParseQueryOnly = Public Sub Modify(cModifiedConn As DEF_PARSE_QUERY_ONLY cConnection) If lngIndex > mcarrConnections.Count - 1 Then QuotedIdentifiers = ' The parameter has not been defined for the DEF_ANSI_QUOTED_IDENTIFIERS ' First check if the parameter record is valid workspace AnsiNulls = DEF_ANSI_NULLS Call CheckDupConnName(cModifiedConn) ' Raise an error ShowQueryPlan = On Error GoTo 0 DEF_SHOW_QUERY_PLAN Call Err.Raise vbObjectError + ShowStatsTime = mcarrConnections.Modify(cModifiedConn) errConnNameInvalid, mstrModuleName & DEF_SHOW_STATS_TIME "GetConnection", _ ShowStatsIO = DEF_SHOW_STATS_IO End Sub LoadResString(errConnNameInvalid) ParseOdbcMsg = Public Sub Load(ByRef cConnToAdd As End If DEF_PARSE_ODBC_MSG_PREFIXES cConnection) RowCount = DEF_ROW_COUNT End Function TsqlBatchSeparator = Call mcarrConnections.Load(cConnToAdd) Public Sub Delete(lngConnId As Long) DEF_TSQL_BATCH_SEPARATOR ' Delete the passed in parameter QueryTimeOut = End Sub DEF_QUERY_TIME_OUT Public Sub Add(ByRef cConnToAdd As Dim lngDeleteElement As Long ServerLanguage = cConnection) DEF_SERVER_LANGUAGE lngDeleteElement = QueryIndex(lngConnId) CharacterTranslation = Set cConnToAdd.NodeDB = Call DEF_CHARACTER_TRANSLATION mcarrConnections.NodeDB mcarrConnections.Delete(lngDeleteElement) RegionalSettings = DEF_REGIONAL_SETTINGS ' First check if the record is valid End Sub Call Validate(cConnToAdd) Private Function QueryIndex(lngConnId As Long) End Sub As Long ' Retrieve a unique identifier Private Sub Class_Terminate() cConnToAdd.ConnectionId = Dim lngIndex As Long cConnToAdd.NextIdentifier Set NodeDB = Nothing ' Find the matching parameter record in the array Set mFieldValue = Nothing Call mcarrConnections.Add(cConnToAdd) For lngIndex = 0 To mcarrConnections.Count - 1 If mcarrConnections(lngIndex).ConnectionId = End Sub End Sub lngConnId And _ VERSION 1.0 CLASS BEGIN Public Sub Unload(lngConnId As Long) mcarrConnections(lngIndex).IndOperation <> MultiUse = -1 'True DeleteOp Then END Dim lngDeleteElement As Long QueryIndex = lngIndex Attribute VB_Name = "cConnections" Exit Function Attribute VB_GlobalNameSpace = False lngDeleteElement = QueryIndex(lngConnId) End If Attribute VB_Creatable = True Next lngIndex Attribute VB_PredeclaredId = False Call Attribute VB_Exposed = False mcarrConnections.Unload(lngDeleteElement) ' Raise error that parameter has not been found ' FILE: cConnections.cls On Error GoTo 0 ' Microsoft TPC-H Kit Ver. 1.00 End Sub Err.Raise vbObjectError + errQueryIndexFailed, ' Copyright Microsoft, 1999 "c ArrParameters.QueryIndex", _ ' All Rights Reserved Public Sub SaveConnectionsInWsp(ByVal LoadResString(errQueryIndexFailed) ' lngWorkspace As Long) ' ' Call a procedure to save all connection End Function ' PURPOSE: Implements an array of records for the workspace cConnection objects. Call mcarrConnections.Save(lngWorkspace) Public Function QueryConnection(lngConnId As ' Type-safe wrapper around Long) As cConnection cNodeCollections. End Sub Dim lngQueryElement As Long HP TPC-H FULL DISCLOSURE REPORT 170 © 2005 Hewlett-Packard Company. All rights reserved. cTempParam.ConnectionId <> lngQueryElement = cConnToValidate.ConnectionId And _ Public Enum ConstraintType QueryIndex(lngConnId) cTempParam.IndOperation <> gintPreStep = 1 DeleteOp Then gintPostStep = 2 ' Return the queried connection object ShowError End Enum Set QueryConnection = errDuplicateConnectionName mcarrConnections(lngQueryElement) On Error GoTo 0 Private Const mstrSQ As String = "'" Err.Raise vbObjectError + Public Property Get WorkspaceId() As Long End Function errDuplicateConnectionName, _ WorkspaceId = mlngWorkspaceId Public Property Get Count() As Long mstrSource, End Property LoadResString(errDuplicateConnectionName) Public Property Let WorkspaceId(ByVal vdata As Count = mcarrConnections.Count End If Long) Next lngIndex mlngWorkspaceId = vdata End Property End Property Public Property Get Item(lngIndex As Long) End Sub As cConnection Public Property Get IndOperation() As Operation Attribute Item.VB_UserMemId = 0 Private Sub Class_Initialize() IndOperation = mintOperation Set Item = mcarrConnections(lngIndex) Set mcarrConnections = New cNodeCollections End Property End Property Public Property Let IndOperation(ByVal vdata As End Sub Operation) Public Sub Validate(ByVal cConnToValidate As cConnection) Private Sub Class_Terminate() On Error GoTo IndOperationErr ' This procedure is necessary since the mstrSource = mstrModuleName & class cannot validate Set mcarrConnections = Nothing "IndOperation" ' all the parameter properties on it's own. This is 'coz we End Sub ' The valid operations are define in the ' might have created new parameters in VERSION 1.0 CLASS cOperations the workspace, but not BEGIN ' class. Check if the operation is valid ' saved them to the database yet - hence MultiUse = -1 'True Select Case vdata the duplicate check END Case QueryOp, InsertOp, UpdateOp, DeleteOp ' has to be repeated in the array Attribute VB_Name = "cConstraint" mintOperation = vdata Attribute VB_GlobalNameSpace = False Dim lngIndex As Long Attribute VB_Creatable = True Case Else Dim cTempParam As cConnection Attribute VB_PredeclaredId = False On Error GoTo 0 Attribute VB_Exposed = False Err.Raise vbObjectError + ' Check if the parameter name already ' FILE: cConstraint.cls errInvalidOperation, _ exists in the workspace ' Microsoft TPC-H Kit Ver. 1.00 mstrSource, For lngIndex = 0 To ' Copyright Microsoft, 1999 LoadResString(errInvalidOperation) mcarrConnections.Count - 1 ' All Rights Reserved End Select Set cTempParam = ' mcarrConnections(lngIndex) ' Exit Property If cTempParam.WorkspaceId = ' PURPOSE: Encapsulates the properties cConnToValidate.WorkspaceId And _ and methods of a constraint. IndOperationErr: cTempParam.ConnectionName = ' Contains functions to insert, update LogErrors Errors cConnToValidate.ConnectionName And _ and delete mstrSource = mstrModuleName & cTempParam.IndOperation <> ' step_constraints records from the "IndOperation" DeleteOp Then database. On Error GoTo 0 On Error GoTo 0 ' Contact: Reshma Tharamal Err.Raise vbObjectError + Err.Raise vbObjectError + ([email protected]) errLetOperationFailed, _ errDuplicateConnectionName, _ ' mstrSource, mstrSource, Option Explicit LoadResString(errLetOperationFailed) LoadResString(errDuplicateConnectionNam e) ' Module level variables to store the property End Property End If values Next lngIndex Private mlngConstraintId As Long Public Function Clone() As cConstraint Private mlngStepId As Long End Sub Private mstrVersionNo As String ' Creates a copy of a given constraint Public Sub CheckDupConnName(ByVal Private mintConstraintType As Integer cConnToValidate As cConnection) Private mlngGlobalStepId As Long Dim cConsClone As cConstraint Private mstrGlobalVersionNo As String Dim lngIndex As Long Private mintSequenceNo As Integer On Error GoTo CloneErr Dim cTempParam As cConnection Private mdbsConstraintDB As Database mstrSource = mstrModuleName & "Clone" Private mlngWorkspaceId As Integer ' Check if the parameter name already Private mintOperation As Operation Set cConsClone = New cConstraint exists in the workspace Private mlngPosition As Long For lngIndex = 0 To ' Copy all the workspace properties to the newly mcarrConnections.Count - 1 ' The cSequence class is used to generate ' created workspace Set cTempParam = unique step identifiers cConsClone.ConstraintId = mlngConstraintId mcarrConnections(lngIndex) Private mConstraintSeq As cSequence cConsClone.StepId = mlngStepId If cTempParam.WorkspaceId = cConsClone.VersionNo = mstrVersionNo cConnToValidate.WorkspaceId And _ Private Const mstrModuleName As String = cConsClone.ConstraintType = cTempParam.ConnectionName = ".cConstraint." mintConstraintType cConnToValidate.ConnectionName And _ Private mstrSource As String cConsClone.GlobalStepId = mlngGlobalStepId HP TPC-H FULL DISCLOSURE REPORT 171 © 2005 Hewlett-Packard Company. All rights reserved. cConsClone.GlobalVersionNo = qy.Close mstrGlobalVersionNo Case Else cConsClone.SequenceNo = ' strInsert = "insert into step_constraints " & ' Write the parameter name that is faulty mintSequenceNo _ WriteError errInvalidParameter, cConsClone.WorkspaceId = ' "( constraint_id, step_id, version_no, " & mstrSource, _ mlngWorkspaceId _ prmParam.Name cConsClone.IndOperation = ' " constraint_type, global_step_id, On Error GoTo 0 mintOperation global_version_no, sequence_no ) " & _ Err.Raise errInvalidParameter, ' " values ( " & _ mstrSource, _ ' And set the return value to the newly ' Str(mlngConstraintId) & ", " & LoadResString(errInvalidParameter) created constraint Str(mlngStepId) & ", " & _ End Select Set Clone = cConsClone ' mstrSQ & mstrVersionNo & mstrSQ & ", Next prmParam " & Str(mintConstraintType) & ", " & _ Exit Function ' Str(mlngGlobalStepId) & ", " & mstrSQ Exit Sub & mstrGlobalVersionNo & mstrSQ & ", " & _ CloneErr: ' Str(mintSequenceNo) & " ) " AssignParametersErr: LogErrors Errors ' mstrSource = mstrModuleName & ' BugMessage strInsert mstrSource = mstrModuleName & "Clone" ' mdbsConstraintDB.Execute strInsert, "AssignParameters" On Error GoTo 0 dbFailOnError Call LogErrors(Errors) Err.Raise vbObjectError + Exit Sub On Error GoTo 0 errCloneFailed, _ Err.Raise vbObjectError + mstrSource, AddErr: errAssignParametersFailed, _ LoadResString(errCloneFailed) LogErrors Errors mstrSource, mstrSource = mstrModuleName & "Add" LoadResString(errAssignParametersFailed) End Function On Error GoTo 0 Err.Raise vbObjectError + End Sub Public Property Get SequenceNo() As errAddConstraintFailed, _ Public Property Get NextIdentifier() As Long Integer mstrSource, _ Dim lngNextId As Long SequenceNo = mintSequenceNo LoadResString(errAddConstraintFailed) End Sub On Error GoTo NextIdentifierErr End Property Private Sub AssignParameters(qyExec As DAO.QueryDef) ' First check if the database object is valid Public Property Let SequenceNo(ByVal ' Assigns values to the parameters in the Call CheckDB vdata As Integer) querydef object mintSequenceNo = vdata ' The parameter names are cryptic to make ' Retrieve the next constraint identifier using the End Property them different ' sequence class ' from the field names. When the parameter Set mConstraintSeq = New cSequence Public Sub Add() names are Set mConstraintSeq.IdDatabase = ' Inserts a new step constraint into the ' the same as the field names, parameters in mdbsConstraintDB database the where mConstraintSeq.IdentifierColumn = ' clause do not get created. "c onstraint_id" Dim strInsert As String lngNextId = mConstraintSeq.Identifier Dim qy As DAO.QueryDef Dim prmParam As DAO.Parameter Set mConstraintSeq = Nothing

On Error GoTo AddErr On Error GoTo AssignParametersErr NextIdentifier = lngNextId mstrSource = mstrModuleName & Exit Property ' First check if the database object is valid "AssignParameters" Call CheckDB NextIdentifierErr: For Each prmParam In qyExec.Parameters LogErrors Errors ' Any record validations Select Case prmParam.Name mstrSource = mstrModuleName & Call Validate Case "[cons_id]" "NextIdentifier" prmParam.Value = mlngConstraintId On Error GoTo 0 ' Create a temporary querydef object Err.Raise vbObjectError + errStepIdGetFailed, _ strInsert = "insert into step_constraints " Case "[s_id]" mstrSource, & _ prmParam.Value = mlngStepId LoadResString(errStepIdGetFailed) "( constraint_id, step_id, version_no, " & _ Case "[ver_no]" End Property " constraint_type, global_step_id, prmParam.Value = mstrVersionNo global_version_no, sequence_no ) " & _ Private Sub CheckDB() " values ( [cons_id], [s_id], [ver_no], Case "[cons_type]" ' Check if the database object has been initialized " & _ prmParam.Value = " [cons_type], [g_step_id], mintConstraintType If mdbsConstraintDB Is Nothing Then [g_ver_no], " & _ ShowError errInvalidDB " [seq_no] )" Case "[g_step_id]" On Error GoTo 0 Set qy = prmParam.Value = Err.Raise vbObjectError + errInvalidDB, _ mdbsConstraintDB.CreateQueryDef(gstrEm mlngGlobalStepId mstrModuleName, ptyString, strInsert) LoadResString(errInvalidDB) Case "[g_ver_no]" End If ' Call a procedure to execute the Querydef prmParam.Value = object mstrGlobalVersionNo End Sub Call AssignParameters(qy) Case "[seq_no]" Public Sub Delete() qy.Execute dbFailOnError prmParam.Value = mintSequenceNo HP TPC-H FULL DISCLOSURE REPORT 172 © 2005 Hewlett-Packard Company. All rights reserved. ' Deletes the step constraint record from the database ' There can be multiple constraints for a step, ' No validations are necessary for the constraint ' meaning that there can be multiple object Dim strDelete As String constraint records Dim qy As DAO.QueryDef ' with the same constraint_id. Only a End Sub combination On Error GoTo DeleteErr ' of the step_id, version and constraint_id Public Property Set NodeDB(vdata As Database) mstrSource = mstrModuleName & will be "Delete" ' unique Set mdbsConstraintDB = vdata ' Create a temporary querydef object with ' There can be multiple constraints for a the modify string End Property step, strUpdate = "Update step_constraints " & _ ' meaning that there can be multiple " set sequence_no = [seq_no] " & _ Public Property Get NodeDB() As Database constraint records " where constraint_id = [cons_id] " & _ ' with the same constraint_id. Only a " and step_id = [s_id] " & _ Set NodeDB = mdbsConstraintDB combination " and version_no = [ver_no] " ' of the step_id, version and constraint_id Set qy = End Property will be mdbsConstraintDB.CreateQueryDef(gstrEmpt ' unique yString, strUpdate) Public Property Get GlobalVersionNo() As String strDelete = "delete from step_constraints " & _ ' Call a procedure to assign the parameter GlobalVersionNo = mstrGlobalVersionNo " where constraint_id = [cons_id]" & values to the _ ' querydef object End Property " and step_id = [s_id] " & _ Call AssignParameters(qy) " and version_no = [ver_no] " qy.Execute dbFailOnError Public Property Let GlobalVersionNo(ByVal vdata Set qy = As String) mdbsConstraintDB.CreateQueryDef(gstrEm qy.Close ptyString, strDelete) mstrGlobalVersionNo = vdata ' strUpdate = "Update step_constraints " & _ Call AssignParameters(qy) ' " set sequence_no = " & End Property qy.Execute dbFailOnError Str(mintSequenceNo) & _ ' " where constraint_id = " & Public Property Get GlobalStepId() As Long qy.Close Str(mlngConstraintId) & _ ' " and step_id = " & Str(mlngStepId) & GlobalStepId = mlngGlobalStepId ' strDelete = "Delete from step_constraints _ " & _ ' " and version_no = " & mstrSQ & End Property ' " where constraint_id = " & mstrVersionNo & mstrSQ Str(mlngConstraintId) & _ ' Public Property Get ConstraintId() As Long ' " and step_id = " & Str(mlngStepId) ' 'BugMessage strUpdate & _ ' mdbsConstraintDB.Execute strUpdate, ConstraintId = mlngConstraintId ' " and version_no = " & mstrSQ & dbFailOnError mstrVersionNo & mstrSQ Exit Sub End Property ' ' 'BugMessage strDelete Modify: Public Property Get VersionNo() As String ' mdbsConstraintDB.Execute strDelete, LogErrors Errors dbFailOnError mstrSource = mstrModuleName & "Modify" VersionNo = mstrVersionNo On Error GoTo 0 Exit Sub Err.Raise vbObjectError + End Property errUpdateConstraintFailed, _ DeleteErr: mstrSource, _ Public Property Get StepId() As Long LogErrors Errors mstrSource = mstrModuleName & LoadResString(errUpdateConstraintFailed) StepId = mlngStepId "Delete" End Sub On Error GoTo 0 Public Property Get Position() As Long End Property Err.Raise vbObjectError + errDeleteConstraintFailed, _ Position = mlngPosition Public Property Let VersionNo(ByVal vdata As mstrSource, _ String) End Property LoadResString(errDeleteConstraintFailed) Public Property Let Position(ByVal RHS As mstrVersionNo = vdata End Sub Long) Public Sub Modify() End Property ' Updates the sequence no of the step mlngPosition = RHS constraint record Public Property Let StepId(ByVal vdata As Long) ' in the database End Property mlngStepId = vdata Dim strUpdate As String Public Sub Validate() Dim qy As QueryDef ' Each distinct object will have a Validate End Property method which On Error GoTo Modify ' will check if the class properties are valid. Public Property Let ConstraintId(ByVal vdata As This method Long) ' First check if the database object is valid ' will be used to check interdependant On Error GoTo ConstraintIdErr Call CheckDB properties that mstrSource = mstrModuleName & ' cannot be validated by the let procedures. "ConstraintId" ' Any record validations ' It should be called by the add and modify Call Validate methods of the class If (vdata > 0) Then HP TPC-H FULL DISCLOSURE REPORT 173 © 2005 Hewlett-Packard Company. All rights reserved. mlngConstraintId = vdata mstrSource, ' Microsoft TPC-H Kit Ver. 1.00 Else LoadResString(errConstraintTypeInvalid) ' Copyright Microsoft, 1999 ' Propogate this error back to the caller End Select ' All Rights Reserved On Error GoTo 0 ' Err.Raise vbObjectError + Exit Property ' errConstraintIdInvalid, _ ' PURPOSE: This module encapsulates a mstrSource, ConstraintTypeErr: collection of failed steps. It LoadResString(errConstraintIdInvalid) LogErrors Errors ' also determines whether sub-steps of a End If mstrSource = mstrModuleName & passed in step need "ConstraintType" ' to be skipped due to a failure. Exit Property On Error GoTo 0 ' Contact: Reshma Tharamal Err.Raise vbObjectError + ([email protected]) ConstraintIdErr: errConstraintTypeLetFailed, _ ' LogErrors Errors mstrSource, Option Explicit mstrSource = mstrModuleName & LoadResString(errConstraintTypeLetFailed) "ConstraintId" Private mcFailedSteps As cVector On Error GoTo 0 End Property Public Function ExecuteSubStep(lParentStepId As Err.Raise vbObjectError + Long) As Boolean errConstraintIdSetFailed, _ Public Property Get ConstraintType() As ' Returns False if there is any condition that mstrSource, ConstraintType prevents sub-steps of the passed LoadResString(errConstraintIdSetFailed) ' in instance from being executed ConstraintType = mintConstraintType Dim lIndex As Long End Property End Property ExecuteSubStep = True Public Property Let GlobalStepId(ByVal vdata As Long) Private Sub Class_Initialize() For lIndex = 0 To Count() - 1 If mcFailedSteps(lIndex).ContCriteria = On Error GoTo GlobalStepIdErr ' Initialize the operation indicator variable to gintOnFailureCompleteSiblings And _ mstrSource = mstrModuleName & Query lParentStepId <> "GlobalStepId" ' It will be modified later by the collection mcFailedSteps(lIndex).ParentStepId Then class when ExecuteSubStep = False If (vdata > 0) Then ' inserts, updates or deletes are performed Exit For mlngGlobalStepId = vdata mintOperation = QueryOp End If Else ' Propogate this error back to the caller End Sub If mcFailedSteps(lIndex).ContCriteria = On Error GoTo 0 gintOnFailureAbortSiblings And _ Err.Raise vbObjectError + lParentStepId = errGlobalStepIdInvalid, _ VERSION 1.0 CLASS mcFailedSteps(lIndex).ParentStepId Then mstrSource, BEGIN ExecuteSubStep = False LoadResString(errGlobalStepIdInvalid) MultiUse = -1 'True Exit For End If END End If Attribute VB_Name = "cFailedStep" Exit Property Attribute VB_GlobalNameSpace = False If mcFailedSteps(lIndex).ContCriteria = Attribute VB_Creatable = True gintOnFailureSkipSiblings And _ GlobalStepIdErr: Attribute VB_PredeclaredId = False lParentStepId = LogErrors Errors Attribute VB_Exposed = False mcFailedSteps(lIndex).ParentStepId Then mstrSource = mstrModuleName & ' FILE: cFailedStep.cls ExecuteSubStep = False "GlobalStepId" ' Microsoft TPC-H Kit Ver. 1.00 Exit For On Error GoTo 0 ' Copyright Microsoft, 1999 End If Err.Raise vbObjectError + ' All Rights Reserved errGlobalStepIdSetFailed, _ ' If mcFailedSteps(lIndex).ContCriteria = mstrSource, ' gintOnFailureAbort Then LoadResString(errGlobalStepIdSetFailed) ' PURPOSE: Properties of a step execution ExecuteSubStep = False failure. Exit For End Property ' Contact: Reshma Tharamal End If ([email protected]) Public Property Let ConstraintType(ByVal ' Next lIndex vdata As ConstraintType) Option Explicit End Function On Error GoTo ConstraintTypeErr Public InstanceId As Long Public Sub Add(ByVal objItem As cFailedStep) Public StepId As Long ' A global step can be either a pre- or a Public ParentStepId As Long mcFailedSteps.Add objItem post-execution step. Public ContCriteria As ContinuationCriteria ' These constants have been defined in the Public EndTime As Currency End Sub enumeration, Public AskResponse As Long Public Function Delete(ByVal lPosition As Long) ' ConstraintType, which is exposed VERSION 1.0 CLASS As cFailedStep Select Case vdata BEGIN Case gintPreStep, gintPostStep MultiUse = -1 'True Set Delete = mcFailedSteps.Delete(lPosition) mintConstraintType = vdata END Attribute VB_Name = "cFailedSteps" End Function Case Else Attribute VB_GlobalNameSpace = False On Error GoTo 0 Attribute VB_Creatable = True Public Sub Clear() Err.Raise vbObjectError + Attribute VB_PredeclaredId = False errConstraintTypeInvalid, _ Attribute VB_Exposed = False mcFailedSteps.Clear ' FILE: cFailedSteps.cls HP TPC-H FULL DISCLOSURE REPORT 174 © 2005 Hewlett-Packard Company. All rights reserved. End Sub Public Function Count() As Long End Property Private mstrFileName As String Public Property Let FileName(ByVal vdata As Private mintHFile As Integer Count = mcFailedSteps.Count String) Private mstrFileHeader As String Private mstrProjectName As String End Function mstrFileName = vdata Public Property Get Item(ByVal Position As Public Sub CloseFile() Long) As cFailedStep End Property Attribute Item.VB_UserMemId = 0 Public Property Let FileHandle(ByVal vdata ' Close the file As Integer) If mintHFile > 0 Then Set Item = mcFailedSteps.Item(Position) Call CloseFileSM(mstrFileName) mintFileHandle = vdata mintHFile = 0 End Property End If End Property Public Function StepFailed(lStepId As Public Property Set NodeDB(vdata As End Sub Long) As Boolean Database) Public Property Let ProjectName(ByVal vdata As ' Returns True if a failure record already Set mdbsNodeDb = vdata String) exists for the passed in step ' An optional field - will be appended to the file Dim lIndex As Long End Property ' header string if specified

StepFailed = False Public Property Get NodeDB() As Database Const strProjectHdr As String = "Project Name:"

For lIndex = 0 To Count() - 1 Set NodeDB = mdbsNodeDb mstrProjectName = vdata If mcFailedSteps(lIndex).StepId = mstrFileHeader = mstrFileHeader & _ lStepId Then End Property Space$(1) & strProjectHdr & Space$(1) & _ StepFailed = True Public Property Get Position() As Long gstrSQ & vdata & gstrSQ Exit For End If Position = mlngPosition End Property Next lIndex Public Property Get ProjectName() As String End Property End Function Public Property Let Position(ByVal vdata As ProjectName = mstrProjectName Long) Private Sub Class_Initialize() End Property mlngPosition = vdata Public Property Get FileName() As String Set mcFailedSteps = New cVector End Property FileName = mstrFileName End Sub Public Property Get FileHandle() As Integer End Property Private Sub Class_Terminate() Public Property Let FileName(ByVal vdata As FileHandle = mintFileHandle String) Set mcFailedSteps = Nothing End Property mstrFileName = vdata End Sub VERSION 1.0 CLASS VERSION 1.0 CLASS End Property BEGIN BEGIN Public Sub WriteLine(strMsg As String) MultiUse = -1 'True MultiUse = -1 'True END END ' Writes the passed in string to the file Attribute VB_Name = "cFileInfo" Attribute VB_Name = "cFileSM" Call WriteToFile(strMsg, False) Attribute VB_GlobalNameSpace = False Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_Creatable = True End Sub Attribute VB_PredeclaredId = False Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Attribute VB_Exposed = False Public Sub WriteField(strMsg As String) ' FILE: cFileInfo.cls Attribute VB_Ext_KEY = ' Microsoft TPC-H Kit Ver. 1.00 "SavedWithClassBuilder" ,"Yes" ' Writes the passed in string to the file ' Copyright Microsoft, 1999 Attribute VB_Ext_KEY = "Top_Level" ,"Yes" Call WriteToFile(strMsg, True) ' All Rights Reserved ' FILE: cFileSM.cls ' ' Microsoft TPC-H Kit Ver. 1.00 End Sub ' ' Copyright Microsoft, 1999 ' PURPOSE: File Properties viz. name, ' All Rights Reserved Private Sub WriteToFile(strMsg As String, _ handle, etc. ' blnContinue As Boolean) ' Contact: Reshma Tharamal ' ' Writes the passed in string to the file - the ([email protected]) ' PURPOSE: Encapsulates functions to open ' Continue flag indicates whether the next line ' a file and write to it. will Option Explicit ' Contact: Reshma Tharamal ' be continued on the same line or printed on a ([email protected]) new one Private mstrFileName As String ' Private mintFileHandle As Integer Option Explicit On Error GoTo WriteToFileErr Private mdbsNodeDb As Database ' Since it is used to form a cNodeCollection ' Used to indicate the source module name ' Open the file if it hasn't been already Private mlngPosition As Long ' Since it is when errors If mintHFile = 0 Then used to form a cNodeCollection ' are raised by this class Public Property Get FileName() As String Private Const mstrModuleName As String = ' If the filename has not been initialized, do not "c FileSM." ' attempt to open it FileName = mstrFileName Private mstrSource As String If mstrFileName <> gstrEmptyString Then HP TPC-H FULL DISCLOSURE REPORT 175 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Class_Terminate() ' Create the object mintHFile = Set mcStep = New cStep OpenFileSM(mstrFileName) ' Close the file opened by this instance Call CloseFile ' Initialize the object with valid values for a If mintHFile = 0 Then global step ' The Open File command failed End Sub ' The global flag should be the first field to be for some reason initialized ' No point in trying to write the ' since subsequent validations might try to check file header VERSION 1.0 CLASS if the Else BEGIN ' step being created is global ' Print a file header, if a header MultiUse = -1 'True mcStep.GlobalFlag = True string has been END mcStep.StepType = gintGlobalStep ' initialized Attribute VB_Name = "cGlobalStep" If mstrFileHeader <> Attribute VB_GlobalNameSpace = False ' A global step cannot have any sub-steps gstrEmptyString Then Attribute VB_Creatable = True associated with it Print #mintHFile, Attribute VB_PredeclaredId = False ' Hence, it will always be at Step Level 0 Print #mintHFile, Attribute VB_Exposed = False mcStep.ParentStepId = 0 mstrFileHeader ' FILE: cGlobalStep.cls mcStep.ParentVersionNo = gstrMinVersion Print #mintHFile, ' Microsoft TPC-H Kit Ver. 1.00 mcStep.StepLevel = 0 End If ' Copyright Microsoft, 1999 End If ' All Rights Reserved ' The enabled flag must be False for all global End If ' steps End If ' ' Global steps can be of two types ' PURPOSE: Encapsulates the properties ' a. Those that are run globally within a If mintHFile <> 0 Then and methods of a global step. workspace either If strMsg = gstrEmptyString Then ' Implements the cStep class - carries ' before every step, after every step or during Print #mintHFile, out initializations the entire Else ' and validations that are specific to ' run, depending on the global run method If blnContinue Then global steps. ' b. Those that are not run globally, but qualify to ' Write the message to the file - ' Contact: Reshma Tharamal be either continue ([email protected]) ' pre or post-execution steps for other steps in ' all subsequent characters on the ' the workspace. same line Option Explicit ' Whether or not such a step will be executed Print #mintHFile, strMsg; depends on Else Implements cStep ' whether the step for which it is defined as a ' Write the message to the file pre/post Print #mintHFile, strMsg ' Object variable to keep the reference in ' step will be executed End If Private mcStep As cStep mcStep.EnabledFlag = False End If Else ' Used to indicate the source module name mcStep.ContinuationCriteria = gintNoOption ' Display the string to the user instead when errors mcStep.DegreeParallelism = of ' are raised by this class gstrGlobalParallelism ' trying to write it to the file Private mstrSource As String ' This could be the project error log that Private Const mstrModuleName As String = End Sub we were "c GlobalStep." Private Sub Class_Terminate() ' trying to open! Play it safe and display errors - do Private Sub cStep_AddAllIterators() ' Remove the step object ' not try to log them. Set mcStep = Nothing MsgBox strMsg, vbOKOnly Call mcStep.AddAllIterators End If End Sub End Sub Exit Sub Private Sub cStep_Add() Private Sub cStep_AddIterator(cItRecord As WriteToFileErr: cIterator) ' Call a private procedure to see if the step text ' Log the error code raised by Visual has been Basic Call mcStep.AddIterator(cItRecord) ' entered - since a global step actually executes a Call DisplayErrors(Errors) step, entry End Sub ' of the text is mandatory ' Display the string to the user instead of Call StepTextOrFileEntered ' trying to write it to the file Private Property Let MsgBox strMsg, vbOKOnly cStep_ArchivedFlag(ByVal RHS As Boolean) ' Call the Add method of the step class to carry out the insert End Sub mcStep.ArchivedFlag = RHS mcStep.Add Public Property Let FileHeader(ByVal vdata As String) End Property End Sub

mstrFileHeader = vdata Private Property Get cStep_ArchivedFlag() As Private Function cStep_Clone(Optional cCloneStep Boolean As cStep) As cStep End Property Public Property Get FileHeader() As String cStep_ArchivedFlag = mcStep.ArchivedFlag Dim cNewGlobal As cGlobalStep

FileHeader = mstrFileHeader End Property Set cNewGlobal = New cGlobalStep Set cStep_Clone = mcStep.Clone(cNewGlobal) End Property Private Sub Class_Initialize() End Function HP TPC-H FULL DISCLOSURE REPORT 176 © 2005 Hewlett-Packard Company. All rights reserved. ' b. Those that are not run globally, but qualify to be either ' Set the global flag to true Private Property Get ' pre or post-execution steps for other steps mcStep.GlobalFlag = True cStep_ContinuationCriteria() As in the workspace. ContinuationCriteria ' Whether or not such a step will be End Property executed depends on cStep_ContinuationCriteria = ' whether the step for which it is defined as Private Function cStep_IncVersionX() As String mcStep.ContinuationCriteria a pre/post ' step will be executed cStep_IncVersionX = mcStep.IncVersionX End Property mcStep.EnabledFlag = False End Function Private Property Let End Property cStep_ContinuationCriteria(ByVal RHS As Private Function cStep_IncVersionY() As String ContinuationCriteria) Private Property Let cStep_ErrorFile(ByVal RHS As String) cStep_IncVersionY = mcStep.IncVersionY ' The continuation criteria field will always be empty for a mcStep.ErrorFile = RHS End Function ' global step mcStep.ContinuationCriteria = 0 End Property 'Private Property Let End Property Private Property Get cStep_ErrorFile() As cStep_GlobalRunMethod(ByVal RHS As Integer) String ' Private Property Let ' ' Whether or not the Global Run Method is valid cStep_DegreeParallelism(ByVal RHS As cStep_ErrorFile = mcStep.ErrorFile for the step String) ' ' will be checked by the Step class End Property ' mcStep.GlobalRunMethod = RHS ' Will always be zero for a global step ' mcStep.DegreeParallelism = Private Property Let 'End Property gstrGlobalParallelism cStep_ExecutionMechanism(ByVal RHS As ' ExecutionMethod) 'Private Property Get cStep_GlobalRunMethod() As End Property Integer ' Whether or not the Execution Mechanism ' Private Property Get is valid will be ' cStep_GlobalRunMethod = cStep_DegreeParallelism() As String ' checked by the Step class mcStep.GlobalRunMethod mcStep.ExecutionMechanism = RHS ' cStep_DegreeParallelism = 'End Property mcStep.DegreeParallelism End Property ' Private Property Get cStep_IndOperation() As End Property Private Property Get Operation cStep_ExecutionMechanism() As Private Sub cStep_DeleteIterator(cItRecord ExecutionMethod cStep_IndOperation = mcStep.IndOperation As cIterator) cStep_ExecutionMechanism = End Property Call mcStep.DeleteIterator(cItRecord) mcStep.ExecutionMechanism Private Property Let cStep_IndOperation(ByVal End Sub End Property RHS As Operation)

Private Sub cStep_Delete() Private Property Let mcStep.IndOperation = RHS cStep_FailureDetails(ByVal RHS As String) mcStep.Delete End Property ' Whether or not the Failure Details are valid End Sub for the Private Sub cStep_InsertIterator(cItRecord As ' selected failure criteria will be checked by cIterator) Private Property Get cStep_EnabledFlag() the Step class As Boolean mcStep.FailureDetails = RHS Call mcStep.InsertIterator(cItRecord)

cStep_EnabledFlag = End Property End Sub mcStep.EnabledFlag Private Property Get cStep_FailureDetails() As Private Function cStep_IsNewVersion() As End Property String Boolean cStep_IsNewVersion = mcStep.IsNewVersion Private Property Let cStep_FailureDetails = End Function cStep_EnabledFlag(ByVal RHS As mcStep.FailureDetails Boolean) Private Function cStep_IteratorCount() As Long End Property ' The enabled flag must be False for all cStep_IteratorCount = mcStep.IteratorCount global steps Private Property Get cStep_GlobalFlag() As ' Global steps can be of two types Boolean End Function ' a. Those that are run globally within a workspace either cStep_GlobalFlag = mcStep.GlobalFlag Private Property Let cStep_IteratorName(ByVal ' before every step, after every step or RHS As String) during the entire End Property ' run, depending on the global run mcStep.IteratorName = RHS method Private Property Let cStep_GlobalFlag(ByVal RHS As Boolean) End Property HP TPC-H FULL DISCLOSURE REPORT 177 © 2005 Hewlett-Packard Company. All rights reserved. Private Property Get cStep_IteratorName() Set cStep_NodeDB = mcStep.NodeDB Private Sub cStep_RemoveIterator(cItRecord As As String cIterator) End Property cStep_IteratorName = Call mcStep.RemoveIterator(cItRecord) mcStep.IteratorName Private Function cStep_OldVersionNo() As String End Sub End Property cStep_OldVersionNo = mcStep.OldVersionNo Private Sub cStep_SaveIterators() Private Function cStep_Iterators() As End Function Variant Call mcStep.SaveIterators Private Property Let cStep_OutputFile(ByVal cStep_Iterators = mcStep.Iterators RHS As String) End Sub

End Function mcStep.OutputFile = RHS Private Property Let cStep_SequenceNo(ByVal RHS As Integer) Private Sub cStep_LoadIterator(cItRecord End Property As cIterator) mcStep.SequenceNo = RHS Private Property Get cStep_OutputFile() As Call mcStep.LoadIterator(cItRecord) String End Property

End Sub cStep_OutputFile = mcStep.OutputFile Private Property Get cStep_SequenceNo() As Integer 'Private Property Let cStep_LogFile(ByVal End Property RHS As String) cStep_SequenceNo = mcStep.SequenceNo ' Private Property Let ' mcStep.LogFile = RHS cStep_ParentStepId(ByVal RHS As Long) End Property ' 'End Property ' A global step cannot have any sub-steps Private Property Let cStep_StepId(ByVal RHS As ' associated with it Long) 'Private Property Get cStep_LogFile() As ' Hence, the parent step id and parent version String number will be zero mcStep.StepId = RHS ' mcStep.ParentStepId = 0 ' cStep_LogFile = mcStep.LogFile End Property ' End Property Private Property Get cStep_StepId() As Long 'End Property Private Property Get cStep_ParentStepId() As cStep_StepId = mcStep.StepId Private Sub cStep_ModifyIterator(cItRecord Long As cIterator) End Property cStep_ParentStepId = mcStep.ParentStepId Call mcStep.ModifyIterator(cItRecord) End Property Private Property Let cStep_StepLabel(ByVal RHS End Sub As String) Private Property Let Private Sub cStep_Modify() cStep_ParentVersionNo(ByVal RHS As mcStep.StepLabel = RHS String) ' Call a private procedure to see if the step End Property text has been ' A global step cannot have any sub-steps ' entered - since a global step actually associated with it Private Property Get cStep_StepLabel() As String executes a step, ' Hence, the parent step id and parent version ' entry of the text is mandatory number will be zero cStep_StepLabel = mcStep.StepLabel Call StepTextOrFileEntered mcStep.ParentVersionNo = gstrMinVersion End Property ' Call the Modify method of the step class End Property to carry out the update Private Property Let cStep_StartDir(ByVal RHS As mcStep.Modify Private Property Get cStep_ParentVersionNo() String) As String End Sub mcStep.StartDir = RHS cStep_ParentVersionNo = Private Property Get cStep_NextStepId() As mcStep.ParentVersionNo End Property Long End Property Private Property Get cStep_StartDir() As String cStep_NextStepId = mcStep.NextStepId Private Property Let cStep_Position(ByVal cStep_StartDir = mcStep.StartDir End Property RHS As Long) End Property Private Property Set cStep_NodeDB(RHS mcStep.Position = RHS As DAO.Database) Private Property Let cStep_StepLevel(ByVal RHS End Property As Integer) Set mcStep.NodeDB = RHS Private Property Get cStep_Position() As Long ' A global step cannot have any sub-steps End Property associated with it cStep_Position = mcStep.Position ' Hence, it will always be at step level 0 Private Property Get cStep_NodeDB() As mcStep.StepLevel = 0 DAO.Database End Property HP TPC-H FULL DISCLOSURE REPORT 178 © 2005 Hewlett-Packard Company. All rights reserved. End Property ' carry out the specific validations for the type and If StringEmpty(mcStep.StepText) And Private Property Get cStep_StepLevel() As ' call the generic validation routine StringEmpty(mcStep.StepTextFile) Then Integer ShowError errStepTextAndFileNull On Error GoTo cStep_ValidateErr On Error GoTo 0 cStep_StepLevel = mcStep.StepLevel mstrSource = mstrModuleName & Err.Raise vbObjectError + "c Step_Validate" errStepTextAndFileNull, _ End Property mstrSource, ' Validations specific to global steps LoadResString(errStepTextAndFileNull) Private Property Let cStep_StepText(ByVal ElseIf Not StringEmpty(mcStep.StepText) And RHS As String) ' Check if the step text or a file name has Not StringEmpty(mcStep.StepTextFile) Then been ShowError errStepTextOrFile mcStep.StepText = RHS ' specified On Error GoTo 0 Call StepTextOrFileEntered Err.Raise vbObjectError + errStepTextOrFile, End Property _ ' The step level must be zero for all globals mstrSource, Private Property Get cStep_StepText() As If mcStep.StepLevel <> 0 Then LoadResString(errStepTextOrFile) String ShowError errStepLevelZeroForGlobal End If On Error GoTo 0 cStep_StepText = mcStep.StepText Err.Raise vbObjectError + End Sub errValidateFailed, _ End Property gstrSource, _ Private Property Let cStep_VersionNo(ByVal RHS LoadResString(errValidateFailed) As String) Private Property Let End If cStep_StepTextFile(ByVal RHS As String) mcStep.VersionNo = RHS If mcStep.EnabledFlag Then mcStep.StepTextFile = RHS ShowError errEnabledFlagFalseForGlobal End Property On Error GoTo 0 End Property Err.Raise vbObjectError + Private Property Get cStep_VersionNo() As String errValidateFailed, _ Private Property Get cStep_StepTextFile() gstrSource, _ cStep_VersionNo = mcStep.VersionNo As String LoadResString(errValidateFailed) End If End Property cStep_StepTextFile = mcStep.StepTextFile If mcStep.DegreeParallelism > 0 Then Private Property Let cStep_WorkspaceId(ByVal ShowError RHS As Long) End Property errDegParallelismNullForGlobal On Error GoTo 0 mcStep.WorkspaceId = RHS Private Property Let cStep_StepType(RHS Err.Raise vbObjectError + As gintStepType) errValidateFailed, _ End Property gstrSource, _ mcStep.StepType = gintGlobalStep LoadResString(errValidateFailed) Private Property Get cStep_WorkspaceId() As Long End If End Property cStep_WorkspaceId = mcStep.WorkspaceId If mcStep.ContinuationCriteria > 0 Then Private Property Get cStep_StepType() As ShowError errContCriteriaNullForGlobal End Property gintStepType On Error GoTo 0 VERSION 1.0 CLASS Err.Raise vbObjectError + BEGIN cStep_StepType = mcStep.StepType errValidateFailed, _ MultiUse = -1 'True gstrSource, _ END End Property LoadResString(errValidateFailed) Attribute VB_Name = "cInstance" End If Attribute VB_GlobalNameSpace = False Private Sub cStep_UnloadIterators() Attribute VB_Creatable = True mcStep.Validate Attribute VB_PredeclaredId = False Call mcStep.UnloadIterators Attribute VB_Exposed = False Exit Sub ' FILE: cInstance.cls End Sub ' Microsoft TPC-H Kit Ver. 1.00 cStep_ValidateErr: ' Copyright Microsoft, 1999 Private Sub cStep_UpdateIterator(cItRecord LogErrors Errors ' All Rights Reserved As cIterator) mstrSource = mstrModuleName & ' "c Step_Validate" ' Call mcStep.UpdateIterator(cItRecord) On Error GoTo 0 ' PURPOSE: Encapsulates the properties and Err.Raise vbObjectError + methods of an instance. End Sub errValidateFailed, _ ' An instance is created when a step is mstrSource, _ executed for a Private Sub cStep_UpdateIteratorVersion() LoadResString(errValidateFailed) ' particular iterator value (if applicable) at End Sub 'run' time. Call mcStep.UpdateIteratorVersion Private Sub StepTextOrFileEntered() ' Contains functions to determine if an ' Checks if either the step text or the name of instance is running, End Sub the file containing ' complete, and so on. ' the text has been entered ' Contact: Reshma Tharamal Private Sub cStep_Validate() ' If both of them are null or both of them are ([email protected]) ' The validate routines for each of the not null, ' steps will ' the global step is invalid and an error is Option Explicit raised HP TPC-H FULL DISCLOSURE REPORT 179 © 2005 Hewlett-Packard Company. All rights reserved. ' Used to indicate the source module name If cParentInstance Is Nothing Then Set cNewSubStep.LastIterator = New when errors ' This will only be true for the dummy cRunItDetails ' are raised by this class instance, which Call cNewSubStep.InitializeIt(cSubStepDtls, Private Const mstrModuleName As String = ' cannot have any iterators defined for it RunParams) "c Instance." ValidForIteration = True Private mstrSource As String Exit Function ' Add add the substep to the collection End If mcSubSteps.Add cNewSubStep Private mcStep As cStep Public Key As String ' Node key for the step vnt Iterators = mcStep.Iterators Set cNewSubStep = Nothing being executed Public InstanceId As Long If Not StringEmpty(mcStep.IteratorName) Exit Sub Public ParentInstanceId As Long ' The And Not IsEmpty(vntIterators) Then parent instance CreateSubStepErr: Private mblnNoMoreToStart As Boolean Set cSubStepRec = ' Log the error code raised by Visual Basic Private mblnComplete As Boolean cParentInstance.QuerySubStep(mcStep.StepId) Call LogErrors(Errors) Public StartTime As Currency On Error GoTo 0 Public EndTime As Currency If intConsType = gintPreStep Then mstrSource = mstrModuleName & Public ElapsedTime As Currency ' Pre-execution constraints will only be "CreateSubStep" Private mintStatus As InstanceStatus executed Err.Raise vbObjectError + errProgramError, Public DegreeParallelism As Integer ' before the first iteration mstrSource, _ Private mcIterators As cRunColIt If LoadResString(errProgramError) cSubStepRec.LastIterator.IteratorType = ' A collection of all the sub-steps for this gintValue Then End Sub step ValidForIteration = Private mcSubSteps As cSubSteps (cSubStepRec.LastIterator.Sequence = _ Public Function QuerySubStep(ByVal SubStepId Public Sub UpdateStartTime(lStepId As gintMinIteratorSequence) As Long) As cSubStep Long, Optional ByVal StartTm As Currency Else ' Retrieves the sub-step record for the passed in = gdtmEmpty, _ ValidForIteration = sub-step id Optional ByVal EndTm As Currency = (cSubStepRec.LastIterator.Value = _ gdtmEmpty, _ Dim lngIndex As Long Optional ByVal Elapsed As Currency = cSubStepRec.LastIterator.RangeFrom) 0) End If On Error GoTo QuerySubStepErr ' We do not maintain start and end Else timestamps for the constraint ' Post-execution constraints will only be ' Find the sub-step node with the matching step id ' of a step. Hence we check if the process executed For lngIndex = 0 To mcSubSteps.Count - 1 that just started/ ' after the last iteration - check if there If mcSubSteps(lngIndex).StepId = SubStepId ' terminated is the worker step that is are any Then being executed. If so, ' pending iterations Set QuerySubStep = mcSubSteps(lngIndex) ' we update the start/end time and status ValidForIteration = Exit For on the instance record. cSubStepRec.NextIteration(mcStep) Is End If Nothing Next lngIndex BugAssert (StartTm <> gdtmEmpty) Or End If (EndTm <> gdtmEmpty), "Mandatory Else Exit Function parameter missing." ValidForIteration = True End If QuerySubStepErr: ' Make sure that we are executing the ' Log the error code raised by Visual Basic actual step and not Exit Function Call LogErrors(Errors) ' a pre or post-execution constraint On Error GoTo 0 If mcStep.StepId = lStepId Then ValidForIterationErr: mstrSource = mstrModuleName & If StartTm <> 0 Then ' Log the error code raised by Visual Basic "QuerySubStep" StartTime = StartTm Call LogErrors(Errors) Err.Raise vbObjectError + mintStatus = gintRunning On Error GoTo 0 errNavInstancesFailed, _ Else mstrSource = mstrModuleName & mstrSource, EndTime = EndTm "ValidForIteration" LoadResString(errNavInstancesFailed) ElapsedTime = Elapsed Err.Raise vbObjectError + mintStatus = gintComplete errExecInstanceFailed, _ End Function End If mstrSource, Public Property Let AllStarted(ByVal vdata As End If LoadResString(errExecInstanceFailed) Boolean)

End Sub End Function 'bugmessage "Set All Started to " & vData & " Public Function for : "& _ ValidForIteration(cParentInstance As Public Sub CreateSubStep(cSubStepDtls As mstrKey cInstance, _ cStep, RunParams As cArrParameters) ByVal intConsType As mblnNoMoreToStart = vdata ConstraintType) As Boolean Dim cNewSubStep As cSubStep ' Returns true if the instance passed in is End Property the first or On Error GoTo CreateSubStepErr Public Property Get AllStarted() As Boolean ' last iteration for the step, depending on the constraint type Set cNewSubStep = New cSubStep AllStarted = mblnNoMoreToStart

Dim cSubStepRec As cSubStep cNewSubStep.StepId = cSubStepDtls.StepId End Property Dim vntIterators As Variant cNewSubStep.TasksComplete = 0 Public Property Let AllComplete(ByVal vdata As cNewSubStep.TasksRunning = 0 Boolean) On Error GoTo ValidForIterationErr ' Initialize the iterator for the instance HP TPC-H FULL DISCLOSURE REPORT 180 © 2005 Hewlett-Packard Company. All rights reserved. 'bugmessage "Set All Complete to " & ' updated only when all the instances for a "Tasks complete for " & vD ata & " for : " & _ sub-step CStr(mcSubSteps(lngIndex).StepId) & _ mstrKey ' complete execution. " Instance Id " & InstanceId & " is less Dim lngIndex As Long than 0." mblnComplete = vdata On Error GoTo ChildTerminatedErr If mcSubSteps(lngIndex).StepId = mlngStepId End Property Then BugAssert mcStep.StepType = mcSubSteps(lngIndex).TasksComplete = _ Public Property Get AllComplete() As gintManagerStep mcSubSteps(lngIndex).TasksComplete Boolean + 1 For lngIndex = 0 To mcSubSteps.Count - 1 ' BugMessage "Tasks Complete for Step Id : AllComplete = mblnComplete " & _ If mcSubSteps(lngIndex).StepId = ' CStr(mcSubSteps(lngIndex).StepId) & End Property mlngStepId Then _ mcSubSteps(lngIndex).TasksRunning = ' " Instance Id: " & InstanceId & _ Public Sub ChildExecuted(mlngStepId As _ ' " = " & Long) mcSubSteps(lngIndex).TasksComplete ' This procedure is called when a sub-step mcSubSteps(lngIndex).TasksRunning - 1 Exit For executes. ' BugMessage "Tasks Running for Step End If Id : " & _ Next lngIndex Dim lngIndex As Long ' CStr(mcSubSteps(lngIndex).StepId) & _ If lngIndex > mcSubSteps.Count - 1 Then On Error GoTo ChildExecutedErr ' " Instance Id: " & InstanceId & _ ' The child step wasn't found - raise an error ' " = " & On Error GoTo 0 BugAssert mcStep.StepType = mcSubSteps(lngIndex).TasksRunning Err.Raise errInvalidChild, mstrModuleName, _ gintManagerStep LoadResString(errInvalidChild) BugAssert End If For lngIndex = 0 To mcSubSteps.Count - mcSubSteps(lngIndex).TasksRunning >= 0, _ 1 "Tasks running for " & Exit Sub If mcSubSteps(lngIndex).StepId = CStr(mlngStepId) & _ mlngStepId Then " Instance Id " & InstanceId & " is ChildCompletedErr: less than 0." ' Log the error code raised by Visual Basic mcSubSteps(lngIndex).TasksRunning = _ Exit For Call LogErrors(Errors) End If On Error GoTo 0 mcSubSteps(lngIndex).TasksRunning + 1 Next lngIndex Err.Raise vbObjectError + errInstanceOpFailed, ' BugMessage "Tasks Running for mstrModuleName & "ChildCompleted", _ Step Id : " & _ If lngIndex > mcSubSteps.Count - 1 Then LoadResString(errInstanceOpFailed) ' ' The child step wasn't found - raise an CStr(mcSubSteps(lngIndex).StepId) & _ error End Sub ' " Instance Id: " & InstanceId & On Error GoTo 0 Public Sub ChildDeleted(mlngStepId As Long) _ Err.Raise errInvalidChild, ' This procedure is called when a sub-step needs ' " = " & mstrModuleName & "ChildTerminated", _ to be re-executed mcSubSteps(lngIndex).TasksRunning LoadResString(errInvalidChild) ' Note: The TasksComplete field is decremented. Exit For End If We needn't worry about End If ' the TasksRunning field since no steps are Next lngIndex Exit Sub currently running. Dim lngIndex As Long If lngIndex > mcSubSteps.Count - 1 Then ChildTerminatedErr: ' The child step wasn't found - raise an ' Log the error code raised by Visual Basic On Error GoTo ChildDeletedErr error Call LogErrors(Errors) On Error GoTo 0 On Error GoTo 0 BugAssert mcStep.StepType = gintManagerStep Err.Raise vbObjectError + mstrSource = mstrModuleName & errInvalidChild, mstrModuleName, _ "ChildTerminated" For lngIndex = 0 To mcSubSteps.Count - 1 LoadResString(errInvalidChild) Err.Raise vbObjectError + End If errInstanceOpFailed, mstrSource, _ If mcSubSteps(lngIndex).StepId = mlngStepId LoadResString(errInstanceOpFailed) Then Exit Sub mcSubSteps(lngIndex).TasksRunning = _ End Sub mcSubSteps(lngIndex).TasksRunning - ChildExecutedErr: Public Sub ChildCompleted(mlngStepId As 1 ' Log the error code raised by Visual Long) Basic ' This procedure is called when any a sub- BugAssert Call LogErrors(Errors) step completes mcSubSteps(lngIndex).TasksRunning >= 0, _ On Error GoTo 0 ' execution. Note: The TasksComplete field "Tasks running for " & Err.Raise vbObjectError + will be CStr(mcSubSteps(lngIndex).StepId) & _ errInstanceOpFailed, mstrModuleName & ' incremented. " Instance Id " & InstanceId & " is less "ChildExecuted", _ Dim lngIndex As Long than 0." LoadResString(errInstanceOpFailed) Exit For On Error GoTo ChildCompletedErr End If End Sub Next lngIndex Public Sub ChildTerminated(mlngStepId As BugAssert mcStep.StepType = Long) gintManagerStep If lngIndex > mcSubSteps.Count - 1 Then ' This procedure is called when any sub- ' The child step wasn't found - raise an error step process For lngIndex = 0 To mcSubSteps.Count - 1 On Error GoTo 0 ' terminates. Note: The TasksComplete BugAssert Err.Raise errInvalidChild, mstrModuleName, _ field will be mcSubSteps(lngIndex).TasksComplete >= 0, _ LoadResString(errInvalidChild) HP TPC-H FULL DISCLOSURE REPORT 181 © 2005 Hewlett-Packard Company. All rights reserved. End If ' executed Public Property Get RunningForStep(lngSubStepId lngRunning = 0 As Long) As Long Exit Sub For lngIndex = 0 To mcSubSteps.Count - ' Returns the total number of instances of the 1 substep ChildDeletedErr: lngRunning = lngRunning + ' that are executing ' Log the error code raised by Visual mcSubSteps(lngIndex).TasksRunning Dim lngIndex As Long Basic Next lngIndex Call LogErrors(Errors) Call RaiseErrForWorker On Error GoTo 0 IsPending = (lngRunning < Err.Raise vbObjectError + DegreeParallelism) For lngIndex = 0 To mcSubSteps.Count - 1 errInstanceOpFailed, mstrModuleName & Else BugAssert "ChildDeleted", _ ' This should be sufficient to prove that mcSubSteps(lngIndex).TasksRunning >= 0, _ LoadResString(errInstanceOpFailed) there r no "Tasks running for " & ' more sub-steps to be executed. CStr(mcSubSteps(lngIndex).StepId) & _ End Sub ' mblnComplete: Handles the case where " is less than 0." Private Sub RaiseErrForWorker() all steps have ' been executed If mcSubSteps(lngIndex).StepId = If mcStep.StepType <> gintManagerStep ' mblnNoMoreToStart: Handles the case lngSubStepId Then Then where the step RunningForStep = On Error GoTo 0 ' has a degree of parallelism greater than mcSubSteps(lngIndex).TasksRunning mstrSource = mstrModuleName & the total Exit For "RaiseErrForWorker" ' number of sub-steps available to execute End If Err.Raise vbObjectError + IsPending = False Next lngIndex errInvalidForWorker, _ End If mstrSource, _ If lngIndex > mcSubSteps.Count - 1 Then End Property ' The child step wasn't found - raise an error LoadResString(errInvalidForWorker) Public Property Get IsRunning() As Boolean On Error GoTo 0 End If ' Returns true if the any one of the substeps Err.Raise errInvalidChild, mstrSource, _ is still LoadResString(errInvalidChild) End Sub ' executing End If Dim lngIndex As Long Public Property Get Step() As cStep End Property Call RaiseErrForWorker Set Step = mcStep Public Property Let Status(ByVal vdata As IsRunning = False InstanceStatus) End Property Public Property Get Iterators() As cRunColIt ' If a substep has no currently executing mintStatus = vdata tasks and Set Iterators = mcIterators ' the tasks completed is greater than zero, End Property then we can End Property ' assume that it has completed execution Public Property Get Status() As InstanceStatus Public Property Get SubSteps() As (otherwise we cSubSteps ' would've run a new task the moment one Status = mintStatus completed!) Call RaiseErrForWorker For lngIndex = 0 To mcSubSteps.Count - 1 End Property If mcSubSteps(lngIndex).TasksRunning > Private Sub Class_Initialize() Set SubSteps = mcSubSteps 0 Then IsRunning = True Set mcSubSteps = New cSubSteps End Property Exit For Public Property Set Step(cRunStep As End If mblnNoMoreToStart = False cStep) Next lngIndex mblnComplete = False StartTime = gdtmEmpty Set mcStep = cRunStep End Property EndTime = gdtmEmpty Public Property Get TotalRunning() As Long End Property ' Returns the total number of substeps that End Sub are executing Public Property Set Iterators(cIts As Dim lngTotalProcesses As Long Private Sub Class_Terminate() cRunColIt) Dim lngIndex As Long mcSubSteps.Clear Set mcIterators = cIts Call RaiseErrForWorker Set mcSubSteps = Nothing

End Property lngTotalProcesses = 0 End Sub Public Property Get IsPending() As Boolean For lngIndex = 0 To mcSubSteps.Count - 1 VERSION 1.0 CLASS ' Returns true if the step has any substeps BugAssert BEGIN that need mcSubSteps(lngIndex).TasksRunning >= 0, _ MultiUse = -1 'True ' execution "Tasks running for " & END Dim lngIndex As Long CStr(mcSubSteps(lngIndex).StepId) & _ Attribute VB_Name = "cInstances" Dim lngRunning As Long " is less than 0." Attribute VB_GlobalNameSpace = False lngTotalProcesses = lngTotalProcesses + Attribute VB_Creatable = True Call RaiseErrForWorker mcSubSteps(lngIndex).TasksRunning Attribute VB_PredeclaredId = False Next lngIndex Attribute VB_Exposed = False If Not mblnComplete And Not ' FILE: cInstances.cls mblnNoMoreToStart Then TotalRunning = lngTotalProcesses ' Microsoft TPC-H Kit Ver. 1.00 ' Get a count of all the substeps that are End Property ' Copyright Microsoft, 1999 already being ' All Rights Reserved HP TPC-H FULL DISCLOSURE REPORT 182 © 2005 Hewlett-Packard Company. All rights reserved. ' Public Function QueryPendingInstance(ByVal ' ParentInstanceId As Long, _ If cSubStepDtls.StepType = gintManagerStep ' PURPOSE: Implements a collection of ByVal lngSubStepId As Long) As Then cInstance objects. cInstance ' Find the run node with the matching step id ' Type-safe wrapper around cVector. ' Retrieves a pending instance for the passed For lngIndex = 0 To Count() - 1 ' Also contains additional functions in substep If mcInstances(lngIndex).ParentInstanceId = to query an instance, etc. ' and the given parent instance id. lParentInstance And _ ' Contact: Reshma Tharamal mcInstances(lngIndex).Step.StepId = ([email protected]) Dim lngIndex As Long cSubStepDtls.StepId Then ' ' Put in a separate if condition since the Option Explicit On Error GoTo QueryPendingInstanceErr IsPending ' property is valid only for manager steps. ' Used to indicate the source module name ' Find the run node with the matching step id BugAssert (Not when errors For lngIndex = 0 To Count() - 1 mcInstances(lngIndex).IsPending), "Pending ' are raised by this class If mcInstances(lngIndex).ParentInstanceId instance exists!" Private Const mstrModuleName As String = = ParentInstanceId And _ "c Instance." mcInstances(lngIndex).Step.StepId = CompletedInstanceExists = True Private mstrSource As String lngSubStepId Then Exit Function ' Put in a separate if condition since the End If Private mcInstances As cVector IsPending Next lngIndex ' property is valid only for manager End If Public Function QueryInstance(ByVal steps. If the InstanceId As Long) As cInstance ' calling procedure does not pass a End Function ' Retrieves the record for the passed in manager step Public Sub Add(ByVal objItem As cInstance) instance from ' identifier, the procedure will error out. ' the collection If mcInstances(lngIndex).IsPending mcInstances.Add objItem Then Dim lngIndex As Long Set QueryPendingInstance = End Sub mcInstances(lngIndex) On Error GoTo QueryInstanceErr Exit For End If Public Sub Clear() ' Check for valid values of the instance id End If If InstanceId > 0 Then Next lngIndex mcInstances.Clear ' Find the run node with the matching step id Exit Function End Sub For lngIndex = 0 To Count() - 1 If mcInstances(lngIndex).InstanceId QueryPendingInstanceErr: = InstanceId Then ' Log the error code raised by Visual Basic Public Function Count() As Long Set QueryInstance = Call LogErrors(Errors) mcInstances(lngIndex) On Error GoTo 0 Count = mcInstances.Count Exit For mstrSource = mstrModuleName & End If "QueryPendingInstance" End Function Next lngIndex Err.Raise vbObjectError + errQueryFailed, _ mstrSource, If lngIndex > mcInstances.Count - 1 LoadResString(errQueryFailed) Public Function Delete(ByVal lngDelete As Long) Then As cInstance On Error GoTo 0 End Function Err.Raise vbObjectError + Public Function InstanceAborted(cSubStepRec Set Delete = mcInstances.Delete(lngDelete) errQueryFailed, mstrSource, _ As cSubStep) As Boolean LoadResString(errQueryFailed) End Function End If Dim lIndex As Long Else On Error GoTo 0 InstanceAborted = False Public Property Set Item(Optional ByVal Position Err.Raise vbObjectError + As Long, _ errQueryFailed, mstrSource, _ For lIndex = 0 To Count() - 1 RHS As cInstance) LoadResString(errQueryFailed) If mcInstances(lIndex).Step.StepId = End If cSubStepRec.StepId And _ If Position = -1 Then mcInstances(lIndex).Status = Position = 0 Exit Function gintAborted Then End If InstanceAborted = True Set mcInstances(Position) = RHS QueryInstanceErr: Exit For ' Log the error code raised by Visual End If End Property Basic Next lIndex Call LogErrors(Errors) Public Property Get Item(Optional ByVal Position On Error GoTo 0 End Function As Long = -1) _ mstrSource = mstrModuleName & Public Function As cInstance "QueryInstance" CompletedInstanceExists(lParentInstance As Attribute Item.VB_UserMemId = 0 Err.Raise vbObjectError + Long, _ errQueryFailed, _ cSubStepDtls As cStep) As Boolean If Position = -1 Then mstrSource, ' Checks if there is a completed instance of Position = 0 LoadResString(errQueryFailed) the passed in step End If Set Item = mcInstances.Item(Position) End Function Dim lngIndex As Long End Property CompletedInstanceExists = False HP TPC-H FULL DISCLOSURE REPORT 183 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Class_Initialize() SequenceNo = mintSequenceNo IndOperation = mintOperation Set mcInstances = New cVector End Property End Property End Sub Public Property Let IndOperation(ByVal vdata Public Property Let SequenceNo(ByVal vdata As As Operation) Integer) mintSequenceNo = vdata Private Sub Class_Terminate() On Error GoTo IndOperationErr End Property mstrSource = mstrModuleName & Set mcInstances = Nothing "IndOperation" Public Sub Add(ByVal lngStepId As Long, _ strVersion As String) End Sub ' The valid operations are define in the ' Inserts a new iterator values record into the cOperations database ' class. Check if the operation is valid VERSION 1.0 CLASS Select Case vdata Dim strInsert As String BEGIN Case QueryOp, InsertOp, UpdateOp, Dim qy As DAO.QueryDef MultiUse = -1 'True DeleteOp END mintOperation = vdata On Error GoTo AddIteratorErr Attribute VB_Name = "cIterator" Attribute VB_GlobalNameSpace = False Case Else ' First check if the database object is valid Attribute VB_Creatable = True On Error GoTo 0 Call CheckDB Attribute VB_PredeclaredId = False Err.Raise vbObjectError + Attribute VB_Exposed = False errInvalidOperation, _ ' Create a temporary querydef object ' FILE: cIterator.cls mstrSource, strInsert = "insert into iterator_values " & _ ' Microsoft TPC-H Kit Ver. 1.00 LoadResString(errInvalidOperation) "( step_id, version_no, type, " & _ ' Copyright Microsoft, 1999 End Select " iterator_value, sequence_no ) " & _ ' All Rights Reserved " values ( [st_id], [ver_no], [it_typ], " & _ ' Exit Property " [it_val], [seq_no] )" ' Set qy = ' PURPOSE: Encapsulates the properties IndOperationErr: mdbsIteratorDB.CreateQueryDef(gstrEmptyString, and methods of an iterator. LogErrors Errors strInsert) ' Contains functions to insert, mstrSource = mstrModuleName & update and delete "IndOperation" ' Call a procedure to execute the Querydef object ' iterator_values records from the On Error GoTo 0 Call AssignParameters(qy, lngStepId, strVersion) database. Err.Raise vbObjectError + ' Contact: Reshma Tharamal errLetOperationFailed, _ qy.Execute dbFailOnError ([email protected]) mstrSource, qy.Close ' LoadResString(errLetOperationFailed) Option Explicit Exit Sub End Property Implements cNode AddIteratorErr: Public Function Clone() As cIterator LogErrors Errors ' Module level variables to store the property mstrSource = mstrModuleName & "AddIterator" values ' Creates a copy of a given Iterator On Error GoTo 0 Private mintType As Integer Err.Raise vbObjectError + errInsertIteratorFailed, Private mintSequenceNo As Integer Dim cItClone As cIterator _ Private mstrValue As String mstrSource, _ Private mdbsIteratorDB As Database On Error GoTo CloneErr LoadResString(errInsertIteratorFailed) Private mintOperation As Integer End Sub Private mlngPosition As Long Set cItClone = New cIterator Private Sub AssignParameters(qyExec As Private Const mstrModuleName As String = ' Copy all the iterator properties to the newly DAO.QueryDef, _ "c Iterator." ' created object ByVal lngStepId As Long, _ Private mstrSource As String cItClone.IteratorType = mintType strVersion As String) cItClone.SequenceNo = mintSequenceNo ' Assigns values to the parameters in the querydef Public Enum ValueType cItClone.IndOperation = mintOperation object gintFrom = 1 cItClone.Value = mstrValue ' The parameter names are cryptic to make them gintTo different gintStep ' And set the return value to the newly ' from the field names. When the parameter gintValue created Iterator names are End Enum Set Clone = cItClone ' the same as the field names, parameters in the Public Property Get Value() As String where Exit Function ' clause do not get created. Value = mstrValue CloneErr: Dim prmParam As DAO.Parameter End Property LogErrors Errors Public Property Let Value(ByVal vdata As mstrSource = mstrModuleName & "Clone" On Error GoTo AssignParametersErr String) On Error GoTo 0 mstrSource = mstrModuleName & Err.Raise vbObjectError + errCloneFailed, _ "AssignParameters" mstrValue = vdata mstrSource, LoadResString(errCloneFailed) For Each prmParam In qyExec.Parameters End Property Select Case prmParam.Name End Function Case "[st_id]" Public Property Get IndOperation() As Public Property Get SequenceNo() As Integer prmParam.Value = lngStepId Operation HP TPC-H FULL DISCLOSURE REPORT 184 © 2005 Hewlett-Packard Company. All rights reserved. Case "[ver_no]" strDelete = "delete from iterator_values " & LogErrors Errors prmParam.Value = strVersion _ mstrSource = mstrModuleName & "Update" " where step_id = [st_id]" & _ On Error GoTo 0 Case "[it_typ]" " and version_no = [ver_no]" & _ Err.Raise vbObjectError + prmParam.Value = mintType " and iterator_value = [it_val] " errUpdateConstraintFailed, _ Set qy = mstrSource, _ Case "[it_val]" mdbsIteratorDB.CreateQueryDef(gstrEmptyStr LoadResString(errUpdateConstraintFailed) prmParam.Value = mstrValue ing, strDelete) End Sub Case "[seq_no]" Call AssignParameters(qy, lngStepId, Public Property Set NodeDB(vdata As Database) prmParam.Value = strVersion) mintSequenceNo qy.Execute dbFailOnError Set mdbsIteratorDB = vdata

Case Else qy.Close End Property ' Write the parameter name that is faulty Exit Sub Public Property Get NodeDB() As Database WriteError errInvalidParameter, mstrSource, _ DeleteIteratorErr: Set NodeDB = mdbsIteratorDB prmParam.Name LogErrors Errors On Error GoTo 0 mstrSource = mstrModuleName & End Property Err.Raise errInvalidParameter, "DeleteIterator" Public Property Get Position() As Long mstrSource, _ On Error GoTo 0 Err.Raise vbObjectError + Position = mlngPosition LoadResString(errInvalidParameter) errDeleteIteratorFailed, _ End Select mstrSource, _ End Property Next prmParam LoadResString(errDeleteIteratorFailed) Public Property Let Position(ByVal vdata As Long) End Sub Exit Sub Public Sub Update(ByVal lngStepId As Long, mlngPosition = vdata strVersion As String) AssignParametersErr: ' Updates the sequence no of the step iterator End Property record mstrSource = mstrModuleName & ' in the database Public Property Let IteratorType(ByVal vdata As "AssignParameters" ValueType) Call LogErrors(Errors) Dim strUpdate As String On Error GoTo 0 Dim qy As QueryDef On Error GoTo TypeErr Err.Raise vbObjectError + mstrSource = mstrModuleName & "Type" errAssignParametersFailed, _ On Error GoTo UpdateErr mstrSource, ' These constants have been defined in the LoadResString(errAssignParametersFailed) ' First check if the database object is valid enumeration, Call CheckDB ' Type, which is exposed End Sub Select Case vdata Private Sub CheckDB() If mintType = gintValue Then Case gintFrom, gintTo, gintStep, gintValue ' Check if the database object has been ' If the iterator is of type value, only the mintType = vdata initialized sequence of the values can get updated strUpdate = "Update iterator_values " & _ Case Else If mdbsIteratorDB Is Nothing Then " set sequence_no = [seq_no] " & _ On Error GoTo 0 ShowError errInvalidDB " where step_id = [st_id]" & _ Err.Raise vbObjectError + errTypeInvalid, _ On Error GoTo 0 " and version_no = [ver_no]" & _ mstrSource, Err.Raise vbObjectError + " and iterator_value = [it_val] " LoadResString(errTypeInvalid) errInvalidDB, _ Else End Select mstrModuleName, ' If the iterator is of type range, only the LoadResString(errInvalidDB) values can get updated Exit Property End If strUpdate = "Update iterator_values " & _ " set iterator_value = [it_val] " & _ TypeErr: End Sub " where step_id = [st_id]" & _ LogErrors Errors " and version_no = [ver_no]" & _ mstrSource = mstrModuleName & "Type" Public Sub Delete(ByVal lngStepId As " and type = [it_typ] " On Error GoTo 0 Long, _ End If Err.Raise vbObjectError + errTypeInvalid, _ strVersion As String) mstrSource, LoadResString(errTypeInvalid) ' Deletes the step iterator record from the Set qy = database mdbsIteratorDB.CreateQueryDef(gstrEmptyStr End Property ing, strUpdate) Dim strDelete As String Public Property Get IteratorType() As ValueType Dim qy As DAO.QueryDef ' Call a procedure to assign the parameter values to the IteratorType = mintType On Error GoTo DeleteIteratorErr ' querydef object mstrSource = mstrModuleName & Call AssignParameters(qy, lngStepId, End Property "DeleteIterator" strVersion) Public Sub Validate() qy.Execute dbFailOnError ' There can be multiple iterators for a step. ' No validations necessary for the iterator class ' However the values that an iterator for a qy.Close step can End Sub ' assume will be unique, meaning that a Exit Sub combination of Private Sub Class_Initialize() ' the iterator_id and value will be unique. UpdateErr: HP TPC-H FULL DISCLOSURE REPORT 185 © 2005 Hewlett-Packard Company. All rights reserved. ' Initialize the operation indicator variable End Property Private Property Let cStep_StartDir(ByVal RHS As to Query String) ' It will be modified later by the collection class when Private Property Get cNode_Position() As mcStep.StartDir = RHS ' inserts, updates or deletes are performed Long mintOperation = QueryOp End Property cNode_Position = mlngPosition End Sub Private Property Get cStep_StartDir() As String End Property cStep_StartDir = mcStep.StartDir Private Property Let cNode_IndOperation(ByVal vdata As Private Sub cNode_Validate() End Property Operation) Private Sub cStep_Delete() ' No validations necessary for the iterator On Error GoTo IndOperationErr class Call mcStep.Delete mstrSource = mstrModuleName & "IndOperation" End Sub End Sub

' The valid operations are define in the Private Property Set cStep_NodeDB(RHS As cOperations Private Property Let cNode_Value(ByVal DAO.Database) ' class. Check if the operation is valid vdata As String) Select Case vdata Set mcStep.NodeDB = RHS Case QueryOp, InsertOp, UpdateOp, mstrValue = vdata DeleteOp End Property mintOperation = vdata End Property Private Function cStep_IncVersionY() As String Case Else Private Property Get cNode_Value() As String On Error GoTo 0 cStep_IncVersionY = mcStep.IncVersionY Err.Raise vbObjectError + Value = mstrValue errInvalidOperation, _ End Function mstrSource, End Property Private Function cStep_IsNewVersion() As LoadResString(errInvalidOperation) VERSION 1.0 CLASS Boolean End Select BEGIN cStep_IsNewVersion = mcStep.IsNewVersion MultiUse = -1 'True End Function Exit Property END Private Function cStep_OldVersionNo() As String Attribute VB_Name = "cManager" cStep_OldVersionNo = mcStep.OldVersionNo IndOperationErr: Attribute VB_GlobalNameSpace = False End Function LogErrors Errors Attribute VB_Creatable = True mstrSource = mstrModuleName & Attribute VB_PredeclaredId = False Private Function cStep_IncVersionX() As String "IndOperation" Attribute VB_Exposed = False On Error GoTo 0 ' FILE: cManager.cls cStep_IncVersionX = mcStep.IncVersionX Err.Raise vbObjectError + ' Microsoft TPC-H Kit Ver. 1.00 errLetOperationFailed, _ ' Copyright Microsoft, 1999 End Function mstrSource, ' All Rights Reserved Private Sub cStep_UpdateIteratorVersion() LoadResString(errLetOperationFailed) ' ' Call mcStep.UpdateIteratorVersion End Property ' PURPOSE: Encapsulates the properties and methods of a manager step. End Sub Private Property Get cNode_IndOperation() ' Implements the cStep class - carries As Operation out initializations Private Function cStep_IteratorCount() As Long ' and validations that are specific to IndOperation = mintOperation manager steps. cStep_IteratorCount = mcStep.IteratorCount ' Contact: Reshma Tharamal End Property ([email protected]) End Function ' Private Property Set cNode_NodeDB(RHS Option Explicit Private Sub cStep_UnloadIterators() As DAO.Database) Implements cStep Call mcStep.UnloadIterators Set mdbsIteratorDB = RHS ' Object variable to keep the step reference in End Sub End Property Private mcStep As cStep Private Sub cStep_DeleteIterator(cItRecord As Private Property Get cNode_NodeDB() As ' Used to indicate the source module name cIterator) DAO.Database when errors ' are raised by this class Call mcStep.DeleteIterator(cItRecord) Set cNode_NodeDB = mdbsIteratorDB Private mstrSource As String Private Const mstrModuleName As String = End Sub End Property "c Manager." Private Property Get cStep_IteratorName() As Private Sub cStep_AddAllIterators() String

Private Property Let cNode_Position(ByVal Call mcStep.AddAllIterators cStep_IteratorName = mcStep.IteratorName vdata As Long) End Sub End Property mlngPosition = vdata Private Property Let cStep_IteratorName(ByVal RHS As String) HP TPC-H FULL DISCLOSURE REPORT 186 © 2005 Hewlett-Packard Company. All rights reserved. Set cStep_Clone = Private Property Get cStep_ArchivedFlag() As mcStep.IteratorName = RHS mcStep.Clone(cNewManager) Boolean

End Property End Function cStep_ArchivedFlag = mcStep.ArchivedFlag

Private Sub cStep_SaveIterators() Private Property Get cStep_IndOperation() As End Property Operation Call mcStep.SaveIterators Private Property Get cStep_NodeDB() As cStep_IndOperation = mcStep.IndOperation DAO.Database End Sub Private Sub cStep_LoadIterator(cItRecord End Property Set cStep_NodeDB = mcStep.NodeDB As cIterator) Private Property Let End Property Call mcStep.LoadIterator(cItRecord) cStep_IndOperation(ByVal RHS As Operation) Private Sub Class_Initialize() End Sub mcStep.IndOperation = RHS ' Create the object Private Property Let cStep_Position(ByVal Set mcStep = New cStep RHS As Long) End Property ' Initialize the object with valid values for a mcStep.Position = RHS Private Property Get cStep_NextStepId() As manager step Long ' The global flag should be the first field to be End Property initialized Private Sub cStep_InsertIterator(cItRecord cStep_NextStepId = mcStep.NextStepId ' since subsequent validations might try to check As cIterator) if the End Property ' step being created is global Call mcStep.InsertIterator(cItRecord) mcStep.GlobalFlag = False Private Property Let cStep_OutputFile(ByVal ' mcStep.GlobalRunMethod = gintNoOption End Sub RHS As String) mcStep.StepType = gintManagerStep Private Function cStep_Iterators() As Variant mcStep.OutputFile = RHS ' Since the manager step does not take any action, the step cStep_Iterators = mcStep.Iterators End Property ' text and file name will always be empty mcStep.StepText = gstrEmptyString End Function Private Property Get cStep_OutputFile() As mcStep.StepTextFile = gstrEmptyString Private Sub cStep_ModifyIterator(cItRecord String As cIterator) ' Since the manager step does not take any action, cStep_OutputFile = mcStep.OutputFile execution Call mcStep.ModifyIterator(cItRecord) ' properties for the step will be empty End Property mcStep.ExecutionMechanism = gintNoOption End Sub mcStep.FailureDetails = gstrEmptyString Private Sub Private Property Let cStep_ErrorFile(ByVal mcStep.ContinuationCriteria = gintNoOption cStep_RemoveIterator(cItRecord As RHS As String) cIterator) End Sub mcStep.ErrorFile = RHS Private Sub Class_Terminate() Call mcStep.RemoveIterator(cItRecord) End Property ' Remove the step object End Sub Set mcStep = Nothing Private Sub cStep_UpdateIterator(cItRecord Private Property Get cStep_ErrorFile() As As cIterator) String End Sub Private Sub cStep_Add() Call mcStep.UpdateIterator(cItRecord) cStep_ErrorFile = mcStep.ErrorFile ' Call the Add method of the step class to carry End Sub End Property out the insert Private Sub cStep_AddIterator(cItRecord As 'Private Property Let cStep_LogFile(ByVal mcStep.Add cIterator) RHS As String) ' End Sub Call mcStep.AddIterator(cItRecord) ' mcStep.LogFile = RHS Private Property Get cStep_ContinuationCriteria() ' As ContinuationCriteria End Sub 'End Property ' cStep_ContinuationCriteria = Private Property Get cStep_Position() As 'Private Property Get cStep_LogFile() As mcStep.ContinuationCriteria Long String ' End Property cStep_Position = mcStep.Position ' cStep_LogFile = mcStep.LogFile ' Private Property Let End Property 'End Property cStep_ContinuationCriteria(ByVal RHS As ContinuationCriteria) Private Function cStep_Clone(Optional Private Property Let cCloneStep As cStep) As cStep cStep_ArchivedFlag(ByVal RHS As Boolean) ' Since a manager step cannot take any action, the continuation Dim cNewManager As cManager mcStep.ArchivedFlag = RHS ' criteria property does not apply to it mcStep.ContinuationCriteria = gintNoOption Set cNewManager = New cManager End Property End Property HP TPC-H FULL DISCLOSURE REPORT 187 © 2005 Hewlett-Packard Company. All rights reserved. Private Property Let Private Property Let cStep_SequenceNo(ByVal Private Property Let cStep_FailureDetails(ByVal RHS As String) RHS As Integer) cStep_DegreeParallelism(ByVal RHS As String) ' Since a manager step cannot take any mcStep.SequenceNo = RHS action, the Failure mcStep.DegreeParallelism = RHS ' Details property does not apply to it End Property mcStep.FailureDetails = gstrEmptyString End Property Private Property Get cStep_SequenceNo() As End Property Integer Private Property Get cStep_DegreeParallelism() As String Private Property Get cStep_FailureDetails() As cStep_SequenceNo = mcStep.SequenceNo String cStep_DegreeParallelism = End Property mcStep.DegreeParallelism cStep_FailureDetails = mcStep.FailureDetails Private Property Let cStep_StepId(ByVal RHS As End Property Long) End Property Private Sub cStep_DeleteStep() mcStep.StepId = RHS Private Property Get cStep_GlobalFlag() As On Error GoTo cStep_DeleteStepErr Boolean End Property mstrSource = mstrModuleName & "c Step_DeleteStep" cStep_GlobalFlag = mcStep.GlobalFlag Private Property Get cStep_StepId() As Long

mcStep.Delete End Property cStep_StepId = mcStep.StepId Exit Sub Private Property Let cStep_GlobalFlag(ByVal End Property cStep_DeleteStepErr: RHS As Boolean) LogErrors Errors mstrSource = mstrModuleName & ' Set the global flag to false - this flag is Private Property Let cStep_StepLabel(ByVal RHS "c Step_DeleteStep" initialized when As String) On Error GoTo 0 ' an instance of the class is created. Just Err.Raise vbObjectError + making sure that mcStep.StepLabel = RHS errDeleteStepFailed, _ ' nobody changes the value inadvertently mstrSource, _ mcStep.GlobalFlag = False End Property LoadResString(errDeleteStepFailed) End Property Private Property Get cStep_StepLabel() As String End Sub Private Sub cStep_Modify() cStep_StepLabel = mcStep.StepLabel Private Property Get cStep_EnabledFlag() ' Call the Modify method of the step class to As Boolean carry out the update End Property mcStep.Modify cStep_EnabledFlag = mcStep.EnabledFlag End Sub Private Property Let cStep_StepLevel(ByVal RHS As Integer) End Property Private Property Let cStep_ParentStepId(ByVal RHS As Long) mcStep.StepLevel = RHS Private Property Let cStep_EnabledFlag(ByVal RHS As mcStep.ParentStepId = RHS End Property Boolean) End Property Private Property Get cStep_StepLevel() As Integer mcStep.EnabledFlag = RHS Private Property Get cStep_ParentStepId() As cStep_StepLevel = mcStep.StepLevel End Property Long End Property Private Property Let cStep_ParentStepId = mcStep.ParentStepId cStep_ExecutionMechanism(ByVal RHS As Private Property Let cStep_StepText(ByVal RHS ExecutionMethod) End Property As String)

' Since a manager step cannot take any Private Property Let ' Since the manager step does not take any action, action, the Execution cStep_ParentVersionNo(ByVal RHS As the step ' Mechanism property does not apply to it String) ' text and file name will always be empty mcStep.ExecutionMechanism = mcStep.StepText = gstrEmptyString gintNoOption mcStep.ParentVersionNo = RHS End Property End Property End Property Private Property Get cStep_StepText() As String Private Property Get Private Property Get cStep_ParentVersionNo() cStep_ExecutionMechanism() As As String cStep_StepText = mcStep.StepText ExecutionMethod cStep_ParentVersionNo = End Property cStep_ExecutionMechanism = mcStep.ParentVersionNo mcStep.ExecutionMechanism Private Property Let cStep_StepTextFile(ByVal End Property RHS As String) End Property

HP TPC-H FULL DISCLOSURE REPORT 188 © 2005 Hewlett-Packard Company. All rights reserved. ' Since the manager step does not take any gstrSource, _ ' action, the step LoadResString(errValidateFailed) Option Explicit ' text and file name will always be empty End If mcStep.StepTextFile = gstrEmptyString Public Property Get IndOperation() As Operation If mcStep.ContinuationCriteria <> End Property End Property gintNoOption Then Public Property Let IndOperation(ByVal vdata As ShowError errContCriteriaInvalid Operation) Private Property Get cStep_StepTextFile() On Error GoTo 0 End Property As String Err.Raise vbObjectError + Public Sub Validate() errValidateFailed, _ End Sub cStep_StepTextFile = gstrSource, _ Public Property Get Value() As String mcStep.StepTextFile LoadResString(errValidateFailed) End Property End If Public Property Let Value(ByVal vdata As String) End Property End Property mcStep.Validate Private Property Let cStep_StepType(RHS Public Property Get NodeDB() As Database As gintStepType) Exit Sub End Property Public Property Set NodeDB(vdata As Database) mcStep.StepType = gintManagerStep cStep_ValidateErr: End Property LogErrors Errors End Property mstrSource = mstrModuleName & Public Property Get Position() As Long "c Step_Validate" End Property Private Property Get cStep_StepType() As On Error GoTo 0 Public Property Let Position(ByVal vdata As Long) gintStepType Err.Raise vbObjectError + End Property errValidateFailed, _ cStep_StepType = mcStep.StepType mstrSource, _ VERSION 1.0 CLASS LoadResString(errValidateFailed) BEGIN End Property End Sub MultiUse = -1 'True END Private Sub cStep_Validate() Private Property Let cStep_VersionNo(ByVal Attribute VB_Name = "cNodeCollections" ' The validate routines for each of the RHS As String) Attribute VB_GlobalNameSpace = False steps will Attribute VB_Creatable = True ' carry out the specific validations for the mcStep.VersionNo = RHS Attribute VB_PredeclaredId = False type and Attribute VB_Exposed = False ' call the generic validation routine End Property ' FILE: cNodeCollections.cls ' Microsoft TPC-H Kit Ver. 1.00 On Error GoTo cStep_ValidateErr Private Property Get cStep_VersionNo() As ' Copyright Microsoft, 1999 mstrSource = mstrModuleName & String ' All Rights Reserved "c Step_Validate" ' cStep_VersionNo = mcStep.VersionNo ' ' Validations specific to manager steps ' PURPOSE: Implements an array of objects. End Property ' Contact: Reshma Tharamal ' Check if the step text or a file name has ([email protected]) been Private Property Let ' ' specified cStep_WorkspaceId(ByVal RHS As Long) Option Explicit If Not StringEmpty(mcStep.StepText) Or Not StringEmpty(mcStep.StepTextFile) mcStep.WorkspaceId = RHS ' Node counter Then Private mlngNodeCount As Long ShowError End Property Private mdbsNodeDb As Database errTextAndFileNullForManager Private mcarrNodes() As Object On Error GoTo 0 Private Property Get cStep_WorkspaceId() As Err.Raise vbObjectError + Long ' Used to indicate the source module name when errValidateFailed, _ errors gstrSource, _ cStep_WorkspaceId = mcStep.WorkspaceId ' are raised by this class LoadResString(errValidateFailed) Private mstrSource As String End If End Property Private Const mstrModuleName As String = VERSION 1.0 CLASS "c NodeCollections." If mcStep.ExecutionMechanism <> BEGIN gintNoOption Then MultiUse = -1 'True Public Property Set Item(ByVal Position As Long, ShowError END _ errExecutionMechanismInvalid Attribute VB_Name = "cNode" ByVal objNode As Object) On Error GoTo 0 Attribute VB_GlobalNameSpace = False Err.Raise vbObjectError + Attribute VB_Creatable = True ' Returns the element at the passed in position in errValidateFailed, _ Attribute VB_PredeclaredId = False the array gstrSource, _ Attribute VB_Exposed = False If Position >= 0 And Position < mlngNodeCount LoadResString(errValidateFailed) ' FILE: cNode.cls Then End If ' Microsoft TPC-H Kit Ver. 1.00 Set mcarrNodes(Position) = objNode ' Copyright Microsoft, 1999 Else If mcStep.FailureDetails <> ' All Rights Reserved On Error GoTo 0 gstrEmptyString Then ' Err.Raise vbObjectError + ShowError ' errItemDoesNotExist, mstrSource, _ errFailureDetailsNullForMgr ' PURPOSE: Defines the properties that an LoadResString(errItemDoesNotExist) On Error GoTo 0 object has to implement. End If Err.Raise vbObjectError + ' Contact: Reshma Tharamal errValidateFailed, _ ([email protected]) End Property HP TPC-H FULL DISCLOSURE REPORT 189 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Get Item(ByVal Position As On Error GoTo SaveErr cNodeToLoad.Position = mlngNodeCount Long) As Object Set mcarrNodes(mlngNodeCount) = Attribute Item.VB_UserMemId = 0 ' Find all parameters in the array with a cNodeToLoad matching workspace id ' Returns the element at the passed in ' It is important to step backwards through mlngNodeCount = mlngNodeCount + 1 position in the array the array, since If Position >= 0 And Position < ' we delete parameter records as we go Exit Sub mlngNodeCount Then along! Set Item = mcarrNodes(Position) For lngIndex = mlngNodeCount - 1 To 0 LoadErr: Else Step -1 LogErrors Errors On Error GoTo 0 If mcarrNodes(lngIndex).WorkspaceId = On Error GoTo 0 Err.Raise vbObjectError + lngWorkspace Then Err.Raise vbObjectError + errLoadFailed, errItemDoesNotExist, mstrSource, _ mstrModuleName & "Load", _ ' Call a procedure to commit all LoadResString(errLoadFailed) LoadResString(errItemDoesNotExist) changes to the End If ' parameter record, if any End Sub Call Commit(mcarrNodes(lngIndex), Public Sub Unload(lngDeletePosition As Long) End Property lngIndex) ' Unloads the passed in object from the array

Public Sub Commit(ByVal cSaveObj As End If On Error GoTo UnloadErr Object, _ Next lngIndex ByVal lngIndex As Long) If lngDeletePosition < (mlngNodeCount - 1) ' This procedure checks if any changes Exit Sub Then have been made to the ' passed in object. If so, it calls the SaveErr: ' Set the Node at the position being deleted to corresponding method LogErrors Errors ' the last Node in the Node array ' to commit the changes. mstrSource = mstrModuleName & "Save" Set mcarrNodes(lngDeletePosition) = On Error GoTo 0 mcarrNodes(mlngNodeCount - 1) On Error GoTo CommitErr Err.Raise vbObjectError + errSaveFailed, _ mcarrNodes(lngDeletePosition).Position = mstrSource = mstrModuleName & mstrSource, _ lngDeletePosition "Commit" LoadResString(errSaveFailed) End If

Select Case cSaveObj.IndOperation End Sub ' Delete the last Node from the array Case QueryOp Public Property Get Count() As Long mlngNodeCount = mlngNodeCount - 1 ' No changes were made to the If mlngNodeCount > 0 Then queried parameter. Count = mlngNodeCount ReDim Preserve mcarrNodes(0 To ' Do nothing mlngNodeCount - 1) End Property Else Case InsertOp ReDim mcarrNodes(0) cSaveObj.Add Public Property Get NodeDB() As Database End If cSaveObj.IndOperation = QueryOp Set NodeDB = mdbsNodeDb Exit Sub Case UpdateOp cSaveObj.Modify End Property UnloadErr: cSaveObj.IndOperation = QueryOp Public Property Set NodeDB(vdata As LogErrors Errors Database) mstrSource = mstrModuleName & "Unload" Case DeleteOp On Error GoTo 0 cSaveObj.Delete Set mdbsNodeDb = vdata Err.Raise vbObjectError + errUnloadFailed, _ ' Now we can remove the record mstrSource, _ from the array End Property LoadResString(errUnloadFailed) Call Unload(lngIndex) Public Sub Load(cNodeToLoad As Object) End Sub End Select ' Adds the passed in object to the array Public Sub Delete(lngDeletePosition As Long) ' Deletes the object at the specified position in the Exit Sub On Error GoTo LoadErr ' array

CommitErr: ' If this procedure is called by the add to Dim cDeleteObj As Object LogErrors Errors array procedure, mstrSource = mstrModuleName & ' the database object has already been On Error GoTo DeleteErr "Commit" initialized mstrSource = mstrModuleName & "Delete" On Error GoTo 0 If cNodeToLoad.NodeDB Is Nothing Then Err.Raise vbObjectError + Set cDeleteObj = mcarrNodes(lngDeletePosition) errCommitFailed, _ ' All the Nodes will be initialized with the mstrSource, _ database If cDeleteObj.IndOperation = InsertOp Then LoadResString(errCommitFailed) ' objects before being added to the array ' If we are deleting a record that has just been Set cNodeToLoad.NodeDB = inserted, End Sub mdbsNodeDb ' blow it away Public Sub Save(ByVal lngWorkspace As Call Unload(lngDeletePosition) Long) End If Else ' Calls a procedure to commit all changes ' Set the operation for the deleted object to for the passed ReDim Preserve indicate a ' in workspace. mcarrNodes(mlngNodeCount) ' delete - we actually delete the element only at the time Dim lngIndex As Long ' Set the newly added element in the array to ' of a save operation the passed in Node cDeleteObj.IndOperation = DeleteOp HP TPC-H FULL DISCLOSURE REPORT 190 © 2005 Hewlett-Packard Company. All rights reserved. End If ' Call a procedure to load the record in the array End Function Exit Sub Call Load(cNodeToAdd)

DeleteErr: Exit Sub Public Function JulianDateToString(dt64Bit As LogErrors Errors Currency) As String mstrSource = mstrModuleName & AddErr: "Delete" LogErrors Errors Dim lYear As Long On Error GoTo 0 mstrSource = mstrModuleName & "Add" Dim lMonth As Long Err.Raise vbObjectError + On Error GoTo 0 Dim lDay As Long errDeleteFailed, _ Err.Raise vbObjectError + errAddFailed, _ Dim lHour As Long mstrSource, _ mstrSource, _ Dim lMin As Long LoadResString(errDeleteFailed) LoadResString(errAddFailed) Dim lSec As Long Dim lMs As Long End Sub End Sub Public Sub Modify(cModifiedNode As Call JulianToTime(dt64Bit, lYear, lMonth, lDay, Object) Private Sub Class_Terminate() lHour, lMin, lSec, lMs) ' Sets the object at the passed in position JulianDateToString = Format$(lYear, to the ReDim mcarrNodes(0) gsYearFormat) & gsDateSeparator & _ ' modified object passed in mlngNodeCount = 0 Format$(lMonth, gsDtFormat) & gsDateSeparator & _ On Error GoTo ModifyErr End Sub Format$(lDay, gsDtFormat) & gstrBlank & _ ' First check if the record is valid - all Format$(lHour, gsTmFormat) & objects that Attribute VB_Name = "Common" gsTimeSeparator & _ ' use this collection class must have a ' FILE: Common.bas Format$(lMin, gsTmFormat) & Validate routine ' Microsoft TPC-H Kit Ver. 1.00 gsTimeSeparator & _ cModifiedNode.Validate ' Copyright Microsoft, 1999 Format$(lSec, gsTmFormat) & ' All Rights Reserved gsMsSeparator & _ ' If we are updating a record that hasn't yet ' Format$(lMs, gsMSecondFormat) been inserted, ' ' do not change the operation indicator - ' PURPOSE: Module containing common End Function or we try to update functionality throughout Public Sub DeleteFile(strFile As String, Optional ' a non-existant record ' StepMaster ByVal bCheckIfEmpty As Boolean = False) If cModifiedNode.IndOperation <> ' Contact: Reshma Tharamal InsertOp Then ([email protected]) ' Ensure that there is only a single file of the ' Set the operations to indicate an ' name before delete, since update Option Explicit ' Kill supports wildcards and can potentially cModifiedNode.IndOperation = delete a number of files UpdateOp Private Const mstrModuleName As String = Dim strTemp As String End If "Common." If CheckFileExists(strFile) Then ' Modify the object at the queried position ' Used to separate the variable data from the If bCheckIfEmpty Then - the Position constant error If FileLen(strFile) = 0 Then ' will be maintained by this class ' message being raised when a context-sensitive Kill strFile Set mcarrNodes(cModifiedNode.Position) error is displayed End If = cModifiedNode Private Const mintDelimiter As String = " : " Else Private Const mstrFormatString = "mmddyy" Kill strFile Exit Sub End If ' Identifiers for the different labels that need to End If ModifyErr: be loaded LogErrors Errors ' into the tree view for each workspace End Sub mstrSource = mstrModuleName & Public Const mstrWorkspacePrefix = "W" Public Function CheckFileExists(strFile As String) "Modify" Public Const mstrParameterPrefix = "P" As Boolean On Error GoTo 0 Public Const mstrParamConnectionPrefix = Err.Raise vbObjectError + "C" ' Returns true if the passed in file exists errModifyFailed, _ Public Const mstrConnectionDtlPrefix = "N" ' Raises an error if multiple files are found mstrSource, _ Public Const mstrParamExtensionPrefix = "E" (filename contains a wildcard) LoadResString(errModifyFailed) Public Const mstrParamBuiltInPrefix = "B" CheckFileExists = False Public Const gstrGlobalStepPrefix = "G" End Sub Public Const gstrManagerStepPrefix = "M" If Not StringEmpty(Dir(strFile)) Then Public Sub Add(cNodeToAdd As Object) Public Const gstrWorkerStepPrefix = "S" If Not StringEmpty(Dir()) Then Public Const gstrDummyPrefix = "D" On Error GoTo 0 On Error GoTo AddErr Public Const mstrLabelPrefix = "L" Err.Raise vbObjectError + Public Const mstrInstancePrefix = "I" errDeleteSingleFile, _ Set cNodeToAdd.NodeDB = Public Function mstrModuleName & "DeleteFile", mdbsNodeDb LabelStep(lngWorkspaceIdentifier As Long) LoadResString(errDeleteSingleFile) As String End If ' First check if the record is valid ' Returns the step label for the workspace cNodeToAdd.Validate identifier passed in CheckFileExists = True ' Basically this is a wrapper around the End If ' Set the operation to indicate an insert MakeKeyValid function cNodeToAdd.IndOperation = InsertOp End Function LabelStep = MakeKeyValid(gintStepLabel, gintStepLabel, lngWorkspaceIdentifier) Public Function GetVersionString() As String HP TPC-H FULL DISCLOSURE REPORT 191 © 2005 Hewlett-Packard Company. All rights reserved. GetVersionString = "Version " & gsVersion ' The workspace id is appended to the label strPrefixChar = Trim$(Str$(WorkspaceId)) End Function identifier to make & mstrLabelPrefix ' it unique, since multiple workspaces may Case Else Function IsLabel(strKey As String) As be open during a session On Error GoTo 0 Boolean ' Strip the prefix characters off while saving Err.Raise vbObjectError + the Ids to the db errInvalidNodeType, _ ' The tree view control on frmMain can gstrSource, _ contain two types of Dim strPrefixChar As String LoadResString(errInvalidNodeType) ' nodes - End Select ' 1. Nodes that contain data for the On Error GoTo MakeKeyValidErr workspace - this could gstrSource = mstrModuleName & MakeKeyValid = strPrefixChar & ' be data for the different types of steps or "MakeKeyValid" Trim$(Str$(lngIdentifier)) parameters ' 2. Nodes that display static data - these Select Case intTypeOfNode Exit Function kind of nodes Case gintWorkspace ' are referred to as label nodes e.g. strPrefixChar = mstrWorkspacePrefix MakeKeyValidErr: "Global Steps" is a Case gintGlobalStep Call LogErrors(Errors) ' label node strPrefixChar = gstrGlobalStepPrefix On Error GoTo 0 ' This function returns True if the passed Case gintManagerStep Err.Raise vbObjectError + in key corresponds strPrefixChar = gstrManagerStepPrefix errMakeKeyValidFailed, _ ' to a label node Case gintWorkerStep gstrSource, _ strPrefixChar = gstrWorkerStepPrefix LoadResString(errMakeKeyValidFailed) IsLabel = InStr(strKey, mstrLabelPrefix) Case gintRunManager, gintRunWorker > 0 If InstanceId = 0 Then End Function On Error GoTo 0 End Function Err.Raise vbObjectError + Function MakeIdentifierValid(strKey As String) As errMandatoryParameterMissing, _ Long Function MakeKeyValid(lngIdentifier As gstrSource, _ Long, _ ' Returns the Identifier corresponding to the intTypeOfNode As Integer, _ LoadResString(errMandatoryParameterMissin passed in key Optional ByVal WorkspaceId As Long = g) ' (Reverse of what was done in MakeKeyValid) 0, _ End If Optional ByVal InstanceId As Long = 0) ' Concatenate the instance identifier and On Error GoTo MakeIdentifierValidErr As String the step ' identifier to form a unique key If IsLabel(strKey) Then ' We use a numbering scheme while strPrefixChar = ' If the key corresponds to a label node, the loading the tree view with Trim$(Str$(InstanceId)) & mstrInstancePrefix identifier ' all node data, since it needs a unique key Case gintParameter ' appears to the right of the label prefix and we want to strPrefixChar = mstrParameterPrefix MakeIdentifierValid = Val(Mid(strKey, ' use the key to identify the data it Case gintNodeParamConnection InStr(strKey, mstrLabelPrefix) + 1)) contains. strPrefixChar = ElseIf InStr(strKey, mstrInstancePrefix) = 0 Then ' Moreover, add a character to the mstrParamConnectionPrefix ' For all other nodes, stripping the first beginning of the identifier Case gintConnectionDtl character off ' so that the tree view control accepts it as strPrefixChar = ' returns a valid Id a valid string, mstrConnectionDtlPrefix MakeIdentifierValid = Val(Mid(strKey, 2)) ' viz. "456" doesn't work, so change it to Case gintNodeParamExtension Else "W456" strPrefixChar = ' Instance node - strip of all characters till the ' The general scheme is to concatenate a mstrParamExtensionPrefix ' instance prefix Label with the Identifier Case gintNodeParamBuiltIn MakeIdentifierValid = Val(Mid(strKey, ' e.g A Global Step Node will have the strPrefixChar = mstrParamBuiltInPrefix InStr(strKey, mstrInstancePrefix) + 1)) Label, G and the Step Id Case gintGlobalsLabel, End If ' concatenated to form the unique key gintParameterLabel, ' The list of all such node types is given gintParamConnectionLabel, _ Exit Function below gintConnDtlLabel, _ ' 1. "W" + Workspace_Id for Workspace gintParamExtensionLabel, MakeIdentifierValidErr: nodes gintParamBuiltInLabel, gintGlobalStepLabel, _ Call LogErrors(Errors) ' 2. "P " + Parameter_Id for Parameter gintStepLabel On Error GoTo 0 nodes If WorkspaceId = 0 Then Err.Raise vbObjectError + ' 3. "M" + Step_Id for Manager Step ' The Workspace Id has to be errMakeIdentifierValidFailed, _ nodes specified for a label node mstrModuleName & "MakeIdentifierValid", ' 4. "S" + Step_Id for Worker Step nodes ' Otherwise it will not be possible to _ ' 5. "G" + Step_Id for Global Step nodes generate unique label ' 6. Instance_id + "I" + Step_Id for ' identifiers if multiple workspaces LoadResString(errMakeIdentifierValidFailed) Instance nodes are open ' 7. Workspace_id + "L" + the label On Error GoTo 0 End Function identifier = node type for all Label nodes Err.Raise vbObjectError + Public Function IsInstanceNode(strNodeKey As ' Since the manager, worker and global errWorkspaceIdMandatory, _ String) As Boolean steps are stored in the gstrSource, _ ' same table and the step identifiers will ' Returns true if the passed in node key always be unique, we LoadResString(errWorkspaceIdMandatory) corresponds to a step instance ' can use the same character as the prefix, End If IsInstanceNode = InStr(strNodeKey, but this is a ' For all labels, the workspace identifier mstrInstancePrefix) > 0 ' convenient way to know the type of step and the being processed. ' label prefix are concatenated to form End Function the key HP TPC-H FULL DISCLOSURE REPORT 192 © 2005 Hewlett-Packard Company. All rights reserved. Public Function IsBuiltInLabel(strNodeKey gstrEnvVarSeparator & Public Function ErrorOnNullField(rstRecords As As String) As Boolean PARAM_DEFAULT_DIR & Recordset, strFieldName As String) As Variant gstrEnvVarSeparator, _ ' Returns true if the passed in node key lWspId, ' If a given field is null, raises an error corresponds to a step instance WspParameters:=WspParameters) ' Else, returns the field value in a variant IsBuiltInLabel = (IsLabel(strNodeKey) MakePathValid (sDir & gstrFileSeparator & ' The calling function must convert the return And _ "a.txt") value to the (MakeIdentifierValid(strNodeKey) = GetDefaultDir = GetShortName(sDir) ' appropriate type gintParamBuiltInLabel)) If StringEmpty(GetDefaultDir) Then On Error GoTo ErrorOnNullFieldErr GetDefaultDir = App.Path gstrSource = mstrModuleName & End Function End If "ErrorOnNullField"

Public Sub ShowBusy() End Function If IsNull(rstRecords.Fields(strFieldName)) Then ' Modifies the mousepointer to indicate On Error GoTo 0 that the Public Sub AddArrayElement(ByRef Err.Raise vbObjectError + ' application is busy arrNodes() As Object, _ errMandatoryFieldNull, _ ByVal objToAdd As Object, _ gstrSource, _ On Error Resume Next ByRef lngCount As Long) strFieldName & mintDelimiter & ' Adds the passed in object to the array LoadResString(errMandatoryFieldNull) Screen.MousePointer = vbHourglass Else On Error GoTo AddArrayElementErr ErrorOnNullField = End Sub rstRecords.Fields(strFieldName) Public Sub ShowFree() ' Increase the array dimension and add the End If ' Modifies the mousepointer to indicate object to it Exit Function that the ReDim Preserve arrNodes(lngCount) ' application has finished processing and Set arrNodes(lngCount) = objToAdd ErrorOnNullFieldErr: is ready lngCount = lngCount + 1 Call LogErrors(Errors) ' to accept user input On Error GoTo 0 Exit Sub Err.Raise vbObjectError + On Error Resume Next errUnableToCheckNull, _ AddArrayElementErr: gstrSource, _ Screen.MousePointer = vbDefault LogErrors Errors strFieldName & mintDelimiter & gstrSource = mstrModuleName & LoadResString(errUnableToCheckNull) End Sub "AddArrayElement" On Error GoTo 0 End Function Public Function InstrR(strMain As String, _ Err.Raise vbObjectError + Public Function StringEmpty(strCheckString As strSearch As String) As Integer errAddArrayElementFailed, _ String) As Boolean ' Finds the last occurrence of the passed in gstrSource, _ string StringEmpty = (strCheckString = LoadResString(errAddArrayElementFailed) gstrEmptyString) Dim intPos As Integer Dim intPrev As Integer End Sub End Function Public Function GetIteratorValue(cStepIterators As On Error GoTo InstrRErr cRunColIt, _ Public Function CheckForNullField(rstRecords ByVal strItName As String) intPrev = intPos As Recordset, strFieldName As String) As intPos = InStr(1, strMain, strSearch) String Dim lngIndex As Long Dim strValue As String Do While intPos > 0 ' Returns an empty string if a given field is intPrev = intPos null On Error GoTo GetIteratorValueErr intPos = InStr(intPos + 1, strMain, On Error GoTo CheckForNullFieldErr gstrSource = mstrModuleName & strSearch) "GetIteratorValue" Loop If IsNull(rstRecords.Fields(strFieldName)) InstrR = intPrev Then ' Find the iterator in the Iterators collection CheckForNullField = gstrEmptyString For lngIndex = 0 To cStepIterators.Count - 1 Exit Function Else If cStepIterators(lngIndex).IteratorName = CheckForNullField = strItName Then InstrRErr: rstRecords.Fields(strFieldName) strValue = cStepIterators(lngIndex).Value Call LogErrors(Errors) End If Exit For gstrSource = mstrModuleName & Exit Function End If "InstrR" Next lngIndex On Error GoTo 0 CheckForNullFieldErr: Err.Raise vbObjectError + Call LogErrors(Errors) If lngIndex > cStepIterators.Count - 1 Then errInstrRFailed, _ On Error GoTo 0 ' The iterator has not been defined for the gstrSource, _ Err.Raise vbObjectError + branch LoadResString(errInstrRFailed) errCheckForNullFieldFailed, _ ' Raise an error mstrModuleName & On Error GoTo 0 End Function "CheckForNullField", _ Err.Raise vbObjectError + errParamNameInvalid, _ Public Function GetDefaultDir(lWspId As LoadResString(errCheckForNullFieldFailed) gstrSource, _ Long, WspParameters As cArrParameters) LoadResString(errParamNameInvalid) As String End Function End If

Dim sDir As String GetIteratorValue = strValue sDir = SubstituteParameters( _ Exit Function HP TPC-H FULL DISCLOSURE REPORT 193 © 2005 Hewlett-Packard Company. All rights reserved. strEnvVariable = Mid(strCommand, End If GetIteratorValueErr: intPos + 1, intEndPos - intPos - 1) ' Log the error code raised by Visual Else strVariable = Mid(strParameter, intPos + 1, Basic On Error GoTo 0 intEndPos - intPos - 1) Call LogErrors(Errors) Err.Raise vbObjectError + Else gstrSource = mstrModuleName & errParamSeparatorMissing, _ ' The separator charactor has not been passed "GetIteratorValue" gstrSource, _ in - On Error GoTo 0 ' try to find the value of the passed in Err.Raise vbObjectError + LoadResString(errParamSeparatorMissing) parameter errGetParamValueFailed, _ End If strVariable = strParameter gstrSource, _ strValue = gstrEmptyString End If

LoadResString(errGetParamValueFailed) ' Get the value of the variable and call a If Not StringEmpty(strVariable) Then function ' Check if this is the timestamp parameter first End Function ' to replace the variable with it's value If strVariable = gstrTimeStamp Then Public Function SubstituteParameters(ByVal strValue = GetValue(strEnvVariable, strValue = Format$(Now, mstrFormatString, strComString As String, _ lngWorkspaceId, StepIterators, _ ByVal lngWorkspaceId As Long, _ WspParameters) vbUseSystemDayOfWeek, Optional StepIterators As cRunColIt = ' The function raises an error if the vbUseSystem) Nothing, _ variable is Else Optional WspParameters As ' not found ' Try to find a parameter for the workspace cArrParameters = Nothing) As String strCommand = with ' This function substitutes all parameter cTempStr.ReplaceSubString(strCommand, _ ' the same name names and gstrEnvVarSeparator & Set cParamRec = ' environment variables in the passed in strEnvVariable & gstrEnvVarSeparator, _ WspParameters.GetParameterValue(lngWorkspaceI string with strValue) d, _ ' their values. It also substitutes the value End If strVariable) for the If cParamRec Is Nothing Then ' iterators, if any. intPos = InStr(intPos, strCommand, If Not cStepIterators Is Nothing Then ' Since the syntax is to enclose parameter gstrEnvVarSeparator) ' If the string is not a parameter, then names and Loop check ' environment variables in "%", we check ' if it is an iterator if a given strCommand = strValue = ' variable is a parameter - if so, we cTempStr.ReplaceSubString(strCommand, _ GetIteratorValue(cStepIterators, strVariable) substitute the gstrEnvVarSeparator & End If ' parameter value - else we try to get the gstrEnvVarSeparator, gstrEnvVarSeparator) value from If StringEmpty(strValue) Then ' the environment Set cTempStr = Nothing ' Neither - Check if it is an environment SubstituteParameters = strCommand variable Dim intPos As Integer strValue = Environ$(strVariable) Dim intEndPos As Integer End Function If StringEmpty(strValue) Then Dim strEnvVariable As String Private Function GetValue(ByVal strParameter On Error GoTo 0 Dim strValue As String As String, _ WriteError errSubValuesFailed, _ Dim strCommand As String ByVal lngWorkspaceId As Long, _ OptArgs:="Invalid parameter: " Dim cTempStr As cStringSM cStepIterators As cRunColIt, _ & gstrSQ & strVariable & gstrSQ WspParameters As cArrParameters) As Err.Raise vbObjectError + ' Initialize the return value of the function String errSubValuesFailed, _ to the ' This function returns the value for the mstrModuleName & ' passed in command passed in "GetValue", _ strCommand = strComString ' parameter - it may be a workspace parameter, an LoadResString(errSubValuesFailed) & "Invalid If WspParameters Is Nothing Then Set ' environment variable or an iterator parameter: " & gstrSQ & strVariable & gstrSQ WspParameters = gcParameters End If Dim intPos As Integer End If Set cTempStr = New cStringSM Dim intEndPos As Integer Else Dim strVariable As String strValue = cParamRec.ParameterValue intPos = InStr(strCommand, Dim strValue As String End If gstrEnvVarSeparator) Dim cParamRec As cParameter End If Do While intPos <> 0 End If If Mid(strCommand, intPos + 1, 1) = On Error GoTo GetValueErr gstrEnvVarSeparator Then GetValue = strValue ' Wildcard character - to be ' Initialize the return value of the function to substituted by a single % - later! the Exit Function intPos = intPos + 2 ' empty If intPos > Len(strCommand) Then strValue = gstrEmptyString GetValueErr: Exit Do If Err.Number = vbObjectError + Else intPos = InStr(strParameter, errParamNameInvalid Then ' Extract the environment variable gstrEnvVarSeparator) ' If the parameter has not been defined for the from the passed If intPos > 0 Then ' workspace then check if it is an environment ' in string ' Extract the variable from the passed in ' variable intEndPos = InStr(intPos + 1, string Resume Next strCommand, gstrEnvVarSeparator) intEndPos = InStr(intPos + 1, End If strParameter, gstrEnvVarSeparator) If intEndPos > 0 Then If intEndPos = 0 Then ' Log the error code raised by Visual Basic intEndPos = Len(strParameter) Call LogErrors(Errors) HP TPC-H FULL DISCLOSURE REPORT 194 © 2005 Hewlett-Packard Company. All rights reserved. gstrSource = mstrModuleName & TranslateStepLabel = TypeOfObject = "GetValue" cTempStr.ReplaceSubString(TranslateStepLab TypeOfStep(StepClass:=objNode) WriteError errSubValuesFailed, el, ":", gstrUnderscore) gstrSource, "Parameter: " & gstrSQ & TranslateStepLabel = Case Else strVariable & gstrSQ cTempStr.ReplaceSubString(TranslateStepLab WriteError errTypeOfObjectFailed, On Error GoTo 0 el, "*", gstrUnderscore) gstrSource, _ Err.Raise vbObjectError + TranslateStepLabel = TypeName(objNode) errSubValuesFailed, _ cTempStr.ReplaceSubString(TranslateStepLab On Error GoTo 0 gstrSource, _ el, "?", gstrUnderscore) Err.Raise vbObjectError + LoadResString(errSubValuesFailed) TranslateStepLabel = errTypeOfObjectFailed, _ & "Parameter: " & gstrSQ & strVariable & cTempStr.ReplaceSubString(TranslateStepLab gstrSource, _ gstrSQ el, gstrDQ, gstrUnderscore) TranslateStepLabel = LoadResString(errTypeOfObjectFailed) End Function cTempStr.ReplaceSubString(TranslateStepLab End Select Public Function SQLFixup(strField As el, "<", gstrUnderscore) String) As String TranslateStepLabel = Exit Function ' Returns a string that can be executed by cTempStr.ReplaceSubString(TranslateStepLab SQL Server el, ">", gstrUnderscore) TypeOfObjectErr: TranslateStepLabel = ' Log the error code raised by Visual Basic Dim cMyStr As New cStringSM cTempStr.ReplaceSubString(TranslateStepLab Call LogErrors(Errors) Dim strTemp As String el, "|", gstrUnderscore) On Error GoTo 0 TranslateStepLabel = Err.Raise vbObjectError + On Error GoTo SQLFixupErr cTempStr.ReplaceSubString(TranslateStepLab errTypeOfObjectFailed, _ el, gstrBlank, gstrUnderscore) gstrSource, _ strTemp = strField LoadResString(errTypeOfObjectFailed) SQLFixup = strTemp ' Commas are substituted with underscores since the command shell uses a comma to End Function ' Single-quotes have to be replaced by two ' delimit commands Attribute VB_Name = "ConnDtlCommon" single-quotes, TranslateStepLabel = ' FILE: ConnDtlCommon.bas ' since a single-quote is the identifier cTempStr.ReplaceSubString(TranslateStepLab ' Microsoft TPC-H Kit Ver. 1.00 delimiter el, ",", gstrUnderscore) ' Copyright Microsoft, 1999 ' character - call a procedure to do the ' All Rights Reserved replace If Len(TranslateStepLabel) > MAX_PATH ' ' SQLFixup = Then ' cMyStr.ReplaceSubString(strTemp, gstrDQ, TranslateStepLabel = ' PURPOSE: Contains functionality common "\" & gstrDQ) Mid(TranslateStepLabel, 1, MAX_PATH) across StepMaster and End If ' SMRunOnly, pertaining to connections ' Replace pipe characters with the ' Specifically, functions to load connections corresponding chr function End Function in an array ' SQLFixup = ' and so on. cMyStr.ReplaceSubString(strTemp, gstrDQ, Public Function TypeOfObject(ByVal objNode ' Contact: Reshma Tharamal gstrDQ & gstrDQ) As Object) As Integer ([email protected]) ' Determines the type of object that is passed ' Exit Function in Option Explicit

SQLFixupErr: On Error GoTo TypeOfObjectErr ' Used to indicate the source module name when gstrSource = mstrModuleName & gstrSource = mstrModuleName & errors "SQLFixup" "TypeOfObject" ' are raised by this module LogErrors Errors Private Const mstrModuleName As String = On Error GoTo 0 Select Case TypeName(objNode) "ConnDtlCommon." Err.Raise vbObjectError + Case "cWorkspace" errMakeFieldValidFailed, _ TypeOfObject = gintWorkspace Public Sub LoadRSInConnDtlArray(rstConns As gstrSource, Recordset, cConns As cConnDtls) LoadResString(errMakeFieldValidFailed) Case "cParameter" TypeOfObject = gintParameter Dim cNewConnDtl As cConnDtl End Function Public Function TranslateStepLabel(sLabel Case "cConnection" On Error GoTo LoadRSInConnDtlArrayErr As String) As String TypeOfObject = gintParameterConnect ' Translates the passed in step label to a If rstConns.RecordCount = 0 Then valid file name Case "cConnDtl" Exit Sub ' All characters in the label that are invalid TypeOfObject = gintConnectionDtl End If for filenames (viz. \ / : * ? "< > |) ' and spaces are substituted with Case "cGlobalStep" rstConns.MoveFirst underscores - also ensure that the resulting TypeOfObject = gintGlobalStep While Not rstConns.EOF filename ' is not greater than 255 characters Case "cManager" Set cNewConnDtl = New cConnDtl Dim cTempStr As New cStringSM TypeOfObject = gintManagerStep TranslateStepLabel = ' Initialize ConnDtl values cTempStr.ReplaceSubString(sLabel, Case "cWorker" ' Call a procedure to raise an error if mandatory gstrFileSeparator, "_") TypeOfObject = gintWorkerStep fields are null. TranslateStepLabel = cNewConnDtl.ConnNameId = cTempStr.ReplaceSubString(TranslateStepL Case "cStep" ErrorOnNullField(rstConns, abel, "/", gstrUnderscore) ' If a step record is passed in, call a FLD_ID_CONN_NAME) function ' to determine the type of step HP TPC-H FULL DISCLOSURE REPORT 195 © 2005 Hewlett-Packard Company. All rights reserved. cNewConnDtl.WorkspaceId = Set cNewConnection = New cConnection Err.Raise vbObjectError + ErrorOnNullField(rstConns, errLoadRsInArrayFailed, gstrSource, _ FLD_ID_WORKSPACE) ' Initialize Connection values LoadResString(errLoadRsInArrayFailed) cNewConnDtl.ConnName = ' Call a procedure to raise an error if End Sub CStr(ErrorOnNullField(rstConns, mandatory fields are null. VERSION 1.0 CLASS FLD_CONN_DTL_CONNECTION_NAM cNewConnection.ConnectionId = BEGIN E)) ErrorOnNullField(rstConns, "connection_id") MultiUse = -1 'True cNewConnDtl.ConnectionString = cNewConnection.WorkspaceId = END CheckForNullField(rstConns, CStr(ErrorOnNullField(rstConns, Attribute VB_Name = "cParameter" FLD_CONN_DTL_CONNECTION_STRI FLD_ID_WORKSPACE)) Attribute VB_GlobalNameSpace = False NG) cNewConnection.ConnectionName = Attribute VB_Creatable = True cNewConnDtl.ConnType = CStr(ErrorOnNullField(rstConns, Attribute VB_PredeclaredId = False CheckForNullField(rstConns, "c onnection_name")) Attribute VB_Exposed = False FLD_CONN_DTL_CONNECTION_TYPE) cNewConnection.ConnectionValue = ' FILE: cParameter.cls CheckForNullField(rstConns, ' Microsoft TPC-H Kit Ver. 1.00 cConns.Load cNewConnDtl "c onnection_value") ' Copyright Microsoft, 1999 cNewConnection.Description = ' All Rights Reserved Set cNewConnDtl = Nothing CheckForNullField(rstConns, "description") ' rstConns.MoveNext ' Wend cNewConnection.NoCountDisplay = ' PURPOSE: Encapsulates the properties and CheckForNullField(rstConns, methods of a parameter. Exit Sub "no_count_display") ' Contains functions to insert, update and cNewConnection.NoExecute = delete LoadRSInConnDtlArrayErr: CheckForNullField(rstConns, "no_execute") ' workspace_parameters records from the LogErrors Errors cNewConnection.ParseQueryOnly = database. gstrSource = mstrModuleName & CheckForNullField(rstConns, ' Contact: Reshma Tharamal "LoadRSInConnDtlArray" "parse_query_only") ([email protected]) On Error GoTo 0 cNewConnection.QuotedIdentifiers = ' Err.Raise vbObjectError + CheckForNullField(rstConns, Option Explicit errLoadRsInArrayFailed, gstrSource, _ "ANSI_quoted_identifiers") Option Base 0 cNewConnection.AnsiNulls = LoadResString(errLoadRsInArrayFailed) CheckForNullField(rstConns, "ANSI_nulls") ' Local variable(s) to hold property value(s) End Sub cNewConnection.ShowQueryPlan = Private mlngWorkspaceId As Long Attribute VB_Name = CheckForNullField(rstConns, Private mlngParameterId As Long "ConnectionCommon" "s how_query_plan") Private mstrParameterName As String ' FILE: ConnnectionCommon.bas cNewConnection.ShowStatsTime = Private mstrParameterValue As String ' Microsoft TPC-H Kit Ver. 1.00 CheckForNullField(rstConns, Private mstrDescription As String ' Copyright Microsoft, 1999 "s how_stats_time") Private mintParameterType As Integer ' All Rights Reserved cNewConnection.ShowStatsIO = Private mdbsStepMaster As Database ' CheckForNullField(rstConns, "s how_stats_io") Private mintOperation As Operation ' cNewConnection.ParseOdbcMsg = Private mlngPosition As Long ' PURPOSE: Contains functionality CheckForNullField(rstConns, common across StepMaster and "parse_odbc_msg_prefixes") ' Used to indicate the source module name when ' SMRunOnly, pertaining to cNewConnection.RowCount = errors connection strings CheckForNullField(rstConns, "row_count") ' are raised by this class ' Specifically, functions to load cNewConnection.TsqlBatchSeparator = Private mstrSource As String connections strings CheckForNullField(rstConns, Private Const mstrModuleName As String = ' in an array and so on. "t sql_batch_separator") "c Parameter." ' Contact: Reshma Tharamal cNewConnection.QueryTimeOut = ([email protected]) CheckForNullField(rstConns, ' The cSequence class is used to generate unique ' "query_time_out") parameter identifiers Option Explicit cNewConnection.ServerLanguage = Private mParameterSeq As cSequence CheckForNullField(rstConns, ' Used to indicate the source module name "s erver_language") ' The StringSM class is used to carry out string when errors cNewConnection.CharacterTranslation = operations ' are raised by this module CheckForNullField(rstConns, Private mFieldValue As cStringSM Private Const mstrModuleName As String = "c haracter_translation") "ConnectionCommon." cNewConnection.RegionalSettings = ' Parameter types CheckForNullField(rstConns, Public Enum ParameterType Public Sub "r egional_settings") gintParameterGeneric = 0 LoadRecordsetInConnectionArray(rstConns gintParameterConnect As Recordset, cConns As cConnections) cConns.Load cNewConnection gintParameterApplication gintParameterBuiltIn Dim cNewConnection As cConnection Set cNewConnection = Nothing End Enum rstConns.MoveNext On Error GoTo Wend LoadRecordsetInConnectionArrayErr Private Sub AssignParameters(qyExec As Exit Sub DAO.QueryDef) If rstConns.RecordCount = 0 Then ' Assigns values to the parameters in the querydef Exit Sub LoadRecordsetInConnectionArrayErr: object End If LogErrors Errors ' The parameter names are cryptic to make them gstrSource = mstrModuleName & different rstConns.MoveFirst "LoadRecordsetInConnectionArray" ' from the field names. When the parameter While Not rstConns.EOF On Error GoTo 0 names are

HP TPC-H FULL DISCLOSURE REPORT 196 © 2005 Hewlett-Packard Company. All rights reserved. ' the same as the field names, parameters Public Property Let Position(ByVal RHS As Dim rstParameter As Recordset in the where Long) Dim strSql As String ' clause do not get created. Dim qy As DAO.QueryDef mlngPosition = RHS Dim prmParam As DAO.Parameter On Error GoTo CheckDupParameterNameErr End Property mstrSource = mstrModuleName & On Error GoTo AssignParametersErr "CheckDupParameterName" Public Property Get Position() As Long For Each prmParam In ' Create a recordset object to retrieve the count of qyExec.Parameters Position = mlngPosition all parameters Select Case prmParam.Name ' for the workspace with the same name Case "[w_id]" End Property strSql = "Select count(*) as parameter_count " & prmParam.Value = _ mlngWorkspaceId Public Function Clone() As cParameter " from workspace_parameters " & _ " where workspace_id = [w_id]" & _ Case "[p_id]" ' Creates a copy of a given parameter " and parameter_name = [p_name]" & _ prmParam.Value = " and parameter_id <> [p_id]" mlngParameterId Dim cCloneParam As cParameter Set qy = Case "[p_name]" On Error GoTo CloneErr mdbsStepMaster.CreateQueryDef(gstrEmptyString, prmParam.Value = mstrSource = mstrModuleName & "Clone" strSql) mstrParameterName Call AssignParameters(qy) Set cCloneParam = New cParameter Case "[p_value]" Set rstParameter = prmParam.Value = ' Copy all the parameter properties to the qy.OpenRecordset(dbOpenForwardOnly) mstrParameterValue newly ' created parameter If rstParameter![parameter_count] > 0 Then Case "[desc]" Set cCloneParam.NodeDB = rstParameter.Close prmParam.Value = mdbsStepMaster qy.Close mstrDescription cCloneParam.WorkspaceId = ShowError errDuplicateParameterName mlngWorkspaceId On Error GoTo 0 Case "[p_type]" cCloneParam.ParameterId = Err.Raise vbObjectError + prmParam.Value = mlngParameterId errDuplicateParameterName, _ mintParameterType cCloneParam.ParameterName = mstrSource, mstrParameterName LoadResString(errDuplicateParameterName) Case Else cCloneParam.ParameterValue = End If ' Write the parameter name that is mstrParameterValue faulty cCloneParam.Description = mstrDescription rstParameter.Close WriteError errInvalidParameter, cCloneParam.ParameterType = qy.Close mstrSource, _ mintParameterType prmParam.Name cCloneParam.IndOperation = mintOperation Exit Sub On Error GoTo 0 cCloneParam.Position = mlngPosition Err.Raise errInvalidParameter, CheckDupParameterNameErr: mstrModuleName & "AssignParameters", _ ' And set the return value to the newly LogErrors Errors created parameter mstrSource = mstrModuleName & LoadResString(errInvalidParameter) Set Clone = cCloneParam "CheckDupParameterName" End Select Set cCloneParam = Nothing On Error GoTo 0 Next prmParam Err.Raise vbObjectError + Exit Function errCheckDupParameterNameFailed, _ ' qyExec.Parameters("w_id").Value = mstrSource, mlngWorkspaceId CloneErr: LoadResString(errCheckDupParameterNameFailed ' qyExec.Parameters("p_id").Value = LogErrors Errors ) mlngParameterId mstrSource = mstrModuleName & "Clone" ' qyExec.Parameters("p_name").Value = On Error GoTo 0 End Sub mstrParameterName Err.Raise vbObjectError + errCloneFailed, _ Private Sub CheckDB() ' qyExec.Parameters("p_value").Value = mstrSource, ' Check if the database object has been initialized mstrParameterValue LoadResString(errCloneFailed) ' If mdbsStepMaster Is Nothing Then End Function On Error GoTo 0 Exit Sub Public Property Set NodeDB(vdata As Err.Raise vbObjectError + errInvalidDB, _ Database) mstrModuleName & "CheckDB", AssignParametersErr: LoadResString(errInvalidDB) Set mdbsStepMaster = vdata End If mstrSource = mstrModuleName & "AssignParameters" End Property End Sub Call LogErrors(Errors) Public Property Get NodeDB() As Database Public Property Let ParameterValue(vdata As On Error GoTo 0 String) Err.Raise vbObjectError + Set NodeDB = mdbsStepMaster errAssignParametersFailed, _ mstrParameterValue = vdata mstrSource, End Property LoadResString(errAssignParametersFailed) End Property Private Sub CheckDupParameterName() Public Property Let Description(vdata As String) End Sub ' Check if the parameter name already exists in the workspace mstrDescription = vdata

HP TPC-H FULL DISCLOSURE REPORT 197 © 2005 Hewlett-Packard Company. All rights reserved. End Property ' parameter to use at runtime Public Property Let ParameterType(vdata Call CheckDupParameterName mstrSource = mstrModuleName & "Add" As ParameterType) Call LogErrors(Errors) Exit Sub On Error GoTo 0 mintParameterType = vdata Err.Raise vbObjectError + ValidateErr: errParameterInsertFailed, _ End Property mstrSource, mstrSource = mstrModuleName & LoadResString(errParameterInsertFailed) Public Property Let ParameterName(vdata "Validate" As String) Call LogErrors(Errors) End Sub On Error GoTo 0 Public Sub Delete() If vdata = gstrEmptyString Then Err.Raise vbObjectError + errValidateFailed, _ Dim strDelete As String ShowError mstrSource, Dim qy As DAO.QueryDef errParameterNameMandatory LoadResString(errValidateFailed) On Error GoTo 0 On Error GoTo DeleteErr ' Propogate this error back to the caller End Sub Err.Raise vbObjectError + Public Property Let WorkspaceId(vdata As ' Check if the db object is valid errParameterNameMandatory, _ Long) Call CheckDB mstrSource, LoadResString(errParameterNameMandator mlngWorkspaceId = vdata strDelete = "delete from workspace_parameters " y) & _ Else End Property " where parameter_id = [p_id]" mstrParameterName = vdata Set qy = End If Public Sub Add() mdbsStepMaster.CreateQueryDef(gstrEmptyString, strDelete) End Property Dim strInsert As String Dim qy As DAO.QueryDef Call AssignParameters(qy) Public Property Let ParameterId(vdata As qy.Execute dbFailOnError Long) On Error GoTo AddErr mlngParameterId = vdata qy.Close End Property ' Validate the record before trying to insert the record Exit Sub Public Property Let IndOperation(ByVal Call Validate vdata As Operation) DeleteErr: ' Create a temporary querydef object LogErrors Errors ' The valid operations are define in the strInsert = "insert into mstrSource = mstrModuleName & "Delete" cOperations workspace_parameters " & _ On Error GoTo 0 ' class. Check if the operation is valid "( workspace_id, parameter_id, " & _ Err.Raise vbObjectError + Select Case vdata " parameter_name, parameter_value, " errDeleteParameterFailed, _ Case QueryOp, InsertOp, UpdateOp, & _ mstrSource, _ DeleteOp " description, parameter_type ) " & _ LoadResString(errDeleteParameterFailed) mintOperation = vdata " values ( [w_id], [p_id], [p_name], [p_value], [desc], [p_type] ) " End Sub Case Else Set qy = On Error GoTo 0 mdbsStepMaster.CreateQueryDef(gstrEmptySt Public Sub Modify() Err.Raise vbObjectError + ring, strInsert) errInvalidOperation, _ Dim strUpdate As String mstrSource, ' Call a procedure to assign the parameter Dim qy As QueryDef LoadResString(errInvalidOperation) values End Select Call AssignParameters(qy) On Error GoTo ModifyErr

End Property qy.Execute dbFailOnError ' Validate the updated values before trying to Public Sub Validate() qy.Close modify the db ' Each distinct object will have a Validate Call Validate method which ' strInsert = "insert into ' will check if the class properties are workspace_parameters " & _ ' Create a temporary querydef object with the valid. This method ' "( workspace_id, parameter_id, " & _ modify string ' will be used to check interdependant ' " parameter_name, parameter_value ) " strUpdate = "update workspace_parameters " & _ properties that & _ " set workspace_id = [w_id], " & _ ' cannot be validated by the let ' " values ( " & _ "parameter_name = [p_name], " & _ procedures. ' Str(mlngWorkspaceId) & ", " & "parameter_value = [p_value], " & _ ' It should be called by the add and Str(mlngParameterId) & _ "description = [desc], " & _ modify methods of the class ' ", " & "parameter_type = [p_type] " & _ mFieldValue.MakeStringFieldValid(mstrPara " where parameter_id = [p_id]" On Error GoTo ValidateErr meterName) & _ Set qy = ' ", " & mdbsStepMaster.CreateQueryDef(gstrEmptyString, ' Check if the db object is valid mFieldValue.MakeStringFieldValid(mstrPara strUpdate) Call CheckDB meterValue) & " ) " ' mdbsStepMaster.Execute strInsert, ' Call a procedure to assign the parameter values ' Call procedure to raise an error if the dbFailOnError + dbSQLPassThrough to the parameter name ' querydef object ' already exists in the workspace - Exit Sub Call AssignParameters(qy) ' if there are duplicates, we don't know qy.Execute dbFailOnError what value for the AddErr: HP TPC-H FULL DISCLOSURE REPORT 198 © 2005 Hewlett-Packard Company. All rights reserved. qy.Close mcIterators.Clear End Property ' mdbsStepMaster.Execute strUpdate, End Sub dbFailOnError Public Property Get ParameterValue() As ' String Private Sub Class_Initialize() Exit Sub ParameterValue = mstrParameterValue Set mcIterators = New cStack ModifyErr: End Property End Sub mstrSource = mstrModuleName & Public Property Get Description() As String "Modify" Private Sub Class_Terminate() Call LogErrors(Errors) Description = mstrDescription On Error GoTo 0 Set mcIterators = Nothing Err.Raise vbObjectError + End Property errParameterUpdateFailed, _ Public Property Get ParameterType() As End Sub mstrSource, ParameterType LoadResString(errParameterUpdateFailed) ParameterType = mintParameterType Public Function Value(strItName As String) As End Sub String Public Property Get ParameterName() As End Property String Dim lngIndex As Long

ParameterName = mstrParameterName Private Sub Class_Initialize() For lngIndex = 0 To mcIterators.Count - 1 If mcIterators(lngIndex).IteratorName = End Property Set mFieldValue = New cStringSM strItName Then Value = mcIterators(lngIndex).Value Public Property Get ParameterId() As Long ' Initialize the operation indicator variable to Exit For Query End If ParameterId = mlngParameterId ' It will be modified later by the collection Next lngIndex class when End Property ' inserts, updates or deletes are performed End Function Public Property Get NextIdentifier() As mintOperation = QueryOp Long Public Property Get Item(ByVal Position As Long) End Sub As cRunItNode Dim lngNextId As Long Attribute Item.VB_UserMemId = 0 Private Sub Class_Terminate() On Error GoTo NextIdentifierErr Set Item = mcIterators(Position) Set mdbsStepMaster = Nothing ' First check if the database object is valid Set mFieldValue = Nothing End Property Call CheckDB End Sub ' Retrieve the next identifier using the VERSION 1.0 CLASS Public Function Count() As Long sequence class BEGIN Set mParameterSeq = New cSequence MultiUse = -1 'True Count = mcIterators.Count Set mParameterSeq.IdDatabase = END mdbsStepMaster Attribute VB_Name = "cRunColIt" End Function mParameterSeq.IdentifierColumn = Attribute VB_GlobalNameSpace = False FLD_ID_PARAMETER Attribute VB_Creatable = True Public Function Pop() As cRunItNode lngNextId = mParameterSeq.Identifier Attribute VB_PredeclaredId = False Set mParameterSeq = Nothing Attribute VB_Exposed = False Set Pop = mcIterators.Pop ' FILE: cRunColIt.cls NextIdentifier = lngNextId ' Microsoft TPC-H Kit Ver. 1.00 End Function Exit Property ' Copyright Microsoft, 1999 ' All Rights Reserved Public Sub Push(objToPush As cRunItNode) NextIdentifierErr: ' LogErrors Errors ' Call mcIterators.Push(objToPush) mstrSource = mstrModuleName & ' PURPOSE: This module implements a "NextIdentifier" stack of Iterator nodes. End Sub On Error GoTo 0 ' Ensures that only cRunItNode Err.Raise vbObjectError + errIdGetFailed, objects are stored in the stack. _ ' Contact: Reshma Tharamal VERSION 1.0 CLASS mstrSource, ([email protected]) BEGIN LoadResString(errIdGetFailed) ' MultiUse = -1 'True Option Explicit Persistable = 0 'NotPersistable End Property DataBindingBehavior = 0 'vbNone Public Property Get IndOperation() As ' Used to indicate the source module name DataSourceBehavior = 0 'vbNone Operation when errors MTSTransactionMode = 0 'NotAnMTSObject ' are raised by this class END IndOperation = mintOperation Private Const mstrModuleName As String = Attribute VB_Name = "cRunInst" "c RunColIt." Attribute VB_GlobalNameSpace = False End Property Private mstrSource As String Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Public Property Get WorkspaceId() As Long Private mcIterators As cStack Attribute VB_Exposed = False Public Sub Clear() ' FILE: cRunColIt.cls WorkspaceId = mlngWorkspaceId ' Microsoft TPC-H Kit Ver. 1.00 HP TPC-H FULL DISCLOSURE REPORT 199 © 2005 Hewlett-Packard Company. All rights reserved. ' Copyright Microsoft, 1999 lngInstanceId As Long, lParentInstanceId Private WithEvents cExecStep28 As cRunStep ' All Rights Reserved As Long, sPath As String, _ Attribute cExecStep28.VB_VarHelpID = -1 ' sIts As String, sItValue As String) Private WithEvents cExecStep29 As cRunStep ' Public Event StepComplete(cStepRecord As Attribute cExecStep29.VB_VarHelpID = -1 ' PURPOSE: This module controls the cStep, dtmEndTime As Currency, run processing. It runs a branch lngInstanceId As Long, lElapsed As Long) Private WithEvents cExecStep30 As cRunStep ' at a time and raises events when Public Event ProcessStart(cStepRecord As Attribute cExecStep30.VB_VarHelpID = -1 each step completes execution. cStep, strCommand As String, _ Private WithEvents cExecStep31 As cRunStep ' Contact: Reshma Tharamal dtmStartTime As Currency, lngInstanceId Attribute cExecStep31.VB_VarHelpID = -1 ([email protected]) As Long, lParentInstanceId As Long, _ Private WithEvents cExecStep32 As cRunStep ' sItValue As String) Attribute cExecStep32.VB_VarHelpID = -1 Option Explicit Public Event ProcessComplete(cStepRecord Private WithEvents cExecStep33 As cRunStep As cStep, dtmEndTime As Currency, Attribute cExecStep33.VB_VarHelpID = -1 ' Used to indicate the source module name lngInstanceId As Long, lElapsed As Long) Private WithEvents cExecStep34 As cRunStep when errors ' The class that will execute each step - we trap Attribute cExecStep34.VB_VarHelpID = -1 ' are raised by this class the events Private WithEvents cExecStep35 As cRunStep Private Const mstrModuleName As String = ' that are raised by it when a step Attribute cExecStep35.VB_VarHelpID = -1 "c RunInst." starts/completes Private WithEvents cExecStep36 As cRunStep Private mstrSource As String ' execution Attribute cExecStep36.VB_VarHelpID = -1 Private WithEvents cExecStep1 As cRunStep Private WithEvents cExecStep37 As cRunStep ' Local variable(s) to hold property value(s) Attribute cExecStep1.VB_VarHelpID = -1 Attribute cExecStep37.VB_VarHelpID = -1 Private mstrRootKey As String Private WithEvents cExecStep2 As cRunStep Private WithEvents cExecStep38 As cRunStep Public WspId As Long Attribute cExecStep2.VB_VarHelpID = -1 Attribute cExecStep38.VB_VarHelpID = -1 Private mcParameters As cArrParameters Private WithEvents cExecStep3 As cRunStep Private WithEvents cExecStep39 As cRunStep Private mcRunSteps As cArrSteps Attribute cExecStep3.VB_VarHelpID = -1 Attribute cExecStep39.VB_VarHelpID = -1 Private mcRunConstraints As Private WithEvents cExecStep4 As cRunStep cArrConstraints Attribute cExecStep4.VB_VarHelpID = -1 Private WithEvents cExecStep40 As cRunStep Public RunConnections As cConnections Private WithEvents cExecStep5 As cRunStep Attribute cExecStep40.VB_VarHelpID = -1 Public RunConnDtls As cConnDtls Attribute cExecStep5.VB_VarHelpID = -1 Private WithEvents cExecStep41 As cRunStep Private mcvntWspPreCons As Variant Private WithEvents cExecStep6 As cRunStep Attribute cExecStep41.VB_VarHelpID = -1 Private mcvntWspPostCons As Variant Attribute cExecStep6.VB_VarHelpID = -1 Private WithEvents cExecStep42 As cRunStep Private mcNavSteps As cStepTree Private WithEvents cExecStep7 As cRunStep Attribute cExecStep42.VB_VarHelpID = -1 Attribute cExecStep7.VB_VarHelpID = -1 Private WithEvents cExecStep43 As cRunStep Private mcInstances As cInstances Private WithEvents cExecStep8 As cRunStep Attribute cExecStep43.VB_VarHelpID = -1 Private mcFreeSteps As cVectorLng Attribute cExecStep8.VB_VarHelpID = -1 Private WithEvents cExecStep44 As cRunStep Private mcFailures As cFailedSteps Private WithEvents cExecStep9 As cRunStep Attribute cExecStep44.VB_VarHelpID = -1 Private mblnAsk As Boolean ' Set to True Attribute cExecStep9.VB_VarHelpID = -1 Private WithEvents cExecStep45 As cRunStep when the a step with continuation Attribute cExecStep45.VB_VarHelpID = -1 criteria=Ask fails Private WithEvents cExecStep10 As cRunStep Private WithEvents cExecStep46 As cRunStep Private mblnAbort As Boolean ' Set to True Attribute cExecStep10.VB_VarHelpID = -1 Attribute cExecStep46.VB_VarHelpID = -1 when the run is aborted Private WithEvents cExecStep11 As cRunStep Private WithEvents cExecStep47 As cRunStep Private msAbortDtls As String Attribute cExecStep11.VB_VarHelpID = -1 Attribute cExecStep47.VB_VarHelpID = -1 Private mbarrFree() As Byte Private WithEvents cExecStep12 As cRunStep Private WithEvents cExecStep48 As cRunStep Private WithEvents mcTermSteps As Attribute cExecStep12.VB_VarHelpID = -1 Attribute cExecStep48.VB_VarHelpID = -1 cTermSteps Private WithEvents cExecStep13 As cRunStep Private WithEvents cExecStep49 As cRunStep Attribute mcTermSteps.VB_VarHelpID = -1 Attribute cExecStep13.VB_VarHelpID = -1 Attribute cExecStep49.VB_VarHelpID = -1 Public RunId As Long Private WithEvents cExecStep14 As cRunStep Public CreateInputFiles As Boolean Attribute cExecStep14.VB_VarHelpID = -1 Private WithEvents cExecStep50 As cRunStep Private Enum WspLogEvents Private WithEvents cExecStep15 As cRunStep Attribute cExecStep50.VB_VarHelpID = -1 mintRunStart Attribute cExecStep15.VB_VarHelpID = -1 Private WithEvents cExecStep51 As cRunStep mintRunComplete Private WithEvents cExecStep16 As cRunStep Attribute cExecStep51.VB_VarHelpID = -1 mintStepStart Attribute cExecStep16.VB_VarHelpID = -1 Private WithEvents cExecStep52 As cRunStep mintStepComplete Private WithEvents cExecStep17 As cRunStep Attribute cExecStep52.VB_VarHelpID = -1 End Enum Attribute cExecStep17.VB_VarHelpID = -1 Private WithEvents cExecStep53 As cRunStep Private WithEvents cExecStep18 As cRunStep Attribute cExecStep53.VB_VarHelpID = -1 Private mcWspLog As cFileSM Attribute cExecStep18.VB_VarHelpID = -1 Private WithEvents cExecStep54 As cRunStep Private mstrCurBranchRoot As String Private WithEvents cExecStep19 As cRunStep Attribute cExecStep54.VB_VarHelpID = -1 Private mcDummyRootInstance As Attribute cExecStep19.VB_VarHelpID = -1 Private WithEvents cExecStep55 As cRunStep cInstance Attribute cExecStep55.VB_VarHelpID = -1 ' Key for the dummy root instance - Should Private WithEvents cExecStep20 As cRunStep Private WithEvents cExecStep56 As cRunStep be a key that is invalid for an actual step Attribute cExecStep20.VB_VarHelpID = -1 Attribute cExecStep56.VB_VarHelpID = -1 record Private WithEvents cExecStep21 As cRunStep Private WithEvents cExecStep57 As cRunStep Private Const mstrDummyRootKey As Attribute cExecStep21.VB_VarHelpID = -1 Attribute cExecStep57.VB_VarHelpID = -1 String = "D" Private WithEvents cExecStep22 As cRunStep Private WithEvents cExecStep58 As cRunStep ' Public events to notify the calling function Attribute cExecStep22.VB_VarHelpID = -1 Attribute cExecStep58.VB_VarHelpID = -1 of the Private WithEvents cExecStep23 As cRunStep Private WithEvents cExecStep59 As cRunStep ' start and end time for each step Attribute cExecStep23.VB_VarHelpID = -1 Attribute cExecStep59.VB_VarHelpID = -1 Public Event RunStart(dtmStartTime As Private WithEvents cExecStep24 As cRunStep Currency, strWspLog As String) Attribute cExecStep24.VB_VarHelpID = -1 Private WithEvents cExecStep60 As cRunStep Public Event RunComplete(dtmEndTime As Private WithEvents cExecStep25 As cRunStep Attribute cExecStep60.VB_VarHelpID = -1 Currency) Attribute cExecStep25.VB_VarHelpID = -1 Private WithEvents cExecStep61 As cRunStep Public Event StepStart(cStepRecord As Private WithEvents cExecStep26 As cRunStep Attribute cExecStep61.VB_VarHelpID = -1 cStep, dtmStartTime As Currency, _ Attribute cExecStep26.VB_VarHelpID = -1 Private WithEvents cExecStep62 As cRunStep Private WithEvents cExecStep27 As cRunStep Attribute cExecStep62.VB_VarHelpID = -1 Attribute cExecStep27.VB_VarHelpID = -1 Private WithEvents cExecStep63 As cRunStep HP TPC-H FULL DISCLOSURE REPORT 200 © 2005 Hewlett-Packard Company. All rights reserved. Attribute cExecStep63.VB_VarHelpID = -1 Private WithEvents cExecStep88 As cRunStep Nothing And cExecStep58 Is Nothing And Private WithEvents cExecStep64 As Attribute cExecStep88.VB_VarHelpID = -1 cExecStep59 Is Nothing And _ cRunStep Private WithEvents cExecStep89 As cRunStep cExecStep60 Is Nothing And cExecStep61 Is Attribute cExecStep64.VB_VarHelpID = -1 Attribute cExecStep89.VB_VarHelpID = -1 Nothing And cExecStep62 Is Nothing And Private WithEvents cExecStep65 As cExecStep63 Is Nothing And cExecStep64 Is cRunStep Private WithEvents cExecStep90 As cRunStep Nothing And cExecStep65 Is Nothing And Attribute cExecStep65.VB_VarHelpID = -1 Attribute cExecStep90.VB_VarHelpID = -1 cExecStep66 Is Nothing And cExecStep67 Is Private WithEvents cExecStep66 As Private WithEvents cExecStep91 As cRunStep Nothing And cExecStep68 Is Nothing And cRunStep Attribute cExecStep91.VB_VarHelpID = -1 cExecStep69 Is Nothing And _ Attribute cExecStep66.VB_VarHelpID = -1 Private WithEvents cExecStep92 As cRunStep cExecStep70 Is Nothing And cExecStep71 Is Private WithEvents cExecStep67 As Attribute cExecStep92.VB_VarHelpID = -1 Nothing And cExecStep72 Is Nothing And cRunStep Private WithEvents cExecStep93 As cRunStep cExecStep73 Is Nothing And cExecStep74 Is Attribute cExecStep67.VB_VarHelpID = -1 Attribute cExecStep93.VB_VarHelpID = -1 Nothing And cExecStep75 Is Nothing And Private WithEvents cExecStep68 As Private WithEvents cExecStep94 As cRunStep cExecStep76 Is Nothing And cExecStep77 Is cRunStep Attribute cExecStep94.VB_VarHelpID = -1 Nothing And cExecStep78 Is Nothing And Attribute cExecStep68.VB_VarHelpID = -1 Private WithEvents cExecStep95 As cRunStep cExecStep79 Is Nothing And _ Private WithEvents cExecStep69 As Attribute cExecStep95.VB_VarHelpID = -1 cExecStep80 Is Nothing And cExecStep81 Is cRunStep Private WithEvents cExecStep96 As cRunStep Nothing And cExecStep82 Is Nothing And Attribute cExecStep69.VB_VarHelpID = -1 Attribute cExecStep96.VB_VarHelpID = -1 cExecStep83 Is Nothing And cExecStep84 Is Private WithEvents cExecStep97 As cRunStep Nothing And cExecStep85 Is Nothing And Private WithEvents cExecStep70 As Attribute cExecStep97.VB_VarHelpID = -1 cExecStep86 Is Nothing And cExecStep87 Is cRunStep Private WithEvents cExecStep98 As cRunStep Nothing And cExecStep88 Is Nothing And Attribute cExecStep70.VB_VarHelpID = -1 Attribute cExecStep98.VB_VarHelpID = -1 cExecStep89 Is Nothing And _ Private WithEvents cExecStep71 As Private WithEvents cExecStep99 As cRunStep cExecStep90 Is Nothing And cExecStep91 Is cRunStep Attribute cExecStep99.VB_VarHelpID = -1 Nothing And cExecStep92 Is Nothing And Attribute cExecStep71.VB_VarHelpID = -1 cExecStep93 Is Nothing And cExecStep94 Is Private WithEvents cExecStep72 As Private Const msIt As String = " Iterator: " Nothing And cExecStep95 Is Nothing And cRunStep Private Const msItValue As String = " Value: " cExecStep96 Is Nothing And cExecStep97 Is Attribute cExecStep72.VB_VarHelpID = -1 Public Sub Abort() Nothing And cExecStep98 Is Nothing And Private WithEvents cExecStep73 As cExecStep99 Is Nothing Then cRunStep On Error GoTo AbortErr ' Then... Attribute cExecStep73.VB_VarHelpID = -1 WriteToWspLog (mintRunComplete) Private WithEvents cExecStep74 As ' Make sure that we don't execute any more RaiseEvent cRunStep steps RunComplete(Determine64BitTime()) Attribute cExecStep74.VB_VarHelpID = -1 Call StopRun Else Private WithEvents cExecStep75 As ' Abort each of the steps that is currently cRunStep If cExecStep1 Is Nothing And cExecStep2 Is executing. Attribute cExecStep75.VB_VarHelpID = -1 Nothing And cExecStep3 Is Nothing And If Not cExecStep1 Is Nothing Then Private WithEvents cExecStep76 As cExecStep4 Is Nothing And cExecStep5 Is cExecStep1.Abort cRunStep Nothing And cExecStep6 Is Nothing And End If Attribute cExecStep76.VB_VarHelpID = -1 cExecStep7 Is Nothing And cExecStep8 Is If Not cExecStep2 Is Nothing Then Private WithEvents cExecStep77 As Nothing And cExecStep9 Is Nothing And _ cExecStep2.Abort cRunStep cExecStep10 Is Nothing And cExecStep11 End If Attribute cExecStep77.VB_VarHelpID = -1 Is Nothing And cExecStep12 Is Nothing And If Not cExecStep3 Is Nothing Then Private WithEvents cExecStep78 As cExecStep13 Is Nothing And cExecStep14 Is cExecStep3.Abort cRunStep Nothing And cExecStep15 Is Nothing And End If Attribute cExecStep78.VB_VarHelpID = -1 cExecStep16 Is Nothing And cExecStep17 Is If Not cExecStep4 Is Nothing Then Private WithEvents cExecStep79 As Nothing And cExecStep18 Is Nothing And cExecStep4.Abort cRunStep cExecStep19 Is Nothing And _ End If Attribute cExecStep79.VB_VarHelpID = -1 cExecStep20 Is Nothing And cExecStep21 If Not cExecStep5 Is Nothing Then Is Nothing And cExecStep22 Is Nothing And cExecStep5.Abort Private WithEvents cExecStep80 As cExecStep23 Is Nothing And cExecStep24 Is End If cRunStep Nothing And cExecStep25 Is Nothing And If Not cExecStep6 Is Nothing Then Attribute cExecStep80.VB_VarHelpID = -1 cExecStep26 Is Nothing And cExecStep27 Is cExecStep6.Abort Private WithEvents cExecStep81 As Nothing And cExecStep28 Is Nothing And End If cRunStep cExecStep29 Is Nothing And _ If Not cExecStep7 Is Nothing Then Attribute cExecStep81.VB_VarHelpID = -1 cExecStep30 Is Nothing And cExecStep31 cExecStep7.Abort Private WithEvents cExecStep82 As Is Nothing And cExecStep32 Is Nothing And End If cRunStep cExecStep33 Is Nothing And cExecStep34 Is If Not cExecStep8 Is Nothing Then Attribute cExecStep82.VB_VarHelpID = -1 Nothing And cExecStep35 Is Nothing And cExecStep8.Abort Private WithEvents cExecStep83 As cExecStep36 Is Nothing And cExecStep37 Is End If cRunStep Nothing And cExecStep38 Is Nothing And If Not cExecStep9 Is Nothing Then Attribute cExecStep83.VB_VarHelpID = -1 cExecStep39 Is Nothing And _ cExecStep9.Abort Private WithEvents cExecStep84 As cExecStep40 Is Nothing And cExecStep41 End If cRunStep Is Nothing And cExecStep42 Is Nothing And If Not cExecStep10 Is Nothing Then Attribute cExecStep84.VB_VarHelpID = -1 cExecStep43 Is Nothing And cExecStep44 Is cExecStep10.Abort Private WithEvents cExecStep85 As Nothing And cExecStep45 Is Nothing And End If cRunStep cExecStep46 Is Nothing And cExecStep47 Is If Not cExecStep11 Is Nothing Then Attribute cExecStep85.VB_VarHelpID = -1 Nothing And cExecStep48 Is Nothing And cExecStep11.Abort Private WithEvents cExecStep86 As cExecStep49 Is Nothing And _ End If cRunStep cExecStep50 Is Nothing And cExecStep51 If Not cExecStep12 Is Nothing Then Attribute cExecStep86.VB_VarHelpID = -1 Is Nothing And cExecStep52 Is Nothing And cExecStep12.Abort Private WithEvents cExecStep87 As cExecStep53 Is Nothing And cExecStep54 Is End If cRunStep Nothing And cExecStep55 Is Nothing And If Not cExecStep13 Is Nothing Then Attribute cExecStep87.VB_VarHelpID = -1 cExecStep56 Is Nothing And cExecStep57 Is cExecStep13.Abort HP TPC-H FULL DISCLOSURE REPORT 201 © 2005 Hewlett-Packard Company. All rights reserved. End If ' ======50 - 59 If Not cExecStep32 Is Nothing Then ======If Not cExecStep14 Is Nothing Then cExecStep32.Abort If Not cExecStep50 Is Nothing Then cExecStep14.Abort End If cExecStep50.Abort End If End If If Not cExecStep33 Is Nothing Then If Not cExecStep15 Is Nothing Then cExecStep33.Abort If Not cExecStep51 Is Nothing Then cExecStep15.Abort End If cExecStep51.Abort End If End If If Not cExecStep34 Is Nothing Then If Not cExecStep16 Is Nothing Then cExecStep34.Abort If Not cExecStep52 Is Nothing Then cExecStep16.Abort End If cExecStep52.Abort End If End If If Not cExecStep35 Is Nothing Then If Not cExecStep17 Is Nothing Then cExecStep35.Abort If Not cExecStep53 Is Nothing Then cExecStep17.Abort End If cExecStep53.Abort End If End If If Not cExecStep36 Is Nothing Then If Not cExecStep18 Is Nothing Then cExecStep36.Abort If Not cExecStep54 Is Nothing Then cExecStep18.Abort End If cExecStep54.Abort End If End If If Not cExecStep37 Is Nothing Then If Not cExecStep19 Is Nothing Then cExecStep37.Abort If Not cExecStep55 Is Nothing Then cExecStep19.Abort End If cExecStep55.Abort End If End If If Not cExecStep38 Is Nothing Then If Not cExecStep20 Is Nothing Then cExecStep38.Abort If Not cExecStep56 Is Nothing Then cExecStep20.Abort End If cExecStep56.Abort End If End If If Not cExecStep39 Is Nothing Then If Not cExecStep21 Is Nothing Then cExecStep39.Abort If Not cExecStep57 Is Nothing Then cExecStep21.Abort End If cExecStep57.Abort End If End If ' ======40 - 49 If Not cExecStep22 Is Nothing Then ======If Not cExecStep58 Is Nothing Then cExecStep22.Abort If Not cExecStep40 Is Nothing Then cExecStep58.Abort End If cExecStep40.Abort End If End If If Not cExecStep23 Is Nothing Then If Not cExecStep59 Is Nothing Then cExecStep23.Abort If Not cExecStep41 Is Nothing Then cExecStep59.Abort End If cExecStep41.Abort End If End If If Not cExecStep24 Is Nothing Then ' ======60 - 69 cExecStep24.Abort If Not cExecStep42 Is Nothing Then ======End If cExecStep42.Abort If Not cExecStep60 Is Nothing Then End If cExecStep60.Abort If Not cExecStep25 Is Nothing Then End If cExecStep25.Abort If Not cExecStep43 Is Nothing Then End If cExecStep43.Abort If Not cExecStep61 Is Nothing Then End If cExecStep61.Abort If Not cExecStep26 Is Nothing Then End If cExecStep26.Abort If Not cExecStep44 Is Nothing Then End If cExecStep44.Abort If Not cExecStep62 Is Nothing Then End If cExecStep62.Abort If Not cExecStep27 Is Nothing Then End If cExecStep27.Abort If Not cExecStep45 Is Nothing Then End If cExecStep45.Abort If Not cExecStep63 Is Nothing Then End If cExecStep63.Abort If Not cExecStep28 Is Nothing Then End If cExecStep28.Abort If Not cExecStep46 Is Nothing Then End If cExecStep46.Abort If Not cExecStep64 Is Nothing Then End If cExecStep64.Abort If Not cExecStep29 Is Nothing Then End If cExecStep29.Abort If Not cExecStep47 Is Nothing Then End If cExecStep47.Abort If Not cExecStep65 Is Nothing Then End If cExecStep65.Abort ' ======30 - 39 End If ======If Not cExecStep48 Is Nothing Then If Not cExecStep30 Is Nothing Then cExecStep48.Abort If Not cExecStep66 Is Nothing Then cExecStep30.Abort End If cExecStep66.Abort End If End If If Not cExecStep49 Is Nothing Then If Not cExecStep31 Is Nothing Then cExecStep49.Abort If Not cExecStep67 Is Nothing Then cExecStep31.Abort End If cExecStep67.Abort End If End If HP TPC-H FULL DISCLOSURE REPORT 202 © 2005 Hewlett-Packard Company. All rights reserved. End If On Error GoTo AbortSiblingsErr If Not cExecStep68 Is Nothing Then cExecStep68.Abort If Not cExecStep86 Is Nothing Then ' Abort each of the steps that is currently End If cExecStep86.Abort executing. End If If Not cExecStep1 Is Nothing Then If Not cExecStep69 Is Nothing Then If cExecStep1.ExecuteStep.ParentStepId = cExecStep69.Abort If Not cExecStep87 Is Nothing Then cTermInstance.Step.ParentStepId Then End If cExecStep87.Abort cExecStep1.Abort End If End If ' ======70 - 79 End If ======If Not cExecStep88 Is Nothing Then If Not cExecStep70 Is Nothing Then cExecStep88.Abort If Not cExecStep2 Is Nothing Then cExecStep70.Abort End If If cExecStep2.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep89 Is Nothing Then cExecStep2.Abort If Not cExecStep71 Is Nothing Then cExecStep89.Abort End If cExecStep71.Abort End If End If End If ' ======90 - 99 If Not cExecStep3 Is Nothing Then If Not cExecStep72 Is Nothing Then ======If cExecStep3.ExecuteStep.ParentStepId = cExecStep72.Abort If Not cExecStep90 Is Nothing Then cTermInstance.Step.ParentStepId Then End If cExecStep90.Abort cExecStep3.Abort End If End If If Not cExecStep73 Is Nothing Then End If cExecStep73.Abort If Not cExecStep91 Is Nothing Then End If cExecStep91.Abort If Not cExecStep4 Is Nothing Then End If If cExecStep4.ExecuteStep.ParentStepId = If Not cExecStep74 Is Nothing Then cTermInstance.Step.ParentStepId Then cExecStep74.Abort If Not cExecStep92 Is Nothing Then cExecStep4.Abort End If cExecStep92.Abort End If End If End If If Not cExecStep75 Is Nothing Then cExecStep75.Abort If Not cExecStep93 Is Nothing Then If Not cExecStep5 Is Nothing Then End If cExecStep93.Abort If cExecStep5.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep76 Is Nothing Then cExecStep5.Abort cExecStep76.Abort If Not cExecStep94 Is Nothing Then End If End If cExecStep94.Abort End If End If If Not cExecStep77 Is Nothing Then If Not cExecStep6 Is Nothing Then cExecStep77.Abort If Not cExecStep95 Is Nothing Then If cExecStep6.ExecuteStep.ParentStepId = End If cExecStep95.Abort cTermInstance.Step.ParentStepId Then End If cExecStep6.Abort If Not cExecStep78 Is Nothing Then End If cExecStep78.Abort If Not cExecStep96 Is Nothing Then End If End If cExecStep96.Abort End If If Not cExecStep7 Is Nothing Then If Not cExecStep79 Is Nothing Then If cExecStep7.ExecuteStep.ParentStepId = cExecStep79.Abort If Not cExecStep97 Is Nothing Then cTermInstance.Step.ParentStepId Then End If cExecStep97.Abort cExecStep7.Abort End If End If ' ======80 - 89 End If ======If Not cExecStep98 Is Nothing Then If Not cExecStep80 Is Nothing Then cExecStep98.Abort If Not cExecStep8 Is Nothing Then cExecStep80.Abort End If If cExecStep8.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep99 Is Nothing Then cExecStep8.Abort If Not cExecStep81 Is Nothing Then cExecStep99.Abort End If cExecStep81.Abort End If End If End If End If If Not cExecStep9 Is Nothing Then If Not cExecStep82 Is Nothing Then If cExecStep9.ExecuteStep.ParentStepId = cExecStep82.Abort Exit Sub cTermInstance.Step.ParentStepId Then End If cExecStep9.Abort AbortErr: End If If Not cExecStep83 Is Nothing Then Call LogErrors(Errors) End If cExecStep83.Abort On Error GoTo 0 End If ShowError errAbortFailed If Not cExecStep10 Is Nothing Then ' Try to abort the remaining steps, if any If cExecStep10.ExecuteStep.ParentStepId = If Not cExecStep84 Is Nothing Then Resume Next cTermInstance.Step.ParentStepId Then cExecStep84.Abort cExecStep10.Abort End If End Sub End If Public Sub AbortSiblings(cTermInstance As End If If Not cExecStep85 Is Nothing Then cInstance) cExecStep85.Abort If Not cExecStep11 Is Nothing Then HP TPC-H FULL DISCLOSURE REPORT 203 © 2005 Hewlett-Packard Company. All rights reserved. If cExecStep20.Abort cExecStep11.ExecuteStep.ParentStepId = End If If Not cExecStep31 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep31.ExecuteStep.ParentStepId = cExecStep11.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep21 Is Nothing Then cExecStep31.Abort End If If cExecStep21.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then End If If Not cExecStep12 Is Nothing Then cExecStep21.Abort If End If If Not cExecStep32 Is Nothing Then cExecStep12.ExecuteStep.ParentStepId = End If If cExecStep32.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep12.Abort If Not cExecStep22 Is Nothing Then cExecStep32.Abort End If If cExecStep22.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If cExecStep22.Abort If Not cExecStep13 Is Nothing Then End If If Not cExecStep33 Is Nothing Then If End If If cExecStep33.ExecuteStep.ParentStepId = cExecStep13.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then If Not cExecStep23 Is Nothing Then cExecStep33.Abort cExecStep13.Abort If cExecStep23.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If End If cExecStep23.Abort End If If Not cExecStep34 Is Nothing Then If Not cExecStep14 Is Nothing Then End If If cExecStep34.ExecuteStep.ParentStepId = If cTermInstance.Step.ParentStepId Then cExecStep14.ExecuteStep.ParentStepId = If Not cExecStep24 Is Nothing Then cExecStep34.Abort cTermInstance.Step.ParentStepId Then If cExecStep24.ExecuteStep.ParentStepId End If cExecStep14.Abort = cTermInstance.Step.ParentStepId Then End If End If cExecStep24.Abort End If End If If Not cExecStep35 Is Nothing Then End If If cExecStep35.ExecuteStep.ParentStepId = If Not cExecStep15 Is Nothing Then cTermInstance.Step.ParentStepId Then If If Not cExecStep25 Is Nothing Then cExecStep35.Abort cExecStep15.ExecuteStep.ParentStepId = If cExecStep25.ExecuteStep.ParentStepId End If cTermInstance.Step.ParentStepId Then = cTermInstance.Step.ParentStepId Then End If cExecStep15.Abort cExecStep25.Abort End If End If If Not cExecStep36 Is Nothing Then End If End If If cExecStep36.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then If Not cExecStep16 Is Nothing Then If Not cExecStep26 Is Nothing Then cExecStep36.Abort If If cExecStep26.ExecuteStep.ParentStepId End If cExecStep16.ExecuteStep.ParentStepId = = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep26.Abort cExecStep16.Abort End If If Not cExecStep37 Is Nothing Then End If End If If cExecStep37.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep27 Is Nothing Then cExecStep37.Abort If Not cExecStep17 Is Nothing Then If cExecStep27.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep17.ExecuteStep.ParentStepId = cExecStep27.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep38 Is Nothing Then cExecStep17.Abort End If If cExecStep38.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then End If If Not cExecStep28 Is Nothing Then cExecStep38.Abort If cExecStep28.ExecuteStep.ParentStepId End If If Not cExecStep18 Is Nothing Then = cTermInstance.Step.ParentStepId Then End If If cExecStep28.Abort cExecStep18.ExecuteStep.ParentStepId = End If If Not cExecStep39 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep39.ExecuteStep.ParentStepId = cExecStep18.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep29 Is Nothing Then cExecStep39.Abort End If If cExecStep29.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then End If If Not cExecStep19 Is Nothing Then cExecStep29.Abort If End If ' ======40 ======cExecStep19.ExecuteStep.ParentStepId = End If If Not cExecStep40 Is Nothing Then cTermInstance.Step.ParentStepId Then If cExecStep40.ExecuteStep.ParentStepId = cExecStep19.Abort ' ======30 cTermInstance.Step.ParentStepId Then End If ======cExecStep40.Abort End If If Not cExecStep30 Is Nothing Then End If If cExecStep30.ExecuteStep.ParentStepId End If If Not cExecStep20 Is Nothing Then = cTermInstance.Step.ParentStepId Then If cExecStep30.Abort If Not cExecStep41 Is Nothing Then cExecStep20.ExecuteStep.ParentStepId = End If If cExecStep41.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then HP TPC-H FULL DISCLOSURE REPORT 204 © 2005 Hewlett-Packard Company. All rights reserved. cExecStep41.Abort End If If Not cExecStep61 Is Nothing Then End If End If If cExecStep61.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep51 Is Nothing Then cExecStep61.Abort If Not cExecStep42 Is Nothing Then If cExecStep51.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep42.ExecuteStep.ParentStepId = cExecStep51.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep62 Is Nothing Then cExecStep42.Abort End If If cExecStep62.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then End If If Not cExecStep52 Is Nothing Then cExecStep62.Abort If cExecStep52.ExecuteStep.ParentStepId End If If Not cExecStep43 Is Nothing Then = cTermInstance.Step.ParentStepId Then End If If cExecStep52.Abort cExecStep43.ExecuteStep.ParentStepId = End If If Not cExecStep63 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep63.ExecuteStep.ParentStepId = cExecStep43.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep53 Is Nothing Then cExecStep63.Abort End If If cExecStep53.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then End If If Not cExecStep44 Is Nothing Then cExecStep53.Abort If End If If Not cExecStep64 Is Nothing Then cExecStep44.ExecuteStep.ParentStepId = End If If cExecStep64.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep44.Abort If Not cExecStep54 Is Nothing Then cExecStep64.Abort End If If cExecStep54.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If cExecStep54.Abort If Not cExecStep45 Is Nothing Then End If If Not cExecStep65 Is Nothing Then If End If If cExecStep65.ExecuteStep.ParentStepId = cExecStep45.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then If Not cExecStep55 Is Nothing Then cExecStep65.Abort cExecStep45.Abort If cExecStep55.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If End If cExecStep55.Abort End If If Not cExecStep66 Is Nothing Then If Not cExecStep46 Is Nothing Then End If If cExecStep66.ExecuteStep.ParentStepId = If cTermInstance.Step.ParentStepId Then cExecStep46.ExecuteStep.ParentStepId = If Not cExecStep56 Is Nothing Then cExecStep66.Abort cTermInstance.Step.ParentStepId Then If cExecStep56.ExecuteStep.ParentStepId End If cExecStep46.Abort = cTermInstance.Step.ParentStepId Then End If End If cExecStep56.Abort End If End If If Not cExecStep67 Is Nothing Then End If If cExecStep67.ExecuteStep.ParentStepId = If Not cExecStep47 Is Nothing Then cTermInstance.Step.ParentStepId Then If If Not cExecStep57 Is Nothing Then cExecStep67.Abort cExecStep47.ExecuteStep.ParentStepId = If cExecStep57.ExecuteStep.ParentStepId End If cTermInstance.Step.ParentStepId Then = cTermInstance.Step.ParentStepId Then End If cExecStep47.Abort cExecStep57.Abort End If End If If Not cExecStep68 Is Nothing Then End If End If If cExecStep68.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then If Not cExecStep48 Is Nothing Then If Not cExecStep58 Is Nothing Then cExecStep68.Abort If If cExecStep58.ExecuteStep.ParentStepId End If cExecStep48.ExecuteStep.ParentStepId = = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep58.Abort cExecStep48.Abort End If If Not cExecStep69 Is Nothing Then End If End If If cExecStep69.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep59 Is Nothing Then cExecStep69.Abort If Not cExecStep49 Is Nothing Then If cExecStep59.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep49.ExecuteStep.ParentStepId = cExecStep59.Abort cTermInstance.Step.ParentStepId Then End If ' ======70 ======cExecStep49.Abort End If If Not cExecStep70 Is Nothing Then End If If cExecStep70.ExecuteStep.ParentStepId = End If ' ======60 cTermInstance.Step.ParentStepId Then ======cExecStep70.Abort ' ======50 If Not cExecStep60 Is Nothing Then End If ======If cExecStep60.ExecuteStep.ParentStepId End If If Not cExecStep50 Is Nothing Then = cTermInstance.Step.ParentStepId Then If cExecStep60.Abort If Not cExecStep71 Is Nothing Then cExecStep50.ExecuteStep.ParentStepId = End If If cExecStep71.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep50.Abort cExecStep71.Abort HP TPC-H FULL DISCLOSURE REPORT 205 © 2005 Hewlett-Packard Company. All rights reserved. End If End If If cExecStep91.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep81 Is Nothing Then cExecStep91.Abort If Not cExecStep72 Is Nothing Then If cExecStep81.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep72.ExecuteStep.ParentStepId = cExecStep81.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep92 Is Nothing Then cExecStep72.Abort End If If cExecStep92.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then End If If Not cExecStep82 Is Nothing Then cExecStep92.Abort If cExecStep82.ExecuteStep.ParentStepId End If If Not cExecStep73 Is Nothing Then = cTermInstance.Step.ParentStepId Then End If If cExecStep82.Abort cExecStep73.ExecuteStep.ParentStepId = End If If Not cExecStep93 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep93.ExecuteStep.ParentStepId = cExecStep73.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep83 Is Nothing Then cExecStep93.Abort End If If cExecStep83.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then End If If Not cExecStep74 Is Nothing Then cExecStep83.Abort If End If If Not cExecStep94 Is Nothing Then cExecStep74.ExecuteStep.ParentStepId = End If If cExecStep94.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep74.Abort If Not cExecStep84 Is Nothing Then cExecStep94.Abort End If If cExecStep84.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If cExecStep84.Abort If Not cExecStep75 Is Nothing Then End If If Not cExecStep95 Is Nothing Then If End If If cExecStep95.ExecuteStep.ParentStepId = cExecStep75.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then If Not cExecStep85 Is Nothing Then cExecStep95.Abort cExecStep75.Abort If cExecStep85.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If End If cExecStep85.Abort End If If Not cExecStep96 Is Nothing Then If Not cExecStep76 Is Nothing Then End If If cExecStep96.ExecuteStep.ParentStepId = If cTermInstance.Step.ParentStepId Then cExecStep76.ExecuteStep.ParentStepId = If Not cExecStep86 Is Nothing Then cExecStep96.Abort cTermInstance.Step.ParentStepId Then If cExecStep86.ExecuteStep.ParentStepId End If cExecStep76.Abort = cTermInstance.Step.ParentStepId Then End If End If cExecStep86.Abort End If End If If Not cExecStep97 Is Nothing Then End If If cExecStep97.ExecuteStep.ParentStepId = If Not cExecStep77 Is Nothing Then cTermInstance.Step.ParentStepId Then If If Not cExecStep87 Is Nothing Then cExecStep97.Abort cExecStep77.ExecuteStep.ParentStepId = If cExecStep87.ExecuteStep.ParentStepId End If cTermInstance.Step.ParentStepId Then = cTermInstance.Step.ParentStepId Then End If cExecStep77.Abort cExecStep87.Abort End If End If If Not cExecStep98 Is Nothing Then End If End If If cExecStep98.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then If Not cExecStep78 Is Nothing Then If Not cExecStep88 Is Nothing Then cExecStep98.Abort If If cExecStep88.ExecuteStep.ParentStepId End If cExecStep78.ExecuteStep.ParentStepId = = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep88.Abort cExecStep78.Abort End If If Not cExecStep99 Is Nothing Then End If End If If cExecStep99.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep89 Is Nothing Then cExecStep99.Abort If Not cExecStep79 Is Nothing Then If cExecStep89.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep79.ExecuteStep.ParentStepId = cExecStep89.Abort cTermInstance.Step.ParentStepId Then End If Exit Sub cExecStep79.Abort End If End If AbortSiblingsErr: End If ' ======90 Call LogErrors(Errors) ======On Error GoTo 0 ' ======80 If Not cExecStep90 Is Nothing Then ShowError errAbortFailed ======If cExecStep90.ExecuteStep.ParentStepId ' Try to abort the remaining steps, if any If Not cExecStep80 Is Nothing Then = cTermInstance.Step.ParentStepId Then Resume Next If cExecStep90.Abort cExecStep80.ExecuteStep.ParentStepId = End If End Sub cTermInstance.Step.ParentStepId Then End If Private Sub ExecutionFailed(cTermStep As cExecStep80.Abort cRunStep) End If If Not cExecStep91 Is Nothing Then HP TPC-H FULL DISCLOSURE REPORT 206 © 2005 Hewlett-Packard Company. All rights reserved. ' Called when execution of a step fails for Case 26 Set cExecStep63 = Nothing any reason - ensure that execution Set cExecStep26 = Nothing Case 64 ' continues Case 27 Set cExecStep64 = Nothing Set cExecStep27 = Nothing Case 65 On Error GoTo ExecutionFailedErr Case 28 Set cExecStep65 = Nothing Set cExecStep28 = Nothing Case 66 Call AddFreeProcess(cTermStep.Index) Case 29 Set cExecStep66 = Nothing Set cExecStep29 = Nothing Case 67 Call RunBranch(mstrCurBranchRoot) Case 30 Set cExecStep67 = Nothing Set cExecStep30 = Nothing Case 68 Exit Sub Case 31 Set cExecStep68 = Nothing Set cExecStep31 = Nothing Case 69 ExecutionFailedErr: Case 32 Set cExecStep69 = Nothing ' Log the error code raised by Visual Set cExecStep32 = Nothing Case 70 Basic - do not raise an error here! Case 33 Set cExecStep70 = Nothing Call LogErrors(Errors) Set cExecStep33 = Nothing Case 71 Case 34 Set cExecStep71 = Nothing End Sub Set cExecStep34 = Nothing Case 72 Private Sub FreeExecStep(lngIndex As Case 35 Set cExecStep72 = Nothing Long) Set cExecStep35 = Nothing Case 73 ' Frees an instance of a cExecuteSM Case 36 Set cExecStep73 = Nothing object depending on the index Set cExecStep36 = Nothing Case 74 On Error GoTo FreeExecStepErr Case 37 Set cExecStep74 = Nothing Set cExecStep37 = Nothing Case 75 Select Case lngIndex + 1 Case 38 Set cExecStep75 = Nothing Case 1 Set cExecStep38 = Nothing Case 76 Set cExecStep1 = Nothing Case 39 Set cExecStep76 = Nothing Case 2 Set cExecStep39 = Nothing Case 77 Set cExecStep2 = Nothing Case 40 Set cExecStep77 = Nothing Case 3 Set cExecStep40 = Nothing Case 78 Set cExecStep3 = Nothing Case 41 Set cExecStep78 = Nothing Case 4 Set cExecStep41 = Nothing Case 79 Set cExecStep4 = Nothing Case 42 Set cExecStep79 = Nothing Case 5 Set cExecStep42 = Nothing Case 80 Set cExecStep5 = Nothing Case 43 Set cExecStep80 = Nothing Case 6 Set cExecStep43 = Nothing Case 81 Set cExecStep6 = Nothing Case 44 Set cExecStep81 = Nothing Case 7 Set cExecStep44 = Nothing Case 82 Set cExecStep7 = Nothing Case 45 Set cExecStep82 = Nothing Case 8 Set cExecStep45 = Nothing Case 83 Set cExecStep8 = Nothing Case 46 Set cExecStep83 = Nothing Case 9 Set cExecStep46 = Nothing Case 84 Set cExecStep9 = Nothing Case 47 Set cExecStep84 = Nothing Case 10 Set cExecStep47 = Nothing Case 85 Set cExecStep10 = Nothing Case 48 Set cExecStep85 = Nothing Case 11 Set cExecStep48 = Nothing Case 86 Set cExecStep11 = Nothing Case 49 Set cExecStep86 = Nothing Case 12 Set cExecStep49 = Nothing Case 87 Set cExecStep12 = Nothing Case 50 Set cExecStep87 = Nothing Case 13 Set cExecStep50 = Nothing Case 88 Set cExecStep13 = Nothing Case 51 Set cExecStep88 = Nothing Case 14 Set cExecStep51 = Nothing Case 89 Set cExecStep14 = Nothing Case 52 Set cExecStep89 = Nothing Case 15 Set cExecStep52 = Nothing Case 90 Set cExecStep15 = Nothing Case 53 Set cExecStep90 = Nothing Case 16 Set cExecStep53 = Nothing Case 91 Set cExecStep16 = Nothing Case 54 Set cExecStep91 = Nothing Case 17 Set cExecStep54 = Nothing Case 92 Set cExecStep17 = Nothing Case 55 Set cExecStep92 = Nothing Case 18 Set cExecStep55 = Nothing Case 93 Set cExecStep18 = Nothing Case 56 Set cExecStep93 = Nothing Case 19 Set cExecStep56 = Nothing Case 94 Set cExecStep19 = Nothing Case 57 Set cExecStep94 = Nothing Case 20 Set cExecStep57 = Nothing Case 95 Set cExecStep20 = Nothing Case 58 Set cExecStep95 = Nothing Case 21 Set cExecStep58 = Nothing Case 96 Set cExecStep21 = Nothing Case 59 Set cExecStep96 = Nothing Case 22 Set cExecStep59 = Nothing Case 97 Set cExecStep22 = Nothing Case 60 Set cExecStep97 = Nothing Case 23 Set cExecStep60 = Nothing Case 98 Set cExecStep23 = Nothing Case 61 Set cExecStep98 = Nothing Case 24 Set cExecStep61 = Nothing Case 99 Set cExecStep24 = Nothing Case 62 Set cExecStep99 = Nothing Case 25 Set cExecStep62 = Nothing Case Else Set cExecStep25 = Nothing Case 63 HP TPC-H FULL DISCLOSURE REPORT 207 © 2005 Hewlett-Packard Company. All rights reserved. BugAssert False, "FreeExecStep: MB_ABORTRETRYIGNORE Private Function ProcessRetryStep(cFailureRec As Invalid index value!" + MB_APPLMODAL + cFailedStep) As cInstance End Select MB_ICONEXCLAMATION) ' This procedure is called when a step with a #End If continuation criteria = Ask has failed Exit Sub ' and the user wants to re-execute the step. ' Process an abort response immediately ' We delete all existing instances for the step and FreeExecStepErr: If cFailureRec.AskResponse = reset the iterator, if ' Log the error code raised by Visual IDABORT Then ' any on the parent instance - this way we ensure Basic mblnAbort = True that the step will be executed Call LogErrors(Errors) Set cNextInst = ' in the next pass. mcInstances.QueryInstance(cFailureRec.Instan Dim lIndex As Long End Sub ceId) Dim cParentInstance As cInstance Private Sub ProcessAskFailures() Call RunPendingSiblings(cNextInst, Dim cSubStepRec As cSubStep ' This procedure is called when a step cFailureRec.EndTime) Dim cStepRec As cStep with a continuation criteria = Ask has failed. Exit For ' Wait for all running processes to End If On Error GoTo ProcessRetryStepErr complete before displaying an End If Abort/Retry/Fail ' Navigate in reverse order since we'll be deleting ' message to the user. We process every Next lIndex items from the collection Ask step that has failed and use a simple For lIndex = mcInstances.Count - 1 To 0 Step -1 ' algorithm to determine what to do next. ' Process all failed steps for which we have ' 1. An abort response to any failure Ignore and Retry responses. If mcInstances(lIndex).Step.StepId = results in an immediate abort of the run If Not mblnAbort Then cFailureRec.StepId Then ' 2. A continue means the run continues - ' Navigate in reverse order since we'll be Set cParentInstance = this failure is popped off the failure list. deleting items from the collection mcInstances.QueryInstance(mcInstances(lIndex).Pa ' 3. A retry means that the execution For lIndex = mcFailures.Count - 1 To 0 rentInstanceId) details for the instance are cleared and the Step -1 Set cSubStepRec = ' step is re-executed. If mcFailures(lIndex).ContCriteria = cParentInstance.QuerySubStep(cFailureRec.StepId) Dim lIndex As Long gintOnFailureAsk Then Set cStepRec = Dim cStepRec As cStep mblnAsk = False mcRunSteps.QueryStep(cFailureRec.StepId) Dim cNextInst As cInstance Set cFailureRec = Dim cFailureRec As cFailedStep mcFailures.Delete(lIndex) ' Decrement the child count on the parent instance and reset the On Error GoTo ProcessAskFailuresErr Select Case ' step iterators on the sub-step record, if any cFailureRec.AskResponse - ' Display a popup message for all steps Case IDABORT ' all the iterations of the step will be re- that have failed with a continuation BugAssert True executed. ' criteria of Ask cParentInstance.ChildDeleted For lIndex = mcFailures.Count - 1 To 0 Case IDRETRY cFailureRec.StepId Step -1 ' Delete all instances for the cParentInstance.AllComplete = False failed step and re-try cParentInstance.AllStarted = False Set cFailureRec = mcFailures(lIndex) ' Returns a parent instance reference cSubStepRec.InitializeIt cStepRec, If cFailureRec.ContCriteria = Set cNextInst = mcParameters gintOnFailureAsk Then ProcessRetryStep(cFailureRec) Set cStepRec = Call ' Now delete the current instance mcRunSteps.QueryStep(cFailureRec.StepId) RunPendingStepInBranch(mstrCurBranchRoot Set ProcessRetryStep = ' Ask the user whether to , cNextInst) mcInstances.Delete(lIndex) abort/retry/continue End If #If RUN_ONLY Then Case IDIGNORE Next lIndex cFailureRec.AskResponse = Set cNextInst = ShowMessageBox(0, _ mcInstances.QueryInstance(cFailureRec.Instan Exit Function "Step '" & ceId) GetStepNodeText(cStepRec) & "' failed. " & Call ProcessRetryStepErr: _ RunPendingSiblings(cNextInst, ' Log the error code raised by Visual Basic "Select Abort to abort run cFailureRec.EndTime) Call LogErrors(Errors) and Ignore to continue. " & _ Err.Raise vbObjectError + "Select Retry to re-execute End Select errExecuteBranchFailed, mstrModuleName, _ the failed step.", _ End If LoadResString(errExecuteBranchFailed) "Step Failure", _ Next lIndex End If End Function MB_ABORTRETRYIGNORE + MB_APPLMODAL + Exit Sub MB_ICONEXCLAMATION) Private Sub RunNextStep(ByVal #Else ProcessAskFailuresErr: dtmCompleteTime As Currency, ByVal lngIndex cFailureRec.AskResponse = ' Log the error code raised by Visual Basic As Long, _ ShowMessageBox(frmRunning.hWnd, _ Call LogErrors(Errors) ByVal InstanceId As Long, ByVal "Step '" & Err.Raise vbObjectError + ExecutionStatus As InstanceStatus) GetStepNodeText(cStepRec) & "' failed. " & errExecuteBranchFailed, mstrModuleName, _ ' Checks if there are any steps remaining to be _ ' executed in the current branch. If so, it executes "Select Abort to abort run LoadResString(errExecuteBranchFailed) ' the step. and Ignore to continue. " & _ Dim cTermInstance As cInstance "Select Retry to re-execute End Sub Dim cFailure As cFailedStep the failed step.", _ "Step Failure", _ On Error GoTo RunNextStepErr HP TPC-H FULL DISCLOSURE REPORT 208 © 2005 Hewlett-Packard Company. All rights reserved. ' Display an error only if the abort is BugMessage "RunNextStep: cExecStep" due to a failure lngSubStepId = & CStr(lngIndex + 1) & " has completed." ' We had to abort since a step failed - MakeIdentifierValid(strRootKey) since no other steps are currently Call mcTermSteps.Delete ' running, we can display a message to Set cSubStepDtls = Call FreeExecStep(lngIndex) the user saying that we had to abort mcRunSteps.QueryStep(lngSubStepId) #If RUN_ONLY Then If cSubStepDtls.EnabledFlag Then ' Call a procedure to add the freed up Call ShowMessageBox(0, ' Create a child node for the step corresponding object to the list msAbortDtls, "Run Aborted", _ to Call AddFreeProcess(lngIndex) MB_APPLMODAL + MB_OK ' the root node of the branch being currently + MB_ICONEXCLAMATION) executed, Set cTermInstance = #Else ' only if it has been enabled mcInstances.QueryInstance(InstanceId) Call Call cTermInstance.Status = ExecutionStatus ShowMessageBox(frmRunning.hWnd, cNewInstance.CreateSubStep(cSubStepDtls, msAbortDtls, "Run Aborted", _ mcParameters) If ExecutionStatus = gintFailed Then MB_APPLMODAL + MB_OK End If If + MB_ICONEXCLAMATION) cTermInstance.Step.ContinuationCriteria = #End If mcInstances.Add cNewInstance gintOnFailureAbortSiblings Then ' MsgBox msAbortDtls, vbOKOnly, Set cNewInstance.Iterators = Call AbortSiblings(cTermInstance) "Run Aborted" DetermineIterators(cNewInstance) End If End If ElseIf mblnAsk Then ' Set a reference to the newly created dummy If Not If Not AnyStepRunning(mcFreeSteps, instance mcFailures.StepFailed(cTermInstance.Step. mbarrFree) Then Set mcDummyRootInstance = cNewInstance StepId) Then ' Ask the user whether to Set cFailure = New cFailedStep abort/retry/ignore failed steps Set cNewInstance = Nothing cFailure.InstanceId = Call ProcessAskFailures cTermInstance.InstanceId End If Exit Sub cFailure.StepId = End If cTermInstance.Step.StepId CreateDummyInstanceErr: cFailure.ParentStepId = Exit Sub ' Log the error code raised by Visual Basic cTermInstance.Step.ParentStepId Call LogErrors(Errors) cFailure.ContCriteria = RunNextStepErr: On Error GoTo 0 cTermInstance.Step.ContinuationCriteria ' Log the error code raised by Visual Basic mstrSource = mstrModuleName & cFailure.EndTime = Call LogErrors(Errors) "CreateDummyInstance" dtmCompleteTime WriteError errExecuteBranchFailed, Err.Raise vbObjectError + mcFailures.Add cFailure mstrSource errCreateInstanceFailed, _ Set cFailure = Nothing Call ResetForm(lngIndex) mstrSource, End If LoadResString(errCreateInstanceFailed) End If End Sub Public Sub StopRun() End Sub If ExecutionStatus = gintFailed And Private Function CreateInstance(cExecStep As cTermInstance.Step.ContinuationCriteria = ' Setting the Abort flag to True will ensure cStep, _ gintOnFailureAbort Then that we cParentInstance As cInstance) As cInstance If StringEmpty(msAbortDtls) Then ' don't execute any more steps ' Creates a new instance of the passed in step. ' Initialize the abort message mblnAbort = True Returns msAbortDtls = "Step '" & ' a reference to the newly created instance object. GetStepNodeText(cTermInstance.Step) & "' End Sub failed. " & _ Dim cNewInstance As cInstance "Aborting execution. Please Private Sub CreateDummyInstance(strRootKey Dim nodChild As cStep check the error file for details." As String) Dim lngSubStepId As Long End If Call Abort Dim cNewInstance As cInstance On Error GoTo CreateInstanceErr ElseIf ExecutionStatus = gintFailed And Dim cSubStepDtls As cStep cTermInstance.Step.ContinuationCriteria = Dim lngSubStepId As Long ' Create a new instance of the step gintOnFailureAsk Then ' initialize substeps for the step mblnAsk = True On Error GoTo CreateDummyInstanceErr Set cNewInstance = New cInstance Set cNewInstance.Step = cExecStep ' If the step failed due to a Cancel ' Create a new instance of the step cNewInstance.Key = operation (Abort), abort the run ' initialize substeps for the step MakeKeyValid(cExecStep.StepId, If mblnAbort Then Set cNewInstance = New cInstance cExecStep.StepType) Call cNewInstance.ParentInstanceId = RunPendingSiblings(cTermInstance, ' There can be multiple iterations of the top cParentInstance.InstanceId dtmCompleteTime) level nodes cNewInstance.InstanceId = NewInstanceId End If ' running at the same time, but only one ' Validate the degree of parallelism field before Else branch at any assigning it to the instance - Call ' time - so enforce a degree of parallelism of ' (the parameter value might have been set to an RunPendingSiblings(cTermInstance, 1 on this invalid value at runtime) dtmCompleteTime) ' node! Call End If Set cNewInstance.Step = New cStep ValidateParallelism(cExecStep.DegreeParallelism, cNewInstance.DegreeParallelism = 1 _ If mblnAbort Then cNewInstance.Key = mstrDummyRootKey cExecStep.WorkspaceId, If Not AnyStepRunning(mcFreeSteps, ParamsInWsp:=mcParameters) mbarrFree) And Not cNewInstance.InstanceId = NewInstanceId StringEmpty(msAbortDtls) Then cNewInstance.ParentInstanceId = 0 HP TPC-H FULL DISCLOSURE REPORT 209 © 2005 Hewlett-Packard Company. All rights reserved. cNewInstance.DegreeParallelism = On Error GoTo DetermineIteratorsErr Private Function SubstituteParameters(cExecStep.DegreePara DetermineConstraints(cInstanceRec As cInstance, _ llelism, _ Set cRunIts = New cRunColIt intConsType As ConstraintType) As Variant cExecStep.WorkspaceId, ' Returns a collection of all the constraints for this WspParameters:=mcParameters) If cInstanceRec.ParentInstanceId > 0 Then ' instance of the passed in type - all the ' The last iterator for an instance of a step constraints defined If is stored ' for the manager are executed first, followed by mcNavSteps.HasChild(StepKey:=cNewInsta ' on it's parent! So navigate up before those defined nce.Key) Then beginning the ' for the step. If a step has an iterator defined for Set nodChild = ' search for iterator values. it, each mcNavSteps.ChildStep(StepKey:=cNewInst Set cParentInst = ' constraint is executed only once. ance.Key) mcInstances.QueryInstance(cInstanceRec.Pare Do ntInstanceId) Dim cParentInst As cInstance If nodChild.EnabledFlag Then Dim cTempInst As cInstance ' Create nodes for all it's substeps ' Get the sub-step record for the current Dim vntConstraints As Variant only step Dim vntTempCons As Variant ' if the substeps have been enabled ' on it's parent's instance! Dim cColConstraints() As Variant Call lngSubStepId = cInstanceRec.Step.StepId Dim lngConsCount As Long cNewInstance.CreateSubStep(nodChild, Set cSubStepRec = mcParameters) cParentInst.QuerySubStep(lngSubStepId) On Error GoTo DetermineConstraintsErr End If Set cSubStepDtls = mcRunSteps.QueryStep(lngSubStepId) Set cTempInst = cInstanceRec Set nodChild = lngConsCount = 0 mcNavSteps.NextStep(StepId:=nodChild.St ' And determine the next iteration value epId) for the ' Go all the way to the root Loop While (Not nodChild Is Nothing) ' substep in this instance Do End If Set cStepIt = If cTempInst.ParentInstanceId > 0 Then cSubStepRec.NewIteration(cSubStepDtls) Set cParentInst = mcInstances.Add cNewInstance mcInstances.QueryInstance(cTempInst.ParentInstan Set cNewInstance.Iterators = If Not cStepIt Is Nothing Then ceId) DetermineIterators(cNewInstance) ' Add the iterator details to the Else collection since Set cParentInst = Nothing ' Increment the number of executing steps ' an iterator has been defined for the End If on the parent step cParentInstance.ChildExecuted Set cRunIt = New cRunItNode ' Check if the step has an iterator defined for it (cExecStep.StepId) cRunIt.IteratorName = If cTempInst.ValidForIteration(cParentInst, cSubStepDtls.IteratorName intConsType) Then Set CreateInstance = cNewInstance cRunIt.Value = vntTempCons = SubstituteParameters(cStepIt.Value, mcRunConstraints.ConstraintsForStep( _ Exit Function cSubStepDtls.WorkspaceId, cTempInst.Step.StepId, WspParameters:=mcParameters) cTempInst.Step.VersionNo, _ CreateInstanceErr: cRunIt.StepId = cSubStepRec.StepId intConsType, blnSort:=True, _ ' Log the error code raised by Visual cRunIts.Push cRunIt blnGlobal:=False, Basic End If blnGlobalConstraintsOnly:=False) Call LogErrors(Errors) On Error GoTo 0 ' Since the parent instance has all the If Not IsEmpty(vntTempCons) Then mstrSource = mstrModuleName & iterators upto ReDim Preserve "CreateInstance" ' that level, read them and push them on to cColConstraints(lngConsCount) Err.Raise vbObjectError + the stack for cColConstraints(lngConsCount) = errCreateInstanceFailed, _ ' this instance vntTempCons mstrSource, For lngIndex = 0 To lngConsCount = lngConsCount + 1 LoadResString(errCreateInstanceFailed) cParentInst.Iterators.Count - 1 End If Set cRunIt = End If End Function cParentInst.Iterators(lngIndex) Private Function cRunIts.Push cRunIt Set cTempInst = cParentInst DetermineIterators(cInstanceRec As Next lngIndex cInstance) As cRunColIt End If Loop While Not cTempInst Is Nothing ' Returns a collection of all the iterator values for this Set DetermineIterators = cRunIts If lngConsCount > 0 Then ' instance - since an iterator that is defined vntTempCons = at a Exit Function OrderConstraints(cColConstraints, intConsType) ' particular level can be used in all it's End If substeps, we DetermineIteratorsErr: ' need to navigate the step tree all the way ' Log the error code raised by Visual Basic DetermineConstraints = vntTempCons to the root Call LogErrors(Errors) On Error GoTo 0 Exit Function Dim cRunIts As cRunColIt mstrSource = mstrModuleName & Dim cRunIt As cRunItNode "DetermineIterators" DetermineConstraintsErr: Dim cStepIt As cIterator Err.Raise vbObjectError + ' Log the error code raised by Visual Basic Dim cParentInst As cInstance errExecInstanceFailed, _ Call LogErrors(Errors) Dim cSubStepRec As cSubStep mstrSource, On Error GoTo 0 Dim cSubStepDtls As cStep LoadResString(errExecInstanceFailed) mstrSource = mstrModuleName & Dim lngSubStepId As Long "DetermineConstraints" Dim lngIndex As Long End Function Err.Raise vbObjectError + errExecInstanceFailed, _ HP TPC-H FULL DISCLOSURE REPORT 210 © 2005 Hewlett-Packard Company. All rights reserved. mstrSource, ' Returns an array of all the instances for a ' Adds the passed in element to the collection of LoadResString(errExecInstanceFailed) step ' free objects Dim lngIndex As Long End Function Dim cTempInst As cInstance mcFreeSteps.Add lngTerminatedProcess Private Function Dim cStepInstances As cInstances GetInstanceToExecute(cParentNode As Dim cStepRec As cStep End Sub cInstance, _ cSubStepRec As cSubStep, _ On Error GoTo InstancesForStepErr Private Sub ResetForm(Optional ByVal lngIndex cSubStepDtls As cStep) As cInstance As Long) Set cStepInstances = New cInstances Dim cSubStepInst As cInstance Dim lngTemp As Long For lngIndex = 0 To mcInstances.Count - 1 On Error GoTo GetInstanceToExecuteErr Set cTempInst = mcInstances(lngIndex) On Error GoTo ResetFormErr

BugAssert Not (cParentNode Is Nothing If cTempInst.Step.StepId = lngStepId ' Check if there are any running instances to wait Or _ Then for cSubStepRec Is Nothing Or _ cStepInstances.Add cTempInst If mcFreeSteps.Count <> cSubStepDtls Is Nothing), _ End If glngNumConcurrentProcesses Then "GetInstanceToExecute: Input Next lngIndex invalid" For lngTemp = 0 To mcFreeSteps.Count - 1 If cStepInstances.Count = 0 Then If mcFreeSteps(lngTemp) = lngIndex Then ' Check if it has iterators Set cStepRec = Exit For If cSubStepDtls.IteratorCount = 0 Then mcRunSteps.QueryStep(lngStepId) End If ' Check if the step has been executed If Not Next lngTemp If cSubStepRec.TasksRunning = 0 And mcFailures.ExecuteSubStep(cStepRec.ParentSt cSubStepRec.TasksComplete = 0 And _ epId) Then If lngTemp <= mcFreeSteps.Count - 1 Then Not StepStatus = gintAborted ' This process that just completed did not mcInstances.CompletedInstanceExists(cPare End If exist in the list of ntNode.InstanceId, cSubStepDtls) Then Set cStepRec = Nothing ' free processes ' The sub-step hasn't been executed End If Call AddFreeProcess(lngIndex) yet. End If ' Create an instance for it and exit ' Set the return value of the function to the Set cSubStepInst = array of If Not AnyStepRunning(mcFreeSteps, CreateInstance(cSubStepDtls, cParentNode) ' constraints that has been built above mbarrFree) Then Else Set InstancesForStep = cStepInstances WriteToWspLog (mintRunComplete) Set cSubStepInst = Nothing ' All steps are complete End If Set cStepInstances = Nothing RaiseEvent Else Exit Function RunComplete(Determine64BitTime()) ' Check if there are pending iterations End If for the sub-step InstancesForStepErr: Else If Not ' Log the error code raised by Visual Basic WriteToWspLog (mintRunComplete) cSubStepRec.NextIteration(cSubStepDtls) Is Call LogErrors(Errors) RaiseEvent Nothing Then On Error GoTo 0 RunComplete(Determine64BitTime()) ' Pending iterations exist - create an mstrSource = mstrModuleName & End If instance for the sub-step and exit "InstancesForStep" Set cSubStepInst = Err.Raise vbObjectError + Exit Sub CreateInstance(cSubStepDtls, cParentNode) errNavInstancesFailed, mstrSource, _ Else LoadResString(errNavInstancesFailed) ResetFormErr: ' No more iterations - continue with the next substep End Function End Sub Set cSubStepInst = Nothing Private Sub Private Function NewInstanceId() As Long End If RemoveFreeProcess(lngRunningProcess As ' Will return new instance id's - uses a static End If Long) counter ' Removes the passed in element from the ' that it increments each time Set GetInstanceToExecute = cSubStepInst collection of Static lngInstance As Long Exit Function ' free objects lngInstance = lngInstance + 1 GetInstanceToExecuteErr: ' Confirm that the last element in the array is NewInstanceId = lngInstance ' Log the error code raised by Visual the one Basic ' we need to delete End Function Call LogErrors(Errors) If mcFreeSteps(mcFreeSteps.Count - 1) = On Error GoTo 0 lngRunningProcess Then Private Function mstrSource = mstrModuleName & mcFreeSteps.Delete RunPendingStepInBranch(strCurBranchRoot As "GetInstanceToExecute" Position:=mcFreeSteps.Count - 1 String, _ Err.Raise vbObjectError + Else Optional cExecInstance As cInstance = errNavInstancesFailed, _ ' Ask the class to find the element and Nothing) As cInstance mstrSource, delete it ' Runs a worker step in the branch being LoadResString(errNavInstancesFailed) mcFreeSteps.Delete executed, if Item:=lngRunningProcess ' there are any pending execution End Function End If ' This function is also called when a step has just completed Public Function InstancesForStep(lngStepId End Sub ' execution - in which case the terminated As Long, ByRef StepStatus As Private Sub instance is InstanceStatus) As cInstances AddFreeProcess(lngTerminatedProcess As ' passed in as the optional parameter. When that Long) happens, HP TPC-H FULL DISCLOSURE REPORT 211 © 2005 Hewlett-Packard Company. All rights reserved. ' we first try to execute the siblings of the Set cNextInst = ' parent by 1 terminated mcInstances.QueryInstance(cParentInstance.Pa Call ' step if any are pending execution. rentInstanceId) cParentInstance.ChildTerminated(cTermInstance.St ' If the terminated instance has not been ep.StepId) passed in, we If cParentInstance.SubSteps.Count = ' start with the dummy root instance and 0 Then ' The first step that terminates has to be a worker navigate down, cNextInst.ChildTerminated ' If it is complete, update the completed steps on ' trying to find a pending worker step. cParentInstance.Step.StepId the End If ' parent by 1. Dim cExecSubStep As cStep End If Call Dim cParentInstance As cInstance End If cParentInstance.ChildCompleted(cTermInstance.St Dim cNextInst As cInstance ep.StepId) BugAssert Not cNextInst Is Nothing cParentInstance.AllStarted = False On Error GoTo Set cParentInstance = cNextInst RunPendingStepInBranchErr Do Loop While cNextInst.Step.StepType <> Set cNextInst = If Not cExecInstance Is Nothing Then gintWorkerStep GetSubStepToExecute(cParentInstance, ' Called when an instance has dtmCompleteTime) terminated If Not cNextInst Is Nothing Then If cNextInst Is Nothing Then ' When a worker step terminates, then Call ExecuteStep(cNextInst) If cParentInstance.Key = we need to End If mstrDummyRootKey Then ' decremement the number of running Set cNextInst = Nothing steps on it's Set RunPendingStepInBranch = cNextInst Exit Do ' manager Else Set cParentInstance = _ Exit Function ' Go to the parent instance and try to find ' some other sibling is pending execution mcInstances.QueryInstance(cExecInstance.P RunPendingStepInBranchErr: Set cNextInst = arentInstanceId) ' Log the error code raised by Visual Basic mcInstances.QueryInstance(cParentInstance.ParentI Call LogErrors(Errors) nstanceId) Else On Error GoTo 0 If cParentInstance.IsRunning Then If StringEmpty(strCurBranchRoot) Or Err.Raise vbObjectError + cNextInst.AllStarted = True mcDummyRootInstance Is Nothing Then errNavInstancesFailed, _ Else ' Run complete - event raised by Run mstrModuleName & ' No more sub-steps to execute method "RunPendingStepInBranch", Call Set RunPendingStepInBranch = LoadResString(errNavInstancesFailed) cNextInst.ChildCompleted(cParentInstance.Step.Ste Nothing pId) Exit Function End Function Call End If Private Function cNextInst.ChildTerminated(cParentInstance.Step.St RunPendingSibling(cTermInstance As epId) ' If there are no pending steps on the cInstance, _ cNextInst.AllStarted = False root instance, dtmCompleteTime As Currency) As End If ' then there are no steps within the cInstance End If branch that need ' This process is called when a step End If ' to be executed terminates. Tries to If ' run a sibling of the terminated step, if one BugAssert Not cNextInst Is Nothing mcDummyRootInstance.AllComplete Or is pending Set cParentInstance = cNextInst mcDummyRootInstance.AllStarted Then ' execution. Set RunPendingStepInBranch = Loop While cNextInst.Step.StepType <> Nothing Dim cParentInstance As cInstance gintWorkerStep Exit Function Dim cNextInst As cInstance End If If Not cNextInst Is Nothing Then On Error GoTo RunPendingSiblingErr Call ExecuteStep(cNextInst) Set cParentInstance = End If mcDummyRootInstance If StringEmpty(mstrCurBranchRoot) Or End If mcDummyRootInstance Is Nothing Then Set RunPendingSibling = cNextInst ' Run complete - event raised by Run Do method Exit Function Set cNextInst = Set RunPendingSibling = Nothing GetSubStepToExecute(cParentInstance) Exit Function RunPendingSiblingErr: If cNextInst Is Nothing Then End If ' Log the error code raised by Visual Basic ' There are no steps within the branch Call LogErrors(Errors) that can BugAssert cTermInstance.ParentInstanceId On Error GoTo 0 ' be executed - If we are at the > 0, "Orphaned instance in array!" mstrSource = mstrModuleName & dummy instance, "RunPendingSibling" ' this branch has completed executing ' When a worker step terminates, then we Err.Raise vbObjectError + If cParentInstance.Key = need to errNavInstancesFailed, mstrSource, _ mstrDummyRootKey Then ' decremement the number of running steps LoadResString(errNavInstancesFailed) Set cNextInst = Nothing on it's Exit Do ' manager End Function Else Set cParentInstance = Private Sub RunPendingSiblings(cTermInstance As ' Go to the parent instance and try mcInstances.QueryInstance(cTermInstance.Par cInstance, _ to find entInstanceId) dtmCompleteTime As Currency) ' some other sibling is pending ' This process is called when a step terminates. execution ' Decrement the number of running Tries to processes on the HP TPC-H FULL DISCLOSURE REPORT 212 © 2005 Hewlett-Packard Company. All rights reserved. ' run siblings of the terminated step, if ' manager step - set the allcomplete or Set GetSubStepToExecute = Nothing they are pending allstarted Exit Function ' execution. ' properties to true End If

Dim cExecInst As cInstance If cMgrInstance.IsRunning() Then If Not cMgrInstance.AllStarted = True mcFailures.ExecuteSubStep(cParentNode.Step.Step On Error GoTo RunPendingSiblingsErr Else Id) Then BugMessage "In RunPendingSiblings" cMgrInstance.AllComplete = True Set GetSubStepToExecute = Nothing If dtmCompleteTime <> gdtmEmpty cParentNode.Status = gintAborted ' Call a procedure to run the sibling of the Then Exit Function terminated ' Update the end time on the manager End If ' step, if any. This procedure will also step update the Call ' First check if there are pending steps for the ' number of complete/running tasks on the TimeCompleteUpdateForStep(cMgrInstance, parent! manager steps. dtmCompleteTime) If cParentNode.IsPending Then Set cExecInst = End If ' Loop through all the sub-steps for the parent RunPendingSibling(cTermInstance, End If node dtmCompleteTime) For lngIndex = 0 To End Sub cParentNode.SubSteps.Count - 1 If Not cExecInst Is Nothing Then Set cSubStepRec = Do Private Function cParentNode.SubSteps(lngIndex) ' Execute any other pending steps in GetSubStepToExecute(cParentNode As Set cSubStepDtls = the branch. cInstance, _ mcRunSteps.QueryStep(cSubStepRec.StepId) ' The step that has just terminated Optional dtmCompleteTime As Currency If Not might be = 0) As cInstance mcInstances.InstanceAborted(cSubStepRec) Then ' the last one that was executing in a ' Returns the child of the passed in node that ' Check if the sub-step is a worker sub-branch. is to be If cSubStepDtls.StepType = ' That would mean that we can ' executed next. Checks if we are in the gintWorkerStep Then execute another middle of an instance ' Find/create an instance to execute ' sub-branch that might involve more ' being executed in which case it returns the Set cSubStepInst = than 1 step. pending GetInstanceToExecute( _ ' Pass the just executed step as a ' instance. Creates a new instance if there are cParentNode, cSubStepRec, parameter. pending cSubStepDtls) Set cExecInst = ' instances for a sub-step. If Not cSubStepInst Is Nothing Then RunPendingStepInBranch(mstrCurBranchR Exit For oot, cExecInst) Dim lngIndex As Long Else Loop While Not cExecInst Is Nothing Dim cSubStepRec As cSubStep ' Continue w/ the next sub-step Else Dim cSubStepDtls As cStep End If If Not Dim cSubStepInst As cInstance Else mcDummyRootInstance.IsRunning Then ' The sub-step is a manager step ' All steps have been executed in the On Error GoTo GetSubStepToExecuteErr ' Check if there are any pending branch - run instances for ' a new branch ' There are a number of cases that need to be ' the manager Call RunNewBranch accounted Set cSubStepInst = Else ' for here. mcInstances.QueryPendingInstance( _ ' There are no more steps to execute ' 1. While traversing through all enabled cParentNode.InstanceId, in the current nodes for the cSubStepRec.StepId) ' branch but we have running ' first time - instance records may not exist If cSubStepInst Is Nothing Then processes. for the ' Find/create an instance to execute End If ' substeps. Set cSubStepInst = End If ' 2. Instance records exist, and there are GetInstanceToExecute( _ processes cParentNode, cSubStepRec, Exit Sub ' that need to be executed for a sub-step cSubStepDtls) ' 3. There are no more processes that need to If Not cSubStepInst Is Nothing Then RunPendingSiblingsErr: be currently Exit For ' Log the error code raised by Visual ' executed (till a process completes) Else Basic ' 4. There are no more processes that need to ' Continue w/ the next sub-step Call LogErrors(Errors) be executed End If On Error GoTo 0 ' (All substeps have completed execution) Else mstrSource = mstrModuleName & ' We have found a pending instance "RunPendingSiblings" ' This is the only point where we check the for the Err.Raise vbObjectError + Abort flag - ' sub-step (manager) - exit the loop errNavInstancesFailed, _ ' since this is the heart of the navigation Exit For mstrSource, routine that End If LoadResString(errNavInstancesFailed) ' selects processes to execute. Also, when a End If step terminates End If End Sub ' selection of the next process goes through Next lngIndex here. Private Sub If mblnAbort Then If lngIndex > cParentNode.SubSteps.Count - 1 NoSubStepsToExecute(cMgrInstance As Set GetSubStepToExecute = Nothing Or cParentNode.SubSteps.Count = 0 Then cInstance, Optional dtmCompleteTime As cParentNode.Status = gintAborted ' If we could not find any sub-steps to Currency = gdtmEmpty) Exit Function execute, ' Called when we cannot find any more End If ' mark the parent node as complete/all substeps to run for started If mblnAsk Then HP TPC-H FULL DISCLOSURE REPORT 213 © 2005 Hewlett-Packard Company. All rights reserved. Call mstrSource, _ Set cInstRec = NoSubStepsToExecute(cParentNode, mcInstances.QueryInstance(cInstRec.ParentInstanc dtmCompleteTime) LoadResString(errMaxProcessesExceeded) eId) Set cSubStepInst = Nothing End If Loop End If End If End Function Call WriteToWspLog(mintStepComplete, Private Function LogLabels, dtmCompleteTime) Set GetSubStepToExecute = cSubStepInst StepTerminated(cCompleteStep As cStep, Set LogLabels = Nothing Exit Function ByVal dtmCompleteTime As Currency, _ ByVal lngIndex As Long, ByVal ' Adds the terminated step details to a queue. GetSubStepToExecuteErr: InstanceId As Long, ByVal ExecutionStatus Set cTermRec = New cTermStep ' Log the error code raised by Visual As InstanceStatus) As cStep cTermRec.ExecutionStatus = ExecutionStatus Basic ' This procedure is called whenever a step cTermRec.Index = lngIndex Call LogErrors(Errors) terminates. cTermRec.InstanceId = InstanceId On Error GoTo 0 Dim cTermRec As cTermStep cTermRec.TimeComplete = dtmCompleteTime mstrSource = mstrModuleName & Dim cInstRec As cInstance Call mcTermSteps.Add(cTermRec) "GetSubStepToExecute" Dim cStartInst As cInstance Set cTermRec = Nothing Err.Raise vbObjectError + Dim lElapsed As Long errNavInstancesFailed, mstrSource, _ Dim sLogLabel As String RaiseEvent StepComplete(cCompleteStep, LoadResString(errNavInstancesFailed) Dim LogLabels As New cVectorStr dtmCompleteTime, InstanceId, lElapsed) Dim iItIndex As Long End Function Exit Function On Error GoTo StepTerminatedErr Private Sub StepTerminatedErr: TimeCompleteUpdateForStep(cMgrInstance Set cInstRec = ' Log the error code raised by Visual Basic As cInstance, ByVal EndTime As Currency) mcInstances.QueryInstance(InstanceId) Call LogErrors(Errors) If dtmCompleteTime <> 0 And WriteError errExecuteBranchFailed, mstrSource ' Called when there are no more sub-steps cInstRec.StartTime <> 0 Then Call ResetForm(lngIndex) to execute for ' Convert to milliseconds since that is the ' the manager step. It updates the end time default precision End Function and status on lElapsed = (dtmCompleteTime - Public Property Let RootKey(ByVal vdata As ' the manager. cInstRec.StartTime) * 10000 String) Dim lElapsed As Long Else lElapsed = 0 mstrRootKey = vdata On Error GoTo End If TimeCompleteUpdateForStepErr End Property Set cStartInst = cInstRec If cMgrInstance.Key <> iItIndex = 0 Public Property Get RootKey() As String mstrDummyRootKey Then Do While cInstRec.Key <> RootKey = mstrRootKey cMgrInstance.EndTime = EndTime mstrDummyRootKey End Property cMgrInstance.Status = gintComplete sLogLabel = gstrSQ & lElapsed = (EndTime - cInstRec.Step.StepLabel & gstrSQ Private Function InitExecStep() As cRunStep cMgrInstance.StartTime) * 10000 ' Since arrays of objects cannot be declared as cMgrInstance.ElapsedTime = lElapsed If iItIndex < cInstRec.Iterators.Count WithEvents, RaiseEvent Then ' we use a limited number of objects and set a StepComplete(cMgrInstance.Step, EndTime, If cStartInst.Iterators(iItIndex).StepId = maximum cMgrInstance.InstanceId, lElapsed) cInstRec.Step.StepId Then ' on the number of steps that can run in parallel End If sLogLabel = sLogLabel & msIt & ' This is a wrapper that will create an instance of gstrSQ & ' a cExecuteSM object depending on the index Exit Sub cStartInst.Iterators(iItIndex).IteratorName & Dim lngIndex As Long gstrSQ & _ TimeCompleteUpdateForStepErr: msItValue & gstrSQ & On Error GoTo InitExecStepErr ' Log the error code raised by Visual cStartInst.Iterators(iItIndex).Value & gstrSQ Basic iItIndex = iItIndex + 1 lngIndex = GetFreeObject Call LogErrors(Errors) End If WriteError errUpdateDisplayFailed, End If Select Case lngIndex + 1 mstrModuleName & Case 1 "TimeCompleteUpdateForStep" If cInstRec.Key = cStartInst.Key Then Set cExecStep1 = New cRunStep ' Append the execution status Set InitExecStep = cExecStep1 End Sub sLogLabel = sLogLabel & " Status: " & Case 2 gstrSQ & gsExecutionStatus(ExecutionStatus) Set cExecStep2 = New cRunStep Private Function GetFreeObject() As Long & gstrSQ Set InitExecStep = cExecStep2 If ExecutionStatus = gintFailed Then Case 3 ' Check the array of free objects and ' Append the continuation criteria for Set cExecStep3 = New cRunStep retrieve the first one the step since it failed Set InitExecStep = cExecStep3 If mcFreeSteps.Count > 0 Then sLogLabel = sLogLabel & " Case 4 GetFreeObject = Continuation Criteria: "& gstrSQ & Set cExecStep4 = New cRunStep mcFreeSteps(mcFreeSteps.Count - 1) gsContCriteria(cInstRec.Step.ContinuationCrit Set InitExecStep = cExecStep4 Else eria) & gstrSQ Case 5 mstrSource = mstrModuleName & End If Set cExecStep5 = New cRunStep "GetFreeObject" End If Set InitExecStep = cExecStep5 ShowError errMaxProcessesExceeded LogLabels.Add sLogLabel Case 6 On Error GoTo 0 Set cExecStep6 = New cRunStep Err.Raise vbObjectError + Set InitExecStep = cExecStep6 errMaxProcessesExceeded, _ Case 7 HP TPC-H FULL DISCLOSURE REPORT 214 © 2005 Hewlett-Packard Company. All rights reserved. Set cExecStep7 = New cRunStep Set cExecStep32 = New cRunStep Set cExecStep57 = New cRunStep Set InitExecStep = cExecStep7 Set InitExecStep = cExecStep32 Set InitExecStep = cExecStep57 Case 8 Case 33 Case 58 Set cExecStep8 = New cRunStep Set cExecStep33 = New cRunStep Set cExecStep58 = New cRunStep Set InitExecStep = cExecStep8 Set InitExecStep = cExecStep33 Set InitExecStep = cExecStep58 Case 9 Case 34 Case 59 Set cExecStep9 = New cRunStep Set cExecStep34 = New cRunStep Set cExecStep59 = New cRunStep Set InitExecStep = cExecStep9 Set InitExecStep = cExecStep34 Set InitExecStep = cExecStep59 Case 10 Case 35 Case 60 Set cExecStep10 = New cRunStep Set cExecStep35 = New cRunStep Set cExecStep60 = New cRunStep Set InitExecStep = cExecStep10 Set InitExecStep = cExecStep35 Set InitExecStep = cExecStep60 Case 11 Case 36 Case 61 Set cExecStep11 = New cRunStep Set cExecStep36 = New cRunStep Set cExecStep61 = New cRunStep Set InitExecStep = cExecStep11 Set InitExecStep = cExecStep36 Set InitExecStep = cExecStep61 Case 12 Case 37 Case 62 Set cExecStep12 = New cRunStep Set cExecStep37 = New cRunStep Set cExecStep62 = New cRunStep Set InitExecStep = cExecStep12 Set InitExecStep = cExecStep37 Set InitExecStep = cExecStep62 Case 13 Case 38 Case 63 Set cExecStep13 = New cRunStep Set cExecStep38 = New cRunStep Set cExecStep63 = New cRunStep Set InitExecStep = cExecStep13 Set InitExecStep = cExecStep38 Set InitExecStep = cExecStep63 Case 14 Case 39 Case 64 Set cExecStep14 = New cRunStep Set cExecStep39 = New cRunStep Set cExecStep64 = New cRunStep Set InitExecStep = cExecStep14 Set InitExecStep = cExecStep39 Set InitExecStep = cExecStep64 Case 15 Case 40 Case 65 Set cExecStep15 = New cRunStep Set cExecStep40 = New cRunStep Set cExecStep65 = New cRunStep Set InitExecStep = cExecStep15 Set InitExecStep = cExecStep40 Set InitExecStep = cExecStep65 Case 16 Case 41 Case 66 Set cExecStep16 = New cRunStep Set cExecStep41 = New cRunStep Set cExecStep66 = New cRunStep Set InitExecStep = cExecStep16 Set InitExecStep = cExecStep41 Set InitExecStep = cExecStep66 Case 17 Case 42 Case 67 Set cExecStep17 = New cRunStep Set cExecStep42 = New cRunStep Set cExecStep67 = New cRunStep Set InitExecStep = cExecStep17 Set InitExecStep = cExecStep42 Set InitExecStep = cExecStep67 Case 18 Case 43 Case 68 Set cExecStep18 = New cRunStep Set cExecStep43 = New cRunStep Set cExecStep68 = New cRunStep Set InitExecStep = cExecStep18 Set InitExecStep = cExecStep43 Set InitExecStep = cExecStep68 Case 19 Case 44 Case 69 Set cExecStep19 = New cRunStep Set cExecStep44 = New cRunStep Set cExecStep69 = New cRunStep Set InitExecStep = cExecStep19 Set InitExecStep = cExecStep44 Set InitExecStep = cExecStep69 Case 20 Case 45 Case 70 Set cExecStep20 = New cRunStep Set cExecStep45 = New cRunStep Set cExecStep70 = New cRunStep Set InitExecStep = cExecStep20 Set InitExecStep = cExecStep45 Set InitExecStep = cExecStep70 Case 21 Case 46 Case 71 Set cExecStep21 = New cRunStep Set cExecStep46 = New cRunStep Set cExecStep71 = New cRunStep Set InitExecStep = cExecStep21 Set InitExecStep = cExecStep46 Set InitExecStep = cExecStep71 Case 22 Case 47 Case 72 Set cExecStep22 = New cRunStep Set cExecStep47 = New cRunStep Set cExecStep72 = New cRunStep Set InitExecStep = cExecStep22 Set InitExecStep = cExecStep47 Set InitExecStep = cExecStep72 Case 23 Case 48 Case 73 Set cExecStep23 = New cRunStep Set cExecStep48 = New cRunStep Set cExecStep73 = New cRunStep Set InitExecStep = cExecStep23 Set InitExecStep = cExecStep48 Set InitExecStep = cExecStep73 Case 24 Case 49 Case 74 Set cExecStep24 = New cRunStep Set cExecStep49 = New cRunStep Set cExecStep74 = New cRunStep Set InitExecStep = cExecStep24 Set InitExecStep = cExecStep49 Set InitExecStep = cExecStep74 Case 25 Case 50 Case 75 Set cExecStep25 = New cRunStep Set cExecStep50 = New cRunStep Set cExecStep75 = New cRunStep Set InitExecStep = cExecStep25 Set InitExecStep = cExecStep50 Set InitExecStep = cExecStep75 Case 26 Case 51 Case 76 Set cExecStep26 = New cRunStep Set cExecStep51 = New cRunStep Set cExecStep76 = New cRunStep Set InitExecStep = cExecStep26 Set InitExecStep = cExecStep51 Set InitExecStep = cExecStep76 Case 27 Case 52 Case 77 Set cExecStep27 = New cRunStep Set cExecStep52 = New cRunStep Set cExecStep77 = New cRunStep Set InitExecStep = cExecStep27 Set InitExecStep = cExecStep52 Set InitExecStep = cExecStep77 Case 28 Case 53 Case 78 Set cExecStep28 = New cRunStep Set cExecStep53 = New cRunStep Set cExecStep78 = New cRunStep Set InitExecStep = cExecStep28 Set InitExecStep = cExecStep53 Set InitExecStep = cExecStep78 Case 29 Case 54 Case 79 Set cExecStep29 = New cRunStep Set cExecStep54 = New cRunStep Set cExecStep79 = New cRunStep Set InitExecStep = cExecStep29 Set InitExecStep = cExecStep54 Set InitExecStep = cExecStep79 Case 30 Case 55 Case 80 Set cExecStep30 = New cRunStep Set cExecStep55 = New cRunStep Set cExecStep80 = New cRunStep Set InitExecStep = cExecStep30 Set InitExecStep = cExecStep55 Set InitExecStep = cExecStep80 Case 31 Case 56 Case 81 Set cExecStep31 = New cRunStep Set cExecStep56 = New cRunStep Set cExecStep81 = New cRunStep Set InitExecStep = cExecStep31 Set InitExecStep = cExecStep56 Set InitExecStep = cExecStep81 Case 32 Case 57 Case 82 HP TPC-H FULL DISCLOSURE REPORT 215 © 2005 Hewlett-Packard Company. All rights reserved. Set cExecStep82 = New cRunStep ' as an array). Since there can be multiple Set InitExecStep = cExecStep82 End Function iterations Case 83 Public Sub Run() ' of the top level nodes running at the same time, Set cExecStep83 = New cRunStep ' Calls procedures to build a list of all the we Set InitExecStep = cExecStep83 steps that ' create a dummy node at the root that keeps a Case 84 ' need to be executed and to execute them record of Set cExecStep84 = New cRunStep ' Determines whether the run has ' the instances of the top level node. Set InitExecStep = cExecStep84 started/terminated and Case 85 ' raises the Run Start and Complete events. ' Determines whether the run has Set cExecStep85 = New cRunStep Dim cTempStep As cStep started/terminated and Set InitExecStep = cExecStep85 ' raises the Run Start and Complete events. Case 86 On Error GoTo RunErr Dim cNextStep As cStep Set cExecStep86 = New cRunStep Dim bRunComplete As Boolean Set InitExecStep = cExecStep86 If StringEmpty(mstrRootKey) Then Case 87 Call ShowError(errExecuteBranchFailed) On Error GoTo RunNewBranchErr Set cExecStep87 = New cRunStep On Error GoTo 0 Set InitExecStep = cExecStep87 Err.Raise vbObjectError + bRunComplete = False Case 88 errExecuteBranchFailed, mstrModuleName & Set cExecStep88 = New cRunStep "Run", _ Do Set InitExecStep = cExecStep88 If StringEmpty(mstrCurBranchRoot) Then Case 89 LoadResString(errExecuteBranchFailed) Exit Do Set cExecStep89 = New cRunStep Else ' On Error GoTo 0 Set InitExecStep = cExecStep89 ' Execute the first branch ' Err.Raise vbObjectError + Case 90 WriteToWspLog (mintRunStart) errExecuteBranchFailed, mstrSource, _ Set cExecStep90 = New cRunStep RaiseEvent ' LoadResString(errExecuteBranchFailed) Set InitExecStep = cExecStep90 RunStart(Determine64BitTime(), Else Case 91 mcWspLog.FileName) Set cNextStep = Set cExecStep91 = New cRunStep mcNavSteps.NextStep(StepKey:=mstrCurBranchRo Set InitExecStep = cExecStep91 If ot) Case 92 mcNavSteps.HasChild(StepKey:=mstrRootKe If cNextStep Is Nothing Then Set cExecStep92 = New cRunStep y) Then mstrCurBranchRoot = gstrEmptyString Set InitExecStep = cExecStep92 Set cTempStep = bRunComplete = True Case 93 mcNavSteps.ChildStep(StepKey:=mstrRootKe Exit Do Set cExecStep93 = New cRunStep y) Else Set InitExecStep = cExecStep93 mstrCurBranchRoot = ' Starting execution of a new branch - Case 94 MakeKeyValid(cTempStep.StepId, initialize the Set cExecStep94 = New cRunStep cTempStep.StepType) ' module-level variable Set InitExecStep = cExecStep94 mstrCurBranchRoot = Case 95 Call MakeKeyValid(cNextStep.StepId, Set cExecStep95 = New cRunStep CreateDummyInstance(mstrCurBranchRoot) cNextStep.StepType) Set InitExecStep = cExecStep95 Call Case 96 ' Run all pending steps in the branch CreateDummyInstance(mstrCurBranchRoot) Set cExecStep96 = New cRunStep If Not RunBranch(mstrCurBranchRoot) End If Set InitExecStep = cExecStep96 Then End If Case 97 ' Execute a new branch if there aren't Debug.Print "Running new branch: " & Set cExecStep97 = New cRunStep any mstrCurBranchRoot Set InitExecStep = cExecStep97 ' steps to run Case 98 Call RunNewBranch ' Loop until we find a branch that has steps to Set cExecStep98 = New cRunStep End If execute Set InitExecStep = cExecStep98 Else Loop While Not Case 99 WriteToWspLog (mintRunComplete) RunBranch(mstrCurBranchRoot) Set cExecStep99 = New cRunStep ' No children to execute - the run is Set InitExecStep = cExecStep99 complete If bRunComplete Then Case Else RaiseEvent WriteToWspLog (mintRunComplete) Set InitExecStep = Nothing RunComplete(Determine64BitTime()) ' Run is complete End Select End If RaiseEvent End If RunComplete(Determine64BitTime()) BugMessage "Sending cExecStep" & End If (lngIndex + 1) & "!" Exit Sub Exit Sub If Not InitExecStep Is Nothing Then RunErr: InitExecStep.Index = lngIndex ' Log the error code raised by Visual Basic RunNewBranchErr: Call LogErrors(Errors) ' Log the error code raised by Visual Basic ' Remove this element from the Call ShowError(errExecuteBranchFailed, Call LogErrors(Errors) collection of free objects OptArgs:=mstrCurBranchRoot) Call ShowError(errExecuteBranchFailed, Call RemoveFreeProcess(lngIndex) Call ResetForm OptArgs:=mstrCurBranchRoot) End If On Error GoTo 0 End Sub mstrSource = mstrModuleName & Exit Function Private Sub RunNewBranch() "RunNewBranch" ' We will build a tree of all instances that Err.Raise vbObjectError + InitExecStepErr: occur and errExecuteBranchFailed, mstrSource, _ ' Log the error code raised by Visual ' the count of the sub-steps that are running LoadResString(errExecuteBranchFailed) Basic will be Call LogErrors(Errors) ' stored at each node in the tree (maintained End Sub Set InitExecStep = Nothing internally HP TPC-H FULL DISCLOSURE REPORT 216 © 2005 Hewlett-Packard Company. All rights reserved. Private Function RunBranch(strRootNode Dim cInstanceRec As cInstance As String) As Boolean Dim sItVal As String For iItIndex = cStartInst.Iterators.Count - 1 To 0 ' This procedure is called to run all the Step -1 necessary steps On Error GoTo TimeUpdateForProcessErr If Not StringEmpty(sIt) Then ' in a branch. It can also be called when a sIt = sIt & gstrFileSeparator step terminates, Set cInstanceRec = End If ' in which case the terminated step is mcInstances.QueryInstance(InstanceId) sIt = sIt & gstrSQ & passed in as the cStartInst.Iterators(iItIndex).Value & gstrSQ ' optional parameter. When a step If StartTime = 0 Then Next iItIndex terminates, we need to RaiseEvent ProcessComplete(StepRecord, ' either wait for some other steps to EndTime, InstanceId, ElapsedTime) sItVal = GetInstanceItValue(cStartInst) terminate before Else RaiseEvent StepStart(StepRecord, StartTime, ' we execute more steps or run as many sItVal = InstanceId, cStartInst.ParentInstanceId, _ steps as necessary GetInstanceItValue(cInstanceRec) sPath, sIt, sItVal) ' Returns True if there are steps currently RaiseEvent ProcessStart(StepRecord, executing Command, StartTime, InstanceId, _ iItIndex = 0 ' in the branch, else returns False cInstanceRec.ParentInstanceId, Set cInstanceRec = cStartInst Dim cRunning As cInstance sItVal) ' Raise a StepStart event for the manager step, if End If this is it's first sub-step being executed On Error GoTo RunBranchErr Do While cInstanceRec.Key <> Call mstrDummyRootKey If Not StringEmpty(strRootNode) Then cInstanceRec.UpdateStartTime(StepRecord.Ste ' Call a procedure to execute all the pId, StartTime, EndTime, ElapsedTime) sLogLabel = gstrSQ & enabled steps cInstanceRec.Step.StepLabel & gstrSQ ' in the branch - will return the step Exit Sub If iItIndex < cStartInst.Iterators.Count Then node that is If cStartInst.Iterators(iItIndex).StepId = ' being executed - nothing means 'No TimeUpdateForProcessErr: cInstanceRec.Step.StepId Then more steps to ' Log the error code raised by Visual Basic sLogLabel = sLogLabel & msIt & gstrSQ ' execute in the branch'. Call LogErrors(Errors) & cStartInst.Iterators(iItIndex).IteratorName & Do WriteError errUpdateDisplayFailed, gstrSQ & _ Set cRunning = mstrModuleName & "TimeUpdateForProcess" msItValue & gstrSQ & RunPendingStepInBranch(strRootNode, cStartInst.Iterators(iItIndex).Value & gstrSQ cRunning) End Sub iItIndex = iItIndex + 1 Private Sub End If Loop While Not cRunning Is Nothing TimeStartUpdateForStep(StepRecord As End If cStep, _ LogLabels.Add sLogLabel RunBranch = ByVal InstanceId As Long, _ mcDummyRootInstance.IsRunning ByVal StartTime As Currency) If cInstanceRec.Key <> cStartInst.Key And End If cInstanceRec.StartTime = 0 Then ' Called when a step starts execution. Checks cInstanceRec.StartTime = StartTime Exit Function if this is the cInstanceRec.Status = gintRunning ' first enabled child of the manager step. If sItVal = GetInstanceItValue(cInstanceRec) RunBranchErr: so, updates ' The step path and iterator values are not ' Log the error code raised by Visual ' the start time and status on the manager. needed for manager steps, since Basic ' Also raises the Step Start event for the ' they are primarily used by the run status Call LogErrors(Errors) completed step. form On Error GoTo 0 RaiseEvent StepStart(cInstanceRec.Step, mstrSource = mstrModuleName & Dim cStartInst As cInstance StartTime, cInstanceRec.InstanceId, _ "RunBranch" Dim cInstanceRec As cInstance cInstanceRec.ParentInstanceId, Err.Raise vbObjectError + Dim LogLabels As New cVectorStr gstrEmptyString, gstrEmptyString, _ errExecuteBranchFailed, _ Dim iItIndex As Long sItVal) mstrSource, Dim sLogLabel As String End If LoadResString(errExecuteBranchFailed) Dim sPath As String Dim sIt As String Set cInstanceRec = End Function Dim sItVal As String mcInstances.QueryInstance(cInstanceRec.ParentIns Private Sub tanceId) TimeUpdateForProcess(StepRecord As On Error GoTo TimeStartUpdateForStepErr Loop cStep, _ ByVal InstanceId As Long, _ Set cStartInst = Call WriteToWspLog(mintStepStart, LogLabels, Optional ByVal StartTime As Currency mcInstances.QueryInstance(InstanceId) StartTime) = 0, _ Set LogLabels = Nothing Optional ByVal EndTime As Currency ' Determine the step path and iterator values = 0, _ for the step and raise a step start event Exit Sub Optional ByVal ElapsedTime As Long Set cInstanceRec = cStartInst = 0, _ Do While cInstanceRec.Key <> TimeStartUpdateForStepErr: Optional Command As String) mstrDummyRootKey ' Log the error code raised by Visual Basic ' We do not maintain start and end If Not StringEmpty(sPath) Then Call LogErrors(Errors) timestamps for the constraint sPath = sPath & gstrFileSeparator WriteError errUpdateDisplayFailed, ' of a step. Hence we check if the process End If mstrModuleName & "TimeStartUpdateForStep" that just started/ sPath = sPath & gstrSQ & ' terminated is the worker step that is cInstanceRec.Step.StepLabel & gstrSQ End Sub being executed. If so, Set cInstanceRec = Private Sub WriteToWspLog(iLogEvent As ' we update the start/end time and status mcInstances.QueryInstance(cInstanceRec.Pare WspLogEvents, Optional StepDtls As cVectorStr, _ on the instance record. ntInstanceId) Optional dtStamp As Currency = gdtmEmpty) Loop HP TPC-H FULL DISCLOSURE REPORT 217 © 2005 Hewlett-Packard Company. All rights reserved. ' Writes to the workspace log that is vbTab & "No Count: " & End If generated for the run. The last three gstrSQ & cTempConn.NoCountDisplay & ' parameters are valid only for Step Start gstrSQ & gstrBlank & _ End Sub and Step Complete events. "No Execute: " & gstrSQ & 'Private Sub WriteToWspLog(iLogEvent As Static bError As Boolean cTempConn.NoExecute & gstrSQ & gstrBlank WspLogEvents, Optional StepDtls As cVectorStr, _ Dim sLabel As String & _ ' Optional dtStamp As Date = gdtmEmpty) Dim lIndex As Long "P arse Query Only: " & gstrSQ ' Dim bHdr As Boolean & cTempConn.ParseQueryOnly & gstrSQ & ' This function uses the LogWriter dll - memory Dim cTempConn As cConnection gstrBlank & _ corruption problems since the vb exe "Quoted Identifiers: " & gstrSQ ' and the vc Execute Dll both use the same dll to On Error GoTo WriteToWspLogErr & cTempConn.QuotedIdentifiers & gstrSQ & write. gstrBlank & _ ' ' Writes to the workspace log that is generated Select Case iLogEvent "ANSI Nulls: " & gstrSQ & for the run. The last three Case mintRunStart cTempConn.AnsiNulls & gstrSQ & gstrBlank ' ' parameters are valid only for StepStart and Set mcWspLog = New cFileSM & _ StepComplete events. mcWspLog.FileName = "Show Query Plan: " & gstrSQ ' Static bError As Boolean GetDefaultDir(WspId, mcParameters) & & cTempConn.ShowQueryPlan & gstrSQ & ' Static sFile As String gstrFileSeparator & _ gstrBlank & _ ' Dim sLabel As String Trim(Str(RunId)) & "Show Stats Time: " & gstrSQ ' Dim lIndex As Long gstrFileSeparator & "SMLog-" & & cTempConn.ShowStatsTime & gstrSQ & ' Dim bHdr As Boolean Format(Now, FMT_WSP_LOG_FILE) & gstrBlank & _ ' gstrLogFileSuffix "Show Stats IO: " & gstrSQ & ' On Error GoTo WriteToWspLogErr mcWspLog.WriteLine cTempConn.ShowStatsIO & gstrSQ & ' (JulianDateToString(Determine64BitTime() gstrBlank & _ ' Select Case iLogEvent ) & " Start Run: " & vbTab & gstrSQ & "Row Count" & gstrSQ & ' Case mintRunStart GetWorkspaceDetails(WorkspaceId:=WspId cTempConn.RowCount & gstrSQ & gstrBlank ' Set mcWspLog = New )) & gstrSQ & _ LOGWRITERLib.SMLog "Query Timeout" & gstrSQ & ' sFile = App.Path & "\" & "SMLog-"& ' Write all current parameter values cTempConn.QueryTimeOut & gstrSQ Format(Now, FMT_WSP_LOG_FILE) & to the log Next lIndex gstrLogFileSuffix bHdr = False ' mcWspLog.FileName = sFile For lIndex = 0 To Case mintRunComplete ' mcWspLog.Init mcParameters.ParameterCount - 1 BugAssert Not mcWspLog Is Nothing ' mcWspLog.WriteLine (Format(Now, If mcWspLog.WriteLine FMT_WSP_LOG_DATE) & " Start Run: " & mcParameters(lIndex).ParameterType <> (JulianDateToString(Determine64BitTime()) vbTab & gstrSQ & gintParameterApplication Then & " Comp. Run: " & vbTab & gstrSQ & GetWorkspaceDetails(WorkspaceId:=WspId)) & If Not bHdr Then GetWorkspaceDetails(WorkspaceId:=WspId)) gstrSQ mcWspLog.WriteField & gstrSQ ' JulianDateToString(Determine64BitTime()) Set mcWspLog = Nothing ' ' Write all current parameter values to the & " Parameters: " log bHdr = True Case mintStepStart ' bHdr = False Else For lIndex = StepDtls.Count - 1 To 0 ' For lIndex = 0 To mcWspLog.WriteField Step -1 mcParameters.ParameterCount - 1 vbTab & vbTab & vbTab sLabel = StepDtls(lIndex) ' If mcParameters(lIndex).ParameterType End If If lIndex = StepDtls.Count - 1 Then <> gintParameterApplication Then mcWspLog.WriteLine vbTab & mcWspLog.WriteLine ' If Not bHdr Then gstrSQ & JulianDateToString(dtStamp) & " Start Step: " ' 'mcWspLog.WriteLine mcParameters(lIndex).ParameterName & & vbTab & sLabel Format(Now, FMT_WSP_LOG_DATE) & " gstrSQ & vbTab & vbTab & gstrSQ & Else Parameters: " & vbTab & gstrSQ & mcParameters(lIndex).ParameterValue & mcWspLog.WriteLine vbTab & mcParameters(lIndex).ParameterName & gstrSQ & gstrSQ vbTab & vbTab & vbTab & sLabel vbTab & vbTab & gstrSQ & End If End If mcParameters(lIndex).ParameterValue & gstrSQ Next lIndex Next lIndex ' bHdr = True ' Else ' Write all connection properties to Case mintStepComplete ' 'mcWspLog.WriteLine vbTab & the log For lIndex = StepDtls.Count - 1 To 0 vbTab & vbTab & vbTab & gstrSQ & For lIndex = 0 To Step -1 mcParameters(lIndex).ParameterName & gstrSQ & RunConnections.Count - 1 sLabel = StepDtls(lIndex) vbTab & vbTab & gstrSQ & Set cTempConn = If lIndex = StepDtls.Count - 1 Then mcParameters(lIndex).ParameterValue & gstrSQ RunConnections(lIndex) mcWspLog.WriteLine ' End If If lIndex = 0 Then JulianDateToString(dtStamp) & " Comp. Step: ' End If mcWspLog.WriteField " & vbTab & sLabel ' Next lIndex JulianDateToString(Determine64BitTime()) Else ' & " Connections: " mcWspLog.WriteLine vbTab & ' Case mintRunComplete Else vbTab & vbTab & vbTab & sLabel ' BugAssert Not mcWspLog Is Nothing mcWspLog.WriteField vbTab End If ' mcWspLog.WriteLine (Format(Now, & vbTab & vbTab Next lIndex FMT_WSP_LOG_DATE) & " Comp. Run: " & End If vbTab & gstrSQ & mcWspLog.WriteLine vbTab & End Select GetWorkspaceDetails(WorkspaceId:=WspId)) & gstrSQ & cTempConn.ConnectionName & gstrSQ gstrSQ & _ Exit Sub ' Set mcWspLog = Nothing vbTab & vbTab & gstrSQ & ' cTempConn.ConnectionValue & gstrSQ & WriteToWspLogErr: ' Case mintStepStart _ If Not bError Then ' For lIndex = StepDtls.Count - 1 To 0 Step - bError = True 1 HP TPC-H FULL DISCLOSURE REPORT 218 © 2005 Hewlett-Packard Company. All rights reserved. ' sLabel = StepDtls(lIndex) Err.Raise vbObjectError + Public Property Set Parameters(cParameters As ' If lIndex = StepDtls.Count - 1 errExecInstanceFailed, mstrSource, _ cArrParameters) Then ' A reference to the parameter array - we use it to ' mcWspLog.WriteLine LoadResString(errExecInstanceFailed) ' substitute parameter values in the step text Format(dtStamp, FMT_WSP_LOG_DATE) End If & " Start Step: " & vbTab & sLabel Set mcParameters = cParameters ' Else Set cExecStep = InitExecStep() ' mcWspLog.WriteLine vbTab ' Exceeded the number of processes that we End Property & vbTab & vbTab & vbTab & sLabel can run simultaneously Public Property Get Steps() As cArrSteps ' End If If cExecStep Is Nothing Then ' Next lIndex ' Raise an error Set Steps = mcRunSteps ' On Error GoTo 0 ' Case mintStepComplete Err.Raise vbObjectError + End Property ' For lIndex = StepDtls.Count - 1 To errProgramError, mstrSource, _ Public Property Get Constraints() As 0 Step -1 LoadResString(errProgramError) cArrConstraints ' sLabel = StepDtls(lIndex) End If ' If lIndex = StepDtls.Count - 1 ' Initialize the instance id - not needed for Set Constraints = mcRunConstraints Then step execution ' mcWspLog.WriteLine ' but necessary to identify later which End Property Format(dtStamp, FMT_WSP_LOG_DATE) instance completed Public Property Set Constraints(vdata As & " Comp. Step: " & vbTab & sLabel cExecStep.InstanceId = cCurStep.InstanceId cArrConstraints) ' Else ' mcWspLog.WriteLine vbTab Set cExecStep.ExecuteStep = cCurStep.Step Set mcRunConstraints = vdata & vbTab & vbTab & vbTab & sLabel Set cExecStep.Iterators = cCurStep.Iterators ' End If Set cExecStep.Globals = mcRunSteps End Property ' Next lIndex Set cExecStep.WspParameters = ' mcParameters ' End Select Set cExecStep.WspConnections = Private Sub ' RunConnections cExecStep1_ProcessComplete(cStepRecord As ' Exit Sub Set cExecStep.WspConnDtls = cStep, _ ' RunConnDtls dtmEndTime As Currency, lngInstanceId As 'WriteToWspLogErr: Long, lElapsed As Long) ' If Not bError Then ' Initialize all the pre and post-execution ' bError = True constraints that Call TimeUpdateForProcess(cStepRecord, ' End If ' have been defined globally for the lngInstanceId, EndTime:=dtmEndTime, ' workspace ElapsedTime:=lElapsed) 'End Sub cExecStep.WspPreCons = ' mcvntWspPreCons End Sub Public Property Get WspPreExecution() As cExecStep.WspPostCons = Variant mcvntWspPostCons WspPreExecution = mcvntWspPreCons Private Sub cExecStep1_ProcessStart(cStepRecord End Property ' Initialize all the pre and post-execution As cStep, _ Public Property Let constraints for strCommand As String, dtmStartTime As WspPreExecution(ByVal vdata As Variant) ' the step being executed Currency, lngInstanceId As Long) mcvntWspPreCons = vdata cExecStep.PreCons = End Property DetermineConstraints(cCurStep, gintPreStep) Call TimeUpdateForProcess(cStepRecord, cExecStep.PostCons = lngInstanceId, StartTime:=dtmStartTime, Public Property Get WspPostExecution() As DetermineConstraints(cCurStep, gintPostStep) Command:=strCommand) Variant WspPostExecution = mcvntWspPostCons cExecStep.RunId = RunId End Sub End Property cExecStep.CreateInputFiles = Public Property Let CreateInputFiles WspPostExecution(ByVal vdata As Variant) Private Sub mcvntWspPostCons = vdata ' Call the execute method to execute the step cExecStep1_StepComplete(cStepRecord As cStep, End Property cExecStep.Execute _ dtmEndTime As Currency, InstanceId As Private Sub ExecuteStep(cCurStep As Set cExecStep = Nothing Long, Status As InstanceStatus) cInstance) ' Initializes a cRunStep object with all the Exit Sub Call StepTerminated(cStepRecord, dtmEndTime, properties cExecStep1.Index, InstanceId, Status) ' corresponding to the step to be executed ExecuteStepErr: and calls it's ' Log the error code raised by Visual Basic End Sub ' execute method to execute the step Call LogErrors(Errors) On Error GoTo 0 Private Sub cExecStep1_StepStart(cStepRecord As Dim cExecStep As cRunStep Call ExecutionFailed(cExecStep) cStep, _ dtmStartTime As Currency, InstanceId As On Error GoTo ExecuteStepErr End Sub Long) mstrSource = mstrModuleName & "ExecuteStep" Public Property Set Steps(cRunSteps As Call TimeStartUpdateForStep(cStepRecord, cArrSteps) InstanceId, dtmStartTime) ' Confirm that the step is a worker If cCurStep.Step.StepType <> Set mcRunSteps = cRunSteps End Sub gintWorkerStep Then Set mcNavSteps.StepRecords = cRunSteps On Error GoTo 0 End Property HP TPC-H FULL DISCLOSURE REPORT 219 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep9_ProcessComplete(cStepRecord Command:=strCommand) End Sub As cStep, _ Private Sub dtmEndTime As Currency, End Sub cExecStep12_ProcessComplete(cStepRecord As lngInstanceId As Long, lElapsed As Long) cStep, _ dtmEndTime As Currency, lngInstanceId As Call Private Sub Long, lElapsed As Long) TimeUpdateForProcess(cStepRecord, cExecStep10_StepComplete(cStepRecord As lngInstanceId, EndTime:=dtmEndTime, cStep, _ Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, Long, Status As InstanceStatus) ElapsedTime:=lElapsed) End Sub Call StepTerminated(cStepRecord, End Sub dtmEndTime, cExecStep10.Index, InstanceId, Private Sub Status) cExecStep9_ProcessStart(cStepRecord As Private Sub cStep, _ End Sub cExecStep12_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime strCommand As String, dtmStartTime As As Currency, lngInstanceId As Long) Private Sub Currency, lngInstanceId As Long) cExecStep10_StepStart(cStepRecord As cStep, Call _ Call TimeUpdateForProcess(cStepRecord, TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As lngInstanceId, StartTime:=dtmStartTime, lngInstanceId, StartTime:=dtmStartTime, Long) Command:=strCommand) Command:=strCommand) Call TimeStartUpdateForStep(cStepRecord, End Sub End Sub InstanceId, dtmStartTime)

End Sub Private Sub Private Sub cExecStep12_StepComplete(cStepRecord As cStep, cExecStep9_StepComplete(cStepRecord As Private Sub _ cStep, _ cExecStep11_ProcessComplete(cStepRecord dtmEndTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId As cStep, _ Long, Status As InstanceStatus) As Long, Status As InstanceStatus) dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, dtmEndTime, Call StepTerminated(cStepRecord, cExecStep12.Index, InstanceId, Status) dtmEndTime, cExecStep9.Index, InstanceId, Call TimeUpdateForProcess(cStepRecord, Status) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) End Sub Private Sub cExecStep12_StepStart(cStepRecord End Sub As cStep, _ Private Sub dtmStartTime As Currency, InstanceId As cExecStep9_StepStart(cStepRecord As Long) cStep, _ Private Sub dtmStartTime As Currency, InstanceId cExecStep11_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, As Long) cStep, _ InstanceId, dtmStartTime) strCommand As String, dtmStartTime As Call Currency, lngInstanceId As Long) End Sub TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, cExecStep13_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ End Sub Command:=strCommand) dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub End Sub cExecStep10_ProcessComplete(cStepRecor Call TimeUpdateForProcess(cStepRecord, d As cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, Private Sub ElapsedTime:=lElapsed) lngInstanceId As Long, lElapsed As Long) cExecStep11_StepComplete(cStepRecord As cStep, _ End Sub Call dtmEndTime As Currency, InstanceId As TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, cExecStep13_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep11.Index, InstanceId, strCommand As String, dtmStartTime As End Sub Status) Currency, lngInstanceId As Long)

End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep10_ProcessStart(cStepRecord As Private Sub Command:=strCommand) cStep, _ cExecStep11_StepStart(cStepRecord As cStep, strCommand As String, dtmStartTime _ End Sub As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Long) Call Private Sub TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, cExecStep13_StepComplete(cStepRecord As cStep, InstanceId, dtmStartTime) _ HP TPC-H FULL DISCLOSURE REPORT 220 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId dtmEndTime As Currency, InstanceId As As Long, Status As InstanceStatus) As Long, lElapsed As Long) Long, Status As InstanceStatus)

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, dtmEndTime, cExecStep13.Index, lngInstanceId, EndTime:=dtmEndTime, cExecStep16.Index, InstanceId, Status) InstanceId, Status) ElapsedTime:=lElapsed) End Sub End Sub End Sub Private Sub cExecStep16_StepStart(cStepRecord Private Sub As cStep, _ cExecStep13_StepStart(cStepRecord As Private Sub dtmStartTime As Currency, InstanceId As cStep, _ cExecStep15_ProcessStart(cStepRecord As Long) dtmStartTime As Currency, InstanceId cStep, _ As Long) strCommand As String, dtmStartTime As Call TimeStartUpdateForStep(cStepRecord, Currency, lngInstanceId As Long) InstanceId, dtmStartTime) Call TimeStartUpdateForStep(cStepRecord, Call TimeUpdateForProcess(cStepRecord, End Sub InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) cExecStep17_ProcessComplete(cStepRecord As End Sub cStep, _ Private Sub End Sub dtmEndTime As Currency, lngInstanceId As cExecStep14_ProcessComplete(cStepRecor Long, lElapsed As Long) d As cStep, _ dtmEndTime As Currency, Private Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId As Long, lElapsed As Long) cExecStep15_StepComplete(cStepRecord As lngInstanceId, EndTime:=dtmEndTime, cStep, _ ElapsedTime:=lElapsed) Call dtmEndTime As Currency, InstanceId As TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) End Sub lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep15.Index, InstanceId, Private Sub End Sub Status) cExecStep17_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub cExecStep14_ProcessStart(cStepRecord As Private Sub Call TimeUpdateForProcess(cStepRecord, cStep, _ cExecStep15_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime _ Command:=strCommand) As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Long) End Sub Call TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Private Sub Command:=strCommand) cExecStep17_StepComplete(cStepRecord As cStep, End Sub _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep16_ProcessComplete(cStepRecord Long, Status As InstanceStatus) As cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, cExecStep14_StepComplete(cStepRecord As Long, lElapsed As Long) cExecStep17.Index, InstanceId, Status) As cStep, _ dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, End Sub As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) Private Sub cExecStep17_StepStart(cStepRecord Call StepTerminated(cStepRecord, As cStep, _ dtmEndTime, cExecStep14.Index, End Sub dtmStartTime As Currency, InstanceId As InstanceId, Status) Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep16_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep14_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep18_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub Private Sub ElapsedTime:=lElapsed) cExecStep15_ProcessComplete(cStepRecor cExecStep16_StepComplete(cStepRecord As d As cStep, _ cStep, _ End Sub

HP TPC-H FULL DISCLOSURE REPORT 221 © 2005 Hewlett-Packard Company. All rights reserved. Call StepTerminated(cStepRecord, Private Sub dtmEndTime, cExecStep19.Index, InstanceId, Private Sub cExecStep18_ProcessStart(cStepRecord As Status) cExecStep21_ProcessStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As strCommand As String, dtmStartTime End Sub Currency, lngInstanceId As Long) As Currency, lngInstanceId As Long) Private Sub Call TimeUpdateForProcess(cStepRecord, Call cExecStep19_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, TimeUpdateForProcess(cStepRecord, _ Command:=strCommand) lngInstanceId, StartTime:=dtmStartTime, dtmStartTime As Currency, InstanceId As Command:=strCommand) Long) End Sub

End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) cExecStep21_StepComplete(cStepRecord As cStep, _ Private Sub End Sub dtmEndTime As Currency, InstanceId As cExecStep18_StepComplete(cStepRecord Long, Status As InstanceStatus) As cStep, _ Private Sub dtmEndTime As Currency, InstanceId cExecStep20_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As Long, Status As InstanceStatus) As cStep, _ cExecStep21.Index, InstanceId, Status) dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, As Long, lElapsed As Long) End Sub dtmEndTime, cExecStep18.Index, InstanceId, Status) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep21_StepStart(cStepRecord lngInstanceId, EndTime:=dtmEndTime, As cStep, _ End Sub ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Long) Private Sub End Sub cExecStep18_StepStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, cStep, _ Private Sub InstanceId, dtmStartTime) dtmStartTime As Currency, InstanceId cExecStep20_ProcessStart(cStepRecord As As Long) cStep, _ End Sub strCommand As String, dtmStartTime As Call Currency, lngInstanceId As Long) Private Sub TimeStartUpdateForStep(cStepRecord, cExecStep22_ProcessComplete(cStepRecord As InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As End Sub Command:=strCommand) Long, lElapsed As Long)

Private Sub End Sub Call TimeUpdateForProcess(cStepRecord, cExecStep19_ProcessComplete(cStepRecor lngInstanceId, EndTime:=dtmEndTime, d As cStep, _ Private Sub ElapsedTime:=lElapsed) dtmEndTime As Currency, cExecStep20_StepComplete(cStepRecord As lngInstanceId As Long, lElapsed As Long) cStep, _ End Sub dtmEndTime As Currency, InstanceId As Call Long, Status As InstanceStatus) Private Sub TimeUpdateForProcess(cStepRecord, cExecStep22_ProcessStart(cStepRecord As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As ElapsedTime:=lElapsed) dtmEndTime, cExecStep20.Index, InstanceId, Currency, lngInstanceId As Long) Status) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) Private Sub Private Sub cExecStep19_ProcessStart(cStepRecord As cExecStep20_StepStart(cStepRecord As cStep, End Sub cStep, _ _ strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Private Sub As Currency, lngInstanceId As Long) Long) cExecStep22_StepComplete(cStepRecord As cStep, _ Call Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Long, Status As InstanceStatus) lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) End Sub Call StepTerminated(cStepRecord, dtmEndTime, cExecStep22.Index, InstanceId, Status) End Sub Private Sub cExecStep21_ProcessComplete(cStepRecord End Sub As cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId Private Sub cExecStep22_StepStart(cStepRecord cExecStep19_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ As cStep, _ dtmStartTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, Long) As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) End Sub HP TPC-H FULL DISCLOSURE REPORT 222 © 2005 Hewlett-Packard Company. All rights reserved. End Sub Private Sub End Sub cExecStep26_ProcessComplete(cStepRecord As Private Sub cStep, _ cExecStep23_ProcessComplete(cStepRecor Private Sub dtmEndTime As Currency, lngInstanceId As d As cStep, _ cExecStep24_StepComplete(cStepRecord As Long, lElapsed As Long) dtmEndTime As Currency, cStep, _ lngInstanceId As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId As Call TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Call ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep24.Index, InstanceId, End Sub ElapsedTime:=lElapsed) Status) Private Sub End Sub End Sub cExecStep26_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As Private Sub Private Sub Currency, lngInstanceId As Long) cExecStep23_ProcessStart(cStepRecord As cExecStep24_StepStart(cStepRecord As cStep, cStep, _ _ Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) Long) Command:=strCommand)

Call Call TimeStartUpdateForStep(cStepRecord, End Sub TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep26_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep25_ProcessComplete(cStepRecord Long, Status As InstanceStatus) Private Sub As cStep, _ cExecStep23_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ As Long, lElapsed As Long) cExecStep26.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) Private Sub cExecStep26_StepStart(cStepRecord dtmEndTime, cExecStep23.Index, As cStep, _ InstanceId, Status) End Sub dtmStartTime As Currency, InstanceId As Long) End Sub Private Sub cExecStep25_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, Private Sub cStep, _ InstanceId, dtmStartTime) cExecStep23_StepStart(cStepRecord As strCommand As String, dtmStartTime As cStep, _ Currency, lngInstanceId As Long) End Sub dtmStartTime As Currency, InstanceId As Long) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep27_ProcessComplete(cStepRecord As Call Command:=strCommand) cStep, _ TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) End Sub Long, lElapsed As Long)

End Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep25_StepComplete(cStepRecord As lngInstanceId, EndTime:=dtmEndTime, Private Sub cStep, _ ElapsedTime:=lElapsed) cExecStep24_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As d As cStep, _ Long, Status As InstanceStatus) End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, Private Sub dtmEndTime, cExecStep25.Index, InstanceId, cExecStep27_ProcessStart(cStepRecord As cStep, _ Call Status) strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, End Sub cExecStep25_StepStart(cStepRecord As cStep, Command:=strCommand) _ Private Sub dtmStartTime As Currency, InstanceId As End Sub cExecStep24_ProcessStart(cStepRecord As Long) cStep, _ Private Sub strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, cExecStep27_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) _ dtmEndTime As Currency, InstanceId As Call End Sub Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) cExecStep27.Index, InstanceId, Status) HP TPC-H FULL DISCLOSURE REPORT 223 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cExecStep30_StepStart(cStepRecord End Sub End Sub As cStep, _ dtmStartTime As Currency, InstanceId As Private Sub Private Sub Long) cExecStep27_StepStart(cStepRecord As cExecStep29_ProcessStart(cStepRecord As cStep, _ cStep, _ Call TimeStartUpdateForStep(cStepRecord, dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As InstanceId, dtmStartTime) As Long) Currency, lngInstanceId As Long) End Sub Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Private Sub InstanceId, dtmStartTime) Command:=strCommand) cExecStep31_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub Private Sub cExecStep28_ProcessComplete(cStepRecor cExecStep29_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, d As cStep, _ cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub Call Call StepTerminated(cStepRecord, TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep29.Index, InstanceId, Private Sub lngInstanceId, EndTime:=dtmEndTime, Status) cExecStep31_ProcessStart(cStepRecord As cStep, _ ElapsedTime:=lElapsed) strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) End Sub Private Sub Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep29_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cExecStep28_ProcessStart(cStepRecord As _ Command:=strCommand) cStep, _ dtmStartTime As Currency, InstanceId As strCommand As String, dtmStartTime Long) End Sub As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Private Sub Call InstanceId, dtmStartTime) cExecStep31_StepComplete(cStepRecord As cStep, TimeUpdateForProcess(cStepRecord, _ lngInstanceId, StartTime:=dtmStartTime, End Sub dtmEndTime As Currency, InstanceId As Command:=strCommand) Long, Status As InstanceStatus) Private Sub End Sub cExecStep30_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ cExecStep31.Index, InstanceId, Status) Private Sub dtmEndTime As Currency, lngInstanceId cExecStep28_StepComplete(cStepRecord As Long, lElapsed As Long) End Sub As cStep, _ dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep31_StepStart(cStepRecord As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, As cStep, _ ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Call StepTerminated(cStepRecord, Long) dtmEndTime, cExecStep28.Index, End Sub InstanceId, Status) Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) End Sub cExecStep30_ProcessStart(cStepRecord As cStep, _ End Sub Private Sub strCommand As String, dtmStartTime As cExecStep28_StepStart(cStepRecord As Currency, lngInstanceId As Long) Private Sub cStep, _ cExecStep32_ProcessComplete(cStepRecord As dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cStep, _ As Long) lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Command:=strCommand) Long, lElapsed As Long) Call TimeStartUpdateForStep(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) End Sub cExecStep30_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep29_ProcessComplete(cStepRecor Long, Status As InstanceStatus) Private Sub d As cStep, _ cExecStep32_ProcessStart(cStepRecord As cStep, _ dtmEndTime As Currency, Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep30.Index, InstanceId, Currency, lngInstanceId As Long) Status) Call Call TimeUpdateForProcess(cStepRecord, TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, lngInstanceId, EndTime:=dtmEndTime, Command:=strCommand) ElapsedTime:=lElapsed) HP TPC-H FULL DISCLOSURE REPORT 224 © 2005 Hewlett-Packard Company. All rights reserved. End Sub dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) Private Sub cExecStep34_ProcessComplete(cStepRecord cExecStep32_StepComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ dtmEndTime As Currency, lngInstanceId cExecStep35.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) As Long, Status As InstanceStatus) End Sub Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep35_StepStart(cStepRecord dtmEndTime, cExecStep32.Index, ElapsedTime:=lElapsed) As cStep, _ InstanceId, Status) dtmStartTime As Currency, InstanceId As End Sub Long) End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub cExecStep34_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cExecStep32_StepStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As End Sub dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) As Long) Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep36_ProcessComplete(cStepRecord As Call lngInstanceId, StartTime:=dtmStartTime, cStep, _ TimeStartUpdateForStep(cStepRecord, Command:=strCommand) dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Long, lElapsed As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep34_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cExecStep33_ProcessComplete(cStepRecor cStep, _ d As cStep, _ dtmEndTime As Currency, InstanceId As End Sub dtmEndTime As Currency, Long, Status As InstanceStatus) lngInstanceId As Long, lElapsed As Long) Private Sub Call StepTerminated(cStepRecord, cExecStep36_ProcessStart(cStepRecord As cStep, _ Call dtmEndTime, cExecStep34.Index, InstanceId, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, Status) Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Private Sub Command:=strCommand) cExecStep34_StepStart(cStepRecord As cStep, Private Sub _ End Sub cExecStep33_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As cStep, _ Long) Private Sub strCommand As String, dtmStartTime cExecStep36_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, _ InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) Private Sub cExecStep36.Index, InstanceId, Status) cExecStep35_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub As Long, lElapsed As Long) Private Sub cExecStep36_StepStart(cStepRecord cExecStep33_StepComplete(cStepRecord As cStep, _ As cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId lngInstanceId, EndTime:=dtmEndTime, Long) As Long, Status As InstanceStatus) ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, Call StepTerminated(cStepRecord, End Sub InstanceId, dtmStartTime) dtmEndTime, cExecStep33.Index, InstanceId, Status) Private Sub End Sub cExecStep35_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As cExecStep37_ProcessComplete(cStepRecord As Private Sub Currency, lngInstanceId As Long) cStep, _ cExecStep33_StepStart(cStepRecord As dtmEndTime As Currency, lngInstanceId As cStep, _ Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) dtmStartTime As Currency, InstanceId lngInstanceId, StartTime:=dtmStartTime, As Long) Command:=strCommand) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Call End Sub ElapsedTime:=lElapsed) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) Private Sub End Sub cExecStep35_StepComplete(cStepRecord As End Sub cStep, _ HP TPC-H FULL DISCLOSURE REPORT 225 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Private Sub cExecStep37_ProcessStart(cStepRecord As cExecStep38_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cStep, _ _ lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Command:=strCommand) As Currency, lngInstanceId As Long) Long) End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep40_StepComplete(cStepRecord As cStep, Command:=strCommand) End Sub _ dtmEndTime As Currency, InstanceId As End Sub Private Sub Long, Status As InstanceStatus) cExecStep39_ProcessComplete(cStepRecord Private Sub As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, cExecStep37_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId cExecStep40.Index, InstanceId, Status) As cStep, _ As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep40_StepStart(cStepRecord Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) As cStep, _ dtmEndTime, cExecStep37.Index, dtmStartTime As Currency, InstanceId As InstanceId, Status) End Sub Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep39_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep37_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep41_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub Private Sub lngInstanceId, EndTime:=dtmEndTime, cExecStep39_StepComplete(cStepRecord As ElapsedTime:=lElapsed) Private Sub cStep, _ cExecStep38_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As End Sub d As cStep, _ Long, Status As InstanceStatus) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, cExecStep41_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep39.Index, InstanceId, strCommand As String, dtmStartTime As Call Status) Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep39_StepStart(cStepRecord As cStep, _ End Sub Private Sub dtmStartTime As Currency, InstanceId As cExecStep38_ProcessStart(cStepRecord As Long) Private Sub cStep, _ cExecStep41_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, _ As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep41.Index, InstanceId, Status) Command:=strCommand) cExecStep40_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub cExecStep41_StepStart(cStepRecord Private Sub As cStep, _ cExecStep38_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Long) dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) As Long, Status As InstanceStatus) Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep38.Index, Private Sub End Sub InstanceId, Status) cExecStep40_ProcessStart(cStepRecord As cStep, _ Private Sub End Sub strCommand As String, dtmStartTime As cExecStep42_ProcessComplete(cStepRecord As Currency, lngInstanceId As Long) cStep, _ HP TPC-H FULL DISCLOSURE REPORT 226 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep43_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, EndTime:=dtmEndTime, Call dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep43.Index, InstanceId, Private Sub End Sub Status) cExecStep45_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As Private Sub End Sub Currency, lngInstanceId As Long) cExecStep42_ProcessStart(cStepRecord As cStep, _ Private Sub Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime cExecStep43_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) _ Command:=strCommand) dtmStartTime As Currency, InstanceId As Call Long) End Sub TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Call TimeStartUpdateForStep(cStepRecord, Private Sub Command:=strCommand) InstanceId, dtmStartTime) cExecStep45_StepComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Private Sub Private Sub cExecStep42_StepComplete(cStepRecord cExecStep44_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ As cStep, _ cExecStep45.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId As Long, Status As InstanceStatus) As Long, lElapsed As Long) End Sub

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep45_StepStart(cStepRecord dtmEndTime, cExecStep42.Index, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ InstanceId, Status) ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub Private Sub InstanceId, dtmStartTime) cExecStep42_StepStart(cStepRecord As cExecStep44_ProcessStart(cStepRecord As cStep, _ cStep, _ End Sub dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) Private Sub cExecStep46_ProcessComplete(cStepRecord As Call Call TimeUpdateForProcess(cStepRecord, cStep, _ TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Command:=strCommand) Long, lElapsed As Long)

End Sub End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub Private Sub ElapsedTime:=lElapsed) cExecStep43_ProcessComplete(cStepRecor cExecStep44_StepComplete(cStepRecord As d As cStep, _ cStep, _ End Sub dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) Private Sub cExecStep46_ProcessStart(cStepRecord As cStep, _ Call Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep44.Index, InstanceId, Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, Status) ElapsedTime:=lElapsed) Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) Private Sub Private Sub cExecStep44_StepStart(cStepRecord As cStep, End Sub cExecStep43_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As Private Sub strCommand As String, dtmStartTime Long) cExecStep46_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) _ Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As Call InstanceId, dtmStartTime) Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) cExecStep46.Index, InstanceId, Status) Private Sub End Sub cExecStep45_ProcessComplete(cStepRecord End Sub As cStep, _ dtmEndTime As Currency, lngInstanceId Private Sub cExecStep46_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ HP TPC-H FULL DISCLOSURE REPORT 227 © 2005 Hewlett-Packard Company. All rights reserved. dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As Call TimeStartUpdateForStep(cStepRecord, As Long) Currency, lngInstanceId As Long) InstanceId, dtmStartTime)

Call Call TimeUpdateForProcess(cStepRecord, End Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) Private Sub cExecStep50_ProcessComplete(cStepRecord As End Sub End Sub cStep, _ dtmEndTime As Currency, lngInstanceId As Private Sub Private Sub Long, lElapsed As Long) cExecStep47_ProcessComplete(cStepRecor cExecStep48_StepComplete(cStepRecord As d As cStep, _ cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) ElapsedTime:=lElapsed)

Call Call StepTerminated(cStepRecord, End Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep48.Index, InstanceId, lngInstanceId, EndTime:=dtmEndTime, Status) Private Sub ElapsedTime:=lElapsed) cExecStep50_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub Private Sub cExecStep48_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cExecStep47_ProcessStart(cStepRecord As _ lngInstanceId, StartTime:=dtmStartTime, cStep, _ dtmStartTime As Currency, InstanceId As Command:=strCommand) strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) End Sub Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) Private Sub TimeUpdateForProcess(cStepRecord, cExecStep50_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, End Sub _ Command:=strCommand) dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) End Sub cExecStep49_ProcessComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, Private Sub dtmEndTime As Currency, lngInstanceId cExecStep50.Index, InstanceId, Status) cExecStep47_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ End Sub dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep50_StepStart(cStepRecord ElapsedTime:=lElapsed) As cStep, _ Call StepTerminated(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep47.Index, End Sub Long) InstanceId, Status) Private Sub Call TimeStartUpdateForStep(cStepRecord, End Sub cExecStep49_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cStep, _ Private Sub strCommand As String, dtmStartTime As End Sub cExecStep47_StepStart(cStepRecord As Currency, lngInstanceId As Long) cStep, _ Private Sub dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cExecStep51_ProcessComplete(cStepRecord As As Long) lngInstanceId, StartTime:=dtmStartTime, cStep, _ Command:=strCommand) dtmEndTime As Currency, lngInstanceId As Call Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, End Sub cExecStep49_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cStep, _ Private Sub dtmEndTime As Currency, InstanceId As End Sub cExecStep48_ProcessComplete(cStepRecor Long, Status As InstanceStatus) d As cStep, _ Private Sub dtmEndTime As Currency, Call StepTerminated(cStepRecord, cExecStep51_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep49.Index, InstanceId, strCommand As String, dtmStartTime As Status) Currency, lngInstanceId As Long) Call TimeUpdateForProcess(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Private Sub Command:=strCommand) cExecStep49_StepStart(cStepRecord As cStep, End Sub _ End Sub dtmStartTime As Currency, InstanceId As Private Sub Long) Private Sub cExecStep48_ProcessStart(cStepRecord As cExecStep51_StepComplete(cStepRecord As cStep, cStep, _ _ HP TPC-H FULL DISCLOSURE REPORT 228 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, As Long, Status As InstanceStatus) As Long, lElapsed As Long) cExecStep54.Index, InstanceId, Status)

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, End Sub dtmEndTime, cExecStep51.Index, lngInstanceId, EndTime:=dtmEndTime, InstanceId, Status) ElapsedTime:=lElapsed) Private Sub cExecStep54_StepStart(cStepRecord As cStep, _ End Sub End Sub dtmStartTime As Currency, InstanceId As Long) Private Sub Private Sub cExecStep51_StepStart(cStepRecord As cExecStep53_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, cStep, _ cStep, _ InstanceId, dtmStartTime) dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) End Sub

Call Call TimeUpdateForProcess(cStepRecord, Private Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, cExecStep55_ProcessComplete(cStepRecord As InstanceId, dtmStartTime) Command:=strCommand) cStep, _ dtmEndTime As Currency, lngInstanceId As End Sub End Sub Long, lElapsed As Long)

Private Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep52_ProcessComplete(cStepRecor cExecStep53_StepComplete(cStepRecord As lngInstanceId, EndTime:=dtmEndTime, d As cStep, _ cStep, _ ElapsedTime:=lElapsed) dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub

Call Call StepTerminated(cStepRecord, Private Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep53.Index, InstanceId, cExecStep55_ProcessStart(cStepRecord As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Status) strCommand As String, dtmStartTime As ElapsedTime:=lElapsed) Currency, lngInstanceId As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep53_StepStart(cStepRecord As cStep, Command:=strCommand) cExecStep52_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As End Sub strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep55_StepComplete(cStepRecord As cStep, Call InstanceId, dtmStartTime) _ TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, InstanceId As lngInstanceId, StartTime:=dtmStartTime, End Sub Long, Status As InstanceStatus) Command:=strCommand) Private Sub Call StepTerminated(cStepRecord, dtmEndTime, End Sub cExecStep54_ProcessComplete(cStepRecord cExecStep55.Index, InstanceId, Status) As cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId End Sub cExecStep52_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ Private Sub cExecStep55_StepStart(cStepRecord dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As cStep, _ As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, dtmStartTime As Currency, InstanceId As ElapsedTime:=lElapsed) Long) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep52.Index, End Sub Call TimeStartUpdateForStep(cStepRecord, InstanceId, Status) InstanceId, dtmStartTime) Private Sub End Sub cExecStep54_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As Private Sub cExecStep52_StepStart(cStepRecord As Currency, lngInstanceId As Long) cExecStep56_ProcessComplete(cStepRecord As cStep, _ cStep, _ dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, lngInstanceId As As Long) lngInstanceId, StartTime:=dtmStartTime, Long, lElapsed As Long) Command:=strCommand) Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, InstanceId, dtmStartTime) ElapsedTime:=lElapsed) Private Sub End Sub cExecStep54_StepComplete(cStepRecord As End Sub cStep, _ Private Sub dtmEndTime As Currency, InstanceId As Private Sub cExecStep53_ProcessComplete(cStepRecor Long, Status As InstanceStatus) cExecStep56_ProcessStart(cStepRecord As cStep, _ d As cStep, _ strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) HP TPC-H FULL DISCLOSURE REPORT 229 © 2005 Hewlett-Packard Company. All rights reserved. End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep59_StepComplete(cStepRecord As cStep, Command:=strCommand) End Sub _ dtmEndTime As Currency, InstanceId As End Sub Private Sub Long, Status As InstanceStatus) cExecStep58_ProcessComplete(cStepRecord Private Sub As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, cExecStep56_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId cExecStep59.Index, InstanceId, Status) As cStep, _ As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep59_StepStart(cStepRecord Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) As cStep, _ dtmEndTime, cExecStep56.Index, dtmStartTime As Currency, InstanceId As InstanceId, Status) End Sub Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep58_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep56_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep60_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub Private Sub lngInstanceId, EndTime:=dtmEndTime, cExecStep58_StepComplete(cStepRecord As ElapsedTime:=lElapsed) Private Sub cStep, _ cExecStep57_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As End Sub d As cStep, _ Long, Status As InstanceStatus) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, cExecStep60_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep58.Index, InstanceId, strCommand As String, dtmStartTime As Call Status) Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep58_StepStart(cStepRecord As cStep, _ End Sub Private Sub dtmStartTime As Currency, InstanceId As cExecStep57_ProcessStart(cStepRecord As Long) Private Sub cStep, _ cExecStep60_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, _ As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep60.Index, InstanceId, Status) Command:=strCommand) cExecStep59_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub cExecStep60_StepStart(cStepRecord Private Sub As cStep, _ cExecStep57_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Long) dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) As Long, Status As InstanceStatus) Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep57.Index, Private Sub End Sub InstanceId, Status) cExecStep59_ProcessStart(cStepRecord As cStep, _ Private Sub End Sub strCommand As String, dtmStartTime As cExecStep61_ProcessComplete(cStepRecord As Currency, lngInstanceId As Long) cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId As cExecStep57_StepStart(cStepRecord As Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) cStep, _ lngInstanceId, StartTime:=dtmStartTime, dtmStartTime As Currency, InstanceId Command:=strCommand) As Long) HP TPC-H FULL DISCLOSURE REPORT 230 © 2005 Hewlett-Packard Company. All rights reserved. Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep62.Index, InstanceId, Private Sub ElapsedTime:=lElapsed) Status) cExecStep64_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As End Sub End Sub Currency, lngInstanceId As Long)

Private Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep61_ProcessStart(cStepRecord As cExecStep62_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cStep, _ _ Command:=strCommand) strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As As Currency, lngInstanceId As Long) Long) End Sub

Call Call TimeStartUpdateForStep(cStepRecord, Private Sub TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) cExecStep64_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, _ Command:=strCommand) End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) End Sub Private Sub cExecStep63_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, Private Sub As cStep, _ cExecStep64.Index, InstanceId, Status) cExecStep61_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId As cStep, _ As Long, lElapsed As Long) End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep64_StepStart(cStepRecord lngInstanceId, EndTime:=dtmEndTime, As cStep, _ Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep61.Index, Long) InstanceId, Status) End Sub Call TimeStartUpdateForStep(cStepRecord, End Sub Private Sub InstanceId, dtmStartTime) cExecStep63_ProcessStart(cStepRecord As Private Sub cStep, _ End Sub cExecStep61_StepStart(cStepRecord As strCommand As String, dtmStartTime As cStep, _ Currency, lngInstanceId As Long) Private Sub dtmStartTime As Currency, InstanceId cExecStep65_ProcessComplete(cStepRecord As As Long) Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Call Command:=strCommand) Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Private Sub ElapsedTime:=lElapsed) cExecStep63_StepComplete(cStepRecord As Private Sub cStep, _ End Sub cExecStep62_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As d As cStep, _ Long, Status As InstanceStatus) Private Sub dtmEndTime As Currency, cExecStep65_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As dtmEndTime, cExecStep63.Index, InstanceId, Currency, lngInstanceId As Long) Call Status) TimeUpdateForProcess(cStepRecord, Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Command:=strCommand) Private Sub End Sub cExecStep63_StepStart(cStepRecord As cStep, End Sub _ Private Sub dtmStartTime As Currency, InstanceId As Private Sub cExecStep62_ProcessStart(cStepRecord As Long) cExecStep65_StepComplete(cStepRecord As cStep, cStep, _ _ strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) Long, Status As InstanceStatus)

Call End Sub Call StepTerminated(cStepRecord, dtmEndTime, TimeUpdateForProcess(cStepRecord, cExecStep65.Index, InstanceId, Status) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) cExecStep64_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub cExecStep65_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ Private Sub dtmStartTime As Currency, InstanceId As cExecStep62_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, Long) As cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, As Long, Status As InstanceStatus) InstanceId, dtmStartTime) HP TPC-H FULL DISCLOSURE REPORT 231 © 2005 Hewlett-Packard Company. All rights reserved. lngInstanceId, StartTime:=dtmStartTime, Private Sub End Sub Command:=strCommand) cExecStep69_ProcessComplete(cStepRecord As cStep, _ Private Sub End Sub dtmEndTime As Currency, lngInstanceId As cExecStep66_ProcessComplete(cStepRecor Long, lElapsed As Long) d As cStep, _ Private Sub dtmEndTime As Currency, cExecStep67_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, lngInstanceId As Long, lElapsed As Long) cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime, cExecStep67.Index, InstanceId, Private Sub Status) cExecStep69_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub cExecStep66_ProcessStart(cStepRecord As Private Sub Call TimeUpdateForProcess(cStepRecord, cStep, _ cExecStep67_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime _ Command:=strCommand) As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Long) End Sub Call TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) cExecStep69_StepComplete(cStepRecord As cStep, Command:=strCommand) _ End Sub dtmEndTime As Currency, InstanceId As End Sub Long, Status As InstanceStatus) Private Sub Private Sub cExecStep68_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, cExecStep66_StepComplete(cStepRecord As cStep, _ cExecStep69.Index, InstanceId, Status) As cStep, _ dtmEndTime As Currency, lngInstanceId dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep69_StepStart(cStepRecord Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ dtmEndTime, cExecStep66.Index, ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As InstanceId, Status) Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) Private Sub cExecStep68_ProcessStart(cStepRecord As cExecStep66_StepStart(cStepRecord As cStep, _ End Sub cStep, _ strCommand As String, dtmStartTime As dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) Private Sub As Long) cExecStep70_ProcessComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ Call lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Command:=strCommand) Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) Private Sub cExecStep68_StepComplete(cStepRecord As cExecStep67_ProcessComplete(cStepRecor cStep, _ End Sub d As cStep, _ dtmEndTime As Currency, InstanceId As dtmEndTime As Currency, Long, Status As InstanceStatus) Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep70_ProcessStart(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As Call dtmEndTime, cExecStep68.Index, InstanceId, Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, Status) lngInstanceId, EndTime:=dtmEndTime, Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) End Sub lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) End Sub Private Sub cExecStep68_StepStart(cStepRecord As cStep, End Sub Private Sub _ cExecStep67_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As Private Sub cStep, _ Long) cExecStep70_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime _ As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As InstanceId, dtmStartTime) Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, End Sub Call StepTerminated(cStepRecord, dtmEndTime, cExecStep70.Index, InstanceId, Status) HP TPC-H FULL DISCLOSURE REPORT 232 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cExecStep73_StepStart(cStepRecord End Sub End Sub As cStep, _ dtmStartTime As Currency, InstanceId As Private Sub Private Sub Long) cExecStep70_StepStart(cStepRecord As cExecStep72_ProcessStart(cStepRecord As cStep, _ cStep, _ Call TimeStartUpdateForStep(cStepRecord, dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As InstanceId, dtmStartTime) As Long) Currency, lngInstanceId As Long) End Sub Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Private Sub InstanceId, dtmStartTime) Command:=strCommand) cExecStep74_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub Private Sub cExecStep71_ProcessComplete(cStepRecor cExecStep72_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, d As cStep, _ cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub Call Call StepTerminated(cStepRecord, TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep72.Index, InstanceId, Private Sub lngInstanceId, EndTime:=dtmEndTime, Status) cExecStep74_ProcessStart(cStepRecord As cStep, _ ElapsedTime:=lElapsed) strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) End Sub Private Sub Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep72_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cExecStep71_ProcessStart(cStepRecord As _ Command:=strCommand) cStep, _ dtmStartTime As Currency, InstanceId As strCommand As String, dtmStartTime Long) End Sub As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Private Sub Call InstanceId, dtmStartTime) cExecStep74_StepComplete(cStepRecord As cStep, TimeUpdateForProcess(cStepRecord, _ lngInstanceId, StartTime:=dtmStartTime, End Sub dtmEndTime As Currency, InstanceId As Command:=strCommand) Long, Status As InstanceStatus) Private Sub End Sub cExecStep73_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ cExecStep74.Index, InstanceId, Status) Private Sub dtmEndTime As Currency, lngInstanceId cExecStep71_StepComplete(cStepRecord As Long, lElapsed As Long) End Sub As cStep, _ dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep74_StepStart(cStepRecord As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, As cStep, _ ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Call StepTerminated(cStepRecord, Long) dtmEndTime, cExecStep71.Index, End Sub InstanceId, Status) Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) End Sub cExecStep73_ProcessStart(cStepRecord As cStep, _ End Sub Private Sub strCommand As String, dtmStartTime As cExecStep71_StepStart(cStepRecord As Currency, lngInstanceId As Long) Private Sub cStep, _ cExecStep75_ProcessComplete(cStepRecord As dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cStep, _ As Long) lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Command:=strCommand) Long, lElapsed As Long) Call TimeStartUpdateForStep(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) End Sub cExecStep73_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep72_ProcessComplete(cStepRecor Long, Status As InstanceStatus) Private Sub d As cStep, _ cExecStep75_ProcessStart(cStepRecord As cStep, _ dtmEndTime As Currency, Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep73.Index, InstanceId, Currency, lngInstanceId As Long) Status) Call Call TimeUpdateForProcess(cStepRecord, TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, lngInstanceId, EndTime:=dtmEndTime, Command:=strCommand) ElapsedTime:=lElapsed) HP TPC-H FULL DISCLOSURE REPORT 233 © 2005 Hewlett-Packard Company. All rights reserved. End Sub dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) Private Sub cExecStep77_ProcessComplete(cStepRecord cExecStep75_StepComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ dtmEndTime As Currency, lngInstanceId cExecStep78.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) As Long, Status As InstanceStatus) End Sub Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep78_StepStart(cStepRecord dtmEndTime, cExecStep75.Index, ElapsedTime:=lElapsed) As cStep, _ InstanceId, Status) dtmStartTime As Currency, InstanceId As End Sub Long) End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub cExecStep77_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cExecStep75_StepStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As End Sub dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) As Long) Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep79_ProcessComplete(cStepRecord As Call lngInstanceId, StartTime:=dtmStartTime, cStep, _ TimeStartUpdateForStep(cStepRecord, Command:=strCommand) dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Long, lElapsed As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep77_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cExecStep76_ProcessComplete(cStepRecor cStep, _ d As cStep, _ dtmEndTime As Currency, InstanceId As End Sub dtmEndTime As Currency, Long, Status As InstanceStatus) lngInstanceId As Long, lElapsed As Long) Private Sub Call StepTerminated(cStepRecord, cExecStep79_ProcessStart(cStepRecord As cStep, _ Call dtmEndTime, cExecStep77.Index, InstanceId, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, Status) Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Private Sub Command:=strCommand) cExecStep77_StepStart(cStepRecord As cStep, Private Sub _ End Sub cExecStep76_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As cStep, _ Long) Private Sub strCommand As String, dtmStartTime cExecStep79_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, _ InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) Private Sub cExecStep79.Index, InstanceId, Status) cExecStep78_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub As Long, lElapsed As Long) Private Sub cExecStep79_StepStart(cStepRecord cExecStep76_StepComplete(cStepRecord As cStep, _ As cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId lngInstanceId, EndTime:=dtmEndTime, Long) As Long, Status As InstanceStatus) ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, Call StepTerminated(cStepRecord, End Sub InstanceId, dtmStartTime) dtmEndTime, cExecStep76.Index, InstanceId, Status) Private Sub End Sub cExecStep78_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As cExecStep80_ProcessComplete(cStepRecord As Private Sub Currency, lngInstanceId As Long) cStep, _ cExecStep76_StepStart(cStepRecord As dtmEndTime As Currency, lngInstanceId As cStep, _ Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) dtmStartTime As Currency, InstanceId lngInstanceId, StartTime:=dtmStartTime, As Long) Command:=strCommand) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Call End Sub ElapsedTime:=lElapsed) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) Private Sub End Sub cExecStep78_StepComplete(cStepRecord As End Sub cStep, _ HP TPC-H FULL DISCLOSURE REPORT 234 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Private Sub cExecStep80_ProcessStart(cStepRecord As cExecStep81_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cStep, _ _ lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Command:=strCommand) As Currency, lngInstanceId As Long) Long) End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep83_StepComplete(cStepRecord As cStep, Command:=strCommand) End Sub _ dtmEndTime As Currency, InstanceId As End Sub Private Sub Long, Status As InstanceStatus) cExecStep82_ProcessComplete(cStepRecord Private Sub As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, cExecStep80_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId cExecStep83.Index, InstanceId, Status) As cStep, _ As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep83_StepStart(cStepRecord Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) As cStep, _ dtmEndTime, cExecStep80.Index, dtmStartTime As Currency, InstanceId As InstanceId, Status) End Sub Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep82_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep80_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep84_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub Private Sub lngInstanceId, EndTime:=dtmEndTime, cExecStep82_StepComplete(cStepRecord As ElapsedTime:=lElapsed) Private Sub cStep, _ cExecStep81_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As End Sub d As cStep, _ Long, Status As InstanceStatus) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, cExecStep84_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep82.Index, InstanceId, strCommand As String, dtmStartTime As Call Status) Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep82_StepStart(cStepRecord As cStep, _ End Sub Private Sub dtmStartTime As Currency, InstanceId As cExecStep81_ProcessStart(cStepRecord As Long) Private Sub cStep, _ cExecStep84_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, _ As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep84.Index, InstanceId, Status) Command:=strCommand) cExecStep83_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub cExecStep84_StepStart(cStepRecord Private Sub As cStep, _ cExecStep81_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Long) dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) As Long, Status As InstanceStatus) Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep81.Index, Private Sub End Sub InstanceId, Status) cExecStep83_ProcessStart(cStepRecord As cStep, _ Private Sub End Sub strCommand As String, dtmStartTime As cExecStep85_ProcessComplete(cStepRecord As Currency, lngInstanceId As Long) cStep, _ HP TPC-H FULL DISCLOSURE REPORT 235 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep86_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, EndTime:=dtmEndTime, Call dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep86.Index, InstanceId, Private Sub End Sub Status) cExecStep88_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As Private Sub End Sub Currency, lngInstanceId As Long) cExecStep85_ProcessStart(cStepRecord As cStep, _ Private Sub Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime cExecStep86_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) _ Command:=strCommand) dtmStartTime As Currency, InstanceId As Call Long) End Sub TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Call TimeStartUpdateForStep(cStepRecord, Private Sub Command:=strCommand) InstanceId, dtmStartTime) cExecStep88_StepComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Private Sub Private Sub cExecStep85_StepComplete(cStepRecord cExecStep87_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ As cStep, _ cExecStep88.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId As Long, Status As InstanceStatus) As Long, lElapsed As Long) End Sub

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep88_StepStart(cStepRecord dtmEndTime, cExecStep85.Index, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ InstanceId, Status) ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub Private Sub InstanceId, dtmStartTime) cExecStep85_StepStart(cStepRecord As cExecStep87_ProcessStart(cStepRecord As cStep, _ cStep, _ End Sub dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) Private Sub cExecStep89_ProcessComplete(cStepRecord As Call Call TimeUpdateForProcess(cStepRecord, cStep, _ TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Command:=strCommand) Long, lElapsed As Long)

End Sub End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub Private Sub ElapsedTime:=lElapsed) cExecStep86_ProcessComplete(cStepRecor cExecStep87_StepComplete(cStepRecord As d As cStep, _ cStep, _ End Sub dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) Private Sub cExecStep89_ProcessStart(cStepRecord As cStep, _ Call Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep87.Index, InstanceId, Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, Status) ElapsedTime:=lElapsed) Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) Private Sub Private Sub cExecStep87_StepStart(cStepRecord As cStep, End Sub cExecStep86_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As Private Sub strCommand As String, dtmStartTime Long) cExecStep89_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) _ Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As Call InstanceId, dtmStartTime) Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) cExecStep89.Index, InstanceId, Status) Private Sub End Sub cExecStep88_ProcessComplete(cStepRecord End Sub As cStep, _ dtmEndTime As Currency, lngInstanceId Private Sub cExecStep89_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ HP TPC-H FULL DISCLOSURE REPORT 236 © 2005 Hewlett-Packard Company. All rights reserved. dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As Call TimeStartUpdateForStep(cStepRecord, As Long) Currency, lngInstanceId As Long) InstanceId, dtmStartTime)

Call Call TimeUpdateForProcess(cStepRecord, End Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) Private Sub cExecStep93_ProcessComplete(cStepRecord As End Sub End Sub cStep, _ dtmEndTime As Currency, lngInstanceId As Private Sub Private Sub Long, lElapsed As Long) cExecStep90_ProcessComplete(cStepRecor cExecStep91_StepComplete(cStepRecord As d As cStep, _ cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) ElapsedTime:=lElapsed)

Call Call StepTerminated(cStepRecord, End Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep91.Index, InstanceId, lngInstanceId, EndTime:=dtmEndTime, Status) Private Sub ElapsedTime:=lElapsed) cExecStep93_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub Private Sub cExecStep91_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cExecStep90_ProcessStart(cStepRecord As _ lngInstanceId, StartTime:=dtmStartTime, cStep, _ dtmStartTime As Currency, InstanceId As Command:=strCommand) strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) End Sub Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) Private Sub TimeUpdateForProcess(cStepRecord, cExecStep93_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, End Sub _ Command:=strCommand) dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) End Sub cExecStep92_ProcessComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, Private Sub dtmEndTime As Currency, lngInstanceId cExecStep93.Index, InstanceId, Status) cExecStep90_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ End Sub dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep93_StepStart(cStepRecord ElapsedTime:=lElapsed) As cStep, _ Call StepTerminated(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep90.Index, End Sub Long) InstanceId, Status) Private Sub Call TimeStartUpdateForStep(cStepRecord, End Sub cExecStep92_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cStep, _ Private Sub strCommand As String, dtmStartTime As End Sub cExecStep90_StepStart(cStepRecord As Currency, lngInstanceId As Long) cStep, _ Private Sub dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cExecStep94_ProcessComplete(cStepRecord As As Long) lngInstanceId, StartTime:=dtmStartTime, cStep, _ Command:=strCommand) dtmEndTime As Currency, lngInstanceId As Call Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, End Sub cExecStep92_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cStep, _ Private Sub dtmEndTime As Currency, InstanceId As End Sub cExecStep91_ProcessComplete(cStepRecor Long, Status As InstanceStatus) d As cStep, _ Private Sub dtmEndTime As Currency, Call StepTerminated(cStepRecord, cExecStep94_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep92.Index, InstanceId, strCommand As String, dtmStartTime As Status) Currency, lngInstanceId As Long) Call TimeUpdateForProcess(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Private Sub Command:=strCommand) cExecStep92_StepStart(cStepRecord As cStep, End Sub _ End Sub dtmStartTime As Currency, InstanceId As Private Sub Long) Private Sub cExecStep91_ProcessStart(cStepRecord As cExecStep94_StepComplete(cStepRecord As cStep, cStep, _ _ HP TPC-H FULL DISCLOSURE REPORT 237 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, As Long, Status As InstanceStatus) As Long, lElapsed As Long) cExecStep97.Index, InstanceId, Status)

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, End Sub dtmEndTime, cExecStep94.Index, lngInstanceId, EndTime:=dtmEndTime, InstanceId, Status) ElapsedTime:=lElapsed) Private Sub cExecStep97_StepStart(cStepRecord As cStep, _ End Sub End Sub dtmStartTime As Currency, InstanceId As Long) Private Sub Private Sub cExecStep94_StepStart(cStepRecord As cExecStep96_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, cStep, _ cStep, _ InstanceId, dtmStartTime) dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) End Sub

Call Call TimeUpdateForProcess(cStepRecord, Private Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, cExecStep98_ProcessComplete(cStepRecord As InstanceId, dtmStartTime) Command:=strCommand) cStep, _ dtmEndTime As Currency, lngInstanceId As End Sub End Sub Long, lElapsed As Long)

Private Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep95_ProcessComplete(cStepRecor cExecStep96_StepComplete(cStepRecord As lngInstanceId, EndTime:=dtmEndTime, d As cStep, _ cStep, _ ElapsedTime:=lElapsed) dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub

Call Call StepTerminated(cStepRecord, Private Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep96.Index, InstanceId, cExecStep98_ProcessStart(cStepRecord As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Status) strCommand As String, dtmStartTime As ElapsedTime:=lElapsed) Currency, lngInstanceId As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep96_StepStart(cStepRecord As cStep, Command:=strCommand) cExecStep95_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As End Sub strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep98_StepComplete(cStepRecord As cStep, Call InstanceId, dtmStartTime) _ TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, InstanceId As lngInstanceId, StartTime:=dtmStartTime, End Sub Long, Status As InstanceStatus) Command:=strCommand) Private Sub Call StepTerminated(cStepRecord, dtmEndTime, End Sub cExecStep97_ProcessComplete(cStepRecord cExecStep98.Index, InstanceId, Status) As cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId End Sub cExecStep95_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ Private Sub cExecStep98_StepStart(cStepRecord dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As cStep, _ As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, dtmStartTime As Currency, InstanceId As ElapsedTime:=lElapsed) Long) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep95.Index, End Sub Call TimeStartUpdateForStep(cStepRecord, InstanceId, Status) InstanceId, dtmStartTime) Private Sub End Sub cExecStep97_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As Private Sub cExecStep95_StepStart(cStepRecord As Currency, lngInstanceId As Long) cExecStep99_ProcessComplete(cStepRecord As cStep, _ cStep, _ dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, lngInstanceId As As Long) lngInstanceId, StartTime:=dtmStartTime, Long, lElapsed As Long) Command:=strCommand) Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, InstanceId, dtmStartTime) ElapsedTime:=lElapsed) Private Sub End Sub cExecStep97_StepComplete(cStepRecord As End Sub cStep, _ Private Sub dtmEndTime As Currency, InstanceId As Private Sub cExecStep96_ProcessComplete(cStepRecor Long, Status As InstanceStatus) cExecStep99_ProcessStart(cStepRecord As cStep, _ d As cStep, _ strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) HP TPC-H FULL DISCLOSURE REPORT 238 © 2005 Hewlett-Packard Company. All rights reserved. dtmStartTime As Currency, InstanceId As Call Long) Call TimeUpdateForProcess(cStepRecord, TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, lngInstanceId, StartTime:=dtmStartTime, Call TimeStartUpdateForStep(cStepRecord, Command:=strCommand) Command:=strCommand) InstanceId, dtmStartTime) End Sub End Sub End Sub Private Sub Private Sub cExecStep4_StepComplete(cStepRecord As cStep, cExecStep99_StepComplete(cStepRecord Private Sub _ As cStep, _ cExecStep3_ProcessComplete(cStepRecord As dtmEndTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId cStep, _ Long, Status As InstanceStatus) As Long, Status As InstanceStatus) dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, dtmEndTime, Call StepTerminated(cStepRecord, cExecStep4.Index, _ dtmEndTime, cExecStep99.Index, Call TimeUpdateForProcess(cStepRecord, InstanceId, Status) InstanceId, Status) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) End Sub End Sub End Sub Private Sub Private Sub cExecStep4_StepStart(cStepRecord As cExecStep99_StepStart(cStepRecord As Private Sub cStep, _ cStep, _ cExecStep3_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As dtmStartTime As Currency, InstanceId cStep, _ Long) As Long) strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) TimeStartUpdateForStep(cStepRecord, Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) End Sub Private Sub End Sub cExecStep5_ProcessComplete(cStepRecord As Private Sub cStep, _ cExecStep2_ProcessComplete(cStepRecord dtmEndTime As Currency, lngInstanceId As As cStep, _ Private Sub Long, lElapsed As Long) dtmEndTime As Currency, cExecStep3_StepComplete(cStepRecord As lngInstanceId As Long, lElapsed As Long) cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, Call Long, Status As InstanceStatus) ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, End Sub ElapsedTime:=lElapsed) dtmEndTime, cExecStep3.Index, _ InstanceId, Status) Private Sub cExecStep5_ProcessStart(cStepRecord End Sub As cStep, _ End Sub strCommand As String, dtmStartTime As Private Sub Currency, lngInstanceId As Long) cExecStep2_ProcessStart(cStepRecord As Private Sub cStep, _ cExecStep3_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime _ lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Command:=strCommand) Long) Call End Sub TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Private Sub Command:=strCommand) cExecStep5_StepComplete(cStepRecord As cStep, End Sub _ End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Private Sub Private Sub cExecStep4_ProcessComplete(cStepRecord As Call StepTerminated(cStepRecord, dtmEndTime, cExecStep2_StepComplete(cStepRecord As cStep, _ cExecStep5.Index, _ cStep, _ dtmEndTime As Currency, lngInstanceId InstanceId, Status) dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) As Long, Status As InstanceStatus) End Sub Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep5_StepStart(cStepRecord As dtmEndTime, cExecStep2.Index, _ ElapsedTime:=lElapsed) cStep, _ InstanceId, Status) dtmStartTime As Currency, InstanceId As End Sub Long) End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub cExecStep4_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cExecStep2_StepStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) HP TPC-H FULL DISCLOSURE REPORT 239 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cExecStep6_ProcessComplete(cStepRecord Private Sub On Error GoTo InitializeErr As cStep, _ cExecStep7_StepComplete(cStepRecord As dtmEndTime As Currency, cStep, _ Set mcFreeSteps = New cVectorLng lngInstanceId As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId As ' Initialize the array of free objects with all Long, Status As InstanceStatus) elements Call ' for now TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, For lngCount = 0 To lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep7.Index, _ glngNumConcurrentProcesses - 1 Step 1 ElapsedTime:=lElapsed) InstanceId, Status) mcFreeSteps.Add lngCount Next lngCount End Sub End Sub ' Initialize a byte array with the number of free Private Sub Private Sub processes. It will cExecStep6_ProcessStart(cStepRecord As cExecStep7_StepStart(cStepRecord As cStep, ' be used later to determine if any step is running cStep, _ _ ' Each element in the array can represent 8 steps, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As 1 for each bit As Currency, lngInstanceId As Long) Long) ReDim mbarrFree(glngNumConcurrentProcesses \ gintBitsPerByte) Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) ' Initialize each element in the byte array w/ all lngInstanceId, StartTime:=dtmStartTime, 1's Command:=strCommand) End Sub ' (upto glngNumConcurrentProcesses) For lngCount = LBound(mbarrFree) To End Sub Private Sub UBound(mbarrFree) Step 1 cExecStep8_ProcessComplete(cStepRecord As lngTemp = IIf( _ Private Sub cStep, _ glngNumConcurrentProcesses - cExecStep6_StepComplete(cStepRecord As dtmEndTime As Currency, lngInstanceId (gintBitsPerByte * lngCount) > gintBitsPerByte, _ cStep, _ As Long, lElapsed As Long) gintBitsPerByte, _ dtmEndTime As Currency, InstanceId glngNumConcurrentProcesses - As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, (gintBitsPerByte * lngCount)) lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) mbarrFree(lngCount) = (2 ^ lngTemp) - 1 dtmEndTime, cExecStep6.Index, _ Next lngCount InstanceId, Status) End Sub Set mcInstances = New cInstances End Sub Private Sub Set mcFailures = New cFailedSteps cExecStep8_ProcessStart(cStepRecord As Set mcNavSteps = New cStepTree Private Sub cStep, _ Set mcTermSteps = New cTermSteps cExecStep6_StepStart(cStepRecord As strCommand As String, dtmStartTime As cStep, _ Currency, lngInstanceId As Long) ' Initialize the Abort flag to False dtmStartTime As Currency, InstanceId mblnAbort = False As Long) Call TimeUpdateForProcess(cStepRecord, mblnAsk = False lngInstanceId, StartTime:=dtmStartTime, Call Command:=strCommand) Exit Sub TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) End Sub InitializeErr: ' Log the error code raised by Visual Basic End Sub Private Sub Call LogErrors(Errors) cExecStep8_StepComplete(cStepRecord As On Error GoTo 0 Private Sub cStep, _ Err.Raise vbObjectError + errInitializeFailed, cExecStep7_ProcessComplete(cStepRecord dtmEndTime As Currency, InstanceId As mstrModuleName & "Initialize", _ As cStep, _ Long, Status As InstanceStatus) LoadResString(errInitializeFailed) dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, End Sub dtmEndTime, cExecStep8.Index, _ Private Sub Class_Terminate() Call InstanceId, Status) TimeUpdateForProcess(cStepRecord, On Error GoTo Class_TerminateErr lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) mcFreeSteps.Clear Private Sub Set mcFreeSteps = Nothing End Sub cExecStep8_StepStart(cStepRecord As cStep, ReDim mbarrFree(0) _ Private Sub dtmStartTime As Currency, InstanceId As mcInstances.Clear cExecStep7_ProcessStart(cStepRecord As Long) Set mcInstances = Nothing cStep, _ strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, Set mcFailures = Nothing As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) Set mcNavSteps = Nothing Set mcTermSteps = Nothing Call End Sub TimeUpdateForProcess(cStepRecord, Exit Sub lngInstanceId, StartTime:=dtmStartTime, Private Sub Class_Initialize() Command:=strCommand) Class_TerminateErr: Dim lngCount As Long Call LogErrors(Errors) End Sub Dim lngTemp As Long HP TPC-H FULL DISCLOSURE REPORT 240 © 2005 Hewlett-Packard Company. All rights reserved. End Sub End Property Private Sub IsRange()

Private Sub Public Property Get RangeStep() As Long If mintType = gintValue Then mcTermSteps_TermStepExists(cStepDetails On Error GoTo 0 As cTermStep) RangeStep = mlngStep Err.Raise vbObjectError + errInvalidProperty, mstrSource, _ Call End Property LoadResString(errInvalidProperty) RunNextStep(cStepDetails.TimeComplete, Public Property Let RangeStep(vdata As Long) End If cStepDetails.Index, _ cStepDetails.InstanceId, mlngStep = vdata End Sub cStepDetails.ExecutionStatus) End Property Public Property Get Value() As String End Sub Public Property Let RangeFrom(ByVal vdata Value = mstrValue VERSION 1.0 CLASS As Long) BEGIN End Property MultiUse = -1 'True mlngFrom = vdata Public Property Let Value(vdata As String) END Attribute VB_Name = "cRunItDetails" End Property mstrValue = vdata Attribute VB_GlobalNameSpace = False Public Property Let Sequence(ByVal vdata As Attribute VB_Creatable = True Long) End Property Attribute VB_PredeclaredId = False Attribute VB_Exposed = False mlngSequence = vdata ' FILE: cRunItDetails.cls Public Property Get IteratorName() As String ' Microsoft TPC-H Kit Ver. 1.00 End Property ' Copyright Microsoft, 1999 IteratorName = mstrIteratorName ' All Rights Reserved Public Property Get IteratorType() As ' ValueType End Property ' Public Property Let IteratorName(ByVal vdata As ' PURPOSE: This module encapsulates IteratorType = mintType String) the properties of iterator values ' that are used by the step being End Property mstrIteratorName = vdata executed at runtime. Public Property Let IteratorType(ByVal vdata ' Contact: Reshma Tharamal As ValueType) End Property ([email protected]) ' On Error GoTo TypeErr VERSION 1.0 CLASS mstrSource = mstrModuleName & "Type" BEGIN Option Explicit MultiUse = -1 'True ' These constants have been defined in the END ' Used to indicate the source module name enumeration, Attribute VB_Name = "cRunItNode" when errors ' Type, which is exposed Attribute VB_GlobalNameSpace = False ' are raised by this class Select Case vdata Attribute VB_Creatable = True Private Const mstrModuleName As String = Case gintFrom, gintTo, gintStep, Attribute VB_PredeclaredId = False "c RunItDetails." gintValue Attribute VB_Exposed = False Private mstrSource As String mintType = vdata ' An iterator class containing the properties that are used Private mstrIteratorName As String Case Else ' by the stpe being executed. Private mintType As ValueType On Error GoTo 0 ' These iterators might actually come from steps that Private mlngSequence As Long Err.Raise vbObjectError + are at Private mlngFrom As Long errTypeInvalid, _ ' a higher level than the step actually being executed Private mlngTo As Long mstrSource, (viz. Private mlngStep As Long LoadResString(errTypeInvalid) ' direct ascendants of the step at any level). Private mstrValue As String End Select Option Explicit Public Property Get RangeTo() As Long Exit Property Public IteratorName As String RangeTo = mlngTo TypeErr: Public Value As String LogErrors Errors Public StepId As Long End Property mstrSource = mstrModuleName & "Type" Public Property Let RangeTo(ByVal vdata On Error GoTo 0 VERSION 1.0 CLASS As Long) Err.Raise vbObjectError + errTypeInvalid, _ BEGIN mstrSource, MultiUse = -1 'True mlngTo = vdata LoadResString(errTypeInvalid) END Attribute VB_Name = "cRunOnly" End Property End Property Attribute VB_GlobalNameSpace = False Private Sub IsList() Attribute VB_Creatable = True Public Property Get RangeFrom() As Long Attribute VB_PredeclaredId = False If mintType <> gintValue Then Attribute VB_Exposed = False RangeFrom = mlngFrom On Error GoTo 0 Option Explicit Err.Raise vbObjectError + End Property errInvalidProperty, mstrSource, _ Public Event Done() Public Property Get Sequence() As Long LoadResString(errInvalidProperty) Private WithEvents mcRunWsp As End If cRunWorkspace Sequence = mlngSequence Attribute mcRunWsp.VB_VarHelpID = -1 End Sub HP TPC-H FULL DISCLOSURE REPORT 241 © 2005 Hewlett-Packard Company. All rights reserved. Public WspName As String Public Event ProcessStart(cStepRecord As cStep, _ Public WorkspaceId As Long ' Used to indicate the source module name strCommand As String, dtmStartTime As Public WspLog As String when errors Currency, _ ' are raised by this class InstanceId As Long) Public Sub RunWsp() Private Const mstrModuleName As String = Public Event ProcessComplete(cStepRecord As "cRunStep." cStep, _ On Error GoTo RunWspErr Private mstrSource As String dtmStartTime As Currency, InstanceId As Long, lElapsed As Long) Set mcRunWsp = New cRunWorkspace ' Local variable(s) to hold property value(s) Set mcRunWsp.LoadDb = dbsAttTool Private mcStep As cStep Private Function AppendDiffErrors(sDiffFile As mcRunWsp.WorkspaceId = WorkspaceId Private mcGlobals As cArrSteps String) mcRunWsp.CreateInputFiles = True Private mcvntWspPreCons As Variant ' The file containing the errors generated by the mcRunWsp.RunWorkspace Private mcvntWspPostCons As Variant diff utility is passed in Private mcvntPreCons As Variant ' These errors are appended to the error file for Exit Sub Private mcvntPostCons As Variant the step Private mcIterators As cRunColIt RunWspErr: Private mlngInstanceId As Long ' Identifier for Dim sTemp As String ' Log the VB error code the current instance Dim InputFile As Integer LogErrors Errors Private mlngIndex As Long ' Index value for the current instance If Not StringEmpty(sDiffFile) Then End Sub Private mstrCommand As String ' The command string InputFile = FreeFile Private Sub Private msRunStepDtl As String ' Step text/file Open sDiffFile For Input Access Read As mcRunWsp_RunComplete(dtmEndTime As name that will go into the run_step_details InputFile Currency) table Private mblnAbort As Boolean ' Set to True Do While Not EOF(InputFile) ' Loop MsgBox "Completed executing when the user aborts the run until end of file. workspace: " & gstrSQ & WspName & Private msOutputFile As String Line Input #InputFile, sTemp ' Read line gstrSQ & " at " & _ Private msErrorFile As String into variable. JulianDateToString(dtmEndTime) & Private miStatus As InstanceStatus mcVBErr.LogMessage sTemp "." & vbCrLf & vbCrLf & _ Private mcVBErr As cVBErrorsSM Loop "The log file for the run is: " & Public WspParameters As cArrParameters gstrSQ & WspLog & gstrSQ & "." Public WspConnections As cConnections Close InputFile RaiseEvent Done Public WspConnDtls As cConnDtls End If

End Sub Private WithEvents mcTermProcess As End Function cTermProcess Private Sub Attribute mcTermProcess.VB_VarHelpID = -1 Private Sub CreateStepTextFile() mcRunWsp_RunStart(dtmStartTime As Public RunId As Long ' Creates a file containing the step text being Currency, strWspLog As String, lRunId As Public CreateInputFiles As Boolean executed Long) Private msOutputDir As String On Error GoTo CreateStepTextFileErr WspLog = strWspLog End Sub ' Object that will execute the step Dim sInputFile As String Private WithEvents mcExecObj As EXECUTEDLLLib.Execute If mcExecStep.ExecutionMechanism = VERSION 1.0 CLASS Attribute mcExecObj.VB_VarHelpID = -1 gintExecuteShell Then BEGIN sInputFile = GetOutputFile(gsCmdFileSuffix) MultiUse = -1 'True ' Holds the step that is currently being executed Else END (constraint or sInputFile = GetOutputFile(gsSqlFileSuffix) Attribute VB_Name = "cRunStep" ' worker step) End If Attribute VB_GlobalNameSpace = False Private mcExecStep As cStep Attribute VB_Creatable = True ' Generate a file containing the step text being Attribute VB_PredeclaredId = False Private Const msCompareExe As String = executed Attribute VB_Exposed = False "\diff.exe" If Not StringEmpty(mcExecStep.StepTextFile) ' FILE: cRunStep.cls Or mcExecStep.ExecutionMechanism = ' Microsoft TPC-H Kit Ver. 1.00 Private Enum NextNodeType gintExecuteShell Then ' Copyright Microsoft, 1999 mintWspPreConstraint = 1 FileCopy mstrCommand, sInputFile ' All Rights Reserved mintPreConstraint Else ' mintStep Call WriteCommandToFile(mstrCommand, ' mintWspPostConstraint sInputFile) ' PURPOSE: This class executes the step mintPostConstraint End If that is assigned to the End Enum ' ExecuteStep property. It executes Exit Sub the pre-execution constraints ' Public events to notify the calling function of ' in sequence and then the step the CreateStepTextFileErr: itself. At the end it executes ' start and end time for each step ' the post-execution constraints. Public Event StepStart(cStepRecord As cStep, mcVBErr.LogVBErrors Since these steps should always _ ' be executed in sequence, each step dtmStartTime As Currency, InstanceId As End Sub is only fired on the Long) Private Function GetOutputFile(strFileExt As ' completion of the previous step. Public Event StepComplete(cStepRecord As String) As String ' Contact: Reshma Tharamal cStep, _ ' This function generates the output file name for ([email protected]) dtmEndTime As Currency, InstanceId As the step currently being executed ' Long, Status As InstanceStatus) ' The value of the built-in parameter 'DefaultDir' Option Explicit is appended with the run identifier HP TPC-H FULL DISCLOSURE REPORT 242 © 2005 Hewlett-Packard Company. All rights reserved. ' for the file location Else ' The step label is used for the file name Index = mlngIndex CompareOutput = (FileLen(sCmpOutput) = 0) and a combination of all iterator values End If ' for the step is used to make the output End Property files unique for each instance Public Property Let Index(ByVal vdata As If Not CompareOutput Then Dim sFile As String Long) mcVBErr.WriteError errDiffFailed Dim sIt As String End If Dim lIt As Long mlngIndex = vdata ' Delete the temporary files used to store the On Error GoTo GetOutputFileErr End Property output of the compare and Private Function InitializeExecStatus() As ' the errors generated by the compare sFile = InstanceStatus Kill sDiffOutput SubstituteParametersIfPossible(mcExecStep Dim sCompareFile As String Kill sCmpOutput .StepLabel) On Error GoTo InitializeExecStatusErr Exit Function sFile = TranslateStepLabel(sFile) InitializeExecStatus = CompareOutputErr: If mcExecStep Is mcStep Then mcExecObj.StepStatus mcVBErr.LogVBErrors ' Use iterators that have been defined CompareOutput = False for the worker or any of it's managers If InitializeExecStatus = gintComplete Then ' to make the error/log file unique for If Not End Function this instance StringEmpty(mcExecStep.FailureDetails) Then Public Property Get InstanceId() As Long For lIt = mcIterators.Count - 1 To 0 ' Compare output to determine whether Step -1 the step failed InstanceId = mlngInstanceId sIt = sIt & gsExtSeparator & sCompareFile = mcIterators(lIt).Value GetShortName(SubstituteParameters( _ End Property Next lIt mcExecStep.FailureDetails, Public Property Let InstanceId(ByVal vdata As End If mcExecStep.WorkspaceId, mcIterators, _ Long) sIt = sIt & strFileExt WspParameters)) InitializeExecStatus = mlngInstanceId = vdata ' Ensure that the length of the complete IIf(CompareOutput(sCompareFile, path does not exceed 255 characters msOutputFile), gintComplete, gintFailed) End Property If Len(msOutputDir) + Len(sFile) + End If Len(sIt) > MAX_PATH Then End If Private Function ExecuteConstraint(vntConstraints sFile = Mid(sFile, 1, MAX_PATH - As Variant, _ Len(sIt) - Len(msOutputDir)) Exit Function ByRef intLoopIndex As Integer) As Boolean End If GetOutputFile = msOutputDir & sFile & InitializeExecStatusErr: ' Returns True if there is a constraint in the sIt mcVBErr.LogVBErrors passed in Exit Function ' Call LogErrors(Errors) ' array that remains to be executed InitializeExecStatus = GetOutputFileErr: mcExecObj.StepStatus If IsArray(vntConstraints) And Not IsEmpty(vntConstraints) Then ' Does not make sense to log error to the End Function ExecuteConstraint = (LBound(vntConstraints) error file yet. Write to the project Private Function <= intLoopIndex) And (intLoopIndex <= ' log and return the step label as default CompareOutput(sCompareFile As String, UBound(vntConstraints)) GetOutputFile = mcExecStep.StepLabel sOutputFile As String) As Boolean Else & gsExtSeparator & strFileExt ExecuteConstraint = False Dim sCmpOutput As String End If End Function Dim sDiffOutput As String End Function On Error GoTo CompareOutputErr Private Function NextStep() As cStep Private Sub HandleExecutionError() ' Create temporary files to store the file ' Determines which is the next step to be executed On Error GoTo HandleExecutionError compare output and - it could ' the errors generated by the compare ' be either a pre-execution step, the worker step ' Log the error code raised by Visual function itself Basic sCmpOutput = CreateTempFile() ' or a post-execution step miStatus = gintFailed sDiffOutput = CreateTempFile() mcVBErr.LogVBErrors Dim cConsRec As cConstraint Call ' Run the compare utility and redirect it's Dim cNextStepRec As cStep mcVBErr.WriteError(errExecuteStepFailed, output and errors Dim vntStepConstraints As Variant _ SyncShell ("cmd /c " & _ OptArgs:="Continuation criteria for GetShortName(App.Path & ' Static variable to remember exactly where we the step is: " & msCompareExe) & gstrBlank & _ are in the gsContCriteria(mcStep.ContinuationCriteria sCompareFile & gstrBlank & ' processing )) sOutputFile & _ Static intIndex As Integer " > " & sCmpOutput & " 2> " & Static intNextStepType As NextNodeType HandleExecutionError: sDiffOutput) On Error GoTo NextStepErr ' Logging failed - return If FileLen(sDiffOutput) > 0 Then ' The compare generated errors - append If mblnAbort = True Then End Sub error msgs to the error file ' The user has aborted the run - do not run any Call AppendDiffErrors(sDiffOutput) more Public Property Get Index() As Long CompareOutput = False ' processes for the step HP TPC-H FULL DISCLOSURE REPORT 243 © 2005 Hewlett-Packard Company. All rights reserved. Set NextStep = Nothing End If ' First time through - initialize the location of Exit Function Else output files End If ' Increment the step type so we look at msOutputDir = the post- GetDefaultDir(mcStep.WorkspaceId, If intNextStepType = 0 Then ' execution steps the next time through WspParameters) ' First time through this function - set Call NextType(intNextStepType, msOutputDir = msOutputDir & the Index and intIndex) gstrFileSeparator & Trim(Str(RunId)) & ' node type to initial values End If gstrFileSeparator intNextStepType = ' Dummy file since the function expects a file mintWspPreConstraint Loop Until (Not cNextStepRec Is Nothing) name intIndex = 0 Or _ MakePathValid (msOutputDir & "a.txt") RaiseEvent StepStart(mcStep, intNextStepType = -1 End If Determine64BitTime(), mlngInstanceId) End If Set NextStep = cNextStepRec ' Call a procedure to determine the next step to be executed Do Exit Function ' - could be a constraint or the step itself Select Case intNextStepType ' Initialize a module-level variable to the step Case mintWspPreConstraint NextStepErr: being vntStepConstraints = ' Log the error code raised by Visual Basic ' executed mcvntWspPreCons Call LogErrors(Errors) Set mcExecStep = NextStep On Error GoTo 0 If mcExecStep Is Nothing Then Case mintPreConstraint mstrSource = mstrModuleName & RaiseEvent StepComplete(mcStep, vntStepConstraints = "NextStep" Determine64BitTime(), mlngInstanceId, miStatus) mcvntPreCons Err.Raise vbObjectError + ' No more stuff to execute errNextStepFailed, mstrSource, _ Exit Sub Case mintStep LoadResString(errNextStepFailed) End If ' CONS: If mcStep.StepType = End Function Dim sStartDir As String gintWorkerStep Then Public Sub Execute() Set cNextStepRec = mcStep ' This procedure is the method that executes Set mcExecObj = New End If the step that EXECUTEDLLLib.Execute ' is assigned to the ExecuteStep property. It Case mintWspPostConstraint call a procedure ' The VB errors class uses the WriteError method vntStepConstraints = ' to determine the next step to be executed. of the Execute class to write mcvntWspPostCons ' Then it initializes all the properties of the ' all VB errors to the error file for the step (this cExecuteSM object prevents a clash when the Case mintPostConstraint ' and calls it's run method to execute it. ' VB errors and Execution errors have to be vntStepConstraints = Dim cConn As cConnection written to the same log). Hence, store mcvntPostCons Dim cRunConnDtl As cConnDtl ' a reference to the Execute object in mcVBErr msErrorFile = GetOutputFile(gsErrorFileSuffix) End Select On Error GoTo ExecuteErr mcExecObj.ErrorFile = msErrorFile Call DeleteFile(msErrorFile, If intNextStepType <> mintStep Then ' If this procedure is called after a step has bCheckIfEmpty:=False) ' Check if there is a constraint to be completed, Set mcVBErr.ErrorFile = mcExecObj executed ' we would have to check if we created any If temporary files If mcExecStep.ExecutionMechanism = ExecuteConstraint(vntStepConstraints, ' while executing that step gintExecuteShell Then intIndex) Then If Not mcExecStep Is Nothing Then sStartDir = ' Get the corresponding step record If Not Trim$(GetShortName(SubstituteParameters( _ to be executed StringEmpty(mcExecStep.StepTextFile) Or mcExecStep.StartDir, ' Query the global step record for mcExecStep.ExecutionMechanism = mcExecStep.WorkspaceId, mcIterators, the current gintExecuteShell Then WspParameters:=WspParameters))) ' constraint ' Remove the temporary file that we ' Dummy connection object Set cConsRec = created while Set cConn = New cConnection vntStepConstraints(intIndex) ' running this command Set cRunConnDtl = New cConnDtl Kill mstrCommand Else Set cNextStepRec = End If ' Find the connection string value and mcGlobals.QueryStep(cConsRec.GlobalStep substitute parameter values in it Id) Call StepCompleted Set cRunConnDtl = intIndex = intIndex + 1 WspConnDtls.GetConnectionDtl(mcExecStep.Wor Else ' The VB errors class stores a reference to kspaceId, mcExecStep.StartDir) If intNextStepType = the Execute class since it uses Set cConn = mintPostConstraint Then ' a method of the class to write errors to WspConnections.GetConnection(mcExecStep.Wor ' No more stuff to be executed the error log. Hence, kspaceId, cRunConnDtl.ConnectionString) for the step ' release all references to the Execute sStartDir = ' Raise a Done event object before destroying it. Trim$(SubstituteParameters(cConn.ConnectionVal Set cNextStepRec = Nothing Set mcVBErr.ErrorFile = Nothing ue, _ Set mcExecObj = Nothing mcExecStep.WorkspaceId, mcIterators, ' Set the next step type to an WspParameters:=WspParameters)) invalid value ' Delete empty output and error files End If intNextStepType = -1 (generated by shell commands) Else ' (Can be done only after cleaning up msOutputFile = Call cExecObj) GetOutputFile(gsOutputFileSuffix) NextType(intNextStepType, intIndex) Call DeleteEmptyOutputFiles Call DeleteFile(msOutputFile, End If Else bCheckIfEmpty:=False) HP TPC-H FULL DISCLOSURE REPORT 244 © 2005 Hewlett-Packard Company. All rights reserved. mcExecObj.OutputFile = msOutputFile msRunStepDtl = mblnAbort = True ' mcExecObj.LogFile = SubstituteParameters(mcExecStep.StepTextFil GetShortName(SubstituteParameters( _ e, _ If Not mcExecObj Is Nothing Then ' mcExecStep.LogFile, mcExecStep.WorkspaceId, mcExecObj.Abort mcExecStep.WorkspaceId, mcIterators, mcIterators, WspParameters:=WspParameters) Else WspParameters:=WspParameters)) ' We are not in the middle of execution yet If mcExecStep.ExecutionMechanism = sFile = GetShortName(msRunStepDtl) End If gintExecuteODBC And _ cRunConnDtl.ConnType = mstrCommand = Exit Sub ConnTypeDynamic Then SubstituteParametersInText(sFile, Call mcExecStep.WorkspaceId) AbortErr: mcExecObj.DoExecute(BuildCommandStri Call LogErrors(Errors) ng(), sStartDir, If mcExecStep.ExecutionMechanism = On Error GoTo 0 mcExecStep.ExecutionMechanism, _ gintExecuteODBC Then Err.Raise vbObjectError + errProgramError, _ cConn.NoCountDisplay, ' Read the contents of the file and pass mstrModuleName & "Abort", _ cConn.NoExecute, cConn.ParseQueryOnly, it to ODBC LoadResString(errProgramError) cConn.QuotedIdentifiers, _ BuildCommandString = cConn.AnsiNulls, ReadCommandFromFile(mstrCommand) End Sub cConn.ShowQueryPlan, Else Private Sub NextType(ByRef StepType As cConn.ShowStatsTime, BuildCommandString = mstrCommand NextNodeType, _ cConn.ShowStatsIO, _ End If ByRef Position As Integer) cConn.RowCount, Else cConn.QueryTimeOut, gstrEmptyString) ' Substitute parameter values and StepType = StepType + 1 Else environment variables Position = 0 Call ' in the step text mcExecObj.DoExecute(BuildCommandStri msRunStepDtl = End Sub ng(), sStartDir, SubstituteParameters(mcExecStep.StepText, _ Private Sub StepCompleted() mcExecStep.ExecutionMechanism, _ mcExecStep.WorkspaceId, cConn.NoCountDisplay, mcIterators, WspParameters:=WspParameters) On Error GoTo StepCompletedErr cConn.NoExecute, cConn.ParseQueryOnly, mstrCommand = msRunStepDtl cConn.QuotedIdentifiers, _ If Not mcExecStep Is Nothing Then cConn.AnsiNulls, If mcExecStep.ExecutionMechanism = If mcExecStep Is mcStep Then cConn.ShowQueryPlan, gintExecuteShell Then miStatus = InitializeExecStatus cConn.ShowStatsTime, ' Write the command to a temp file If miStatus = gintFailed Then cConn.ShowStatsIO, _ (enables us to execute multiple ' Create input files if the step failed cConn.RowCount, ' commands via the command execution and one hasn't been created already cConn.QueryTimeOut, interpreter) If Not CreateInputFiles Then mcExecStep.StartDir) mstrCommand = CreateStepTextFile End If WriteCommandToFile(msRunStepDtl) Call BuildCommandString = mstrCommand mcVBErr.WriteError(errExecuteStepFailed, _ Exit Sub Else OptArgs:="Continuation criteria for BuildCommandString = the step is: " & ExecuteErr: SQLFixup(msRunStepDtl) gsContCriteria(mcStep.ContinuationCriteria)) Call HandleExecutionError End If End If End If End If ' We can assume that if we are in this End If function, a StepStart event has been If CreateInputFiles Then triggered already. Call CreateStepTextFile Exit Sub RaiseEvent StepComplete(mcStep, End If Determine64BitTime(), mlngInstanceId, StepCompletedErr: miStatus) Exit Function ' Log the error code raised by Visual Basic miStatus = gintFailed End Sub BuildCommandStringErr: mcVBErr.LogVBErrors Private Function BuildCommandString() As ' Log the error code raised by the Execute Call mcVBErr.WriteError(errExecuteStepFailed, String procedure _ ' Process text to be executed - either from ' Call LogErrors(Errors) OptArgs:="Continuation criteria for the step the text mcVBErr.LogVBErrors is: "& ' field or read it from a file. gsContCriteria(mcStep.ContinuationCriteria)) ' This function will always return the On Error GoTo 0 command text for ODBC commands mstrSource = mstrModuleName & End Sub ' and a file name for Shell commands "Execute" Private Sub DeleteEmptyOutputFiles() Dim sFile As String Err.Raise vbObjectError + Dim sCommand As String errExecuteStepFailed, mstrSource, _ On Error GoTo DeleteEmptyOutputFilesErr Dim sTemp As String LoadResString(errExecuteStepFailed) & mstrCommand ' Delete empty output and error files On Error GoTo BuildCommandStringErr If Not mcExecStep Is Nothing Then End Function Call DeleteFile(msErrorFile, If Not Public Sub Abort() bCheckIfEmpty:=True) StringEmpty(mcExecStep.StepTextFile) Call DeleteFile(msOutputFile, Then On Error GoTo AbortErr bCheckIfEmpty:=True) ' Substitute parameter values and End If environment variables ' Setting the Abort flag to True will ensure ' in the filename that we Exit Sub ' don't execute any more processes for this step DeleteEmptyOutputFilesErr: HP TPC-H FULL DISCLOSURE REPORT 245 © 2005 Hewlett-Packard Company. All rights reserved. ' Not a critical error - continue lngWorkspace As Long) As String Private Function WriteCommandToFile(sCommand As String, Optional sFile As String = End Sub ' Reads each line in the passed in file, gstrEmptyString) As String Private Function substitutes parameter ReadCommandFromFile(strFileName As ' values in the line and writes out the ' Writes the command text to a temporary file String) As String modified line to a ' Returns the name of the temporary file ' temporary file that we create. The ' Returns the contents of the passed in file temporary file will be Dim OutputFile As Integer ' removed once the step completes Dim sCommand As String execution. On Error GoTo WriteCommandToFileErr Dim sTemp As String ' Returns the name of the newly created Dim InputFile As Integer temporary file. If StringEmpty(sFile) Then sFile = CreateTempFile() On Error GoTo Dim strTempFile As String End If ReadCommandFromFileErr Dim strTemp As String Dim strOutput As String OutputFile = FreeFile If Not StringEmpty(strFileName) Then Dim InputFile As Integer Open sFile For Output Access Write As Dim OutputFile As Integer OutputFile InputFile = FreeFile Open strFileName For Input Access On Error GoTo Print #OutputFile, sCommand Read As InputFile SubstituteParametersInTextErr Close OutputFile Line Input #InputFile, sCommand ' strTempFile = CreateTempFile() Read line into variable. WriteCommandToFile = sFile If Not StringEmpty(strFileName) Then Do While Not EOF(InputFile) ' Loop Exit Function until end of file. InputFile = FreeFile Line Input #InputFile, sTemp ' Read Open strFileName For Input Access Read WriteCommandToFileErr: line into variable. As InputFile sCommand = sCommand & vbCrLf ' Log the error code raised by Visual Basic & sTemp OutputFile = FreeFile Call LogErrors(Errors) Loop Open strTempFile For Output Access mstrSource = mstrModuleName & Write As OutputFile "WriteCommandToFile" Close InputFile On Error GoTo 0 End If Do While Not EOF(InputFile) ' Loop until Err.Raise vbObjectError + errSubValuesFailed, _ end of file. gstrSource, _ ReadCommandFromFile = sCommand Line Input #InputFile, strTemp ' Read LoadResString(errSubValuesFailed) line into variable. Exit Function strOutput = End Function SubstituteParameters(strTemp, lngWorkspace, ReadCommandFromFileErr: mcIterators, WspParameters:=WspParameters) Public Property Get WspPreCons() As Variant ' Log the error code raised by Visual If mcExecStep.ExecutionMechanism = WspPreCons = mcvntWspPreCons Basic gintExecuteODBC Then strOutput = End Property Call LogErrors(Errors) SQLFixup(strOutput) Public Property Let WspPreCons(ByVal vdata As mstrSource = mstrModuleName & Variant) "ReadCommandFromFile" Print #OutputFile, strOutput mcvntWspPreCons = vdata On Error GoTo 0 BugMessage strOutput End Property Err.Raise vbObjectError + Loop errSubValuesFailed, _ Public Property Get WspPostCons() As Variant gstrSource, _ End If WspPostCons = mcvntWspPostCons LoadResString(errSubValuesFailed) End Property Close InputFile Public Property Let WspPostCons(ByVal vdata As End Function Close OutputFile Variant) Private Function mcvntWspPostCons = vdata SubstituteParametersIfPossible(strLabel As SubstituteParametersInText = strTempFile End Property String) Exit Function Public Property Get PreCons() As Variant On Error GoTo PreCons = mcvntPreCons SubstituteParametersIfPossibleErr SubstituteParametersInTextErr: End Property Public Property Let PreCons(ByVal vdata As SubstituteParametersIfPossible = ' Log the error code raised by Visual Basic Variant) SubstituteParameters(strLabel, _ ' Call LogErrors(Errors) mcvntPreCons = vdata mcExecStep.WorkspaceId, mcVBErr.LogVBErrors End Property mcIterators, mstrSource = mstrModuleName & WspParameters:=WspParameters) "SubstituteParametersInText" Public Property Get PostCons() As Variant Exit Function On Error GoTo 0 PostCons = mcvntPostCons Err.Raise vbObjectError + End Property SubstituteParametersIfPossibleErr: errSubValuesFailed, _ Public Property Let PostCons(ByVal vdata As SubstituteParametersIfPossible = strLabel gstrSource, _ Variant) LoadResString(errSubValuesFailed) mcvntPostCons = vdata End Function End Property Private Function End Function SubstituteParametersInText(strFileName As Public Property Set Globals(cRunSteps As String, _ cArrSteps) HP TPC-H FULL DISCLOSURE REPORT 246 © 2005 Hewlett-Packard Company. All rights reserved. End Sub Public Event StepStart(cStepRecord As cStep, Set mcGlobals = cRunSteps dtmStartTime As Currency, lngInstanceId As Long, Private Sub _ End Property mcTermProcess_TermProcessExists() sPath As String, sIts As String) Public Property Set ExecuteStep(cRunStep Public Event StepComplete(cStepRecord As cStep, As cStep) On Error GoTo TermProcessExistsErr dtmEndTime As Currency, lngInstanceId As Long) Public Event ProcessStart(cStepRecord As cStep, Set mcStep = cRunStep ' Call a procedure to execute the next step, if strCommand As String, _ any dtmStartTime As Currency, lngInstanceId As End Property Call Execute Long) Public Property Get Globals() As cArrSteps Public Event ProcessComplete(cStepRecord As Exit Sub cStep, dtmEndTime As Currency, lngInstanceId As Set Globals = mcGlobals Long) TermProcessExistsErr: Public Function InstancesForStep(lngStepId As End Property ' Log the error code raised by the Execute Long, iStatus As InstanceStatus) As cInstances Public Property Get ExecuteStep() As cStep procedure ' Returns an array of all the instances for a step Call LogErrors(Errors) Set ExecuteStep = mcStep If mcRun Is Nothing Then End Sub Set InstancesForStep = Nothing End Property VERSION 1.0 CLASS Else Public Property Set Iterators(vdata As BEGIN Set InstancesForStep = cRunColIt) MultiUse = -1 'True mcRun.InstancesForStep(lngStepId, iStatus) END End If Set mcIterators = vdata Attribute VB_Name = "cRunWorkspace" Attribute VB_GlobalNameSpace = False End Function End Property Attribute VB_Creatable = True Private Sub InsertRunDetail(cStepRecord As cStep, Private Sub Class_Initialize() Attribute VB_PredeclaredId = False _ Attribute VB_Exposed = False strCommand As String, dtmStartTime As ' Initialize the Abort flag to False ' FILE: cRunWorkspace.cls Currency, _ mblnAbort = False ' Microsoft TPC-H Kit Ver. 1.00 lngInstanceId As Long, lParentInstanceId As Set mcVBErr = New cVBErrorsSM ' Copyright Microsoft, 1999 Long, sItValue As String) Set mcTermProcess = New cTermProcess ' All Rights Reserved ' Inserts a new run detail record into the database ' End Sub ' Dim strInsert As String ' PURPOSE: This class loads all the Dim qy As QueryDef Private Sub Class_Terminate() information necessary to ' execute a workspace and calls On Error GoTo InsertRunDetailErr On Error GoTo Class_TerminateErr cRunInst to execute the workspace. mstrSource = mstrModuleName & ' It also propagates Step start and "InsertRunDetail" Set mcExecObj = Nothing complete and Set mcVBErr = Nothing ' Run start and complete events. strInsert = "insert into run_step_details " & _ Set mcTermProcess = Nothing ' Contact: Reshma Tharamal "( run_id, step_id, version_no, instance_id, ([email protected]) parent_instance_id, " & _ Exit Sub ' " command, start_time, iterator_value ) " & Option Explicit _ Class_TerminateErr: " values ( " Call LogErrors(Errors) ' Used to indicate the source module name when errors #If USE_JET Then End Sub ' are raised by this module Private Const mstrModuleName As String = strInsert = strInsert & " [r_id], [s_id], [ver_no], Private Sub mcExecObj_Start(ByVal "c RunWorkspace." [i_id], [p_i_id], " & _ StartTime As Currency) Private mstrSource As String " [com], [s_date], [it_val] )" ' Raise an event indicating that the step has begun execution Private mcRunSteps As cArrSteps Set qy = mdbsLoadDb.CreateQueryDef( _ RaiseEvent ProcessStart(mcExecStep, Private mcRunParams As cArrParameters gstrEmptyString, strInsert) msRunStepDtl, StartTime, mlngInstanceId) Private mcRunConstraints As cArrConstraints End Sub Private mcRunConnections As cConnections ' Call a procedure to assign the Querydef Private mcRunConnDtls As cConnDtls parameters Private Sub mcExecObj_Complete(ByVal Private mcvntWspPreCons As Variant Call AssignParameters(qy, EndTime As Currency, ByVal Elapsed As Private mcvntWspPostCons As Variant StartTime:=dtmStartTime, _ Long) Private mdbsLoadDb As Database StepId:=cStepRecord.StepId, _ Private mlngRunId As Long Version:=cStepRecord.VersionNo, _ On Error GoTo mcExecObj_CompleteErr Private mlngWorkspaceId As Long InstanceId:=lngInstanceId, _ Private mField As cStringSM Command:=strCommand) Debug.Print Elapsed Public CreateInputFiles As Boolean RaiseEvent qy.Execute dbFailOnError ProcessComplete(mcExecStep, EndTime, Private WithEvents mcRun As cRunInst qy.Close mlngInstanceId, Elapsed) Attribute mcRun.VB_VarHelpID = -1 mcTermProcess.ProcessTerminated #Else Public Event RunStart(dtmStartTime As Exit Sub Currency, strWspLog As String, lRunId As strInsert = strInsert & Str(mlngRunId) _ Long) & ", " & Str(cStepRecord.StepId) _ mcExecObj_CompleteErr: Public Event RunComplete(dtmEndTime As & ", " & Call LogErrors(Errors) Currency) mField.MakeStringFieldValid(cStepRecord.Version No) _ HP TPC-H FULL DISCLOSURE REPORT 247 © 2005 Hewlett-Packard Company. All rights reserved. & ", " & Str(lngInstanceId) _ mstrSource, _ Set cParamRec = mcRunParams(lngIndex) & ", " & Str(lParentInstanceId) _ & ", " & LoadResString(errUpdateRunDataFailed) qy.Parameters("p_name").Value = mField.MakeStringFieldValid(strCommand) cParamRec.ParameterName _ End Sub qy.Parameters("p_value").Value = & ", " & Str(dtmStartTime) _ Private Function cParamRec.ParameterValue & ", " & InsertRunHeader(dtmStartTime As Currency) qy.Execute dbFailOnError mField.MakeStringFieldValid(sItValue) As Long ' Inserts a new run header record into the Next lngIndex strInsert = strInsert & " ) " database ' and returns the id for the run qy.Close mdbsLoadDb.Execute strInsert, dbFailOnError Dim strInsert As String Exit Sub Dim qy As QueryDef #End If InsertRunParametersErr: On Error GoTo InsertRunHeaderErr LogErrors Errors Exit Sub mstrSource = mstrModuleName & strInsert = "insert into run_header " & _ "InsertRunParameters" InsertRunDetailErr: "( run_id, workspace_id, start_time ) " & On Error GoTo 0 LogErrors Errors _ Err.Raise vbObjectError + mstrSource = mstrModuleName & " values ( " & _ errUpdateRunDataFailed, _ "InsertRunDetail" " [r_id], [w_id], [s_date] )" mstrSource, _ On Error GoTo 0 LoadResString(errUpdateRunDataFailed) Err.Raise vbObjectError + Set qy = mdbsLoadDb.CreateQueryDef( _ errUpdateRunDataFailed, _ gstrEmptyString, strInsert) End Sub mstrSource, _ Private Sub AssignParameters(qyExec As ' Call a procedure to execute the Querydef DAO.QueryDef, _ LoadResString(errUpdateRunDataFailed) object Optional StartTime As Currency = 0, _ Call AssignParameters(qy, Optional EndTime As Currency = 0, _ End Sub StartTime:=dtmStartTime) Optional StepId As Long = 0, _ Private Sub UpdateRunDetail(cStepRecord Optional Version As String = gstrEmptyString, As cStep, _ qy.Execute dbFailOnError _ dtmEndTime As Currency, qy.Close Optional InstanceId As Long = 0, _ lngInstanceId As Long, lElapsed As Long) Optional ParentInstanceId As Long = 0, _ ' Updates the run detail record in the InsertRunHeader = mlngRunId Optional Command As String = database Exit Function gstrEmptyString, _ Optional Elapsed As Long = 0, _ Dim strUpdate As String InsertRunHeaderErr: Optional ItValue As String = gstrEmptyString) Dim qy As QueryDef LogErrors Errors ' Assigns values to the parameters in the querydef mstrSource = mstrModuleName & object On Error GoTo UpdateRunDetailErr "InsertRunHeader" On Error GoTo 0 Dim prmParam As DAO.Parameter strUpdate = "update run_step_details " & Err.Raise vbObjectError + _ errUpdateRunDataFailed, _ On Error GoTo AssignParametersErr " set end_time = [e_date], mstrSource, _ mstrSource = mstrModuleName & elapsed_time = [elapsed] " & _ "AssignParameters" " where run_id = [r_id] " & _ LoadResString(errUpdateRunDataFailed) " and step_id = [s_id] " & _ For Each prmParam In qyExec.Parameters " and version_no = [ver_no] " & _ End Function Select Case prmParam.Name " and instance_id = [i_id] " Private Sub Case "[w_id]" InsertRunParameters(dtmStartTime As prmParam.Value = mlngWorkspaceId Set qy = mdbsLoadDb.CreateQueryDef( _ Currency) gstrEmptyString, strUpdate) ' Inserts a new run header record into the Case "[r_id]" database prmParam.Value = mlngRunId ' Call a procedure to assign the Querydef ' and returns the id for the run parameters Case "[s_id]" Call AssignParameters(qy, Dim strInsert As String BugAssert StepId <> 0 EndTime:=dtmEndTime, _ Dim qy As QueryDef prmParam.Value = StepId StepId:=cStepRecord.StepId, _ Dim cParamRec As cParameter Version:=cStepRecord.VersionNo, _ Dim lngIndex As Long Case "[ver_no]" InstanceId:=lngInstanceId, BugAssert Not StringEmpty(Version) Elapsed:=lElapsed) On Error GoTo InsertRunParametersErr prmParam.Value = Version

qy.Execute dbFailOnError strInsert = "insert into run_parameters " & _ Case "[i_id]" qy.Close "( run_id, parameter_name, BugAssert InstanceId <> 0 parameter_value ) " & _ prmParam.Value = InstanceId Exit Sub " values ( " & _ " [r_id], [p_name], [p_value] )" Case "[p_i_id]" UpdateRunDetailErr: prmParam.Value = ParentInstanceId LogErrors Errors Set qy = mdbsLoadDb.CreateQueryDef( _ mstrSource = mstrModuleName & gstrEmptyString, strInsert) Case "[com]" "UpdateRunDetail" qy.Parameters("r_id").Value = mlngRunId BugAssert Not StringEmpty(Command) On Error GoTo 0 prmParam.Value = Command Err.Raise vbObjectError + For lngIndex = 0 To errUpdateRunDataFailed, _ mcRunParams.ParameterCount - 1 Case "[s_date]" HP TPC-H FULL DISCLOSURE REPORT 248 © 2005 Hewlett-Packard Company. All rights reserved. BugAssert StartTime <> 0 On Error GoTo ProcessStartProcessingErr prmParam.Value = StartTime On Error GoTo StepCompleteProcessingErr ' Insert the run detail into the database Case "[e_date]" Call InsertRunDetail(cStepRecord, ' Since ProcessComplete events won't be BugAssert EndTime <> 0 strCommand, dtmStartTime, lngInstanceId, _ triggered for manager steps prmParam.Value = EndTime lParentInstanceId, sItValue) If cStepRecord.StepType = gintManagerStep Then Case "[elapsed]" Exit Sub ' Update the run detail in the database prmParam.Value = Elapsed Call UpdateRunDetail(cStepRecord, ProcessStartProcessingErr: dtmEndTime, lngInstanceId, lElapsed) Case "[it_val]" ' Log the error code raised by Visual Basic End If prmParam.Value = ItValue Call LogErrors(Errors) mstrSource = mstrModuleName & Exit Sub Case Else "P rocessStartProcessing" ' Write the parameter name that is ShowError errUpdateRunDataFailed StepCompleteProcessingErr: faulty WriteError errUpdateRunDataFailed, ' Log the error code raised by Visual Basic WriteError errInvalidParameter, mstrSource Call LogErrors(Errors) mstrSource, _ ShowError errUpdateRunDataFailed prmParam.Name End Sub On Error GoTo 0 Private Sub StepStartProcessing(cStepRecord End Sub Err.Raise errInvalidParameter, As cStep, dtmStartTime As Currency, _ Private Sub RunCompleteProcessing(dtmEndTime mstrSource, _ lngInstanceId As Long, lParentInstanceId As Currency) As Long, sItValue As String) LoadResString(errInvalidParameter) On Error GoTo RunCompleteProcessingErr End Select On Error GoTo StepStartProcessingErr Next prmParam ' Update the header record with the end time for ' Since ProcessStart events won't be the run Exit Sub triggered for manager steps Call UpdateRunHeader(dtmEndTime) If cStepRecord.StepType = gintManagerStep AssignParametersErr: Then Exit Sub ' Insert the run detail into the database mstrSource = mstrModuleName & Call InsertRunDetail(cStepRecord, RunCompleteProcessingErr: "AssignParameters" cStepRecord.StepLabel, _ ' Log the error code raised by Visual Basic Call LogErrors(Errors) dtmStartTime, lngInstanceId, Call LogErrors(Errors) On Error GoTo 0 lParentInstanceId, sItValue) ShowError errUpdateRunDataFailed Err.Raise vbObjectError + End If errAssignParametersFailed, _ End Sub mstrSource, Exit Sub LoadResString(errAssignParametersFailed) Private Sub UpdateRunHeader(ByVal dtmEndTime StepStartProcessingErr: As Currency) End Sub ' Log the error code raised by Visual Basic ' Updates the run header record with the end date Private Sub Call LogErrors(Errors) RunStartProcessing(dtmStartTime As mstrSource = mstrModuleName & Dim strUpdate As String Currency) "StepStartProcessing" Dim qy As QueryDef ShowError errUpdateRunDataFailed On Error GoTo RunStartProcessingErr On Error GoTo UpdateRunHeaderErr End Sub ' Insert the run header into the database Private Sub strUpdate = "update run_header " & _ Call InsertRunHeader(dtmStartTime) ProcessCompleteProcessing(cStepRecord As " set end_time = [e_date] " & _ cStep, _ " where run_id = [r_id] " ' Insert the run parameters into the dtmStartTime As Currency, lngInstanceId database As Long, lElapsed As Long) Set qy = mdbsLoadDb.CreateQueryDef( _ Call InsertRunParameters(dtmStartTime) gstrEmptyString, strUpdate) On Error GoTo Exit Sub ProcessCompleteProcessingErr ' Call a procedure to execute the Querydef object Call AssignParameters(qy, RunStartProcessingErr: ' Insert the run detail into the database EndTime:=dtmEndTime) ' Log the error code raised by Visual Call UpdateRunDetail(cStepRecord, Basic dtmStartTime, lngInstanceId, lElapsed) qy.Execute dbFailOnError Call LogErrors(Errors) qy.Close mstrSource = mstrModuleName & Exit Sub "RunStartProcessing" Exit Sub ShowError errUpdateRunDataFailed ProcessCompleteProcessingErr: WriteError errUpdateRunDataFailed, ' Log the error code raised by Visual Basic UpdateRunHeaderErr: mstrSource Call LogErrors(Errors) LogErrors Errors mstrSource = mstrModuleName & mstrSource = mstrModuleName & End Sub "P rocessCompleteProcessing" "UpdateRunHeader" Private Sub ShowError errUpdateRunDataFailed On Error GoTo 0 ProcessStartProcessing(cStepRecord As Err.Raise vbObjectError + cStep, _ End Sub errUpdateRunDataFailed, _ strCommand As String, dtmStartTime Private Sub mstrSource, _ As Currency, lngInstanceId As Long, _ StepCompleteProcessing(cStepRecord As LoadResString(errUpdateRunDataFailed) lParentInstanceId As Long, sItValue As cStep, _ String) dtmEndTime As Currency, lngInstanceId End Sub As Long, lElapsed As Long) HP TPC-H FULL DISCLOSURE REPORT 249 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Let WorkspaceId(ByVal End Property vdata As Long) Private Function LoadRunData() As Boolean End Function mlngWorkspaceId = vdata Public Sub StopRun() End Property ' Loads the step, parameter and constraint Public Property Get WorkspaceId() As Long arrays On Error GoTo StopRunErr WorkspaceId = mlngWorkspaceId ' with all the data for the workspace. Returns End Property False If mcRun Is Nothing Then Public Sub RunWorkspace() ' if a failure occurs ' We haven't been the run yet, so do nothing Else Dim cRunSeq As cSequence Dim strWorkspaceName As String mcRun.StopRun Dim recWspSteps As Recordset End If On Error GoTo RunWorkspaceErr Dim qySteps As DAO.QueryDef Dim recWspParams As Recordset Exit Sub ' Call a procedure to load the module- Dim qyParams As DAO.QueryDef level structures Dim recWspConns As Recordset StopRunErr: ' with all the step and parameter data for Dim qyConns As DAO.QueryDef ' Log the error code raised by Visual Basic the run Dim recWspConnDtls As Recordset Call LogErrors(Errors) If LoadRunData = False Then Dim qyConnDtls As DAO.QueryDef ' Errors would have been displayed by the called ' Error handled by the function already process Exit Sub On Error GoTo LoadRunDataErr End If End Sub Set mcRunSteps.StepDB = mdbsLoadDb Public Sub AbortRun() ' Retrieve the next run identifier using the Set mcRunParams.ParamDatabase = sequence class mdbsLoadDb On Error GoTo AbortRunErr Set cRunSeq = New cSequence Set mcRunConstraints.ConstraintDB = Set cRunSeq.IdDatabase = dbsAttTool mdbsLoadDb If mcRun Is Nothing Then cRunSeq.IdentifierColumn = "run_id" Set mcRunConnections.ConnDb = ' We haven't been the run yet, so do nothing mlngRunId = cRunSeq.Identifier mdbsLoadDb Else Set cRunSeq = Nothing Set mcRunConnDtls.ConnDb = mcRun.Abort mdbsLoadDb End If Call mcRunParams.InitBuiltInsForRun(mlngWor ' Read all the step and parameter data for the Exit Sub kspaceId, mlngRunId) workspace Call AbortRunErr: Set mcRun.Constraints = ReadWorkspaceData(mlngWorkspaceId, ' Log the error code raised by Visual Basic mcRunConstraints mcRunSteps, _ Call LogErrors(Errors) mcRun.WspPreExecution = mcRunParams, mcRunConstraints, ' Errors would have been displayed by the called mcvntWspPreCons mcRunConnections, mcRunConnDtls, _ process mcRun.WspPostExecution = recWspSteps, qySteps, recWspParams, mcvntWspPostCons qyParams, recWspConns, qyConns, _ End Sub recWspConnDtls, qyConnDtls) Set mcRun.Steps = mcRunSteps Private Sub Class_Initialize() Set mcRun.Parameters = mcRunParams ' Load all the pre- and post-execution Set mcRun.RunConnections = constraints that ' Create instances of the step, parameter and mcRunConnections ' have been defined for the workspace constraint arrays Set mcRun.RunConnDtls = mcvntWspPreCons = Set mcRunSteps = New cArrSteps mcRunConnDtls mcRunConstraints.ConstraintsForWsp( _ Set mcRunParams = New cArrParameters mlngWorkspaceId, _ Set mcRunConstraints = New cArrConstraints mcRun.WspId = mlngWorkspaceId gintPreStep, _ Set mcRunConnections = New cConnections mcRun.RootKey = blnSort:=True, _ Set mcRunConnDtls = New cConnDtls LabelStep(mlngWorkspaceId) blnGlobalConstraintsOnly:=True) Set mcRun = New cRunInst mcRun.RunId = mlngRunId mcvntWspPostCons = Set mField = New cStringSM mcRun.CreateInputFiles = mcRunConstraints.ConstraintsForWsp( _ CreateInputFiles mlngWorkspaceId, _ End Sub gintPostStep, _ Private Sub Class_Terminate() mcRun.Run blnSort:=True, _ blnGlobalConstraintsOnly:=True) On Error GoTo UnLoadRunDataErr Exit Sub On Error Resume Next ' Clears the step, parameter and constraint arrays RunWorkspaceErr: recWspSteps.Close Set mcRunSteps = Nothing ' Log the error code raised by Visual qySteps.Close Set mcRunParams = Nothing Basic recWspParams.Close Set mcRunConstraints = Nothing Call LogErrors(Errors) qyParams.Close Set mcRunConnections = Nothing recWspConns.Close Set mcRunConnDtls = Nothing End Sub qyConns.Close Public Property Get LoadDb() As Database Set mcRun = Nothing LoadRunData = True Set mdbsLoadDb = Nothing Set LoadDb = mdbsLoadDb Set mField = Nothing Exit Function End Property Exit Sub Public Property Set LoadDb(vdata As LoadRunDataErr: Database) ' Log the error code raised by Visual Basic UnLoadRunDataErr: Call LogErrors(Errors) ' Log the error code raised by Visual Basic Set mdbsLoadDb = vdata ShowError errLoadRunDataFailed Call LogErrors(Errors) LoadRunData = False ' Not a critical error - continue HP TPC-H FULL DISCLOSURE REPORT 250 © 2005 Hewlett-Packard Company. All rights reserved. Resume Next Private Sub mcRun_StepStart(cStepRecord As pId.Value = glMinId cStep, dtmStartTime As Currency, _ Next pId End Sub lngInstanceId As Long, lParentInstanceId qyId.Execute dbFailOnError As Long, sPath As String, sIts As String, qyId.Close Private Sub sItValue As String) mcRun_ProcessComplete(cStepRecord As End Sub cStep, _ RaiseEvent StepStart(cStepRecord, Private Sub CreateIdRecordset() dtmEndTime As Currency, dtmStartTime, lngInstanceId, sPath, sIts) lngInstanceId As Long, lElapsed As Long) 'bugmessage "Step: " & Dim strSql As String cStepRecord.StepLabel & " has started." RaiseEvent ' Initialize the recordset with all identifiers ProcessComplete(cStepRecord, Call StepStartProcessing(cStepRecord, strSql = "select * from att_identifiers" dtmEndTime, lngInstanceId) dtmStartTime, lngInstanceId, Set mrecIdentifiers = Call lParentInstanceId, sItValue) mdbsDatabase.OpenRecordset(strSql, ProcessCompleteProcessing(cStepRecord, dbOpenForwardOnly) dtmEndTime, lngInstanceId, lElapsed) End Sub If mrecIdentifiers.RecordCount = 0 Then End Sub VERSION 1.0 CLASS CreateIdRecord BEGIN Set mrecIdentifiers = Private Sub MultiUse = -1 'True mdbsDatabase.OpenRecordset(strSql, mcRun_ProcessStart(cStepRecord As cStep, END dbOpenForwardOnly) _ Attribute VB_Name = "cSequence" End If strCommand As String, dtmStartTime Attribute VB_GlobalNameSpace = False As Currency, lngInstanceId As Long, _ Attribute VB_Creatable = True BugAssert mrecIdentifiers.RecordCount <> 0 lParentInstanceId As Long, sItValue As Attribute VB_PredeclaredId = False String) Attribute VB_Exposed = False End Sub ' FILE: cSequence.cls RaiseEvent ProcessStart(cStepRecord, ' Microsoft TPC-H Kit Ver. 1.00 Public Property Set IdDatabase(vdata As Database) strCommand, dtmStartTime, lngInstanceId) ' Copyright Microsoft, 1999 Call ProcessStartProcessing(cStepRecord, ' All Rights Reserved Set mdbsDatabase = vdata strCommand, dtmStartTime, lngInstanceId, ' _ ' End Property lParentInstanceId, sItValue) ' PURPOSE: This class uses the att_identifiers table to generate unique Public Property Let IdentifierColumn(vdata As End Sub ' identifiers. String) ' Contact: Reshma Tharamal Private Sub ([email protected]) Dim intIndex As Integer mcRun_RunComplete(dtmEndTime As ' Currency) Option Explicit On Error GoTo IdentifierColumnErr

Debug.Print "Run ended at: " & Private mlngIdentifier As Long ' Initialize the return value to an empty string CStr(dtmEndTime) Private mstrIdentifierColumn As String mstrIdentifierColumn = mstrEmptyString Call Private mrecIdentifiers As Recordset Call CreateIdRecordset RunCompleteProcessing(dtmEndTime) Private mdbsDatabase As Database For intIndex = 0 To mrecIdentifiers.Fields.Count RaiseEvent RunComplete(dtmEndTime) Private Const mstrEmptyString = "" - 1

End Sub ' Used to indicate the source module name If Private Sub mcRun_RunStart(dtmStartTime when errors LCase(Trim(mrecIdentifiers.Fields(intIndex).Name As Currency, strWspLog As String) ' are raised by this class )) = _ Private mstrSource As String LCase(Trim(vdata)) Then RaiseEvent RunStart(dtmStartTime, Private Const mstrModuleName As String = strWspLog, mlngRunId) "c Sequence." ' Valid column name Debug.Print "Run started at: " & mstrIdentifierColumn = vdata CStr(dtmStartTime) Private Sub CreateIdRecord() Exit Property ' Creates a record with all identifiers having End If Call RunStartProcessing(dtmStartTime) an initial value of 1 Next intIndex End Sub Dim sSql As String Private Sub Dim pId As DAO.Parameter BugAssert True, "Invalid column name!" mcRun_StepComplete(cStepRecord As Dim qyId As DAO.QueryDef cStep, _ Exit Property dtmEndTime As Currency, sSql = "insert into att_identifiers (" & _ lngInstanceId As Long, lElapsed As Long) " workspace_id, parameter_id, step_id, IdentifierColumnErr: " & _ LogErrors Errors RaiseEvent StepComplete(cStepRecord, " constraint_id, run_id, connection_id " mstrSource = mstrModuleName & dtmEndTime, lngInstanceId) & _ "IdentifierColumn" ' BugMessage "Step: " & ", " & FLD_ID_CONN_NAME & _ On Error GoTo 0 cStepRecord.StepLabel & " has completed!" " ) values ( " & _ Err.Raise vbObjectError + "[w_id], [p_id], [s_id], [c_id], [r_id], errIdentifierColumnFailed, _ Call [conn_id], [conn_dtl_id] )" mstrSource, _ StepCompleteProcessing(cStepRecord, Set qyId = LoadResString(errIdentifierColumnFailed) dtmEndTime, lngInstanceId, lElapsed) mdbsDatabase.CreateQueryDef(gstrEmptyStri ng, sSql) End Property End Sub For Each pId In qyId.Parameters Public Property Get Identifier() As Long HP TPC-H FULL DISCLOSURE REPORT 251 © 2005 Hewlett-Packard Company. All rights reserved. Dim strSql As String Public Property Get Item(ByVal Position As ' Long) As Object Option Explicit On Error GoTo GetIdentifierErr Attribute Item.VB_UserMemId = 0 ' Local variable(s) to hold property value(s) BugAssert mstrIdentifierColumn <> Set Item = mcVector(Position) Private mlngStepId As Long mstrEmptyString Private mstrVersionNo As String End Property Private mstrStepLabel As String ' Increment the identifier column by 1 Private mstrStepTextFile As String strSql = "update att_identifiers " & _ Public Sub Push(objToPush As Object) Private mstrStepText As String " set " & mstrIdentifierColumn & _ Private mstrStartDir As String " = " & mstrIdentifierColumn & " + 1" mcVector.Add objToPush Private mlngWorkspaceId As Integer mdbsDatabase.Execute strSql, Private mlngParentStepId As Integer dbFailOnError End Sub Private mstrParentVersionNo As String Public Sub Clear() Private mintSequenceNo As Integer ' Refresh the recordset with identifier Private mintStepLevel As Integer values mcVector.Clear Private mblnEnabledFlag As Boolean Call CreateIdRecordset Private mstrDegreeParallelism As String End Sub Private mintExecutionMechanism As Integer mlngIdentifier = Private mstrFailureDetails As String mrecIdentifiers.Fields(mstrIdentifierColumn Public Function Pop() As Object Private mintContinuationCriteria As Integer ).Value Private mblnGlobalFlag As Boolean If mcVector.Count > 0 Then Private mblnArchivedFlag As Boolean Identifier = mlngIdentifier Set Pop = Private mstrOutputFile As String mcVector.Delete(mcVector.Count - 1) 'Private mstrLogFile As String Exit Property Else Private mstrErrorFile As String Set Pop = Nothing Private mdbsDatabase As Database GetIdentifierErr: End If Private mintStepType As Integer LogErrors Errors Private mintOperation As Operation mstrSource = mstrModuleName & End Function Private mlngPosition As Long "Identifier" Public Function Count() As Long Private mstrIteratorName As String On Error GoTo 0 Private mcIterators As cNodeCollections Err.Raise vbObjectError + Count = mcVector.Count Private mbIsNewVersion As Boolean errGetIdentifierFailed, _ Private msOldVersion As String mstrSource, _ End Function ' The following constants are used throughout the LoadResString(errGetIdentifierFailed) project to Private Sub Class_Initialize() ' indicate the different options selected by the user End Property ' The options are presented to the user as control Private Sub Class_Terminate() Set mcVector = New cVector arrays of ' option buttons. These constants have to be in sync mrecIdentifiers.Close End Sub with the ' indexes of the option buttons. End Sub ' All the control arrays have an lbound of 1. The Private Sub Class_Terminate() value 0 is VERSION 1.0 CLASS ' used to indicate that the property being represented BEGIN Set mcVector = Nothing by the MultiUse = -1 'True ' control array is not valid for the step END End Sub ' Public enums are used since we cannot expose Attribute VB_Name = "cStack" public constants Attribute VB_GlobalNameSpace = False ' in class modules. gintNoOption is applicable to all Attribute VB_Creatable = True VERSION 1.0 CLASS enums, Attribute VB_PredeclaredId = False BEGIN ' but declared in the Execution method enum, since Attribute VB_Exposed = False MultiUse = -1 'True we cannot ' FILE: cStack.cls END ' declare it more than once. ' Microsoft TPC-H Kit Ver. 1.00 Attribute VB_Name = "cStep" ' Copyright Microsoft, 1999 Attribute VB_GlobalNameSpace = False ' Is here as a comment ' All Rights Reserved Attribute VB_Creatable = True ' Has been defined in public.bas with the other ' Attribute VB_PredeclaredId = False object types ' Attribute VB_Exposed = False 'Public Enum gintStepType ' PURPOSE: This class implements a Attribute VB_Ext_KEY = ' gintGlobalStep = 3 stack of objects. "SavedWithClassBuilder" ,"Yes" ' gintManagerStep ' Contact: Reshma Tharamal Attribute VB_Ext_KEY = "Top_Level" ,"Yes" ' gintWorkerStep ([email protected]) ' FILE: cStep.cls 'End Enum ' ' Microsoft TPC-H Kit Ver. 1.00 Option Explicit ' Copyright Microsoft, 1999 ' Execution Method options ' All Rights Reserved Public Enum ExecutionMethod ' Used to indicate the source module name ' gintNoOption = 0 when errors ' gintExecuteODBC ' are raised by this class ' PURPOSE: Encapsulates the properties gintExecuteShell Private Const mstrModuleName As String = and methods of a step. End Enum "c Stack." ' Contains functions to insert, update Private mstrSource As String and delete ' Failure criteria options ' att_steps records from the database. Public Enum FailureCriteria Private mcVector As cVector ' Contact: Reshma Tharamal gintFailureODBC = 1 Private mlngCount As Long ([email protected]) gintFailureTextCompare HP TPC-H FULL DISCLOSURE REPORT 252 © 2005 Hewlett-Packard Company. All rights reserved. End Enum Case UpdateOp Else cItRec.Update mlngStepId, Iterators = cStepIterators() ' Continuation criteria options mstrVersionNo End If ' Note: Update the initialization of cItRec.IndOperation = QueryOp gsContCriteria in Initialize() if the Call QuickSort(Iterators) ' continuation criteria are modified Case DeleteOp Public Enum ContinuationCriteria cItRec.Delete mlngStepId, Exit Function gintOnFailureAbort = 1 mstrVersionNo gintOnFailureContinue ' Remove the record from the IteratorsErr: gintOnFailureCompleteSiblings collection LogErrors Errors gintOnFailureAbortSiblings mcIterators.Delete lngIndex On Error GoTo 0 gintOnFailureSkipSiblings Err.Raise vbObjectError + errIteratorsFailed, _ gintOnFailureAsk End Select mstrModuleName & "Iterators", _ End Enum Next lngIndex LoadResString(errIteratorsFailed)

' The initial version # Exit Sub End Function Private Const mstrMinVersion As String = Public Function IteratorCount() As Long "0 .0" SaveIteratorsErr: ' Returns a count of all the iterators for the step LogErrors Errors ' End of constants for option button control mstrSource = mstrModuleName & Dim lngItCount As Long arrays "SaveIterators" Dim lngIndex As Long ' Used to indicate the source module name On Error GoTo 0 Dim cTempIt As cIterator when errors Err.Raise vbObjectError + errSaveFailed, _ ' are raised by this class mstrSource, _ On Error GoTo IteratorsErr Private mstrSource As String LoadResString(errSaveFailed) Private Const mstrModuleName As String = lngItCount = 0 "c Step." End Sub For lngIndex = 0 To mcIterators.Count - 1 Public Property Get IndOperation() As ' The cSequence class is used to generate Operation If mcIterators(lngIndex).IndOperation <> unique step identifiers DeleteOp Then Private mStepSeq As cSequence IndOperation = mintOperation lngItCount = lngItCount + 1 End If ' The StringSM class is used to carry out End Property string operations Public Property Let IndOperation(ByVal vdata Next lngIndex Private mFieldValue As cStringSM As Operation) Private Sub NewVersion() IteratorCount = lngItCount BugAssert vdata = QueryOp Or vdata = mbIsNewVersion = True InsertOp Or vdata = UpdateOp Or vdata = Exit Function msOldVersion = mstrVersionNo DeleteOp, "Invalid operation" mintOperation = vdata IteratorsErr: End Sub LogErrors Errors Public Function IsNewVersion() As Boolean End Property On Error GoTo 0 IsNewVersion = mbIsNewVersion Err.Raise vbObjectError + errIteratorsFailed, _ End Function Public Function Iterators() As Variant mstrSource, _ ' Returns a variant containing all the iterators LoadResString(errIteratorsFailed) Public Function OldVersionNo() As String that OldVersionNo = msOldVersion ' have been defined for the step End Function End Function Public Sub Validate() Dim cStepIterators() As cIterator ' Each distinct object will have a Validate method Public Sub SaveIterators() Dim cTempIt As cIterator which ' This procedure checks if any changes Dim lngIndex As Long ' will check if the class properties are valid. This have been made Dim lngItCount As Long method ' to the iterators for the step. If so, it calls ' will be used to check interdependant properties the On Error GoTo IteratorsErr that ' methods of the iterator class to commit ' cannot be validated by the let procedures. the changes lngItCount = 0 ' It should be called by the add and modify Dim cItRec As cIterator For lngIndex = 0 To mcIterators.Count - 1 methods of the class Dim lngIndex As Long ' Increase the array dimension and add the constraint ' Check if the step label has been specified On Error GoTo SaveIteratorsErr ' to it If StringEmpty(mstrStepLabel) Then Set cTempIt = mcIterators(lngIndex) ShowError errStepLabelMandatory For lngIndex = 0 To mcIterators.Count - 1 On Error GoTo 0 Set cItRec = mcIterators(lngIndex) If cTempIt.IndOperation <> DeleteOp Err.Raise vbObjectError + errValidateFailed, _ Then "Validate", Select Case cItRec.IndOperation ReDim Preserve LoadResString(errValidateFailed) Case QueryOp cStepIterators(lngItCount) End If ' No changes were made to the Set cStepIterators(lngItCount) = queried Step. cTempIt If Not IsStringEmpty(mstrStepText) And Not ' Do nothing lngItCount = lngItCount + 1 IsStringEmpty(mstrStepTextFile) Then End If ShowError errStepTextOrFile Case InsertOp On Error GoTo 0 cItRec.Add mlngStepId, Next lngIndex Err.Raise vbObjectError + errStepTextOrFile, mstrVersionNo _ cItRec.IndOperation = QueryOp If lngItCount = 0 Then "Validate", Iterators = Empty LoadResString(errStepTextOrFile) HP TPC-H FULL DISCLOSURE REPORT 253 © 2005 Hewlett-Packard Company. All rights reserved. End If LoadResString(errIncVersionXFailed) cCloneStep.ParentVersionNo = mstrParentVersionNo End Sub End Function cCloneStep.StepLevel = mintStepLevel cCloneStep.SequenceNo = mintSequenceNo Public Function IncVersionY() As String cCloneStep.EnabledFlag = mblnEnabledFlag ' The version number for a step is stored Private Function GetY(strVersion As String) cCloneStep.DegreeParallelism = in the x.y As Long mstrDegreeParallelism ' format where x is the parent component ' The version number for a step is stored in cCloneStep.ExecutionMechanism = and y is the the x.y mintExecutionMechanism ' child component of the step. This ' format where x is the parent component and cCloneStep.FailureDetails = mstrFailureDetails function will increment y is the cCloneStep.ContinuationCriteria = ' the y component of the step by 1 ' child component of the step. Given an mintContinuationCriteria argument of type cCloneStep.ArchivedFlag = mblnArchivedFlag On Error GoTo IncVersionYErr ' x.y, it returns y cCloneStep.OutputFile = mstrOutputFile ' cCloneStep.LogFile = mstrLogFile ' Store the old version number for the step ' Truncate the fractional part to get the parent cCloneStep.ErrorFile = mstrErrorFile Call NewVersion component cCloneStep.IteratorName = mstrIteratorName ' of the version number (x.y) mstrVersionNo = GetY = Val(Mid(strVersion, cCloneStep.IndOperation = mintOperation Trim$(Str$(GetX(mstrVersionNo))) & InStr(strVersion, gstrVerSeparator) + 1)) cCloneStep.Position = mlngPosition gstrVerSeparator & _ Trim$(Str(GetY(mstrVersionNo) + End Function Set cCloneStep.NodeDB = mdbsDatabase 1)) Private Function GetX(strVersion As String) IncVersionY = mstrVersionNo As Long ' Clone all the iterators for the step ' The version number for a step is stored in For lngIndex = 0 To mcIterators.Count - 1 Exit Function the x.y Set cItRec = mcIterators(lngIndex) ' format where x is the parent component and Set cItClone = cItRec.Clone IncVersionYErr: y is the cCloneStep.LoadIterator cItClone ' Log the error code raised by Visual ' child component of the step. Given an Next lngIndex Basic argument of type Call LogErrors(Errors) ' x.y, it returns x ' And set the return value to the newly created gstrSource = mstrModuleName & step "IncVersionY" ' Truncate the fractional part to get the parent Set Clone = cCloneStep On Error GoTo 0 component Err.Raise vbObjectError + ' of the version number (x.y) Exit Function errIncVersionYFailed, _ GetX = Val(Left(strVersion, gstrSource, _ InStr(strVersion, gstrVerSeparator) - 1)) CloneErr: LogErrors Errors LoadResString(errIncVersionYFailed) End Function mstrSource = mstrModuleName & "Clone" On Error GoTo 0 End Function Public Function Clone(Optional cCloneStep As Err.Raise vbObjectError + errCloneFailed, _ Public Function IncVersionX() As String cStep) As cStep mstrSource, LoadResString(errCloneFailed) ' The version number for a step is stored in the x.y ' Creates a copy of a given step End Function ' format where x is the parent component 'End Sub and y is the Dim lngIndex As Long ' ' child component of the step. This Dim cItRec As cIterator Public Property Let OutputFile(ByVal vdata As function will increment Dim cItClone As cIterator String) ' the y component of the step by 1 and reset the x component On Error GoTo CloneErr mstrOutputFile = vdata ' to 0 If cCloneStep Is Nothing Then End Property On Error GoTo IncVersionXErr Set cCloneStep = New cStep End If Public Property Get OutputFile() As String ' Store the old version number for the step Call NewVersion ' Copy all the step properties to the newly OutputFile = mstrOutputFile created step mstrVersionNo = ' Initialize the global flag first since End Property Trim$(Str$(GetX(mstrVersionNo) + 1)) & subsequent gstrVerSeparator & "0" ' validations might depend on it 'Public Property Let LogFile(ByVal vdata As IncVersionX = mstrVersionNo cCloneStep.GlobalFlag = mblnGlobalFlag String) ' cCloneStep.GlobalRunMethod = ' Exit Function mintGlobalRunMethod ' mstrLogFile = vdata ' IncVersionXErr: cCloneStep.StepType = mintStepType 'End Property ' Log the error code raised by Visual cCloneStep.StepId = mlngStepId ' Basic cCloneStep.VersionNo = mstrVersionNo 'Public Property Get LogFile() As String Call LogErrors(Errors) cCloneStep.StepLabel = mstrStepLabel ' gstrSource = mstrModuleName & cCloneStep.StepTextFile = mstrStepTextFile ' LogFile = mstrLogFile "IncVersionX" cCloneStep.StepText = mstrStepText ' On Error GoTo 0 cCloneStep.StartDir = mstrStartDir 'End Property Err.Raise vbObjectError + cCloneStep.WorkspaceId = errIncVersionXFailed, _ mlngWorkspaceId Public Property Let ErrorFile(ByVal vdata As gstrSource, _ cCloneStep.ParentStepId = String) mlngParentStepId HP TPC-H FULL DISCLOSURE REPORT 254 © 2005 Hewlett-Packard Company. All rights reserved. mstrErrorFile = vdata End Property " parent_step_id, parent_version_no, sequence_no, " & _ End Property Public Property Get ArchivedFlag() As " enabled_flag, step_level, " & _ Public Property Let IteratorName(ByVal Boolean " degree_parallelism, execution_mechanism, " vdata As String) & _ ArchivedFlag = mblnArchivedFlag " failure_details, " & _ mstrIteratorName = vdata " continuation_criteria, global_flag, " & _ End Property " archived_flag, " & _ End Property " output_file_name, error_file_name, " & _ Public Property Get GlobalFlag() As Boolean " iterator_name ) values ( " Public Property Get ErrorFile() As String GlobalFlag = mblnGlobalFlag ' log_file_name, ErrorFile = mstrErrorFile End Property #If USE_JET Then End Property Public Property Get IteratorName() As Public Sub Add() strInsert = strInsert & " [w_id], [s_id], [ver_no], " String ' Inserts a step record into the database - it & _ initializes " [s_label], [s_file_name], [s_text], IteratorName = mstrIteratorName ' the necessary properties for the step and [s_start_dir], " & _ calls InsertStepRec " [p_step_id], [p_version_no], [seq_no], " & _ End Property ' to do the database work " [enabled], [s_level], [deg_parallelism], " & _ " [exec_mechanism], [fail_dtls], " & _ Public Property Set NodeDB(vdata As On Error GoTo AddErr " [cont_criteria], [global], [archived], " & _ Database) " [output_file], [error_file], " & _ ' A new record would have the deleted_flag " [it_name] ) " Set mdbsDatabase = vdata turned off! Set mcIterators.NodeDB = vdata mblnArchivedFlag = False ' [log_file],

End Property Call InsertStepRec Set qy = Public Property Get NodeDB() As Database mdbsDatabase.CreateQueryDef(gstrEmptyString, ' If a new version of a step has been created, strInsert) Set NodeDB = mdbsDatabase reset the old version info, since ' it's already been saved to the db ' Call a procedure to execute the Querydef object End Property If IsNewVersion() Then Call AssignParameters(qy) mbIsNewVersion = False Private Function IsStringEmpty(strToCheck msOldVersion = gstrEmptyString qy.Execute dbFailOnError As String) As Boolean End If qy.Close #Else IsStringEmpty = (strToCheck = Exit Sub gstrEmptyString) strInsert = strInsert & Str(mlngWorkspaceId) AddErr: & ", " & Str(mlngStepId) & _ End Function LogErrors Errors ", " & On Error GoTo 0 mFieldValue.MakeStringFieldValid(mstrVersionNo Public Property Let EnabledFlag(ByVal Err.Raise vbObjectError + ) vdata As Boolean) errAddStepFailed, _ mstrModuleName & "Add", ' For fields that may be null, call a function to ' The enabled flag must be False for all LoadResString(errAddStepFailed) determine global steps. End Sub ' the string to be appended to the insert statement ' This check must be made by the global Private Sub InsertStepRec() strInsert = strInsert & ", " & step class. Only ' Inserts a step record into the database mFieldValue.MakeStringFieldValid(mstrStepLabel) ' generic step validations will be carried ' It first generates the insert statement using strInsert = strInsert & ", " & out by this the different mFieldValue.MakeStringFieldValid(mstrStepTextF ' class ' step properties and then executes it ile) mblnEnabledFlag = vdata strInsert = strInsert & ", " & Dim strInsert As String mFieldValue.MakeStringFieldValid(mstrStepText) End Property Dim qy As DAO.QueryDef strInsert = strInsert & ", " & mFieldValue.MakeStringFieldValid(mstrStartDir) Public Property Let GlobalFlag(ByVal vdata On Error GoTo InsertStepRecErr As Boolean) strInsert = strInsert & ", " & ' First check if the database object is valid Str(mlngParentStepId) & _ mblnGlobalFlag = vdata Call CheckDB ", " & mFieldValue.MakeStringFieldValid(mstrParentVer End Property ' Check if the step record is valid sionNo) & _ Public Property Get EnabledFlag() As Call Validate ", " & Str(mintSequenceNo) & _ Boolean ", " & Str(mblnEnabledFlag) & ", " & If IsNewVersion() Then Str(mintStepLevel) EnabledFlag = mblnEnabledFlag Call UpdOldVersionsArchFlg End If strInsert = strInsert & ", " & End Property mFieldValue.MakeStringFieldValid(mstrDegreePar ' Create a temporary querydef object allelism) Public Property Let ArchivedFlag(ByVal strInsert = "insert into att_steps " & _ strInsert = strInsert & ", " & vdata As Boolean) "( workspace_id, step_id, version_no, " & Str(mintExecutionMechanism) _ mblnArchivedFlag = vdata " step_label, step_file_name, step_text, start_directory, " & _ HP TPC-H FULL DISCLOSURE REPORT 255 © 2005 Hewlett-Packard Company. All rights reserved. strInsert = strInsert & ", " & Err.Raise vbObjectError + mFieldValue.MakeStringFieldValid(mstrFai errModifyStepFailed, _ UpdateIteratorVersionErr: lureDetails) & _ mstrSource, mstrSource = mstrModuleName & ", " & Str(mintContinuationCriteria) & LoadResString(errModifyStepFailed) "UpdateIteratorVersion" _ End If LogErrors Errors ", " & Str(mblnGlobalFlag) & _ On Error GoTo 0 ", " & Str(mblnArchivedFlag) qy.Close Err.Raise vbObjectError + errUpdateFailed, _ mstrSource, strInsert = strInsert & ", " & #Else LoadResString(errUpdateFailed) mFieldValue.MakeStringFieldValid(mstrOu tputFile) sUpdate = "update att_steps " & _ End Sub ' strInsert = strInsert & ", " & " set archived_flag = True " Public Sub AddIterator(cItRecord As cIterator) mFieldValue.MakeStringFieldValid(mstrLo ' Adds the iterator record to the collection of gFile) sUpdate = sUpdate & " where step_id = "& iterators strInsert = strInsert & ", " & Str(mlngStepId) & _ ' for the step mFieldValue.MakeStringFieldValid(mstrErr " and version_no <> " & orFile) mFieldValue.MakeStringFieldValid(mstrVersi Call mcIterators.Add(cItRecord) strInsert = strInsert & ", " & onNo) mFieldValue.MakeStringFieldValid(mstrIter End Sub atorName) BugMessage sUpdate Public Sub AddAllIterators() mdbsDatabase.Execute sUpdate, ' Sets the indicator variable for all iterators to strInsert = strInsert & " ) " dbFailOnError insert #End If BugMessage strInsert Dim lngIndex As Long mdbsDatabase.Execute strInsert, Exit Sub dbFailOnError For lngIndex = 0 To mcIterators.Count - 1 UpdOldVersionsArchFlgErr: mcIterators(lngIndex).Validate #End If mstrSource = mstrModuleName & mcIterators(lngIndex).IndOperation = InsertOp "UpdOldVersionsArchFlg" Next lngIndex Exit Sub LogErrors Errors On Error GoTo 0 End Sub InsertStepRecErr: Err.Raise vbObjectError + mstrSource = mstrModuleName & errModifyStepFailed, _ Public Sub LoadIterator(cItRecord As cIterator) "InsertStepRec" mstrSource, ' Adds the iterator record to the collection of LogErrors Errors LoadResString(errModifyStepFailed) iterators On Error GoTo 0 End Sub ' for the step Err.Raise vbObjectError + Public Sub InsertIterator(cItRecord As errInsertStepFailed, _ cIterator) Call mcIterators.Load(cItRecord) mstrSource, ' Inserts the iterator record into the database LoadResString(errInsertStepFailed) End Sub End Sub Call cItRecord.Add(mlngStepId, Public Sub UnloadIterators() Private Sub UpdOldVersionsArchFlg() mstrVersionNo) ' Unloads all iterator records for the step ' Updates the archived flag on all old version for the step to True End Sub Dim lngIndex As Long Public Sub UpdateIterator(cItRecord As Dim sUpdate As String cIterator) For lngIndex = mcIterators.Count - 1 To 0 Step - Dim qy As DAO.QueryDef ' Updates the iterator record in the database 1 ' Calls the collection method to unload the On Error GoTo Call cItRecord.Update(mlngStepId, node UpdOldVersionsArchFlgErr mstrVersionNo) ' from the array mstrSource = mstrModuleName & mcIterators.Unload lngIndex "UpdOldVersionsArchFlg" End Sub Next lngIndex Public Sub UpdateIteratorVersion() #If USE_JET Then ' Updates the iterator record in the database End Sub Public Sub ModifyIterator(cItRecord As cIterator) sUpdate = "update att_steps " & _ Dim lngIndex As Long ' Modifies the iterator record in the collection " set archived_flag = True " Dim cTempIt As cIterator Call mcIterators.Modify(cItRecord) ' Append the Where clause On Error GoTo UpdateIteratorVersionErr sUpdate = sUpdate & " where step_id = End Sub [s_id] " & _ For lngIndex = 0 To mcIterators.Count - 1 Public Sub DeleteIterator(cItRecord As cIterator) " and version_no <> [ver_no]" ' Increase the array dimension and add the ' Deletes the iterator record from the database constraint Set qy = ' to it Call cItRecord.Delete(mlngStepId, mdbsDatabase.CreateQueryDef(gstrEmptyS Set cTempIt = mcIterators(lngIndex) mstrVersionNo) tring, sUpdate) If cTempIt.IndOperation <> DeleteOp End Sub ' Call a procedure to execute the Querydef Then Public Sub RemoveIterator(cItRecord As cIterator) object ' Set the operation to indicate an insert ' Marks the iterator record in the collection to Call AssignParameters(qy) cTempIt.IndOperation = InsertOp ' indicate a delete qy.Execute dbFailOnError End If Call mcIterators.Delete(cItRecord.Position) If qy.RecordsAffected = 0 Then Next lngIndex On Error GoTo 0 End Sub Exit Sub HP TPC-H FULL DISCLOSURE REPORT 256 © 2005 Hewlett-Packard Company. All rights reserved. Case "[error_file]" " , sequence_no = [seq_no] " & _ Private Sub AssignParameters(qyExec As prmParam.Value = mstrErrorFile " , step_level = [s_level] " & _ DAO.QueryDef) Case "[it_name]" " , enabled_flag = [enabled] " & _ ' Assigns values to the parameters in the prmParam.Value = mstrIteratorName " , degree_parallelism = [deg_parallelism] " & querydef object Case Else _ ' The parameter names are cryptic to make ' Write the parameter name that is " , execution_mechanism = [exec_mechanism] them different faulty " & _ ' from the actual field names. When the WriteError errInvalidParameter, " , failure_details = [fail_dtls] " & _ parameter names mstrSource, _ " , continuation_criteria = [cont_criteria] " & _ ' are the same as the field names, prmParam.Name " , global_flag = [global] " & _ parameters in the On Error GoTo 0 " , archived_flag = [archived] " & _ ' where clause do not get created. Err.Raise errInvalidParameter, " , output_file_name = [output_file] " & _ mstrSource, _ " , error_file_name = [error_file] " & _ Dim prmParam As DAO.Parameter " , iterator_name = [it_name] " LoadResString(errInvalidParameter) On Error GoTo AssignParametersErr End Select ' ", log_file_name = [log_file] " & _ mstrSource = mstrModuleName & Next prmParam "AssignParameters" ' Append the Where clause If qyExec.Parameters("s_id") = 0 Or strUpdate = strUpdate & " where step_id = [s_id] For Each prmParam In StringEmpty(qyExec.Parameters("ver_no")) " & _ qyExec.Parameters Then " and version_no = [ver_no]" Select Case prmParam.Name WriteError errInvalidParameter, Case "[w_id]" mstrSource Set qy = prmParam.Value = On Error GoTo 0 mdbsDatabase.CreateQueryDef(gstrEmptyString, mlngWorkspaceId Err.Raise errInvalidParameter, strUpdate) Case "[s_id]" mstrSource, prmParam.Value = mlngStepId LoadResString(errInvalidParameter) ' Call a procedure to execute the Querydef object Case "[ver_no]" End If Call AssignParameters(qy) prmParam.Value = qy.Execute dbFailOnError mstrVersionNo Exit Sub Case "[s_label]" If qy.RecordsAffected = 0 Then prmParam.Value = mstrStepLabel AssignParametersErr: On Error GoTo 0 Case "[s_file_name]" Err.Raise vbObjectError + prmParam.Value = mstrSource = mstrModuleName & errModifyStepFailed, _ mstrStepTextFile "AssignParameters" mstrSource, Case "[s_text]" Call LogErrors(Errors) LoadResString(errModifyStepFailed) prmParam.Value = mstrStepText On Error GoTo 0 End If Case "[s_start_dir]" Err.Raise vbObjectError + prmParam.Value = mstrStartDir errAssignParametersFailed, _ qy.Close Case "[p_step_id]" mstrSource, prmParam.Value = LoadResString(errAssignParametersFailed) #Else mlngParentStepId Case "[p_version_no]" End Sub strUpdate = "update att_steps " & _ prmParam.Value = " set step_label = " mstrParentVersionNo Public Sub Modify() Case "[seq_no]" ' For fields that may be null, call a function to prmParam.Value = Dim strUpdate As String determine mintSequenceNo Dim qy As QueryDef ' the string to be appended to the update statement Case "[enabled]" strUpdate = strUpdate & prmParam.Value = On Error GoTo ModifyErr mFieldValue.MakeStringFieldValid(mstrStepLabel) mblnEnabledFlag mstrSource = mstrModuleName & "Modify" Case "[s_level]" strUpdate = strUpdate & " , step_file_name = " & prmParam.Value = mintStepLevel ' Check if the database object is valid mFieldValue.MakeStringFieldValid(mstrStepTextF Case "[deg_parallelism]" Call CheckDB ile) prmParam.Value = strUpdate = strUpdate & " , step_text = " & mstrDegreeParallelism ' Check if the step record is valid mFieldValue.MakeStringFieldValid(mstrStepText) Case "[exec_mechanism]" Call Validate strUpdate = strUpdate & " , start_directory = " & prmParam.Value = mFieldValue.MakeStringFieldValid(mstrStartDir) mintExecutionMechanism ' The step_id and version_no will never be Case "[fail_dtls]" updated - strUpdate = strUpdate & " , workspace_id = " & prmParam.Value = ' whenever a step is modified a copy of the Str(mlngWorkspaceId) & _ mstrFailureDetails old step will " , parent_step_id = " & Str(mlngParentStepId) Case "[cont_criteria]" ' be created with an incremented version_no & _ prmParam.Value = " , parent_version_no = " & mintContinuationCriteria #If USE_JET Then mFieldValue.MakeStringFieldValid(mstrParentVer Case "[global]" sionNo) & _ prmParam.Value = strUpdate = "update att_steps " & _ " , sequence_no = " & Str(mintSequenceNo) & mblnGlobalFlag " set step_label = [s_label] " & _ _ Case "[archived]" " , step_file_name = [s_file_name] " & _ " , step_level = "& Str(mintStepLevel) & _ prmParam.Value = " , step_text = [s_text] " & _ " , enabled_flag = " & Str(mblnEnabledFlag) mblnArchivedFlag " , start_directory = [s_start_dir] " & _ & _ Case "[output_file]" " , workspace_id = [w_id] " & _ " , degree_parallelism = " & prmParam.Value = mstrOutputFile " , parent_step_id = [p_step_id] " & _ mFieldValue.MakeStringFieldValid(mstrDegreePar ' Case "[log_file]" " , parent_version_no = [p_version_no] " allelism) & _ ' prmParam.Value = mstrLogFile & _ HP TPC-H FULL DISCLOSURE REPORT 257 © 2005 Hewlett-Packard Company. All rights reserved. " , execution_mechanism = " & ' mdbsDatabase.Execute strDelete, Public Property Let ParentStepId(ByVal vdata As Str(mintExecutionMechanism) & _ dbFailOnError Long) " , failure_details = " & Set qy = mlngParentStepId = vdata mFieldValue.MakeStringFieldValid(mstrFai mdbsDatabase.CreateQueryDef(gstrEmptyStri End Property lureDetails) & _ ng, strDelete) " , continuation_criteria = " & Public Property Get SequenceNo() As Integer Str(mintContinuationCriteria) & _ Call AssignParameters(qy) " , global_flag = " & qy.Execute dbFailOnError SequenceNo = mintSequenceNo Str(mblnGlobalFlag) & _ " , archived_flag = " & qy.Close End Property Str(mblnArchivedFlag) & _ " , output_file_name = " & Exit Sub Public Property Get StepLevel() As Integer mFieldValue.MakeStringFieldValid(mstrOu StepLevel = mintStepLevel tputFile) & _ DeleteErr: End Property " , error_file_name = " & LogErrors Errors mFieldValue.MakeStringFieldValid(mstrErr On Error GoTo 0 Public Property Get ParentVersionNo() As String orFile) & _ Err.Raise vbObjectError + ParentVersionNo = mstrParentVersionNo " , iterator_name = " & errDeleteStepFailed, _ End Property mFieldValue.MakeStringFieldValid(mstrIter mstrModuleName & "Delete", atorName) LoadResString(errDeleteStepFailed) Public Property Let ParentVersionNo(ByVal vdata End Sub As String) ' " , log_file_name = " & Public Property Get DegreeParallelism() As mstrParentVersionNo = vdata mFieldValue.MakeStringFieldValid(mstrLo String End Property gFile) & _ DegreeParallelism = mstrDegreeParallelism Public Property Get ParentStepId() As Long strUpdate = strUpdate & " where step_id ParentStepId = mlngParentStepId = " & Str(mlngStepId) & _ End Property End Property " and version_no = " & Public Property Get Position() As Long mFieldValue.MakeStringFieldValid(mstrVe Public Property Let WorkspaceId(ByVal vdata As rsionNo) Position = mlngPosition Long) mlngWorkspaceId = vdata BugMessage strUpdate End Property End Property mdbsDatabase.Execute strUpdate, dbFailOnError Public Property Let DegreeParallelism(ByVal Public Property Let VersionNo(ByVal vdata As #End If vdata As String) String) ' The version number of a step is stored in the x.y Exit Sub ' The degree of parallelism must be zero for format where all global steps ' x represents a change to the step as a result of ModifyErr: ' This check must be made by the global step modifications LogErrors Errors class. Only ' to any of the step properties mstrSource = mstrModuleName & ' generic step validations will be carried out ' y represents a change to the step as a result of "Modify" by this modifications On Error GoTo 0 ' class ' to the sub-steps associated with it. Hence the y- Err.Raise vbObjectError + mstrDegreeParallelism = vdata component errModifyStepFailed, _ ' of the version will be incremented when a sub- mstrSource, End Property step is added, LoadResString(errModifyStepFailed) ' modified or deleted End Sub Public Property Let ' x will be referred to throughout this code as the Private Sub CheckDB() ExecutionMechanism(ByVal vdata As parent ' Check if the database object has been ExecutionMethod) ' component of the version and y will be referred initialized to as the BugAssert vdata = gintExecuteODBC Or ' child component of the version If mdbsDatabase Is Nothing Then vdata = gintExecuteShell Or vdata = ' The version information for a step is maintained ShowError errInvalidDB gintNoOption, _ by the On Error GoTo 0 "Execution mechanism invalid" ' calling function Err.Raise vbObjectError + mintExecutionMechanism = vdata errInvalidDB, _ mstrVersionNo = vdata mstrModuleName, End Property LoadResString(errInvalidDB) End Property End If Public Property Let FailureDetails(ByVal vdata As String) Public Property Get StepType() As gintStepType End Sub mstrFailureDetails = vdata On Error GoTo StepTypeErr Public Sub Delete() End Property If mintStepType = 0 Then Dim strDelete As String Public Property Let SequenceNo(ByVal vdata ' The step type variable has not been initialized Dim qy As DAO.QueryDef As Integer) - mintSequenceNo = vdata If mblnGlobalFlag Then On Error GoTo DeleteErr End Property mintStepType = gintGlobalStep ElseIf IsStringEmpty(mstrStepText) And _ Call CheckDB Public Property Let Position(ByVal vdata As IsStringEmpty(mstrStepTextFile) Then Long) mintStepType = gintManagerStep strDelete = "delete from att_steps " & _ mlngPosition = vdata Else " where step_id = [s_id] " & _ End Property mintStepType = gintWorkerStep " and version_no = [ver_no] " End If HP TPC-H FULL DISCLOSURE REPORT 258 © 2005 Hewlett-Packard Company. All rights reserved. End If ' classes - only generic step validations will ' The check will have to be made by the user be made interface and StepType = mintStepType ' by this class ' by the manager step class BugAssert vdata = mstrStepLabel = vdata Exit Property gintOnFailureAbortSiblings Or vdata = End Property gintOnFailureCompleteSiblings _ StepTypeErr: Or vdata = Public Property Get StepLabel() As String LogErrors Errors gintOnFailureSkipSiblings Or vdata = StepLabel = mstrStepLabel mstrSource = mstrModuleName & gintOnFailureAbort _ End Property "StepType" Or vdata = gintOnFailureContinue On Error GoTo 0 Or vdata = gintOnFailureAsk _ Public Property Let StartDir(ByVal vdata As Err.Raise vbObjectError + Or vdata = gintNoOption, _ String) errGetStepTypeFailed, _ "Invalid continuation criteria" mstrStartDir = vdata mstrSource, _ mintContinuationCriteria = vdata End Property

LoadResString(errGetStepTypeFailed) End Property Public Property Get StartDir() As String Public Property Get ExecutionMechanism() As StartDir = mstrStartDir End Property ExecutionMethod End Property

Public Property Let StepType(vdata As ExecutionMechanism = Public Property Get VersionNo() As String gintStepType) mintExecutionMechanism ' The version number of a step is stored in the x.y format where On Error GoTo StepTypeErr End Property ' x represents a change to the step as a result of modifications Select Case vdata ' to any of the step properties Case gintGlobalStep, gintManagerStep, Public Property Get FailureDetails() As String ' y represents a change to the step as a result of gintWorkerStep modifications mintStepType = vdata FailureDetails = mstrFailureDetails ' to the sub-steps associated with it. Hence the y- component Case Else End Property ' of the version will be incremented when a sub- On Error GoTo 0 step is added, Err.Raise vbObjectError + Public Property Let StepText(ByVal vdata As ' modified or deleted errStepTypeInvalid, _ String) ' x will be referred to throughout this code as the mstrModuleName & ' Has to be null for manager steps parent "StepType", ' The check will have to be made by the user ' component of the version and y will be referred LoadResString(errStepTypeInvalid) interface or to as the End Select ' by the manager step class ' child component of the version Exit Property mstrStepText = vdata ' The version information for a step is maintained End Property by the StepTypeErr: Public Property Let StepLevel(ByVal vdata As ' calling function LogErrors Errors Integer) mstrSource = mstrModuleName & VersionNo = mstrVersionNo "StepType" ' The step level must be zero for all global On Error GoTo 0 steps End Property Err.Raise vbObjectError + ' This check must be made in the global step errLetStepTypeFailed, _ class Public Property Get StepId() As Long mstrSource, _ mintStepLevel = vdata StepId = mlngStepId LoadResString(errLetStepTypeFailed) End Property Public Property Get StepText() As String End Property End Property StepText = mstrStepText Public Property Get NextStepId() As Long End Property Public Property Get WorkspaceId() As Long Dim lngNextId As Long WorkspaceId = mlngWorkspaceId Public Property Let StepTextFile(ByVal vdata End Property As String) On Error GoTo NextStepIdErr ' Has to be null for manager steps Public Property Get ContinuationCriteria() ' The check will have to be made by the user ' First check if the database object is valid As ContinuationCriteria interface and Call CheckDB ' by the manager step class ContinuationCriteria = mstrStepTextFile = vdata ' Retrieve the next identifier using the sequence mintContinuationCriteria End Property class Set mStepSeq = New cSequence End Property Public Property Get StepTextFile() As String Set mStepSeq.IdDatabase = mdbsDatabase StepTextFile = mstrStepTextFile mStepSeq.IdentifierColumn = "step_id" Public Property Let End Property lngNextId = mStepSeq.Identifier ContinuationCriteria(ByVal vdata As Set mStepSeq = Nothing ContinuationCriteria) Public Property Let StepLabel(ByVal vdata As String) NextStepId = lngNextId ' The Continuation criteria must be null ' Cannot be null for manager steps Exit Property for all global steps ' But this check cannot be made here since ' and non-null for all manager and worker we do not know NextStepIdErr: steps ' at this point if the step being created is a LogErrors Errors ' These checks will have to be made by manager mstrSource = mstrModuleName & "NextStepId" the corresponding ' or a worker step On Error GoTo 0 Err.Raise vbObjectError + errStepIdGetFailed, _ HP TPC-H FULL DISCLOSURE REPORT 259 © 2005 Hewlett-Packard Company. All rights reserved. mstrSource, Else LoadResString(errStepIdGetFailed) For lTemp = 0 To StepRecords.StepCount - GetStepId = IIf(IsLabel(StepKey), 0, 1 MakeIdentifierValid(StepKey)) End Property If StepRecords(lTemp).StepType <> End If Public Property Let StepId(ByVal vdata As gintGlobalStep And Else Long) StepRecords(lTemp).ParentStepId = StepId GetStepId = StepId Then End If mlngStepId = vdata HasChild = True End Function Exit For VERSION 1.0 CLASS End Property End If BEGIN Next lTemp MultiUse = -1 'True Private Sub Class_Initialize() END End Property Attribute VB_Name = "cStringSM" ' Initialize the operation indicator variable Public Property Get ChildStep(Optional ByVal Attribute VB_GlobalNameSpace = False to Query StepKey As String, _ Attribute VB_Creatable = True ' It will be modified later by the collection Optional ByVal StepId As Long = 0) As Attribute VB_PredeclaredId = False class when cStep Attribute VB_Exposed = False ' inserts, updates or deletes are performed ' FILE: cStringSM.cls mintOperation = QueryOp Dim lTemp As Long ' Microsoft TPC-H Kit Ver. 1.00 mbIsNewVersion = False ' Copyright Microsoft, 1999 msOldVersion = gstrEmptyString Set ChildStep = Nothing ' All Rights Reserved StepId = GetStepId(StepKey, StepId) ' Set mFieldValue = New cStringSM ' Set mcIterators = New cNodeCollections For lTemp = 0 To StepRecords.StepCount - ' PURPOSE: This module contains common 1 procedures that can be used End Sub If StepRecords(lTemp).StepType <> ' to manipulate strings gintGlobalStep And ' It is called StringSM, since String is a Private Sub Class_Terminate() StepRecords(lTemp).ParentStepId = StepId Visual Basic keyword And _ ' Contact: Reshma Tharamal Set mFieldValue = Nothing StepRecords(lTemp).SequenceNo = ([email protected]) Set mcIterators = Nothing gintMinSequenceNo Then ' Set ChildStep = StepRecords(lTemp) Option Explicit End Sub Exit For End If ' Used to indicate the source module name when Next lTemp errors VERSION 1.0 CLASS ' are raised by this class BEGIN End Property Private mstrSource As String MultiUse = -1 'True Public Property Get NextStep(Optional ByVal Private Const mstrModuleName As String = END StepKey As String, _ "c StringSM." Attribute VB_Name = "cStepTree" Optional ByVal StepId As Long = 0) As Attribute VB_GlobalNameSpace = False cStep Private mstrText As String Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Dim lTemp As Long Private Const mstrNullValue = "null" Attribute VB_Exposed = False Dim cChildStep As cStep Private Const mstrSQ = "'" ' FILE: cStepTree.cls Private Const mstrEnvVarSeparator = "%" ' Microsoft TPC-H Kit Ver. 1.00 Set NextStep = Nothing Public Function InsertEnvVariables( _ ' Copyright Microsoft, 1999 StepId = GetStepId(StepKey, StepId) Optional ByVal strComString As String) As ' All Rights Reserved Set cChildStep = String ' StepRecords.QueryStep(StepId) ' This function replaces all environment variables ' in ' PURPOSE: Implements step navigation For lTemp = 0 To StepRecords.StepCount - ' the passed in string with their values - they are functions such as determining 1 ' enclosed by "%" ' the child of a step and so on. If StepRecords(lTemp).StepType <> ' Contact: Reshma Tharamal gintGlobalStep And _ Dim intPos As Integer ([email protected]) StepRecords(lTemp).ParentStepId = Dim intEndPos As Integer ' cChildStep.ParentStepId And _ Dim strEnvVariable As String Option Explicit StepRecords(lTemp).SequenceNo = Dim strValue As String cChildStep.SequenceNo + 1 Then Dim strCommand As String ' Used to indicate the source module name Set NextStep = StepRecords(lTemp) when errors Exit For On Error GoTo InsertEnvVariablesErr ' are raised by this class End If mstrSource = mstrModuleName & Private Const mstrModuleName As String = Next lTemp "InsertEnvVariables" "c StepTree." Private mstrSource As String End Property ' Initialize the return value of the function to the Private Function GetStepId(Optional ByVal ' passed in command Public StepRecords As cArrSteps StepKey As String, _ If IsStringEmpty(strComString) Then Public Property Get HasChild(Optional Optional ByVal StepId As Long = 0) As strCommand = mstrText ByVal StepKey As String, _ Long Else Optional ByVal StepId As Long = 0) If StepId = 0 Then strCommand = strComString As Boolean If StringEmpty(StepKey) Then End If Err.Raise vbObjectError + Dim lTemp As Long errMandatoryParameterMissing, _ intPos = InStr(strCommand, mstrModuleName & "GetStepId", mstrEnvVarSeparator) HasChild = False LoadResString(errMandatoryParameterMissin Do While intPos <> 0 StepId = GetStepId(StepKey, StepId) g) HP TPC-H FULL DISCLOSURE REPORT 260 © 2005 Hewlett-Packard Company. All rights reserved. ' Extract the environment variable from MakeStringFieldValid = mstrSQ & Err.Raise vbObjectError + errParseStringFailed, the passed strTemp & mstrSQ _ ' in string mstrSource, _ intEndPos = InStr(intPos + 1, End If LoadResString(errParseStringFailed) strCommand, mstrEnvVarSeparator) strEnvVariable = Mid(strCommand, Exit Function End Function intPos + 1, intEndPos - intPos - 1) MakeStringFieldValidErr: Public Property Get Text() As String ' Get the value of the variable and call a mstrSource = mstrModuleName & Attribute Text.VB_UserMemId = 0 function "MakeStringFieldValid" Text = mstrText ' to replace the variable with it's value LogErrors Errors End Property strValue = Environ$(strEnvVariable) On Error GoTo 0 strCommand = Err.Raise vbObjectError + Public Property Let Text(ByVal vdata As String) ReplaceSubString(strCommand, _ errMakeFieldValidFailed, _ mstrText = vdata mstrEnvVarSeparator & mstrSource, End Property strEnvVariable & mstrEnvVarSeparator, _ LoadResString(errMakeFieldValidFailed) strValue) VERSION 1.0 CLASS End Function BEGIN intPos = InStr(strCommand, Public Function MakeDateFieldValid( _ MultiUse = -1 'True mstrEnvVarSeparator) Optional dtmField As Date = gdtmEmpty) END Loop As String Attribute VB_Name = "cSubStep" ' Returns a string that can be appended to Attribute VB_GlobalNameSpace = False InsertEnvVariables = strCommand any insert Attribute VB_Creatable = True Exit Function ' or modify (sql) statement Attribute VB_PredeclaredId = False Attribute VB_Exposed = False InsertEnvVariablesErr: ' Enclose the date in single quotes ' FILE: cSubStep.cls ' Log the error code raised by Visual MakeDateFieldValid = mstrSQ & dtmField ' Microsoft TPC-H Kit Ver. 1.00 Basic & mstrSQ ' Copyright Microsoft, 1999 Call LogErrors(Errors) ' All Rights Reserved ' Return an empty string End Function ' InsertEnvVariables = gstrEmptyString ' Private Function IsStringEmpty(strToCheck ' PURPOSE: This module encapsulates the End Function As String) As Boolean properties of sub-steps Public Function MakeStringFieldValid( _ ' that are used during the execution of a Optional strField As String = If strToCheck = gstrEmptyString Then workspace. gstrEmptyString) As String IsStringEmpty = True ' Contact: Reshma Tharamal ' Returns a string that can be appended to Else ([email protected]) any insert IsStringEmpty = False ' ' or modify (sql) statement End If Option Explicit ' If an argument is not passed to this function, the End Function ' Used to indicate the source module name when ' default text property is used Public Function ReplaceSubString(ByVal errors MainString As String, _ ' are raised by this class Dim strTemp As String ByVal ReplaceString As String, _ Private Const mstrModuleName As String = ByVal ReplaceWith As String) As String "c SubStep" On Error GoTo MakeStringFieldValidErr ' Replaces all occurrences of ReplaceString Private mlngStepId As Long If IsStringEmpty(strField) Then in MainString with ReplaceWith Private mintRunning As Integer ' Number of strTemp = mstrText running tasks Else Dim intPos As Integer Private mintComplete As Integer ' Number of strTemp = strField Dim strTemp As String completed tasks End If ' The last iterator for this sub-step On Error GoTo ReplaceSubStringErr Private mcLastIterator As cRunItDetails ' It checks whether the text is empty ' If so, it returns the string, "null" strTemp = MainString Public Function NewIteration(cStepRec As cStep) If IsStringEmpty(strTemp) Then As cIterator MakeStringFieldValid = intPos = InStr(strTemp, ReplaceString) ' Calls a procedure to determine the next iterator mstrNullValue Do While intPos <> 0 value Else strTemp = Left(strTemp, intPos - 1) & ' for the passed in step - returns the value to be ' Single-quotes have to be replaced by ReplaceWith & _ used two single-quotes, Mid(strTemp, intPos + ' in the iteration. ' since a single-quote is the identifier Len(ReplaceString)) ' It updates the instance node with the new delimiter intPos = InStr(intPos + iteration ' character - call a procedure to do the Len(ReplaceString) + 1, strTemp, ' for the step. replace ReplaceString) strTemp = ReplaceSubString(strTemp, Loop Dim cItRec As cIterator mstrSQ, mstrSQ & mstrSQ) ReplaceSubString = strTemp On Error GoTo NewIterationErr ' Replace pipe characters with the Exit Function corresponding chr function ' Call a function that will populate an iterator strTemp = ReplaceSubString(strTemp, ReplaceSubStringErr: record "|", "' & Chr(124) & '") Call LogErrors(Errors) ' with the iterator values mstrSource = mstrModuleName & Set cItRec = NextIteration(cStepRec) ' Enclose the string in single quotes "ReplaceSubString" On Error GoTo 0 ' Initialize the run node with the new iterator HP TPC-H FULL DISCLOSURE REPORT 261 © 2005 Hewlett-Packard Company. All rights reserved. ' values (mcLastIterator.RangeStep < 0 Err.Raise vbObjectError + errIterateFailed, If Not mcLastIterator Is Nothing Then And _ mstrModuleName, _ If cItRec Is Nothing Then (mcLastIterator.RangeFrom >= LoadResString(errIterateFailed) mcLastIterator.Value = mcLastIterator.RangeTo) And _ gstrEmptyString (mcLastIterator.RangeStep + End Sub Else lngValue) >= mcLastIterator.RangeTo) Then mcLastIterator.Value = cItRec.Value Set cItRec = New cIterator Private Sub InitializeItRange(vntIterators As cItRec.Value = Variant, ByVal lWorkspace As Long, _ ' And if the iterator is a list of values, Trim$(CStr(mcLastIterator.RangeStep + ColParameters As cArrParameters) then update lngValue)) ' the sequence number as well Else ' Initializes the LastIteration structure for range If mcLastIterator.IteratorType = Set cItRec = Nothing iterators from the gintValue Then End If ' passed in variant containing the iterator records mcLastIterator.Sequence = End If cItRec.SequenceNo Else Dim lngIndex As Long End If Set cItRec = Nothing Dim cItRec As cIterator End If End If End If On Error GoTo InitializeItRangeErr Set NextIteration = cItRec Set NewIteration = cItRec Exit Function If IsArray(vntIterators) And Not Set cItRec = Nothing IsEmpty(vntIterators) Then NextIterationErr: Exit Function ' Log the error code raised by Visual Basic ' Check if the iterator range has been Call LogErrors(Errors) completely initialized NewIterationErr: On Error GoTo 0 RangeComplete (vntIterators) ' Log the error code raised by Visual Err.Raise vbObjectError + errIterateFailed, Basic mstrModuleName, _ ' Initialize the Run node with the values for the Call LogErrors(Errors) LoadResString(errIterateFailed) From, On Error GoTo 0 ' To and Step boundaries Err.Raise vbObjectError + End Function For lngIndex = LBound(vntIterators) To errIterateFailed, mstrModuleName, _ Public Sub InitializeIt(cPendingStep As cStep, UBound(vntIterators) LoadResString(errIterateFailed) _ Set cItRec = vntIterators(lngIndex) ColParameters As cArrParameters, _ Select Case cItRec.IteratorType End Function Optional vntIterators As Variant) Case gintFrom Public Function NextIteration(cStepRec As mcLastIterator.RangeFrom = cStep) As cIterator ' Initializes the LastIteration structure with SubstituteParameters(cItRec.Value, lWorkspace, the iterator details for the WspParameters:=ColParameters) ' Retrieves the next iterator value for the ' passed in step Case gintTo passed in step - mcLastIterator.RangeTo = ' returns an iterator record with the new On Error GoTo InitializeItErr SubstituteParameters(cItRec.Value, lWorkspace, iterator values WspParameters:=ColParameters) If IsMissing(vntIterators) Then Case gintStep Dim cItRec As cIterator vntIterators = cPendingStep.Iterators mcLastIterator.RangeStep = Dim vntIterators As Variant End If SubstituteParameters(cItRec.Value, lWorkspace, Dim lngValue As String WspParameters:=ColParameters) If IsArray(vntIterators) And Not Case Else On Error GoTo NextIterationErr IsEmpty(vntIterators) Then On Error GoTo 0 mcLastIterator.IteratorName = Err.Raise vbObjectError + vnt Iterators = cStepRec.Iterators cPendingStep.IteratorName errTypeInvalid, mstrModuleName, _ If LoadResString(errTypeInvalid) If Not mcLastIterator Is Nothing Then vntIterators(LBound(vntIterators)).IteratorTyp End Select ' The run node contains the iterator e = _ Next lngIndex details gintValue Then ' Get the next value for the iterator mcLastIterator.IteratorType = mcLastIterator.Value = If mcLastIterator.IteratorType = gintValue Trim$(CStr(mcLastIterator.RangeFrom - gintValue Then ' Since the sequence numbers begin at 0 mcLastIterator.RangeStep)) ' Find the next iterator that appears in mcLastIterator.Sequence = End If the list of gintMinIteratorSequence - 1 ' iterator values Else Exit Sub Set cItRec = mcLastIterator.IteratorType = gintFrom NextInSequence(vntIterators, Call InitializeItRange(vntIterators, InitializeItRangeErr: mcLastIterator.Sequence) cPendingStep.WorkspaceId, _ ' Log the error code raised by Visual Basic Else ColParameters) Call LogErrors(Errors) lngValue = End If On Error GoTo 0 CLng(Trim$(mcLastIterator.Value)) Else Err.Raise vbObjectError + errIterateFailed, ' Determine whether the new iterator Set mcLastIterator = Nothing mstrModuleName, _ value falls in the End If LoadResString(errIterateFailed) ' range between From and To If (mcLastIterator.RangeStep > 0 Exit Sub End Sub And _ Private Function NextInSequence(vntIterators As (mcLastIterator.RangeFrom <= InitializeItErr: Variant, _ mcLastIterator.RangeTo) And _ ' Log the error code raised by Visual Basic lngOldSequence As Long) As cIterator (mcLastIterator.RangeStep + Call LogErrors(Errors) lngValue) <= mcLastIterator.RangeTo) Or _ On Error GoTo 0 Dim lngIndex As Long Dim cItRec As cIterator HP TPC-H FULL DISCLOSURE REPORT 262 © 2005 Hewlett-Packard Company. All rights reserved. On Error GoTo NextInSequenceErr TasksComplete = mintComplete Public Property Get Item(ByVal Position As Long) As cSubStep If IsArray(vntIterators) And Not End Property Attribute Item.VB_UserMemId = 0 IsEmpty(vntIterators) Then Public Property Let TasksComplete(ByVal For lngIndex = LBound(vntIterators) vdata As Integer) Set Item = mcSubSteps.Item(Position) To UBound(vntIterators) Set cItRec = vntIterators(lngIndex) mintComplete = vdata End Property If cItRec.IteratorType <> gintValue Then End Property Private Sub Class_Initialize() On Error GoTo 0 Public Property Get StepId() As Long Err.Raise vbObjectError + Set mcSubSteps = New cVector errTypeInvalid, mstrModuleName, _ StepId = mlngStepId End Sub LoadResString(errTypeInvalid) End Property End If Public Property Let StepId(ByVal vdata As Private Sub Class_Terminate() If cItRec.SequenceNo = Long) lngOldSequence + 1 Then Set mcSubSteps = Nothing Exit For mlngStepId = vdata End If End Sub End Property Next lngIndex VERSION 1.0 CLASS BEGIN VERSION 1.0 CLASS If cItRec.SequenceNo <> MultiUse = -1 'True BEGIN lngOldSequence + 1 Then END MultiUse = -1 'True Set cItRec = Nothing Attribute VB_Name = "cSubSteps" END End If Attribute VB_GlobalNameSpace = False Attribute VB_Name = "cTermProcess" Else Attribute VB_Creatable = True Attribute VB_GlobalNameSpace = False Set cItRec = Nothing Attribute VB_PredeclaredId = False Attribute VB_Creatable = True End If Attribute VB_Exposed = False Attribute VB_PredeclaredId = False ' FILE: cSubSteps.cls Attribute VB_Exposed = False Set NextInSequence = cItRec ' Microsoft TPC-H Kit Ver. 1.00 ' FILE: cTermProcess.cls ' Copyright Microsoft, 1999 ' Microsoft TPC-H Kit Ver. 1.00 Exit Function ' All Rights Reserved ' Copyright Microsoft, 1999 ' ' All Rights Reserved NextInSequenceErr: ' ' ' Log the error code raised by Visual ' PURPOSE: This module provides a type- ' Basic safe wrapper around cVector to ' PURPOSE: This module raises an event if a Call LogErrors(Errors) ' implement a collection of cSubStep completed step exists. On Error GoTo 0 objects. ' Contact: Reshma Tharamal Err.Raise vbObjectError + ' Contact: Reshma Tharamal ([email protected]) errIterateFailed, mstrModuleName, _ ([email protected]) ' LoadResString(errIterateFailed) ' Option Explicit Option Explicit End Function Private WithEvents moTimer As cTimerSM Private mcSubSteps As cVector Attribute moTimer.VB_VarHelpID = -1 Public Property Get LastIterator() As Private bTermProcessExists As Boolean cRunItDetails Public Sub Add(ByVal objItem As cSubStep) Public Event TermProcessExists()

Set LastIterator = mcLastIterator mcSubSteps.Add objItem Public Sub ProcessTerminated()

End Property End Sub bTermProcessExists = True Public Property Set LastIterator(vdata As moTimer.Enabled = True cRunItDetails) Public Sub Clear() End Sub Set mcLastIterator = vdata mcSubSteps.Clear Private Sub Class_Initialize() End Property End Sub bTermProcessExists = False Public Property Get TasksRunning() As Integer Set moTimer = New cTimerSM Public Function Count() As Long moTimer.Enabled = False TasksRunning = mintRunning Count = mcSubSteps.Count End Sub End Property End Function Private Sub Class_Terminate() Public Property Let TasksRunning(ByVal vdata As Integer) Set moTimer = Nothing Public Function Delete(ByVal lngDelete As mintRunning = vdata Long) As cSubStep End Sub

End Property Set Delete = mcSubSteps.Delete(lngDelete) Private Sub moTimer_Timer()

Public Property Get TasksComplete() As End Function On Error GoTo moTimer_TimerErr Integer HP TPC-H FULL DISCLOSURE REPORT 263 © 2005 Hewlett-Packard Company. All rights reserved. If bTermProcessExists Then Public Sub Add(ByVal citem As cTermStep) Attribute VB_GlobalNameSpace = False RaiseEvent TermProcessExists Attribute VB_Creatable = True End If Call mcTermSteps.Add(citem) Attribute VB_PredeclaredId = False moTimer.Enabled = True Attribute VB_Exposed = False moTimer.Enabled = False ' FILE: cTimer.cls bTermProcessExists = False End Sub ' Microsoft TPC-H Kit Ver. 1.00 ' Copyright Microsoft, 1999 Exit Sub Public Sub Clear() ' All Rights Reserved ' moTimer_TimerErr: mcTermSteps.Clear ' LogErrors Errors ' PURPOSE: This module implements a timer. End Sub ' Contact: Reshma Tharamal End Sub ([email protected]) Public Function Delete() ' VERSION 1.0 CLASS BEGIN Call mcTermSteps.Delete(0) Option Explicit MultiUse = -1 'True ' Disable the timer if there are no more END pending events Public Event Timer() Attribute VB_Name = "cTermStep" If mcTermSteps.Count = 0 Then Attribute VB_GlobalNameSpace = False moTimer.Enabled = False Private Const mnDefaultInterval As Long = 1 Attribute VB_Creatable = True Attribute VB_PredeclaredId = False End Function Private mnTimerID As Long Attribute VB_Exposed = False Private mnInterval As Long ' FILE: cTermStep.cls Public Property Get Item(ByVal Position As Private mfEnabled As Boolean ' Microsoft TPC-H Kit Ver. 1.00 Long) As cTermStep ' Copyright Microsoft, 1999 Public Property Get Interval() As Long ' All Rights Reserved Set Item = mcTermSteps(Position) Interval = mnInterval ' End Property ' End Property Public Property Let Interval(Value As Long) ' PURPOSE: This module encapsulates If mnInterval <> Value Then the properties of steps that Public Function Count() As Long mnInterval = Value ' have completed execution such as If mfEnabled Then status and time of completion. Count = mcTermSteps.Count SetInterval mnInterval, mnTimerID ' Contact: Reshma Tharamal End If ([email protected]) End Function End If ' End Property Option Explicit Private Sub Class_Initialize() Public Property Get Enabled() As Boolean Public TimeComplete As Currency Set mcTermSteps = New cVector Enabled = mfEnabled Public Index As Long End Property Public InstanceId As Long Set moTimer = New cTimerSM Public Property Let Enabled(Value As Boolean) Public ExecutionStatus As InstanceStatus moTimer.Enabled = False If mfEnabled <> Value Then If Value Then VERSION 1.0 CLASS End Sub mnTimerID = StartTimer(mnInterval) BEGIN If mnTimerID <> 0 Then MultiUse = -1 'True Private Sub Class_Terminate() mfEnabled = True END 'Storing Me in the global would add a Attribute VB_Name = "cTermSteps" Set mcTermSteps = Nothing reference to Me, which Attribute VB_GlobalNameSpace = False Set moTimer = Nothing ' would prevent Me from being released, Attribute VB_Creatable = True which in turn would Attribute VB_PredeclaredId = False End Sub ' prevent my Class_Terminate code from Attribute VB_Exposed = False running. To prevent ' FILE: cTermSteps.cls Private Sub moTimer_Timer() ' this, I store a "soft reference" - the ' Microsoft TPC-H Kit Ver. 1.00 collection holds a ' Copyright Microsoft, 1999 On Error GoTo moTimer_TimerErr ' pointer to me without incrementing my ' All Rights Reserved reference count. ' If mcTermSteps.Count > 0 Then gcTimerObjects.Add ObjPtr(Me), ' ' Since items are appended to the end of Str$(mnTimerID) ' PURPOSE: This module provides a the array End If type-safe wrapper around cVector to RaiseEvent Else ' implement a collection of TermStepExists(mcTermSteps(0)) StopTimer mnTimerID cTermStep objects. Raises an Else mfEnabled = False ' event if a step that has completed moTimer.Enabled = False gcTimerObjects.Remove Str$(mnTimerID) execution exists. End If End If ' Contact: Reshma Tharamal Exit Sub End If ([email protected]) End Property ' moTimer_TimerErr: Option Explicit LogErrors Errors Private Sub Class_Initialize() If gcTimerObjects Is Nothing Then Set Private mcTermSteps As cVector End Sub gcTimerObjects = New Collection Private WithEvents moTimer As cTimerSM VERSION 1.0 CLASS mnInterval = mnDefaultInterval Attribute moTimer.VB_VarHelpID = -1 BEGIN End Sub Public Event TermStepExists(cStepDetails MultiUse = -1 'True As cTermStep) END Private Sub Class_Terminate() Attribute VB_Name = "cTimerSM" Enabled = False HP TPC-H FULL DISCLOSURE REPORT 264 © 2005 Hewlett-Packard Company. All rights reserved. End Sub With Err Exit Sub If Err.Number > vbObjectError And Friend Sub Tick() Err.Number < (vbObjectError + 65536) Then LogMessageErr: RaiseEvent Timer errCode = .Number - vbObjectError Call LogErrors(Errors) End Sub Else ' Since write to the error file for the step has VERSION 1.0 CLASS errCode = .Number failed, write to the project log BEGIN End If Call WriteMessage(strMsg) MultiUse = -1 'True strError = "Error #: "& errCode & END vbCrLf End Sub Attribute VB_Name = "cVBErrorsSM" strError = strError & "Description: " & Public Property Set ErrorFile(vdata As Attribute VB_GlobalNameSpace = False .Description & vbCrLf EXECUTEDLLLib.Execute) Attribute VB_Creatable = True strError = strError & "Source: "& Attribute VB_PredeclaredId = False Err.Source & vbCrLf Set mcExecObjRef = vdata Attribute VB_Exposed = False End With Attribute VB_Ext_KEY = End Property "SavedWithClassBuilder" ,"Yes" Debug.Print strError Private Sub Class_Terminate() Attribute VB_Ext_KEY = "Top_Level" InitErrorString = strError ,"Yes" End If Set mcExecObjRef = Nothing ' FILE: cVBErrors.cls ' Microsoft TPC-H Kit Ver. 1.00 End Function End Sub ' Copyright Microsoft, 1999 Public Sub LogVBErrors() VERSION 1.0 CLASS ' All Rights Reserved BEGIN ' Dim strErr As String MultiUse = -1 'True ' END ' PURPOSE: This module encapsulates strErr = InitErrorString Attribute VB_Name = "cVector" the handling of Visual Basic errors. Attribute VB_GlobalNameSpace = False ' This module does not do any error On Error GoTo LogVBErrorsErr Attribute VB_Creatable = True handling - any error handler Attribute VB_PredeclaredId = False ' will erase the errors object! If Not StringEmpty(strErr) Then Attribute VB_Exposed = False ' Contact: Reshma Tharamal ' Write an error using the WriteError ' FILE: cVector.cls ([email protected]) method of the Execute object. ' Microsoft TPC-H Kit Ver. 1.00 ' If Not mcExecObjRef Is Nothing Then ' Copyright Microsoft, 1999 Option Explicit mcExecObjRef.WriteError strErr ' All Rights Reserved Else ' ' The Execute class exposes a method, WriteMessage strErr ' WriteError through which we can write to End If ' PURPOSE: This class implements an array of the End If objects. ' error log that is currently being used by the ' Contact: Reshma Tharamal Execute object. Store a reference to Err.Clear ([email protected]) ' Execute object locally. ' Private mcExecObjRef As Exit Sub Option Explicit EXECUTEDLLLib.Execute Public Sub WriteError(ByVal ErrorCode As LogVBErrorsErr: ' Used to indicate the source module name when errErrorConstants, _ Call LogErrors(Errors) errors Optional ByVal ErrorSource As String ' Since write to the error file for the step has ' are raised by this class = gstrEmptyString, _ failed, write to the project log Private mstrSource As String Optional ByVal OptArgs As String = Call WriteMessage(strErr) Private Const mstrModuleName As String = gstrEmptyString) "c Vector." End Sub Dim sError As String Public Sub DisplayErrors() ' Array counter Private mlngCount As Long sError = "StepMaster Error:" & Dim strErr As String Private mcarrItems() As Object ErrorCode & vbCrLf & LoadResString(ErrorCode) & vbCrLf strErr = InitErrorString Public Sub Add(ByVal objItem As Object) ' Adds the passed in Object variable to the array If Not StringEmpty(ErrorSource) Then If Not StringEmpty(strErr) Then sError = sError & "(Source: " & ' Display the error message On Error GoTo AddErr ErrorSource & ")" & vbCrLf MsgBox strErr End If End If ReDim Preserve mcarrItems(mlngCount) sError = sError & OptArgs Err.Clear ' Set the newly added element in the array to the Call LogMessage(sError) ' passed in variable End Sub Set mcarrItems(mlngCount) = objItem End Sub Public Sub LogMessage(strMsg As String) mlngCount = mlngCount + 1 Private Function InitErrorString() As String ' Initializes a string with all the properties On Error GoTo LogMessageErr Exit Sub of the ' Err object ' Write an error using the WriteError method AddErr: of the Execute object. LogErrors Errors Dim strError As String If Not mcExecObjRef Is Nothing Then gstrSource = mstrModuleName & "Add" Dim errCode As Long mcExecObjRef.WriteError strMsg On Error GoTo 0 Else Err.Raise vbObjectError + errLoadInArrayFailed, If Err.Number = 0 Then WriteMessage strMsg _ InitErrorString = gstrEmptyString End If mstrSource, _ Else LoadResString(errLoadInArrayFailed) HP TPC-H FULL DISCLOSURE REPORT 265 © 2005 Hewlett-Packard Company. All rights reserved. End Property End Sub Public Property Set Item(ByVal Position As Private Sub Class_Terminate() Public Sub Clear() Long, _ ByVal Value As Object) Call Clear ' Clear the array ReDim mcarrItems(0) ' Returns the element at the passed in End Sub mlngCount = 0 position in the array If Position >= 0 Then VERSION 1.0 CLASS End Sub ' If the passed in position is outside the BEGIN array MultiUse = -1 'True Public Function Delete(ByVal lngDelete As ' bounds, then resize the array END Long) As Object If Position >= mlngCount Then Attribute VB_Name = "cVectorLng" ReDim Preserve mcarrItems(Position) Attribute VB_GlobalNameSpace = False Dim lngIndex As Long mlngCount = Position + 1 Attribute VB_Creatable = True End If Attribute VB_PredeclaredId = False On Error GoTo DeleteErr Attribute VB_Exposed = False ' Set the newly added element in the array ' FILE: cVectorLng.cls If lngDelete < (mlngCount - 1) Then to the ' Microsoft TPC-H Kit Ver. 1.00 ' passed in variable ' Copyright Microsoft, 1999 ' We want to maintain the order of all Set mcarrItems(Position) = Value ' All Rights Reserved items in the Else ' ' array - so move all remaining On Error GoTo 0 ' elements in the array Err.Raise vbObjectError + ' PURPOSE: This class implements an array of ' up by 1 errItemDoesNotExist, mstrSource, _ longs. For lngIndex = lngDelete To LoadResString(errItemDoesNotExist) ' Contact: Reshma Tharamal mlngCount - 2 End If ([email protected]) MoveDown lngIndex ' Next lngIndex End Property Option Explicit Public Sub MoveUp(ByVal Position As Long) End If ' Moves the element at the passed in position ' Used to indicate the source module name when up by 1 errors ' Return the deleted node ' are raised by this class Set Delete = mcarrItems(mlngCount - 1) Dim cTemp As Object Private mstrSource As String Private Const mstrModuleName As String = ' Delete the last Node from the array If Position > 0 And Position < mlngCount "c VectorLng." mlngCount = mlngCount - 1 Then If mlngCount > 0 Then Set cTemp = mcarrItems(Position) ' Array counter ReDim Preserve mcarrItems(0 To Private mlngCount As Long mlngCount - 1) Set mcarrItems(Position) = Private mcarrItems() As Long Else mcarrItems(Position - 1) ReDim mcarrItems(0) Set mcarrItems(Position - 1) = cTemp Public Sub Add(ByVal lngItem As Long) End If End If ' Adds the passed in long variable to the array

Exit Function End Sub On Error GoTo AddErr Public Sub MoveDown(ByVal Position As DeleteErr: Long) ReDim Preserve mcarrItems(mlngCount) LogErrors Errors ' Moves the element at the passed in position mstrSource = mstrModuleName & down by 1 ' Set the newly added element in the array to the "Delete" ' passed in variable On Error GoTo 0 Dim cTemp As Object mcarrItems(mlngCount) = lngItem Err.Raise vbObjectError + mlngCount = mlngCount + 1 errDeleteArrayElementFailed, _ If Position >= 0 And Position < mlngCount - mstrSource, _ 1 Then Exit Sub Set cTemp = mcarrItems(Position) LoadResString(errDeleteArrayElementFaile AddErr: d) Set mcarrItems(Position) = LogErrors Errors mcarrItems(Position + 1) gstrSource = mstrModuleName & "Add" End Function Set mcarrItems(Position + 1) = cTemp On Error GoTo 0 Public Property Get Item(ByVal Position As End If Err.Raise vbObjectError + errLoadInArrayFailed, Long) As Object _ Attribute Item.VB_UserMemId = 0 End Sub mstrSource, _ LoadResString(errLoadInArrayFailed) ' Returns the element at the passed in Public Function Count() As Long position in the array End Sub If Position >= 0 And Position < Count = mlngCount Public Sub Clear() mlngCount Then Set Item = mcarrItems(Position) End Function ' Clear the array Else ReDim mcarrItems(0) On Error GoTo 0 Err.Raise vbObjectError + Private Sub Class_Initialize() End Sub errItemDoesNotExist, mstrSource, _ mlngCount = 0 Public Sub Delete(Optional ByVal Position As LoadResString(errItemDoesNotExist) Long = -1, _ End If End Sub Optional ByVal Item As Long = -1)

HP TPC-H FULL DISCLOSURE REPORT 266 © 2005 Hewlett-Packard Company. All rights reserved. ' The user can opt to delete either a For lngIndex = 0 To mlngCount - 1 specific item in mcarrItems(Position) = mcarrItems(Position - ' the list or the item at a specified position. If mcarrItems(lngIndex) = Item Then 1) If no Find = lngIndex mcarrItems(Position - 1) = lngTemp ' parameters are passed in, we delete the Exit Function End If element at End If ' position 0! End Sub Next lngIndex Public Sub MoveDown(ByVal Position As Long) Dim lngDelete As Long ' Moves the element at the passed in position Dim lngIndex As Long Find = -1 down by 1

On Error GoTo DeleteErr Exit Function Dim lngTemp As Long

If Position = -1 Then FindErr: If Position >= 0 And Position < mlngCount - 1 ' Since we can never store an element at LogErrors Errors Then position -1, mstrSource = mstrModuleName & "Find" lngTemp = mcarrItems(Position) ' we can be sure that the user is trying On Error GoTo 0 to delete Err.Raise vbObjectError + mcarrItems(Position) = mcarrItems(Position + ' a given item errItemNotFound, mstrSource, _ 1) lngDelete = Find(Item) LoadResString(errItemNotFound) mcarrItems(Position + 1) = lngTemp Else End If lngDelete = Position End Function End If Public Property Get Item(ByVal Position As End Sub Long) As Long If lngDelete < (mlngCount - 1) Then Attribute Item.VB_UserMemId = 0 Public Function Count() As Long

' We want to maintain the order of all ' Returns the element at the passed in Count = mlngCount items in the position in the array ' array - so move all remaining If Position >= 0 And Position < mlngCount End Function elements in the array Then ' up by 1 Item = mcarrItems(Position) For lngIndex = lngDelete To Else Private Sub Class_Initialize() mlngCount - 2 On Error GoTo 0 MoveDown lngIndex Err.Raise vbObjectError + mlngCount = 0 Next lngIndex errItemDoesNotExist, mstrSource, _ LoadResString(errItemDoesNotExist) End Sub End If End If

' Delete the last Node from the array End Property Private Sub Class_Terminate() mlngCount = mlngCount - 1 Public Property Let Item(ByVal Position As If mlngCount > 0 Then Long, _ Call Clear ReDim Preserve mcarrItems(0 To ByVal Value As Long) mlngCount - 1) End Sub Else ' Returns the element at the passed in ReDim mcarrItems(0) position in the array VERSION 1.0 CLASS End If If Position >= 0 Then BEGIN ' If the passed in position is outside the MultiUse = -1 'True Exit Sub array END ' bounds, then resize the array Attribute VB_Name = "cVectorStr" DeleteErr: If Position >= mlngCount Then Attribute VB_GlobalNameSpace = False LogErrors Errors ReDim Preserve mcarrItems(Position) Attribute VB_Creatable = True mstrSource = mstrModuleName & mlngCount = Position + 1 Attribute VB_PredeclaredId = False "Delete" End If Attribute VB_Exposed = False On Error GoTo 0 ' FILE: cVectorStr.cls Err.Raise vbObjectError + ' Set the newly added element in the array ' Microsoft TPC-H Kit Ver. 1.00 errDeleteArrayElementFailed, _ to the ' Copyright Microsoft, 1999 mstrSource, _ ' passed in variable ' All Rights Reserved mcarrItems(Position) = Value ' LoadResString(errDeleteArrayElementFaile Else ' d) On Error GoTo 0 ' PURPOSE: This class implements an array of Err.Raise vbObjectError + strings. End Sub errItemDoesNotExist, mstrSource, _ ' Contact: Reshma Tharamal Public Function Find(ByVal Item As Long) LoadResString(errItemDoesNotExist) ([email protected]) As Long End If ' Option Explicit ' Returns the position at which the passed End Property in value occurs Public Sub MoveUp(ByVal Position As Long) ' Used to indicate the source module name when ' in the array ' Moves the element at the passed in position errors up by 1 ' are raised by this class Dim lngIndex As Long Private mstrSource As String Dim lngTemp As Long Private Const mstrModuleName As String = On Error GoTo FindErr "c VectorStr." If Position > 0 And Position < mlngCount ' Find the element in the array to be Then ' Array counter deleted lngTemp = mcarrItems(Position) Private mlngCount As Long HP TPC-H FULL DISCLOSURE REPORT 267 © 2005 Hewlett-Packard Company. All rights reserved. Private mcarrItems() As String Next lngIndex End If

Public Sub Add(ByVal strItem As String) End If End Property ' Adds the passed in string variable to the Public Property Let Item(ByVal Position As Long, array ' Delete the last Node from the array _ mlngCount = mlngCount - 1 ByVal Value As String) On Error GoTo AddErr If mlngCount > 0 Then ReDim Preserve mcarrItems(0 To ' Returns the element at the passed in position in ReDim Preserve mcarrItems(mlngCount) mlngCount - 1) the array Else If Position >= 0 Then ' Set the newly added element in the array ReDim mcarrItems(0) ' If the passed in position is outside the array to the End If ' bounds, then resize the array ' passed in variable If Position >= mlngCount Then mcarrItems(mlngCount) = strItem Exit Sub ReDim Preserve mcarrItems(Position) mlngCount = mlngCount + 1 mlngCount = Position + 1 DeleteErr: End If Exit Sub Call LogErrors(Errors) mstrSource = mstrModuleName & "Delete" ' Set the newly added element in the array to AddErr: On Error GoTo 0 the Call LogErrors(Errors) Err.Raise vbObjectError + ' passed in variable gstrSource = mstrModuleName & "Add" errDeleteArrayElementFailed, _ mcarrItems(Position) = Value On Error GoTo 0 mstrSource, _ Else Err.Raise vbObjectError + On Error GoTo 0 errLoadInArrayFailed, _ LoadResString(errDeleteArrayElementFailed) Err.Raise vbObjectError + mstrSource, _ errItemDoesNotExist, mstrSource, _ End Sub LoadResString(errItemDoesNotExist) LoadResString(errLoadInArrayFailed) Public Function Find(ByVal Item As String) End If As Long End Sub End Property Public Sub Clear() ' Returns the position at which the passed in Public Sub MoveUp(ByVal Position As Long) value occurs ' Moves the element at the passed in position up ' Clear the array ' in the array by 1 ReDim mcarrItems(0) Dim lngIndex As Long Dim strTemp As String End Sub On Error GoTo FindErr If Position > 0 And Position < mlngCount Then Public Sub Delete(Optional ByVal Position mstrSource = mstrModuleName & "Find" strTemp = mcarrItems(Position) As Long = -1, _ Optional ByVal Item As String = -1) ' Find the element in the array to be deleted mcarrItems(Position) = mcarrItems(Position - ' The user can opt to delete either a For lngIndex = 0 To mlngCount - 1 1) specific item in mcarrItems(Position - 1) = strTemp ' the list or the item at a specified position. If mcarrItems(lngIndex) = Item Then End If If no Find = lngIndex ' parameters are passed in, we delete the Exit Function End Sub element at End If Public Sub MoveDown(ByVal Position As Long) ' position 0! ' Moves the element at the passed in position Next lngIndex down by 1 Dim lngDelete As Long Dim lngIndex As Long Find = -1 Dim strTemp As String

On Error GoTo DeleteErr Exit Function If Position >= 0 And Position < mlngCount - 1 mstrSource = mstrModuleName & Then "Delete" FindErr: strTemp = mcarrItems(Position) Call LogErrors(Errors) If Position = -1 Then mstrSource = mstrModuleName & "Find" mcarrItems(Position) = mcarrItems(Position + ' Since we can never store an element at On Error GoTo 0 1) position -1, Err.Raise vbObjectError + mcarrItems(Position + 1) = strTemp ' we can be sure that the user is trying errItemNotFound, mstrSource, _ End If to delete LoadResString(errItemNotFound) ' a given item End Sub lngDelete = Find(Item) End Function Else Public Property Get Item(ByVal Position As Public Function Count() As Long lngDelete = Position Long) As String End If Attribute Item.VB_UserMemId = 0 Count = mlngCount

If lngDelete < (mlngCount - 1) Then ' Returns the element at the passed in End Function position in the array ' We want to maintain the order of all If Position >= 0 And Position < mlngCount items in the Then Private Sub Class_Initialize() ' array - so move all remaining Item = mcarrItems(Position) elements in the array Else mlngCount = 0 ' up by 1 On Error GoTo 0 For lngIndex = lngDelete To Err.Raise vbObjectError + End Sub mlngCount - 2 errItemDoesNotExist, mstrSource, _ Private Sub Class_Terminate() MoveDown lngIndex LoadResString(errItemDoesNotExist) HP TPC-H FULL DISCLOSURE REPORT 268 © 2005 Hewlett-Packard Company. All rights reserved. Call Clear End Property Private Sub cStep_InsertIterator(cItRecord As cIterator) End Sub Private Function cStep_IncVersionY() As String Call mcStep.InsertIterator(cItRecord)

VERSION 1.0 CLASS cStep_IncVersionY = mcStep.IncVersionY End Sub BEGIN Private Function cStep_Iterators() As Variant MultiUse = -1 'True End Function END Private Function cStep_IsNewVersion() As cStep_Iterators = mcStep.Iterators Attribute VB_Name = "cWorker" Boolean Attribute VB_GlobalNameSpace = False cStep_IsNewVersion = End Function Attribute VB_Creatable = True mcStep.IsNewVersion Private Sub cStep_ModifyIterator(cItRecord As Attribute VB_PredeclaredId = False End Function cIterator) Attribute VB_Exposed = False Private Function cStep_OldVersionNo() As ' FILE: cWorker.cls String Call mcStep.ModifyIterator(cItRecord) ' Microsoft TPC-H Kit Ver. 1.00 cStep_OldVersionNo = ' Copyright Microsoft, 1999 mcStep.OldVersionNo End Sub ' All Rights Reserved End Function Private Sub cStep_RemoveIterator(cItRecord As ' cIterator) ' Private Function cStep_IncVersionX() As ' PURPOSE: Encapsulates the properties String Call mcStep.RemoveIterator(cItRecord) and methods of a worker step. ' Implements the cStep class - cStep_IncVersionX = mcStep.IncVersionX End Sub carries out initializations Private Sub cStep_UpdateIterator(cItRecord As ' and validations that are specific to End Function cIterator) worker steps. Private Sub cStep_UpdateIteratorVersion() ' Contact: Reshma Tharamal Call mcStep.UpdateIterator(cItRecord) ([email protected]) Call mcStep.UpdateIteratorVersion ' End Sub Option Explicit End Sub Private Sub cStep_AddIterator(cItRecord As cIterator) Implements cStep Private Function cStep_IteratorCount() As Long Call mcStep.AddIterator(cItRecord) ' Object variable to keep the step reference in cStep_IteratorCount = mcStep.IteratorCount End Sub Private mcStep As cStep End Function Private Property Let cStep_Position(ByVal RHS As ' Used to indicate the source module name Long) when errors Private Sub cStep_UnloadIterators() ' are raised by this class mcStep.Position = RHS Private mstrSource As String Call mcStep.UnloadIterators Private Const mstrModuleName As String = End Property "c Worker." End Sub Private Sub cStep_AddAllIterators() Private Property Get cStep_Position() As Long Private Sub cStep_SaveIterators() Call mcStep.AddAllIterators cStep_Position = mcStep.Position Call mcStep.SaveIterators End Sub End Property End Sub Private Property Let cStep_StartDir(ByVal Private Property Get cStep_IteratorName() As Private Function cStep_Clone(Optional cCloneStep RHS As String) String As cStep) As cStep

mcStep.StartDir = RHS cStep_IteratorName = mcStep.IteratorName Dim cNewWorker As cWorker

End Property End Property Set cNewWorker = New cWorker Private Property Let Set cStep_Clone = mcStep.Clone(cNewWorker) Private Property Get cStep_StartDir() As cStep_IteratorName(ByVal RHS As String) String End Function mcStep.IteratorName = RHS cStep_StartDir = mcStep.StartDir Private Sub StepTextOrFileEntered() End Property ' Checks if either the step text or the name of the End Property file containing Private Sub cStep_LoadIterator(cItRecord As ' the text has been entered Private Property Set cStep_NodeDB(RHS cIterator) ' If both of them are null or both of them are not As DAO.Database) null, Call mcStep.LoadIterator(cItRecord) ' the worker step is invalid and an error is raised Set mcStep.NodeDB = RHS If StringEmpty(mcStep.StepText) And End Sub StringEmpty(mcStep.StepTextFile) Then End Property Private Sub cStep_DeleteIterator(cItRecord As ShowError errStepTextAndFileNull cIterator) On Error GoTo 0 Private Property Get cStep_NodeDB() As Err.Raise vbObjectError + DAO.Database Call mcStep.DeleteIterator(cItRecord) errStepTextAndFileNull, _ mstrSource, Set cStep_NodeDB = mcStep.NodeDB End Sub LoadResString(errStepTextAndFileNull) End If HP TPC-H FULL DISCLOSURE REPORT 269 © 2005 Hewlett-Packard Company. All rights reserved. Private Property Get cStep_ArchivedFlag() As mstrModuleName, End Sub Boolean LoadResString(errContCriteriaInvalid) End Select Private Property Get cStep_IndOperation() cStep_ArchivedFlag = mcStep.ArchivedFlag As Operation End Property End Property cStep_IndOperation = Private Property Let mcStep.IndOperation Private Sub Class_Initialize() cStep_DegreeParallelism(ByVal RHS As String)

End Property ' Create the object mcStep.DegreeParallelism = RHS Set mcStep = New cStep Private Property Let End Property cStep_IndOperation(ByVal RHS As ' Initialize the object with valid values for a Operation) Worker step Private Property Get cStep_DegreeParallelism() As ' The global flag should be the first field to String mcStep.IndOperation = RHS be initialized ' since subsequent validations might try to cStep_DegreeParallelism = End Property check if the mcStep.DegreeParallelism ' step being created is global Private Property Get cStep_NextStepId() As mcStep.GlobalFlag = False End Property Long ' mcStep.GlobalRunMethod = gintNoOption mcStep.StepType = gintWorkerStep Private Sub cStep_Delete() cStep_NextStepId = mcStep.NextStepId End Sub mcStep.Delete End Property Private Sub Class_Terminate() End Sub Private Property Let ' Remove the step object cStep_OutputFile(ByVal RHS As String) Set mcStep = Nothing Private Property Get cStep_EnabledFlag() As Boolean mcStep.OutputFile = RHS End Sub Private Sub cStep_Add() cStep_EnabledFlag = mcStep.EnabledFlag End Property ' Call a private procedure to see if the step End Property Private Property Get cStep_OutputFile() As text has been String ' entered - since a worker step actually Private Property Let cStep_EnabledFlag(ByVal executes a step, entry RHS As Boolean) cStep_OutputFile = mcStep.OutputFile ' of the text is mandatory Call StepTextOrFileEntered mcStep.EnabledFlag = RHS End Property ' Call the Add method of the step class to End Property Private Property Let cStep_ErrorFile(ByVal carry out the insert RHS As String) mcStep.Add Private Property Let cStep_ExecutionMechanism(ByVal RHS As mcStep.ErrorFile = RHS End Sub ExecutionMethod)

End Property Private Property Get On Error GoTo ExecutionMechanismErr cStep_ContinuationCriteria() As mstrSource = mstrModuleName & Private Property Get cStep_ErrorFile() As ContinuationCriteria "c Step_ExecutionMechanism" String cStep_ContinuationCriteria = Select Case RHS cStep_ErrorFile = mcStep.ErrorFile mcStep.ContinuationCriteria Case gintExecuteShell, gintExecuteODBC mcStep.ExecutionMechanism = RHS End Property End Property 'Private Property Let cStep_LogFile(ByVal Case Else RHS As String) Private Property Let On Error GoTo 0 ' cStep_ContinuationCriteria(ByVal RHS As Err.Raise vbObjectError + ' mcStep.LogFile = RHS ContinuationCriteria) errExecutionMechanismInvalid, _ ' mstrSource, 'End Property ' The Continuation criteria must be non-null LoadResString(errExecutionMechanismInvalid) ' for all worker steps. End Select 'Private Property Get cStep_LogFile() As ' Check if the Continuation Criteria is valid String Select Case RHS Exit Property ' Case gintOnFailureAbortSiblings, ' cStep_LogFile = mcStep.LogFile gintOnFailureCompleteSiblings, _ ExecutionMechanismErr: ' gintOnFailureSkipSiblings, LogErrors Errors 'End Property gintOnFailureAbort, _ mstrSource = mstrModuleName & gintOnFailureContinue, "c Step_ExecutionMechanism" Private Property Let gintOnFailureAsk On Error GoTo 0 cStep_ArchivedFlag(ByVal RHS As mcStep.ContinuationCriteria = RHS Err.Raise vbObjectError + Boolean) errExecutionMechanismLetFailed, _ Case Else mstrSource, mcStep.ArchivedFlag = RHS On Error GoTo 0 LoadResString(errExecutionMechanismLetFailed) Err.Raise vbObjectError + End Property errContCriteriaInvalid, _ End Property

HP TPC-H FULL DISCLOSURE REPORT 270 © 2005 Hewlett-Packard Company. All rights reserved. Private Property Get End Property cStep_ExecutionMechanism() As mcStep.ParentVersionNo = RHS ExecutionMethod Private Property Get cStep_StepText() As String End Property cStep_ExecutionMechanism = cStep_StepText = mcStep.StepText mcStep.ExecutionMechanism Private Property Get cStep_ParentVersionNo() As String End Property End Property cStep_ParentVersionNo = Private Property Let cStep_StepTextFile(ByVal Private Property Let mcStep.ParentVersionNo RHS As String) cStep_FailureDetails(ByVal RHS As String) End Property mcStep.StepTextFile = RHS mcStep.FailureDetails = RHS Private Property Let End Property End Property cStep_SequenceNo(ByVal RHS As Integer) Private Property Get cStep_StepTextFile() As Private Property Get cStep_FailureDetails() mcStep.SequenceNo = RHS String As String End Property cStep_StepTextFile = mcStep.StepTextFile cStep_FailureDetails = mcStep.FailureDetails Private Property Get cStep_SequenceNo() As End Property Integer End Property Private Property Let cStep_StepType(RHS As cStep_SequenceNo = mcStep.SequenceNo gintStepType) Private Property Get cStep_GlobalFlag() As Boolean End Property mcStep.StepType = gintWorkerStep

cStep_GlobalFlag = mcStep.GlobalFlag Private Property Let cStep_StepId(ByVal RHS End Property As Long) End Property Private Property Get cStep_StepType() As mcStep.StepId = RHS gintStepType Private Property Let cStep_GlobalFlag(ByVal RHS As Boolean) End Property cStep_StepType = mcStep.StepType

' Set the global flag to false - this flag is Private Property Get cStep_StepId() As Long End Property initialized when ' an instance of the class is created. Just cStep_StepId = mcStep.StepId Private Sub cStep_Validate() making sure that ' The validate routines for each of the steps will ' nobody changes the value inadvertently End Property ' carry out the specific validations for the type mcStep.GlobalFlag = False and ' call the generic validation routine End Property Private Property Let cStep_StepLabel(ByVal Private Sub cStep_Modify() RHS As String) On Error GoTo cStep_ValidateErr

' Call a private procedure to see if the step mcStep.StepLabel = RHS ' Validations specific to worker steps text has been ' entered - since a worker step actually End Property ' Check if the step text or a file name has been executes a step, entry ' specified ' of the text is mandatory Private Property Get cStep_StepLabel() As Call StepTextOrFileEntered Call StepTextOrFileEntered String mcStep.Validate ' Call the Modify method of the step class cStep_StepLabel = mcStep.StepLabel to carry out the update Exit Sub mcStep.Modify End Property cStep_ValidateErr: End Sub LogErrors Errors Private Property Let cStep_StepLevel(ByVal mstrSource = mstrModuleName & Private Property Let RHS As Integer) "c Step_Validate" cStep_ParentStepId(ByVal RHS As Long) On Error GoTo 0 mcStep.StepLevel = RHS Err.Raise vbObjectError + errValidateFailed, _ mcStep.ParentStepId = RHS mstrSource, _ End Property LoadResString(errValidateFailed) End Property End Sub Private Property Get cStep_StepLevel() As Private Property Get cStep_ParentStepId() Integer Private Property Let cStep_VersionNo(ByVal RHS As Long As String) cStep_StepLevel = mcStep.StepLevel cStep_ParentStepId = mcStep.VersionNo = RHS mcStep.ParentStepId End Property End Property End Property Private Property Let cStep_StepText(ByVal RHS As String) Private Property Get cStep_VersionNo() As String Private Property Let cStep_ParentVersionNo(ByVal RHS As mcStep.StepText = RHS cStep_VersionNo = mcStep.VersionNo String) HP TPC-H FULL DISCLOSURE REPORT 271 © 2005 Hewlett-Packard Company. All rights reserved. End Property ' created workspace Set rstWorkspace = cCloneWsp.WorkspaceId = qy.OpenRecordset(dbOpenForwardOnly) Private Property Let mlngWorkspaceId cStep_WorkspaceId(ByVal RHS As Long) cCloneWsp.WorkspaceName = ' mFieldValue.MakeStringFieldValid mstrWorkspaceName (mstrWorkspaceName) & _ mcStep.WorkspaceId = RHS cCloneWsp.ArchivedFlag = ' " and workspace_id <> " & _ mblnArchivedFlag ' Str(mlngWorkspaceId) End Property ' ' And set the return value to the newly ' Set rstWorkspace = Private Property Get cStep_WorkspaceId() created workspace mdbsStepMaster.OpenRecordset( _ As Long Set Clone = cCloneWsp ' strSQL, dbOpenForwardOnly)

cStep_WorkspaceId = Exit Function If rstWorkspace![workspace_count] > 0 Then mcStep.WorkspaceId rstWorkspace.Close CloneErr: qy.Close End Property LogErrors Errors ShowError errDuplicateWorkspaceName VERSION 1.0 CLASS mstrSource = mstrModuleName & "Clone" On Error GoTo 0 BEGIN On Error GoTo 0 Err.Raise vbObjectError + MultiUse = -1 'True Err.Raise vbObjectError + errCloneFailed, _ errDuplicateWorkspaceName, _ END mstrSource, mstrSource, Attribute VB_Name = "cWorkspace" LoadResString(errCloneFailed) LoadResString(errDuplicateWorkspaceName) Attribute VB_GlobalNameSpace = False End If Attribute VB_Creatable = True End Function rstWorkspace.Close Attribute VB_PredeclaredId = False qy.Close Attribute VB_Exposed = False Public Property Let ArchivedFlag(ByVal vdata ' FILE: cWorkspace.cls As Boolean) Exit Sub ' Microsoft TPC-H Kit Ver. 1.00 ' Copyright Microsoft, 1999 mblnArchivedFlag = vdata WorkspaceNameDuplicateErr: ' All Rights Reserved Call LogErrors(Errors) ' End Property mstrSource = mstrModuleName & ' "WorkspaceNameDuplicate" ' PURPOSE: Encapsulates the properties Public Property Get ArchivedFlag() As On Error GoTo 0 and methods of a workspace. Boolean Err.Raise vbObjectError + ' Contains functions to insert, errWorkspaceNameDuplicateFailed, _ update and delete ArchivedFlag = mblnArchivedFlag mstrSource, ' att_workspaces records from the LoadResString(errWorkspaceNameDuplicateFailed database. End Property ) ' Contact: Reshma Tharamal ([email protected]) Public Property Set WorkDatabase(vdata As End Sub ' Database) Public Property Let WorkspaceName(vdata As Option Explicit String) Set mdbsStepMaster = vdata ' Local variable(s) to hold property value(s) On Error GoTo WorkspaceNameErr Private mlngWorkspaceId As Long End Property mstrSource = mstrModuleName & Private mstrWorkspaceName As String "WorkspaceName" Private mblnArchivedFlag As Boolean Private Sub WorkspaceNameDuplicate() Private mdbsStepMaster As Database ' Check if the workspace name already exists If vdata = gstrEmptyString Then in the workspace ' Used to indicate the source module name On Error GoTo 0 when errors Dim rstWorkspace As Recordset ' Propogate this error back to the caller ' are raised by this class Dim strSql As String Err.Raise vbObjectError + Private mstrSource As String Dim qy As DAO.QueryDef errWorkspaceNameMandatory, _ Private Const mstrModuleName As String = mstrSource, "c Workspace." On Error GoTo LoadResString(errWorkspaceNameMandatory) WorkspaceNameDuplicateErr Else ' The cSequence class is used to generate mstrSource = mstrModuleName & mstrWorkspaceName = vdata unique workspace identifiers "WorkspaceNameDuplicate" End If Private mWorkspaceSeq As cSequence Exit Property ' Create a recordset to retrieve the count of ' The StringSM class is used to carry out records WorkspaceNameErr: string operations ' having the same workspace name LogErrors Errors Private mFieldValue As cStringSM strSql = " Select count(*) as mstrSource = mstrModuleName & workspace_count " & _ "WorkspaceName" Public Function Clone() As cWorkspace " from att_workspaces " & _ On Error GoTo 0 " where workspace_name = [w_name] " Err.Raise vbObjectError + ' Creates a copy of a given workspace & _ errWorkspaceNameSetFailed, _ " and workspace_id <> [w_id] " mstrSource, Dim cCloneWsp As cWorkspace Set qy = LoadResString(errWorkspaceNameSetFailed) mdbsStepMaster.CreateQueryDef(gstrEmptySt On Error GoTo CloneErr ring, strSql) End Property

Set cCloneWsp = New cWorkspace ' Call a procedure to assign the parameter Public Property Let WorkspaceId(vdata As Long) values ' Copy all the workspace properties to the Call AssignParameters(qy) On Error GoTo WorkspaceIdErr newly HP TPC-H FULL DISCLOSURE REPORT 272 © 2005 Hewlett-Packard Company. All rights reserved. mstrSource = mstrModuleName & ' strInsert = "insert into att_workspaces " & _ "WorkspaceId" ' "( workspace_id, workspace_name, " AssignParametersErr: & _ If (vdata > 0) Then ' " archived_flag ) " & _ mstrSource = mstrModuleName & mlngWorkspaceId = vdata ' " values ( " & _ "AssignParameters" Else ' Str(mlngWorkspaceId) & _ Call LogErrors(Errors) ' Propogate this error back to the caller ' ", " & On Error GoTo 0 On Error GoTo 0 mFieldValue.MakeStringFieldValid(mstrWork Err.Raise vbObjectError + Err.Raise vbObjectError + spaceName) & _ errAssignParametersFailed, _ errWorkspaceIdInvalid, _ ' ", " & Str(mblnArchivedFlag) & _ mstrSource, mstrSource, ' " ) " LoadResString(errAssignParametersFailed) LoadResString(errWorkspaceIdInvalid) ' mdbsStepMaster.Execute strInsert, End If dbFailOnError End Sub ' Public Sub DeleteWorkspace() Exit Property Exit Sub Dim strDelete As String WorkspaceIdErr: AddWorkspaceErr: Dim qy As DAO.QueryDef LogErrors Errors mstrSource = mstrModuleName & Call LogErrors(Errors) On Error GoTo DeleteWorkspaceErr "WorkspaceId" mstrSource = mstrModuleName & On Error GoTo 0 "AddWorkspace" strDelete = "delete from att_workspaces " & _ Err.Raise vbObjectError + On Error GoTo 0 " where workspace_id = [w_id]" errWorkspaceIdSetFailed, _ Err.Raise vbObjectError + Set qy = mstrSource, errWorkspaceInsertFailed, _ mdbsStepMaster.CreateQueryDef(gstrEmptyString, LoadResString(errWorkspaceIdSetFailed) mstrSource, strDelete) LoadResString(errWorkspaceInsertFailed) End Property ' Call a procedure to assign the parameter values End Sub Call AssignParameters(qy) Public Sub AddWorkspace() Private Sub AssignParameters(qyExec As DAO.QueryDef) qy.Execute dbFailOnError Dim strInsert As String ' Assigns values to the parameters in the qy.Close Dim qy As DAO.QueryDef querydef object ' The parameter names are cryptic to make ' mdbsStepMaster.Execute strDelete, On Error GoTo AddWorkspaceErr them different dbFailOnError ' from the field names. When the parameter ' " where workspace_id = " & _ ' Retrieve the next identifier using the names are ' Str(mlngWorkspaceId) sequence class ' the same as the field names, parameters in Set mWorkspaceSeq = New cSequence the where Exit Sub Set mWorkspaceSeq.IdDatabase = ' clause do not get created. mdbsStepMaster DeleteWorkspaceErr: mWorkspaceSeq.IdentifierColumn = Dim prmParam As DAO.Parameter Call LogErrors(Errors) FLD_ID_WORKSPACE mstrSource = mstrModuleName & mlngWorkspaceId = On Error GoTo AssignParametersErr "DeleteWorkspace" mWorkspaceSeq.Identifier mstrSource = mstrModuleName & On Error GoTo 0 Set mWorkspaceSeq = Nothing "AssignParameters" Err.Raise vbObjectError + errWorkspaceDeleteFailed, _ ' Call procedure to raise an error if the For Each prmParam In qyExec.Parameters mstrSource, Workspace name Select Case prmParam.Name LoadResString(errWorkspaceDeleteFailed) ' already exists in the db Case "[w_id]" End Sub Call WorkspaceNameDuplicate prmParam.Value = mlngWorkspaceId Public Sub ModifyWorkspace() ' A new record will have the archived_flag turned off Case "[w_name]" Dim strUpdate As String mblnArchivedFlag = False prmParam.Value = Dim qy As DAO.QueryDef mstrWorkspaceName ' Create a temporary querydef object On Error GoTo ModifyWorkspaceErr strInsert = "insert into att_workspaces " & Case "[archived]" _ prmParam.Value = ' Call procedure to raise an error if the Workspace "( workspace_id, workspace_name, " mblnArchivedFlag name & _ ' already exists in the db " archived_flag ) " & _ Case Else Call WorkspaceNameDuplicate " values ( [w_id], [w_name], ' Write the parameter name that is [archived] ) " faulty strUpdate = "update att_workspaces " & _ Set qy = WriteError errInvalidParameter, " set workspace_name = [w_name] " & _ mdbsStepMaster.CreateQueryDef(gstrEmpt mstrSource, _ ", archived_flag = [archived] " & _ yString, strInsert) prmParam.Name " where workspace_id = [w_id] " On Error GoTo 0 Set qy = ' Call a procedure to assign the parameter Err.Raise errInvalidParameter, mdbsStepMaster.CreateQueryDef(gstrEmptyString, values mstrSource, _ strUpdate) Call AssignParameters(qy) LoadResString(errInvalidParameter) ' Call a procedure to assign the parameter values qy.Execute dbFailOnError End Select Call AssignParameters(qy) qy.Close Next prmParam qy.Execute dbFailOnError Exit Sub qy.Close HP TPC-H FULL DISCLOSURE REPORT 273 © 2005 Hewlett-Packard Company. All rights reserved. ' This module is called DatabaseSM, since Public Const PARAM_RUN_ID As ' strUpdate = "update att_workspaces " & Database is a standard String = "RUN_ID" _ ' Visual Basic object and we want to avoid any Public Const PARAM_RUN_ID_DESC As ' " set workspace_name = " & _ confusion with it. String = "The run identifier for a run. " & _ ' "Any modifications will be overwritten mFieldValue.MakeStringFieldValid(mstrW Option Explicit before each run." orkspaceName) & _ ' ", archived_flag = " & _ Public wrkJet As Workspace Public Const PARAM_OUTPUT_DIR As ' Str(mblnArchivedFlag) & _ Public dbsAttTool As Database String = "OUTPUT_DIR" ' " where workspace_id = " & _ Public gblnDbOpen As Boolean Public Const PARAM_OUTPUT_DIR_DESC ' Str(mlngWorkspaceId) Public gRunEngine As rdoEngine As String = "The output directory for a run. " & _ ' "Any modifications will be overwritten ' mdbsStepMaster.Execute strUpdate, ' Used to indicate the source module name before each run." dbFailOnError when errors ' ' are raised by this module Public Const Exit Sub Private Const mstrModuleName As String = CONNECTION_STRINGS_TO_NAME_SUFFIX "DatabaseSM." As String = "_NAME" ModifyWorkspaceErr: Public Const gsDefDBFileExt As String = ".stp" Private Const TBL_RUN_STEP_HDR As String = Call LogErrors(Errors) Private Const msDefDBFile As String = "r un_header" mstrSource = mstrModuleName & "\SMData" & gsDefDBFileExt Private Const TBL_RUN_STEP_DTLS As String = "ModifyWorkspace" "r un_step_details" On Error GoTo 0 Private Const merrFileNotFound As Integer = Public Const TBL_CONNECTION_DTLS As Err.Raise vbObjectError + 3024 String = "connection_dtls" errWorkspaceUpdateFailed, _ Private Const merrDaoTableMissing As Public Const TBL_CONNECTION_STRINGS As mstrSource, Integer = 3078 String = "workspace_connections" LoadResString(errWorkspaceUpdateFailed) Public Const TBL_STEPS As String = "att_steps" Private Const End Sub STEPMASTER_SETTINGS_VAL_NAME_D Public Const FLD_ID_CONN_NAME As String = Public Property Get WorkspaceName() As BFILE As String = "WorkspaceFile" "c onnection_name_id" String Public Const FLD_ID_WORKSPACE As String = Public Const DEF_NO_COUNT_DISPLAY "workspace_id" WorkspaceName = mstrWorkspaceName As Boolean = False Public Const FLD_ID_STEP As String = "step_id" Public Const DEF_NO_EXECUTE Public Const FLD_ID_PARAMETER As String = End Property As Boolean = False "parameter_id" Public Const DEF_PARSE_QUERY_ONLY Public Property Get WorkspaceId() As Long As Boolean = False Public Const Public Const FLD_CONN_DTL_CONNECTION_NAME As WorkspaceId = mlngWorkspaceId DEF_ANSI_QUOTED_IDENTIFIERS As String = "connection_name" Boolean = False Public Const End Property Public Const DEF_ANSI_NULLS As FLD_CONN_DTL_CONNECTION_STRING As Boolean = True String = "connection_string_name" Private Sub Class_Initialize() Public Const DEF_SHOW_QUERY_PLAN Public Const As Boolean = False FLD_CONN_DTL_CONNECTION_TYPE As ' Each function will append it's own name Public Const DEF_SHOW_STATS_TIME String = "connection_type" to this As Boolean = False ' variable Public Const DEF_SHOW_STATS_IO Public Const mstrSource = "cWorkspace." As Boolean = False FLD_CONN_STR_CONNECTION_NAME As Public Const String = "connection_name" Set mFieldValue = New cStringSM DEF_PARSE_ODBC_MSG_PREFIXES As Boolean = True Public Const FLD_STEPS_EXEC_MECHANISM End Sub Public Const DEF_ROW_COUNT As String = "execution_mechanism" As Long = 0 Public Const FLD_STEPS_EXEC_DTL As String Private Sub Class_Terminate() Public Const = "start_directory" DEF_TSQL_BATCH_SEPARATOR As Public Const FLD_STEPS_VERSION_NO As Set mdbsStepMaster = Nothing String = "GO" String = "version_no" Set mFieldValue = Nothing Public Const DEF_QUERY_TIME_OUT As Long = 0 Public Const DATA_TYPE_CURRENCY As End Sub Public Const DEF_SERVER_LANGUAGE String = "CURRENCY" Attribute VB_Name = "DatabaseSM" As String = "(Default)" Public Const DATA_TYPE_LONG As String = ' FILE: DatabaseSM.bas Public Const "Long" ' Microsoft TPC-H Kit Ver. 1.00 DEF_CHARACTER_TRANSLATION As Public Const DATA_TYPE_INTEGER As String = ' Copyright Microsoft, 1999 Boolean = True "INTEGER" ' All Rights Reserved Public Const DEF_REGIONAL_SETTINGS Public Const DATA_TYPE_TEXT255 As String = ' As Boolean = False "Te xt(255)" ' ' PURPOSE: Contains all the database Public Const PARAM_DEFAULT_DIR Private Sub InsertBuiltInParameter(dbFile As initialization/cleanup As String = "DEFAULT_DIR" Database, sParamName As String, _ ' procedures for the project. Also Public Const sParamValue As String, sParamDesc As contains upgrade PARAM_DEFAULT_DIR_DESC As String) ' database upgrade functions. String = "Default destination directory " & _ ' Contact: Reshma Tharamal "f or all output and error files. If it is Dim sBuf As String ([email protected]) blank, the StepMaster installation directory Dim cTempStr As New cStringSM ' will be used." Dim lId As Long Dim rTemp As DAO.Recordset HP TPC-H FULL DISCLOSURE REPORT 274 © 2005 Hewlett-Packard Company. All rights reserved. Dim rParam As DAO.Recordset rTemp.Close Dim sVersion As String Dim cTempSeq As cSequence Dim bOpeningDb As Boolean ' This flag is used End Sub to check if OpenDatabase failed ' Create the passed in built-in parameter, Public Sub InitRunEngine() for each workspace in the db On Error GoTo OpenDatabaseErr Set cTempSeq = New cSequence Set gRunEngine = New rdoEngine Set cTempSeq.IdDatabase = dbFile gRunEngine.rdoDefaultCursorDriver = bOpeningDb = False cTempSeq.IdentifierColumn = rdUseServer SMOpenDatabase = False FLD_ID_PARAMETER End Sub ' Create Microsoft Jet Workspace object. sBuf = "select * from att_workspaces " If Not gblnDbOpen Then Set rTemp = dbFile.OpenRecordset(sBuf, Public Function DefaultDBFile() As String Set wrkJet = dbOpenSnapshot) DefaultDBFile = GetSetting(App.Title, CreateWorkspace("att_tool_workspace_setup", If rTemp.RecordCount <> 0 Then "Settings", "admin", gstrEmptyString, dbUseJet) rTemp.MoveFirst STEPMASTER_SETTINGS_VAL_NAME_D End If BFILE, App.Path & msDefDBFile) While Not rTemp.EOF End Function ' Prompt the user for the database file if it is not sBuf = "select * from passed in workspace_parameters " & _ Public Sub CloseDatabase() If StringEmpty(strDbName) Then " where workspace_id = " & strDbName = BrowseDBFile Str(rTemp!workspace_id) & _ Dim dbsInstance As Database If StringEmpty(strDbName) Then " and parameter_name = " & Dim recInstance As Recordset Exit Function cTempStr.MakeStringFieldValid(sParamNa End If me) On Error GoTo CloseDatabaseErr End If Set rParam = dbFile.OpenRecordset(sBuf, ' Close all open recordsets and databases in Do dbOpenSnapshot) the workspace If gblnDbOpen Then If rParam.RecordCount <> 0 Then For Each dbsInstance In wrkJet.Databases #If Not RUN_ONLY Then rParam.MoveFirst CloseOpenWorkspaces ' Since the parameter already For Each recInstance In #End If exists, change it to a built-in type dbsAttTool.Recordsets Set wrkJet = sBuf = "update recInstance.Close CreateWorkspace("att_tool_workspace_setup", workspace_parameters " & _ Next recInstance "admin", gstrEmptyString, dbUseJet) " set parameter_type = " & dbsInstance.Close End If CStr(gintParameterBuiltIn) & _ ", description = " & Next dbsInstance ' Toggle the bOpeningDb flag around the cTempStr.MakeStringFieldValid(sParamDe OpenDatabase method - the value sc) & _ Set dbsAttTool = Nothing ' of this flag will be checked by the error " where workspace_id = " & handler to determine if it is Str(rTemp!workspace_id) & _ gblnDbOpen = False ' the OpenDatabase that failed. " and parameter_id = " & wrkJet.Close BugMessage "DB File: " & strDbName Str(rParam!parameter_id) Else Exit Sub bOpeningDb = True ' Else, insert a parameter record ' Open the database for exclusive use lId = cTempSeq.Identifier CloseDatabaseErr: Set dbsAttTool = sBuf = "insert into wrkJet.OpenDatabase(strDbName, Options:=True) workspace_parameters " & _ Call LogErrors(Errors) bOpeningDb = False "( workspace_id, Resume Next parameter_id, " & _ If dbsAttTool Is Nothing Then " parameter_name, End Sub ' If the file is not present in the directory, parameter_value, " & _ display " description, parameter_type Private Function NoDbChanges(sVerTo As ' an error and ask the user to enter a new ) "& _ String, sVerFrom As String) As Boolean path " values ( " & _ Call ShowError(errOpenDbFailed, Str(rTemp!workspace_id) & If sVerTo = gsVersion242 And sVerFrom = OptArgs:=strDbName) ", " & Str(lId) & ", " & _ gsVersion241 Then NoDbChanges = True strDbName = BrowseDBFile cTempStr.MakeStringFieldValid(sParamNa ElseIf sVerTo = gsVersion242 And Else me) & ", " & _ sVerFrom = gsVersion24 Then sVersion = DBVersion(dbsAttTool) NoDbChanges = True cTempStr.MakeStringFieldValid(sParamVal ElseIf sVerTo = gsVersion253 And ' Make sure the application and db version ue) & ", " & _ sVerFrom = gsVersion251 Then numbers match NoDbChanges = True If sVersion = gsVersion Then cTempStr.MakeStringFieldValid(sParamDe ElseIf sVerTo = gsVersion255 And Call InitializeData(strDbName) sc) & ", " & _ sVerFrom = gsVersion251 Then gblnDbOpen = True CStr(gintParameterBuiltIn) & NoDbChanges = True SMOpenDatabase = True _ Else Else " ) " NoDbChanges = False If UpgradeDb(wrkJet, dbsAttTool, End If End If gsVersion, sVersion) Then dbFile.Execute sBuf, dbFailOnError Call InitializeData(strDbName) rParam.Close End Function gblnDbOpen = True SMOpenDatabase = True rTemp.MoveNext Public Function SMOpenDatabase(Optional Else Wend strDbName As String = gstrEmptyString) As dbsAttTool.Close End If Boolean Set dbsAttTool = Nothing HP TPC-H FULL DISCLOSURE REPORT 275 © 2005 Hewlett-Packard Company. All rights reserved. End If dbFile.Execute sSql, dbFailOnError ShowError errVersionMismatch, _ ' Create a recordset object to retrieve all Exit Sub OptArgs:=" Please install steps for Version '" & gsVersion & "' of the ' the given workspace UpdateDbDtlsErr: workspace definition file." sBuf = " update att_steps a " & _ Call LogErrors(Errors) strDbName = BrowseDBFile " set continuation_criteria = " & Err.Raise vbObjectError + errUpgradeFailed, End If CStr(gintOnFailureContinue) & _ mstrModuleName, _ End If " where archived_flag = [archived] " LoadResString(errUpgradeFailed) End If Loop While gblnDbOpen = False And ' Find the highest X-component of the End Sub Not StringEmpty(strDbName) version number sBuf = sBuf & " AND cint( mid( Private Sub Upgrade10to21(UpgradeWsp As Exit Function version_no, 1, instr( version_no, " & gstrDQ & DAO.Workspace, dbFile As Database, sVersion As gstrVerSeparator & gstrDQ & " ) - 1 ) ) = "& String) OpenDatabaseErr: _ Call DisplayErrors(Errors) " ( select max( cint( mid( version_no, 1, Dim sSql As String instr( version_no, " & gstrDQ & ' If the OpenDatabase failed, continue gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ On Error GoTo Upgrade10to21Err If bOpeningDb Then " from att_steps AS d " & _ Resume Next " WHERE a.step_id = d.step_id ) " Call UpdateDbDtls(dbFile, sVersion) End If ' Find the highest Y-component of the Call UpdateContinuationCriteria(dbFile) Call ShowError(errOpenDbFailed, version number for the highest X-component OptArgs:=strDbName) sBuf = sBuf & " AND cint( mid( Exit Sub version_no, instr( version_no, " & gstrDQ & End Function gstrVerSeparator & gstrDQ & " ) + 1 ) ) = "& Upgrade10to21Err: Private Sub InitializeData(sDb As String) _ UpgradeWsp.Rollback " ( select max( cint( mid( version_no, Call LogErrors(Errors) Set gcParameters = New cArrParameters instr( version_no, " & gstrDQ & Err.Raise vbObjectError + errUpgradeFailed, Set gcParameters.ParamDatabase = gstrVerSeparator & gstrDQ & " ) + 1 ) ) ) " & mstrModuleName, _ dbsAttTool _ LoadResString(errUpgradeFailed) " from att_steps AS b " & _ Set gcSteps = New cArrSteps " Where a.step_id = b.step_id " & _ End Sub Set gcSteps.StepDB = dbsAttTool " AND cint( mid( version_no, 1, instr( Private Sub Upgrade21to23(UpgradeWsp As version_no, " & gstrDQ & gstrVerSeparator & DAO.Workspace, dbFile As Database, sVersion As Set gcConstraints = New cArrConstraints gstrDQ & " ) - 1 ) ) = "& _ String) Set gcConstraints.ConstraintDB = " ( select max( cint( mid( version_no, 1, dbsAttTool instr( version_no, " & gstrDQ & Dim sBuf As String gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ Dim cTempStr As New cStringSM Set gcConnections = New cConnections " from att_steps AS c " & _ Set gcConnections.ConnDb = dbsAttTool " WHERE a.step_id = c.step_id ) ) " On Error GoTo Upgrade21to23Err

Set gcConnDtls = New cConnDtls ' Create a temporary Querydef object ' Add a parameter type field and a description Set gcConnDtls.ConnDb = dbsAttTool Set qyTemp = field to the parameter table dbFile.CreateQueryDef(gstrEmptyString, sBuf = "alter table workspace_parameters " & _ ' Disable the error handler since this is not sBuf) " add column description TEXT(255) " a critical step qyTemp.Parameters("archived").Value = dbFile.Execute sBuf, dbFailOnError On Error GoTo 0 False SaveSetting App.Title, "Settings", sBuf = "alter table workspace_parameters " & _ STEPMASTER_SETTINGS_VAL_NAME qyTemp.Execute dbFailOnError " add column parameter_type INTEGER " _DBFILE, sDb qyTemp.Close dbFile.Execute sBuf, dbFailOnError End Sub Private Sub Exit Sub ' Initialize the parameter type on all parameters to UpdateContinuationCriteria(dbFile As indicate generic parameters DAO.Database) UpdateContinuationCriteriaErr: sBuf = "update workspace_parameters " & _ Call LogErrors(Errors) " set parameter_type = " & Dim qyTemp As DAO.QueryDef Err.Raise vbObjectError + CStr(gintParameterGeneric) Dim sBuf As String errModifyStepFailed, mstrModuleName, _ dbFile.Execute sBuf, dbFailOnError LoadResString(errModifyStepFailed) On Error GoTo sBuf = "Release 2.3 onwards, connection string UpdateContinuationCriteriaErr End Sub parameters will be " & _ "displayed in a separate node. After this sBuf = "Since this version of the Private Sub UpdateDbDtls(dbFile As upgrade, all connection " & _ executable incorporates failure processing, " Database, sNewVersion As String) "s tring parameters will appear under the & _ Globals/Connection Strings " & _ "t he upgrade will update the On Dim sSql As String "node in the workspace. " Failure field for each of the steps " & _ Dim cTemp As New cStringSM Call MsgBox(sBuf, vbOKOnly + "t o 'Continue' to be compatible with vbApplicationModal, "Upgrade database") the existing behaviour. " & _ On Error GoTo UpdateDbDtlsErr "P roceed?" ' Update the parameter type on all parameters that If Not Confirm(Buttons:=vbYesNo, sSql = "update db_details " & _ look like db connection strings strMessage:=sBuf, strTitle:="Upgrade " set db_version = " & sBuf = "update workspace_parameters " & _ database") Then cTemp.MakeStringFieldValid(sNewVersion) " set parameter_type = " & Exit Sub CStr(gintParameterConnect) & _ HP TPC-H FULL DISCLOSURE REPORT 276 © 2005 Hewlett-Packard Company. All rights reserved. " where UCase(parameter_value) ' Add a new table for connection properties like '*DRIVER*' " & _ sBuf = CreateConnectionsTableScript() lId = lId + 1 " or UCase(parameter_value) like ' TODO: Not sure of column sizes for row rTemp.MoveNext '*DSN*'" count, tsql_batch_separator and Wend dbFile.Execute sBuf, dbFailOnError server_language End If dbFile.Execute sBuf, dbFailOnError rTemp.Close ' Add an elapsed time field to the run_step_details table - this field is ' Move all connection parameters from the ' Add an identifier column for the connection_id ' needed to store the elapsed time in parameter table to the connections tables field milliseconds. ' Insert default values for the newly added sBuf = "alter table att_identifiers " & _ sBuf = "alter table run_step_details " & _ connection properties " add column connection_id long " " add column elapsed_time LONG " sBuf = "select * from workspace_parameters dbFile.Execute sBuf, dbFailOnError dbFile.Execute sBuf, dbFailOnError " & _ "where parameter_type = " & ' Initialize the value of the connection identifier, ' The failure_details field has some data CStr(gintParameterConnect) initialized above for the case when an ODBC failure Set rTemp = dbFile.OpenRecordset(sBuf, sBuf = "update att_identifiers " & _ ' threshold was specified. Since that's no dbOpenSnapshot) " set connection_id = " & Str(lId) longer relevant, update the failure_details lId = 1 dbFile.Execute sBuf, dbFailOnError ' field for records with failure_criteria = If rTemp.RecordCount <> 0 Then gintFailureODBC to empty. rTemp.MoveFirst ' Delete all connection strings from the parameter ' failure_criteria = gintFailureODBC = 1 table sBuf = "update att_steps " & _ While Not rTemp.EOF sBuf = "delete from workspace_parameters " & _ " set failure_details = " & sBuf = "insert into "where parameter_type = " & cTempStr.MakeStringFieldValid(gstrEmpty workspace_connections " & _ CStr(gintParameterConnect) String) & _ "( workspace_id, connection_id, " & _ dbFile.Execute sBuf, dbFailOnError " where failure_criteria = '1'" "c onnection_name, connection_value, dbFile.Execute sBuf, dbFailOnError " & _ ' Create the built-in parameter, default directory, "description, no_count_display, " & _ for each workspace in the db Call UpdateDbDtls(dbFile, sVersion) "no_execute, parse_query_only, " & _ Call InsertBuiltInParameter(dbFile, "ANSI_quoted_identifiers, PARAM_DEFAULT_DIR, gstrEmptyString, UpgradeWsp.CommitTrans ANSI_nulls, " & _ PARAM_DEFAULT_DIR_DESC) "s how_query_plan, show_stats_time, " On Error GoTo DropColumnErr & _ Call UpdateDbDtls(dbFile, sVersion) "s how_stats_io, UpgradeWsp.BeginTrans parse_odbc_msg_prefixes, " & _ Exit Sub "row_count, tsql_batch_separator, " & ' This ddl cannot be in the same _ Upgrade23to24Err: transaction as the failure_details update "query_time_out, server_language, " & UpgradeWsp.Rollback ' But we can do this in a separate _ Call LogErrors(Errors) transaction since we do not expect this "c haracter_translation, Err.Raise vbObjectError + errUpgradeFailed, ' statement to fail - AND, it doesn't matter regional_settings ) " & _ mstrModuleName, _ if this transaction fails " values ( " & _ LoadResString(errUpgradeFailed) ' Drop the failure_criteria column from Str(rTemp!workspace_id) & ", " & the att_steps table Str(lId) & ", " & _ End Sub sBuf = "alter table att_steps " & _ cTempStr.MakeStringFieldValid("" & Private Sub Upgrade243to25(UpgradeWsp As " drop column failure_criteria " rTemp!parameter_name) & ", " & _ DAO.Workspace, dbFile As Database, sVersion As dbFile.Execute sBuf, dbFailOnError cTempStr.MakeStringFieldValid("" & String) rTemp!parameter_value) & ", " & _ Exit Sub cTempStr.MakeStringFieldValid("" & Dim sBuf As String rTemp!Description) & ", " & _ Dim qy As DAO.QueryDef DropColumnErr: Str(DEF_NO_COUNT_DISPLAY) & Dim rTemp As DAO.Recordset Call LogErrors(Errors) ", " & _ Dim lId As Long ShowError errDeleteColumnFailed Str(DEF_NO_EXECUTE) & ", " & Dim cTempStr As New cStringSM Exit Sub Str(DEF_PARSE_QUERY_ONLY) & ", " & _ On Error GoTo Upgrade243to25Err Upgrade21to23Err: Str(DEF_ANSI_QUOTED_IDENTIFIERS) & UpgradeWsp.Rollback ", " & Str(DEF_ANSI_NULLS) & ", " & _ sBuf = "Release " & gsVersion25 & " onwards, Call LogErrors(Errors) Str(DEF_SHOW_QUERY_PLAN) & new 'Connections' must be created for all " & _ Err.Raise vbObjectError + ", " & Str(DEF_SHOW_STATS_TIME) & ", " "c onnection strings. " & vbCrLf & vbCrLf errUpgradeFailed, mstrModuleName, _ & _ & _ LoadResString(errUpgradeFailed) Str(DEF_SHOW_STATS_IO) & ", " & "Connections will appear under the Str(DEF_PARSE_ODBC_MSG_PREFIXES) Globals/Connections " & _ End Sub & ", " & _ "node in the workspace. " & vbCrLf & _ Private Sub Upgrade23to24(UpgradeWsp Str(DEF_ROW_COUNT) & ", " & "A list of all 'Connections' (instead of As DAO.Workspace, dbFile As Database, cTempStr.MakeStringFieldValid(DEF_TSQL_ 'Connection Strings') " & _ sVersion As String) BATCH_SEPARATOR) & ", " & _ "i n the workspace will be displayed in the Str(DEF_QUERY_TIME_OUT) & ", " 'Connections' field for " & _ Dim sBuf As String & "ODBC steps on the Step definition screen. Dim lId As Long cTempStr.MakeStringFieldValid(DEF_SERV " & vbCrLf & vbCrLf & _ Dim rTemp As DAO.Recordset ER_LANGUAGE) & ", " & _ "Each Connection can be marked as static or Dim cTempStr As New cStringSM dynamic. " & vbCrLf & _ Str(DEF_CHARACTER_TRANSLATION) & "Dynamic connections will be created when On Error GoTo Upgrade23to24Err ", " & Str(DEF_REGIONAL_SETTINGS) & _ a step starts execution and " & _ " ) " "c losed once the step completes. " & vbCrLf dbFile.Execute sBuf, dbFailOnError & _ HP TPC-H FULL DISCLOSURE REPORT 277 © 2005 Hewlett-Packard Company. All rights reserved. "Static connections will be kept open till the run completes." & vbCrLf & vbCrLf lId = lId + 1 End Sub & _ rTemp.MoveNext Private Sub Upgrade25to251(UpgradeWsp As "Currently dynamic 'Connections' Wend DAO.Workspace, dbFile As Database, sVersion As have been created for all existing End If String) 'Connection Strings' " & _ qy.Close "with the suffix " & rTemp.Close On Error GoTo Upgrade25to251Err CONNECTION_STRINGS_TO_NAME_S UFFIX ' Initialize the value of the ' Create the built-in parameters, run_id and Call MsgBox(sBuf, vbOKOnly + connection_name_id output_dir, for each workspace in the db vbApplicationModal, "Upgrade database") sBuf = "update att_identifiers " & _ Call InsertBuiltInParameter(dbFile, " set " & FLD_ID_CONN_NAME & " PARAM_RUN_ID, gstrEmptyString, ' Add a new table for the connection name = " & Str(lId) PARAM_RUN_ID_DESC) entity dbFile.Execute sBuf, dbFailOnError Call InsertBuiltInParameter(dbFile, ' This table has been added in order to PARAM_OUTPUT_DIR, gstrEmptyString, satisfy the TPC-H requirement that ' Update the start_directory field in att_steps PARAM_OUTPUT_DIR_DESC) ' all the queries in a stream need to be to point to the newly executed on a single connection. ' created connections Call UpdateDbDtls(dbFile, sVersion) sBuf = Call ReadStepsInWorkspace(rTemp, qy, CreateConnectionDtlsTableScript() glInvalidId, dbLoad:=dbFile, _ Exit Sub dbFile.Execute sBuf, dbFailOnError bSelectArchivedRecords:=False) Upgrade25to251Err: ' Add an identifier column for the sBuf = "update " & TBL_STEPS & _ UpgradeWsp.Rollback connection_name_id field " set "& FLD_STEPS_EXEC_DTL & " = Call LogErrors(Errors) sBuf = "alter table att_identifiers " & _ [c_name] " & _ Err.Raise vbObjectError + errUpgradeFailed, " add column " & " where " & FLD_ID_STEP & " = [s_id] " mstrModuleName, _ FLD_ID_CONN_NAME & " long " & _ LoadResString(errUpgradeFailed) dbFile.Execute sBuf, dbFailOnError " and " & FLD_STEPS_VERSION_NO & " = [ver_no] " End Sub Call UpdateDbDtls(dbFile, sVersion) Set qy = dbFile.CreateQueryDef("", sBuf) Private Sub Upgrade242to243(UpgradeWsp As ' insert connection_dtl records for each of If rTemp.RecordCount <> 0 Then DAO.Workspace, dbFile As Database, sVersion As the connection strings rTemp.MoveFirst String) sBuf = "select * from " & TBL_CONNECTION_STRINGS While Not rTemp.EOF Dim sBuf As String Set rTemp = dbFile.OpenRecordset(sBuf, If Dim cTempStr As New cStringSM dbOpenSnapshot) rTemp.Fields(FLD_STEPS_EXEC_MECHAN Dim iResponse As Integer ISM).Value = gintExecuteODBC Then sBuf = "insert into " & If Not (StringEmpty("" & On Error GoTo DeleteHistoryErr TBL_CONNECTION_DTLS & _ rTemp.Fields(FLD_STEPS_EXEC_DTL))) "( " & FLD_ID_WORKSPACE & _ Then Call DeleteRunHistory(dbFile) ", " & FLD_ID_CONN_NAME & _ sBuf = ", " & rTemp.Fields(FLD_STEPS_EXEC_DTL) On Error GoTo Upgrade242to243Err FLD_CONN_DTL_CONNECTION_NAM ' Strip the enclosing "%" E & _ characters UpgradeWsp.CommitTrans ", " & sBuf = Mid(sBuf, 2, Len(sBuf) - FLD_CONN_DTL_CONNECTION_STRI 2) & UpgradeWsp.BeginTrans NG & _ CONNECTION_STRINGS_TO_NAME_SUF ", " & FIX ' Add a parameter type field and a description FLD_CONN_DTL_CONNECTION_TYPE field to the parameter table & " ) " & _ qy.Parameters("c_name").Value = sBuf = "alter table run_step_details " & _ " values ( [w_id], [c_id], [c_name], sBuf " add column parent_instance_id LONG " [c_str], [c_type] ) " qy.Parameters("s_id").Value = Set qy = dbFile.CreateQueryDef("", sBuf) rTemp.Fields(FLD_ID_STEP) dbFile.Execute sBuf, dbFailOnError qy.Parameters("ver_no").Value = lId = glMinId rTemp.Fields(FLD_STEPS_VERSION_NO) sBuf = "alter table run_step_details " & _ If rTemp.RecordCount <> 0 Then " add column iterator_value TEXT(255) " rTemp.MoveFirst qy.Execute dbFailOnError End If dbFile.Execute sBuf, dbFailOnError While Not rTemp.EOF End If qy.Parameters("w_id").Value = rTemp.MoveNext Call AlterFieldType(dbFile, rTemp.Fields(FLD_ID_WORKSPACE) Wend TBL_RUN_STEP_DTLS, "start_time", qy.Parameters("c_id").Value = lId End If DATA_TYPE_CURRENCY) qy.Parameters("c_name").Value = Call AlterFieldType(dbFile, rTemp.Fields(FLD_CONN_STR_CONNEC qy.Close TBL_RUN_STEP_DTLS, "end_time", TION_NAME) & rTemp.Close DATA_TYPE_CURRENCY) CONNECTION_STRINGS_TO_NAME_S Call AlterFieldType(dbFile, UFFIX Exit Sub TBL_RUN_STEP_HDR, "start_time", qy.Parameters("c_str").Value = DATA_TYPE_CURRENCY) rTemp.Fields(FLD_CONN_STR_CONNEC Upgrade243to25Err: Call AlterFieldType(dbFile, TION_NAME) UpgradeWsp.Rollback TBL_RUN_STEP_HDR, "end_time", qy.Parameters("c_type").Value = Call LogErrors(Errors) DATA_TYPE_CURRENCY) ConnTypeDynamic Err.Raise vbObjectError + errUpgradeFailed, mstrModuleName, _ Call UpdateDbDtls(dbFile, sVersion) qy.Execute dbFailOnError LoadResString(errUpgradeFailed) HP TPC-H FULL DISCLOSURE REPORT 278 © 2005 Hewlett-Packard Company. All rights reserved. Exit Sub sSql = "Create table db_details (" & _ UpgradeWsp.CommitTrans "db_version Text(50) " & _ Exit Function DeleteHistoryErr: ") ;" End If ' This is not a critical error - continue with Call Upgrade242to243(UpgradeWsp, upgrade dbFile.Execute sSql, dbFailOnError dbFile, gsVersion243) Call LogErrors(Errors) Call Upgrade243to25(UpgradeWsp, dbFile, Resume Next sSql = "insert into db_details " & _ gsVersion25) "( db_version ) values ( '" & sVersion Call Upgrade25to251(UpgradeWsp, dbFile, Upgrade242to243Err: & "' ) " gsVersion251) UpgradeWsp.Rollback Call LogErrors(Errors) dbFile.Execute sSql, dbFailOnError Case gsVersion23 Err.Raise vbObjectError + Call Upgrade23to24(UpgradeWsp, dbFile, errUpgradeFailed, mstrModuleName, _ Call UpdateContinuationCriteria(dbFile) gsVersion24) LoadResString(errUpgradeFailed) Call Upgrade242to243(UpgradeWsp, Exit Sub dbFile, gsVersion242) End Sub Call Upgrade243to25(UpgradeWsp, dbFile, '*********************************** Upgrade01to21Err: gsVersion25) ****************************** Call LogErrors(Errors) Call Upgrade25to251(UpgradeWsp, dbFile, ' The AlterFieldType Sub procedure requires UpgradeWsp.Rollback gsVersion251) three string Err.Raise vbObjectError + ' parameters. The first string specifies the errUpgradeFailed, mstrModuleName, _ Case gsVersion21 name of the table LoadResString(errUpgradeFailed) Call Upgrade21to23(UpgradeWsp, dbFile, ' containing the field to be changed. The gsVersion23) second string specifies End Sub Call Upgrade23to24(UpgradeWsp, dbFile, ' the name of the field to be changed. The Private Function UpgradeDb(UpgradeWsp As gsVersion24) third string specifies DAO.Workspace, dbFile As Database, _ Call Upgrade242to243(UpgradeWsp, ' the new data type for the field. sVerTo As String, sVerFrom As String) dbFile, gsVersion242) '*********************************** As Boolean Call Upgrade243to25(UpgradeWsp, dbFile, ****************************** gsVersion25) Dim sMsg As String Call Upgrade25to251(UpgradeWsp, dbFile, Private Sub AlterFieldType(dbFile As gsVersion251) Database, TblName As String, FieldName On Error GoTo UpgradeDbErr As String, _ Case gsVersion10 NewDataType As String) UpgradeDb = False Call Upgrade10to21(UpgradeWsp, dbFile, Dim qdf As DAO.QueryDef If Not ValidUpgrade(sVerTo, sVerFrom) gsVersion21) Dim sSql As String Then Exit Function Call Upgrade21to23(UpgradeWsp, dbFile, gsVersion23) ' Add a temporary field to the table. If NoDbChanges(sVerTo, sVerFrom) Then Call Upgrade23to24(UpgradeWsp, dbFile, sSql = "ALTER TABLE [" & TblName & UpgradeDb = True gsVersion24) _ Exit Function Call Upgrade242to243(UpgradeWsp, "] ADD COLUMN AlterTempField End If dbFile, gsVersion242) " & NewDataType Call Upgrade243to25(UpgradeWsp, dbFile, Set qdf = dbFile.CreateQueryDef("", sMsg = "The database needs to be upgraded gsVersion25) sSql) from Version " & sVerFrom & _ Call Upgrade25to251(UpgradeWsp, dbFile, qdf.Execute " to Version " & sVerTo & "." & gsVersion251) vbCrLf & _ ' Copy the data from old field into the new "P roceed?" Case gsVersion01 field. If Not Confirm(Buttons:=vbYesNo, Call Upgrade01to21(UpgradeWsp, dbFile, qdf.SQL = "UPDATE DISTINCTROW strMessage:=sMsg, strTitle:="Upgrade gsVersion21) [" & TblName & "] SET AlterTempField = database") Then Call Upgrade21to23(UpgradeWsp, dbFile, [" & FieldName & "]" Exit Function gsVersion23) qdf.Execute End If Call Upgrade23to24(UpgradeWsp, dbFile, gsVersion24) ' Delete the old field. UpgradeWsp.BeginTrans Call Upgrade242to243(UpgradeWsp, qdf.SQL = "ALTER TABLE [" & dbFile, gsVersion242) TblName & "] DROP COLUMN [" & Select Case sVerFrom Call Upgrade243to25(UpgradeWsp, dbFile, FieldName & "]" Case gsVersion25 gsVersion25) qdf.Execute Call Upgrade25to251(UpgradeWsp, Call Upgrade25to251(UpgradeWsp, dbFile, dbFile, gsVersion251) gsVersion251) ' Rename the temporary field to the old field's name. Case gsVersion243 End Select dbFile.TableDefs("[" & TblName & Call Upgrade243to25(UpgradeWsp, "]").Fields("AlterTempField").Name = dbFile, gsVersion25) UpgradeWsp.CommitTrans FieldName Call Upgrade25to251(UpgradeWsp, dbFile.TableDefs.Refresh dbFile, gsVersion251) UpgradeDb = True Exit Function ' Clean up. Case gsVersion24, gsVersion241, End Sub gsVersion242 UpgradeDbErr: Private Sub Upgrade01to21(UpgradeWsp sMsg = "After this upgrade, the run Call LogErrors(Errors) As DAO.Workspace, dbFile As history for previous runs will no longer be ShowError errUpgradeFailed DAO.Database, sVersion As String) available. " & _ Dim sSql As String "Continue?" End Function If Not Confirm(Buttons:=vbYesNo, Private Function DBVersion(TestDb As Database) On Error GoTo Upgrade01to21Err strMessage:=sMsg, strTitle:="Upgrade As String database") Then ' Retrieves the database version HP TPC-H FULL DISCLOSURE REPORT 279 © 2005 Hewlett-Packard Company. All rights reserved. Dim rVersion As Recordset ' PURPOSE: Contains all the functions that ' Find the message string for the passed in code carry out error/debug If StringEmpty(strMessage) Then On Error GoTo DBVersionErr ' processing for the project. strMessage = ' Contact: Reshma Tharamal Trim$(LoadResString(lngMessageCode)) Set rVersion = ([email protected]) End If TestDb.OpenRecordset("Select db_version ' from db_details ", _ ' Most of the functions in this module that If StringEmpty(strTitle) Then dbOpenForwardOnly) manipulate the strTitle = ' error object do not have an On Error GoTo Trim$(LoadResString(lngTitleCode)) BugAssert rVersion.RecordCount <> 0 statement - this End If DBVersion = rVersion!db_version ' is because it will clear the passed in error object - let If Not StringEmpty(TitleParameter) Then rVersion.Close ' the calling functions handle the errors raised strTitle = strTitle & Chr$(vbKeySpace) & _ Exit Function by this gstrSQ & TitleParameter & gstrSQ ' module, if any End If DBVersionErr: Option Explicit If Err.Number = merrDaoTableMissing ' Display the confirmation message with the Then ' Used to indicate the source module name Cancel button DBVersion = gsVersion01 when errors ' set to the default - assume that we are Else ' are raised by this module confirming LogErrors Errors Private Const mstrModuleName As String = ' potentially dangerous operations! Err.Raise vbObjectError + "DebugSM." intResponse = MsgBox(strMessage, _ errUpgradeFailed, mstrModuleName, _ intButtonStyle + vbQuestion + LoadResString(errUpgradeFailed) Private mcLogFile As cFileSM vbApplicationModal, _ End If Private mcErrorFile As cFileSM strTitle)

End Function Private Const ' Translate the user response into a True/False FORMAT_MESSAGE_FROM_SYSTEM = return code Private Function ValidUpgrade(sVerTo As &H1000 If intButtonStyle = vbOKCancel Then String, sVerFrom As String) As Boolean Private Const If intResponse = vbOK Then FORMAT_MESSAGE_IGNORE_INSERTS = Confirm = True If sVerTo = gsVersion And sVerFrom = &H200 Else gsVersion251 Then Private Const pNull = 0 Confirm = False ValidUpgrade = True End If ElseIf sVerTo = gsVersion And Declare Function FormatMessage Lib Else sVerFrom = gsVersion25 Then "kernel32" Alias "FormatMessageA" (ByVal If intResponse = vbYes Then ValidUpgrade = True dwFlags As Long, lpSource As Any, ByVal Confirm = True ElseIf sVerTo = gsVersion And dwMessageId As Long, ByVal dwLanguageId Else sVerFrom = gsVersion243 Then As Long, ByVal lpbuffer As String, ByVal Confirm = False ValidUpgrade = True nSize As Long, Arguments As Long) As Long End If ElseIf sVerTo = gsVersion And Public Function Confirm(Optional End If sVerFrom = gsVersion242 Then lngMessageCode As conConfirmMsgCodes, _ ValidUpgrade = True Optional lngTitleCode As Exit Function ElseIf sVerTo = gsVersion And conConfirmMsgTitleCodes, _ sVerFrom = gsVersion241 Then Optional TitleParameter As String, _ ConfirmErr: ValidUpgrade = True Optional ByVal Buttons As Integer = -1, _ ' Log the error code raised by Visual Basic ElseIf sVerTo = gsVersion And Optional strMessage As String = Call LogErrors(Errors) sVerFrom = gsVersion24 Then gstrEmptyString, _ On Error GoTo 0 ValidUpgrade = True Optional strTitle As String = gstrSource = mstrModuleName & "Confirm" ElseIf sVerTo = gsVersion And gstrEmptyString) _ Err.Raise vbObjectError + errConfirmFailed, _ sVerFrom = gsVersion23 Then As Boolean gstrSource, _ ValidUpgrade = True ' Displays a confirmation message LoadResString(errConfirmFailed) ElseIf sVerTo = gsVersion And corresponding to the sVerFrom = gsVersion21 Then ' passed in message code. Returns True if the End Function ValidUpgrade = True user says Public Sub LogSystemError() ElseIf sVerTo = gsVersion And ' Ok and False otherwise Dim eErrCode As Long sVerFrom = gsVersion10 Then ValidUpgrade = True Dim intResponse As Integer eErrCode = GetLastError() ElseIf sVerTo = gsVersion And Dim intButtonStyle As Integer If eErrCode <> 0 Then sVerFrom = gsVersion01 Then WriteToFile "System Error: "& eErrCode & ValidUpgrade = True On Error GoTo ConfirmErr vbCrLf & ApiError(eErrCode), _ Else blnError:=True ValidUpgrade = False Confirm = False End If End If ' If the buttons style hasn't been specified, set End Sub End Function the Public Function ApiError(ByVal e As Long) As ' default style to display OK and Cancel String Attribute VB_Name = "DebugSM" buttons ' FILE: DebugSM.bas If Buttons = -1 Then Dim s As String ' Microsoft TPC-H Kit Ver. 1.00 intButtonStyle = vbOKCancel Dim c As Long ' Copyright Microsoft, 1999 Else ' All Rights Reserved intButtonStyle = Buttons s = String(256, 0) ' End If c = ' FormatMessage(FORMAT_MESSAGE_FROM_S YSTEM Or _ HP TPC-H FULL DISCLOSURE REPORT 280 © 2005 Hewlett-Packard Company. All rights reserved. ' Re-initialize the values of the Error object FORMAT_MESSAGE_IGNORE_INSERT On Error GoTo WriteToFileErr before S, _ ' displaying the error to the user pNull, e, 0&, s, Len(s), ByVal pNull) If blnError Then Call InitErrObject(ErrorCode, ErrorSource, If c Then ApiError = e & ": " & Left$(s, If mcErrorFile Is Nothing Then OptArgs) c) Set mcErrorFile = New cFileSM End If Call DisplayErrors(Errors) End Function Set mcFileObj = mcErrorFile Else Err.Clear ' Output flags determine output destination If mcLogFile Is Nothing Then of BugAsserts and messages Set mcLogFile = New cFileSM End Sub #Const afLogfile = 1 End If Public Sub WriteError(ByVal ErrorCode As #Const afMsgBox = 2 Set mcFileObj = mcLogFile errErrorConstants, _ #Const afDebugWin = 4 End If Optional ByVal ErrorSource As String = #Const afAppLog = 8 gstrEmptyString, _ If StringEmpty(mcFileObj.FileName) Then Optional ByVal OptArgs As String = ' Display appropriate error message, and If blnError Then gstrEmptyString) then stop strFileName = gstrProjectPath & "\" & ' program. These errors should NOT be App.EXEName & ".ERR" ' Initialize the values of the Error object before possible in strFileHdr = "Stepmaster Errors" ' calling the log function ' shipping product. Else Call InitErrObject(ErrorCode, ErrorSource, Sub BugAssert(ByVal fExpression As strFileName = gstrProjectPath & "\" & OptArgs) Boolean, _ App.EXEName & ".DBG" Optional sExpression As String) strFileHdr = "Stepmaster Log" Call LogErrors(Errors) #If afDebug Then End If If fExpression Then Exit Sub Err.Clear BugMessage "BugAssert failed: " & mcFileObj.FileName = strFileName sExpression mcFileObj.WriteLine strFileHdr End Sub Stop mcFileObj.WriteLine "Log start time : " Private Sub InitErrObject(ByVal ErrorCode As #End If & Now errErrorConstants, _ End Sub End If Optional ByVal ErrorSource As String = gstrEmptyString, _ Sub BugMessage(sMsg As String) mcFileObj.WriteLine sMsg Optional ByVal OptArgs As String = gstrEmptyString) #If afDebug And afLogfile Then Exit Sub ' Since we are writing log messages, the Dim lngError As Long error flag is turned off WriteToFileErr: Call WriteToFile(sMsg, False) ' Display the error code raised by Visual lngError = IIf(ErrorCode > vbObjectError And #End If Basic ErrorCode < vbObjectError + 65535, _ #If afDebug And afMsgBox Then Call DisplayErrors(Errors) ErrorCode - vbObjectError, ErrorCode) MsgBox sMsg ' An error message would've been displayed Err.Number = lngError + vbObjectError #End If by the called Err.Description = LoadResString(lngError) & #If afDebug And afDebugWin Then ' procedures OptArgs Debug.Print sMsg Err.Source = App.EXEName & ErrorSource #End If End Sub #If afDebug And afAppLog Then Public Sub WriteMessage(sMsg As String) End Sub App.LogEvent sMsg Public Sub ShowMessage(ByVal MessageCode As #End If Call WriteToFile(sMsg, True) errErrorConstants, _ Optional ByVal OptArgs As String) End Sub End Sub Public Function ProjectLogFile() As String Dim strMessage As String Sub BugTerm() ProjectLogFile = mcLogFile.FileName #If afDebug And afLogfile Then On Error GoTo ShowMessageErr ' Close log file End Function mcLogFile.CloseFile strMessage = LoadResString(MessageCode) & Public Function ProjectErrorFile() As String #End If OptArgs End Sub ProjectErrorFile = mcErrorFile.FileName ' Write the error to a log file Public Sub ShowError(ByVal ErrorCode As BugMessage strMessage End Function errErrorConstants, _ Optional ByVal ErrorSource As String = MsgBox strMessage, vbOKOnly Private Sub WriteToFile(sMsg As String, gstrEmptyString, _ Optional ByVal blnError As Boolean) Optional ByVal OptArgs As String = Exit Sub gstrEmptyString, _ ' Calls procedures to write the passed in Optional ByVal DoWriteError As ShowMessageErr: message to the log - Boolean = True) ' Log the error and exit ' The blnError flag is used to indicate that Call DisplayErrors(Errors) the message If DoWriteError Then ' should be logged to the error file - by ' Call a procedure to write the error to a End Sub default the log log file Public Sub ShowMessageStr(sMessage As String) ' file is used Call WriteError(ErrorCode, ErrorSource, OptArgs) ' Write the error to a log file Dim mcFileObj As cFileSM End If BugMessage sMessage Dim strFileName As String Dim strFileHdr As String MsgBox sMessage, vbOKOnly HP TPC-H FULL DISCLOSURE REPORT 281 © 2005 Hewlett-Packard Company. All rights reserved. errCode = Err.Number - vbObjectError ' End Sub Else Option Explicit errCode = Err.Number Public Sub DisplayErrors(myErrCollection End If ' Used to indicate the source module name when As Errors) strError = "Error # " & Str(errCode) & " errors Dim strError As String was generated by " _ ' are raised by this module Dim errLoop As Error & Err.Source & vbCrLf & Private Const mstrModuleName As String = Dim errCode As Long Err.Description "FileCommon."

' Enumerate Errors collection and display cColErrors.Add strError Private Enum EOpenFile properties of End If OFN_OVERWRITEPROMPT = &H2 ' each Error object. OFN_HIDEREADONLY = &H4 If Err.Number <> 0 Then ' Log all database errors, if any OFN_FILEMUSTEXIST = &H1000 If Err.Number > vbObjectError And For Each errLoop In myErrCollection OFN_EXPLORER = &H80000 Err.Number < (vbObjectError + 65536) With errLoop End Enum Then If Err.Number > vbObjectError And errCode = Err.Number - Err.Number < (vbObjectError + 65536) Then ' The locations for the different output files are vbObjectError errCode = .Number - vbObjectError presented to Else Else ' the user in a list box. These constants are used errCode = Err.Number errCode = .Number while loading the End If End If ' data and while reading the data from the list box. strError = "Error # " & Str(errCode) & strError = "Error #"& errCode & ' These constants also represent the different file " was generated by " _ vbCrLf types that are & Err.Source & Chr(13) & strError = strError & " " & ' displayed to the user in File Open dialogs Err.Description .Description & vbCrLf Public Enum gFileTypes MsgBox strError, , "Error", strError = strError & _ gintOutputFile = 0 Err.HelpFile, Err.HelpContext " (Source: " & .Source & ")" & ' gintLogFile = 1 Else vbCrLf gintErrorFile For Each errLoop In myErrCollection End With gintStepTextFile With errLoop gintOutputCompareFile If Err.Number > vbObjectError cColErrors.Add strError gintDBFile And Err.Number < (vbObjectError + 65536) Next gintDBFileNew Then gintImportFile errCode = .Number - ' We can have a error handler now that we gintExportFile vbObjectError have stored all End Enum Else ' errors away safely! - having an error errCode = .Number handler before Public Const gsSqlFileSuffix = ".sql" End If ' enumerating all the errors would have Public Const gsCmdFileSuffix = ".cmd" strError = "Error #"& errCode & cleared the error vbCrLf ' collection Public Const gsOutputFileSuffix = ".out" strError = strError & " " & On Error GoTo LogErrorsErr Public Const gstrLogFileSuffix = ".log" .Description & vbCrLf gstrSource = mstrModuleName & Public Const gsErrorFileSuffix = ".err" strError = strError & _ "LogErrors" Public Function BrowseDBFile() As String " (Source: " & .Source & ")" ' Prompts the user for a database file with the & vbCrLf For lngIndex = 0 To cColErrors.Count - 1 workspace information ' strError = strError & _ strError = cColErrors(lngIndex) ' Call CallFileDialog to display the open file ' "Press F1 to see topic " & Debug.Print strError dialog .HelpContext & vbCrLf Call WriteToFile(strError, True) BrowseDBFile = CallFileDialog(gintDBFile) ' strError = strError & _ Next lngIndex ' " in the file "& .HelpFile & End Function "." Set cColErrors = Nothing Public Function CallFileDialog(intFileType As End With Integer, _ Exit Sub Optional ByVal strDefaultFile As String = MsgBox strError gstrEmptyString) As String Next LogErrorsErr: ' This function initializes the values of the filter End If ' Display the error code raised by Visual property, Basic ' the dialog title and flags for the File Open dialog End Sub DisplayErrors Errors depending Public Sub LogErrors(myErrCollection As On Error GoTo 0 ' on the FileType passed in Errors) ShowError errUnableToWriteError, ' It then calls ShowFileOpenDialog to set these Dim cColErrors As cVectorStr DoWriteError:=False properties and Dim strError As String ' display the File Open dialog to the user Dim errLoop As Error End Sub Dim errCode As Long Attribute VB_Name = "FileCommon" ' All the properties used by the File Open dialog Dim lngIndex As Long ' FILE: FileCommon.bas are defined ' Microsoft TPC-H Kit Ver. 1.00 ' as constants in this function and passed to Set cColErrors = New cVectorStr ' Copyright Microsoft, 1999 ShowFileOpenDialog ' All Rights Reserved ' as parameters. So if any of the dialog properties ' Enumerate Errors collection and display ' need to be properties of ' ' modified, these constants are what need to be ' each Error object. ' PURPOSE: This module contains common changed If Err.Number <> 0 Then functionality to display Const s_DLG_TITLE_OPEN = "Open" If Err.Number > vbObjectError And ' the File Open dialog. Const s_DLG_TITLE_NEW = "New" Err.Number < (vbObjectError + 65536) ' Contact: Reshma Tharamal Const s_DLG_TITLE_IMPORT = "Import Then ([email protected]) From" HP TPC-H FULL DISCLOSURE REPORT 282 © 2005 Hewlett-Packard Company. All rights reserved. Const s_DLG_TITLE_EXPORT = mstr_FILE_OUTPUT_FILTER & gstrSource = mstrModuleName & "Export To" mstr_FILE_ALL_FILTER, _ "CallFileDialog" s_DLG_TITLE_OPEN, _ Call ShowError(errBrowseFailed) Const mlng_FILE_STEP_TEXT_FLAGS mlng_FILE_OUTPUT_FLAGS, _ = OFN_EXPLORER Or strDefaultFile) End Function OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY ' Case gintLogFile VERSION 5.00 Const ' strFileName = ShowFileOpenDialog( _ Begin VB.Form frmSplash mlng_FILE_OUTPUT_COMPARE_FLAG ' mstr_FILE_LOG_FILTER & BorderStyle = 3 'Fixed Dialog S = mlng_FILE_STEP_TEXT_FLAGS mstr_FILE_ALL_FILTER, _ ClientHeight = 4710 Const mlng_FILE_DB_FLAGS = ' s_DLG_TITLE_OPEN, _ ClientLeft = 45 mlng_FILE_STEP_TEXT_FLAGS ' mlng_FILE_LOG_FLAGS, _ ClientTop = 45 Const mlng_FILE_OUTPUT_FLAGS = ' strDefaultFile) ClientWidth = 7455 OFN_EXPLORER Or ' ControlBox = 0 'False OFN_HIDEREADONLY Or Case gintErrorFile Icon = "frmSplash.frx":0000 OFN_OVERWRITEPROMPT strFileName = ShowFileOpenDialog( _ LinkTopic = "Form1" Const mlng_FILE_LOG_FLAGS = mstr_FILE_ERROR_FILTER & LockControls = -1 'True mlng_FILE_OUTPUT_FLAGS mstr_FILE_ALL_FILTER, _ MaxButton = 0 'False Const mlng_FILE_ERROR_FLAGS = s_DLG_TITLE_OPEN, _ MinButton = 0 'False mlng_FILE_OUTPUT_FLAGS mlng_FILE_ERROR_FLAGS, _ ScaleHeight = 4710 Const mlng_FILE_DB_NEW_FLAGS = strDefaultFile) ScaleWidth = 7455 mlng_FILE_OUTPUT_FLAGS ShowInTaskbar = 0 'False Case gintDBFile StartUpPosition = 2 'CenterScreen Const mstr_FILE_ALL_FILTER = "|All strFileName = ShowFileOpenDialog( _ Visible = 0 'False Files (*.*)|*.*" mstr_FILE_DB_FILTER & Begin VB.Frame fraMainFrame Const mstr_FILE_STEP_TEXT_FILTER mstr_FILE_ALL_FILTER, _ Height = 4590 = "Query Files (*"& gsSqlFileSuffix & _ s_DLG_TITLE_OPEN, _ Left = 45 ") |*"& gsSqlFileSuffix & mlng_FILE_DB_FLAGS, _ TabIndex = 0 "|Command Script Files (*" & strDefaultFile) Top = -15 gsCmdFileSuffix & _ Width = 7380 ") |*"& gsCmdFileSuffix Case gintDBFileNew Begin VB.PictureBox picLogo Const strFileName = ShowFileOpenDialog( _ Height = 2385 mstr_FILE_OUTPUT_COMPARE_FILTE mstr_FILE_DB_FILTER & Left = 510 R = "Text Files (*.txt)|*.txt" mstr_FILE_ALL_FILTER, _ Picture = "frmSplash.frx":0442 Const mstr_FILE_OUTPUT_FILTER = s_DLG_TITLE_NEW, _ ScaleHeight = 2325 "Output Files (*.out)|*.out" mlng_FILE_DB_NEW_FLAGS, _ ScaleWidth = 1755 Const mstr_FILE_LOG_FILTER = "Log strDefaultFile) TabIndex = 1 Files (*.log)|*.log" Top = 855 Const mstr_FILE_ERROR_FILTER = Case gintImportFile Width = 1815 "Error Files (*.err)|*.err" strFileName = ShowFileOpenDialog( _ End Const mstr_FILE_DB_FILTER = mstr_FILE_DB_FILTER & Begin VB.Label lblReserved "Stepmaster Workspace Files (*" & mstr_FILE_ALL_FILTER, _ AutoSize = -1 'True gsDefDBFileExt & ")|*" & gsDefDBFileExt s_DLG_TITLE_IMPORT, _ Caption = "All Rights Reserved." mlng_FILE_DB_FLAGS, _ Height = 195 Dim strFileName As String strDefaultFile) Left = 5520 TabIndex = 8 On Error GoTo CallFileDialogErr Case gintExportFile Top = 4080 strFileName = ShowFileOpenDialog( _ Width = 1440 Select Case intFileType mstr_FILE_DB_FILTER & End Case gintStepTextFile mstr_FILE_ALL_FILTER, _ Begin VB.Label lblCopyright strFileName = s_DLG_TITLE_EXPORT, _ AutoSize = -1 'True ShowFileOpenDialog( _ mlng_FILE_DB_FLAGS, _ Caption = "Copyright © 1998" strDefaultFile) BeginProperty Font mstr_FILE_STEP_TEXT_FILTER & Name = "Arial" mstr_FILE_ALL_FILTER, _ Case Else Size = 8.25 s_DLG_TITLE_OPEN, _ BugAssert True, "Incorrect file type Charset = 0 passed in." Weight = 400 mlng_FILE_STEP_TEXT_FLAGS, _ ' Default processing will be for the Underline = 0 'False strDefaultFile) output file Italic = 0 'False strFileName = ShowFileOpenDialog( _ Strikethrough = 0 'False Case gintOutputCompareFile mstr_FILE_OUTPUT_FILTER & EndProperty strFileName = mstr_FILE_ALL_FILTER, _ Height = 210 ShowFileOpenDialog( _ s_DLG_TITLE_OPEN, _ Left = 5550 mlng_FILE_OUTPUT_FLAGS, _ TabIndex = 7 mstr_FILE_OUTPUT_COMPARE_FILTE strDefaultFile) Tag = "Copyright" R & mstr_FILE_ALL_FILTER, _ Top = 3850 s_DLG_TITLE_OPEN, _ End Select Width = 1380 CallFileDialog = strFileName WordWrap = -1 'True mlng_FILE_OUTPUT_COMPARE_FLAG End S, _ Exit Function Begin VB.Label lblCompany strDefaultFile) AutoSize = -1 'True CallFileDialogErr: Caption = "Microsoft Corporation" Case gintOutputFile CallFileDialog = gstrEmptyString BeginProperty Font strFileName = ' Log the error code raised by Visual Basic Name = "Arial" ShowFileOpenDialog( _ Call LogErrors(Errors) Size = 8.25 HP TPC-H FULL DISCLOSURE REPORT 283 © 2005 Hewlett-Packard Company. All rights reserved. Charset = 0 Left = 480 Left = 240 Weight = 400 TabIndex = 2 List = "frmWorkspaceOpen.frx":0002 Underline = 0 'False Tag = "Warning" MultiSelect = 2 'Extended Italic = 0 'False Top = 3850 TabIndex = 1 Strikethrough = 0 'False Width = 1380 Top = 480 EndProperty End Width = 4215 Height = 210 End End Left = 5460 End Begin VB.Label lblWorkspaces TabIndex = 6 Attribute VB_Name = "frmSplash" AutoSize = -1 'True Tag = "Company" Attribute VB_GlobalNameSpace = False Caption = "Workspace" Top = 3640 Attribute VB_Creatable = False Height = 195 Width = 1560 Attribute VB_PredeclaredId = True Left = 240 End Attribute VB_Exposed = False TabIndex = 0 Begin VB.Label lblRestrictions ' FILE: frmSplash.frm Top = 120 AutoSize = -1 'True ' Microsoft TPC-H Kit Ver. 1.00 Width = 825 Caption = "See License ' Copyright Microsoft, 1999 End Agreement for Restrictions" ' All Rights Reserved End Height = 195 ' Attribute VB_Name = "frmWorkspaceOpen" Left = 460 ' Attribute VB_GlobalNameSpace = False TabIndex = 5 ' PURPOSE: Splash screen for StepMaster Attribute VB_Creatable = False Top = 4080 ' Contact: Reshma Tharamal Attribute VB_PredeclaredId = True Width = 2790 ([email protected]) Attribute VB_Exposed = False End ' ' FILE: frmWorkspaceOpen.frm Begin VB.Label lblProductName Option Explicit ' Microsoft TPC-H Kit Ver. 1.00 AutoSize = -1 'True ' Copyright Microsoft, 1999 Caption = "StepMaster" ' All Rights Reserved BeginProperty Font Private Sub Form_Load() ' Name = "Arial" ' lblVersion.Caption = "Version " & ' Size = 32.25 App.Major & "." & App.Minor & "." & ' PURPOSE: Used to display a list of all Charset = 0 App.Revision workspaces in a Weight = 700 lblProductName.Caption = App.Title ' workspace definition file for Open, Import, Underline = 0 'False lblVersion.Caption = GetVersionString Export Italic = 0 'False ' and Run (in SMRunOnly) workspace Strikethrough = 0 'False End Sub ' Contact: Reshma Tharamal EndProperty ([email protected]) Height = 765 ' Left = 2670 Option Explicit TabIndex = 4 VERSION 5.00 #If RUN_ONLY Then Tag = "Product" Begin VB.Form frmWorkspaceOpen Private WithEvents cRunOnlyInst As cRunOnly Top = 1200 BorderStyle = 3 'Fixed Dialog Attribute cRunOnlyInst.VB_VarHelpID = -1 Width = 3495 Caption = "Open Workspace" End ClientHeight = 2550 Private Sub cRunOnlyInst_Done() Begin VB.Label lblVersion ClientLeft = 45 ShowFree Alignment = 1 'Right Justify ClientTop = 330 End Sub AutoSize = -1 'True ClientWidth = 4695 Caption = "Version 2.4" LinkTopic = "Form1" Private Sub Run() BeginProperty Font LockControls = -1 'True Dim iIndex As Integer Name = "Arial" MaxButton = 0 'False Size = 12 MinButton = 0 'False Set cRunOnlyInst = New cRunOnly Charset = 0 ScaleHeight = 2550 Weight = 700 ScaleWidth = 4695 For iIndex = 0 To Me.lstWorkspaces.ListCount - Underline = 0 'False ShowInTaskbar = 0 'False 1 Italic = 0 'False StartUpPosition = 1 'CenterOwner If Me.lstWorkspaces.Selected(iIndex) Then Strikethrough = 0 'False Begin VB.CommandButton cmdOK ShowBusy EndProperty Caption = "OK" cRunOnlyInst.WorkspaceId = Height = 285 Default = -1 'True Me.lstWorkspaces.ItemData(Me.lstWorkspaces.List Left = 4800 Height = 375 Index) TabIndex = 3 Left = 2160 cRunOnlyInst.WspName = Tag = "Version" TabIndex = 2 Me.lstWorkspaces.List(Me.lstWorkspaces.ListInde Top = 2040 Top = 2040 x) Width = 1275 Width = 1095 cRunOnlyInst.RunWsp End End End If Begin VB.Label lblWarning Begin VB.CommandButton cmdCancel Next iIndex AutoSize = -1 'True Cancel = -1 'True Caption = "Do Not Redistribute" Caption = "Cancel" End Sub BeginProperty Font Height = 375 Name = "Arial" Left = 3360 #End If Size = 8.25 TabIndex = 3 Charset = 0 Top = 2040 Private Sub cmdCancel_Click() Weight = 400 Width = 1095 Underline = 0 'False End Unload Me Italic = 0 'False Begin VB.ListBox lstWorkspaces Strikethrough = 0 'False Height = 1425 End Sub EndProperty ItemData = Height = 210 "f rmWorkspaceOpen.frx":0000 Private Sub cmdOK_Click() HP TPC-H FULL DISCLOSURE REPORT 284 © 2005 Hewlett-Packard Company. All rights reserved. rstStepsInWsp.MoveNext #If RUN_ONLY Then ' Assert that all the elements are present Wend Call Run BugAssert bReset = 0, "Range not #Else completely specified!" qyIt.Close Call WorkspaceOpenOk #End If End Sub BugMessage "Query step at a time Read + load Public Sub LoadIteratorsForWsp(cStepsCol As took: " & CStr(DateDiff("s", dtStart, Now)) End Sub cArrSteps, _ ByVal lngWorkspaceId As Long, #End If rstStepsInWsp As Recordset) Private Sub lstWorkspaces_DblClick() ' Initializes the step records in with all the Exit Sub iterator ' A double click on the workspaces list ' values for each step LoadIteratorsForWspErr: box is considered LogErrors Errors ' equivalent to selecting an item in the list Dim recIterators As Recordset gstrSource = mstrModuleName & and then selecting "LoadIteratorsForWsp" ' the OK command On Error GoTo LoadIteratorsForWspErr On Error GoTo 0 Call cmdOK_Click Err.Raise vbObjectError + #If QUERY_ALL Then errLoadRsInArrayFailed, _ End Sub Dim dtStart As Date gstrSource, _ LoadResString(errLoadRsInArrayFailed) Attribute VB_Name = "IteratorCommon" dtStart = Now ' FILE: IteratorCommon.bas Set recIterators = End Sub ' Microsoft TPC-H Kit Ver. 1.00 ReadWspIterators(lngWorkspaceId) Private Function ReadWspIterators(ByVal ' Copyright Microsoft, 1999 lngWorkspaceId As Long) As Recordset ' All Rights Reserved Call LoadIteratorsArray(cStepsCol, ' recIterators) ' This function will return a recordset that is ' populated ' PURPOSE: Contains functionality recIterators.Close ' with the iterators for all the steps in a given common across StepMaster and workspace ' SMRunOnly, pertaining to iterators BugMessage "QueryAll Read + load took: " ' Specifically, functions to read & CStr(DateDiff("s", dtStart, Now)) Dim recIterators As Recordset iterators records Dim qyIt As DAO.QueryDef ' in the workspace, load them in an #Else Dim strSql As String array and so on. Dim dtStart As Date ' Contact: Reshma Tharamal Dim qyIt As DAO.QueryDef On Error GoTo ReadWspIteratorsErr ([email protected]) Dim sSql As String gstrSource = mstrModuleName & ' "ReadWspIterators" Option Explicit dtStart = Now If rstStepsInWsp.RecordCount = 0 Then strSql = "Select i.step_id, i.version_no, " & _ ' Used to indicate the source module name Exit Sub " i.type, i.iterator_value, " & _ when errors End If " i.sequence_no " & _ ' are raised by this module " from iterator_values i, att_steps a " & _ Private Const mstrModuleName As String = ' This method has the advantage that if the " where i.step_id = a.step_id " & _ "IteratorCommon." steps are queried right, everything else follows " and i.version_no = a.version_no " & _ sSql = "Select step_id, version_no, type, " and a.workspace_id = [w_id] " & _ Public Const gintMinIteratorSequence As iterator_value, " & _ " and a.archived_flag = [archived] " Integer = 0 " sequence_no " & _ " from iterator_values " & _ ' Find the highest X-component of the version Public Sub RangeComplete(vntIterators As " where step_id = [s_id] " & _ number Variant) " and version_no = [ver_no] " strSql = strSql & " AND cint( mid( a.version_no, ' This is a debug procedure 1, instr( a.version_no, " & gstrDQ & ' Checks if the from, to and step values ' Order the iterators by sequence within a gstrVerSeparator & gstrDQ & " ) - 1 ) ) = "& _ are present in step " ( select max( cint( mid( version_no, 1, instr( ' the array sSql = sSql & " order by sequence_no " version_no, " & gstrDQ & gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) "& _ Dim bReset As Byte Set qyIt = " from att_steps AS d " & _ Dim bShift As Byte dbsAttTool.CreateQueryDef(gstrEmptyString, " WHERE a.step_id = d.step_id ) " Dim lngIndex As Long sSql) rstStepsInWsp.MoveFirst ' Find the highest Y-component of the version ' Set the three lowest order bits to 1 number for the highest X-component bReset = 7 While Not rstStepsInWsp.EOF strSql = strSql & " AND cint( mid( a.version_no, instr( a.version_no, " & gstrDQ & gstrVerSeparator BugAssert IsArray(vntIterators) And Not qyIt.Parameters("s_id").Value = & gstrDQ & " ) + 1 ) ) = " & _ IsEmpty(vntIterators), _ rstStepsInWsp!step_id " ( select max( cint( mid( version_no, instr( "Iterators not specified!" qyIt.Parameters("ver_no").Value = version_no, " & gstrDQ & gstrVerSeparator & rstStepsInWsp!version_no gstrDQ & " ) + 1 ) ) ) " & _ For lngIndex = LBound(vntIterators) To _ " from att_steps AS b " & _ UBound(vntIterators) Set recIterators = " Where a.step_id = b.step_id " & _ bShift = 1 qyIt.OpenRecordset(dbOpenSnapshot) " AND cint( mid( version_no, 1, instr( bShift = bShift * (2 ^ version_no, " & gstrDQ & gstrVerSeparator & (vntIterators(lngIndex).IteratorType - 1)) Call LoadIteratorsArray(cStepsCol, gstrDQ & " ) - 1 ) ) = "& _ recIterators) " ( select max( cint( mid( version_no, 1, instr( bReset = bReset Xor bShift recIterators.Close version_no, " & gstrDQ & gstrVerSeparator & Next lngIndex gstrDQ & " ) - 1 ) ) ) "& _ HP TPC-H FULL DISCLOSURE REPORT 285 © 2005 Hewlett-Packard Company. All rights reserved. " from att_steps AS c " & _ cNewIt.IteratorType = Attribute VB_Name = "OpenFiles" " WHERE a.step_id = c.step_id ) ) " CInt(ErrorOnNullField(recIterators, "type")) ' FILE: OpenFiles.bas cNewIt.Value = ' Microsoft TPC-H Kit Ver. 1.00 CStr(ErrorOnNullField(recIterators, ' Copyright Microsoft, 1999 ' Order the iterators by sequence within a "i terator_value")) ' All Rights Reserved step cNewIt.SequenceNo = ' strSql = strSql & " order by i.step_id, CInt(ErrorOnNullField(recIterators, ' i.sequence_no " "s equence_no")) ' PURPOSE: This module holds a list of all files that have been Set qyIt = ' Add this record to the array of iterators ' opened by the project. This module is dbsAttTool.CreateQueryDef(gstrEmptyStrin cStepRec.LoadIterator cNewIt needed since there g, strSql) ' is no way to share static data between qyIt.Parameters("w_id").Value = Set cNewIt = Nothing different instances lngWorkspaceId recIterators.MoveNext ' of a class. qyIt.Parameters("archived").Value = Wend ' Many procedure in this module do not do False any error handling - Exit Sub ' this is 'coz it is also used by procedures Set recIterators = that log error qyIt.OpenRecordset(dbOpenSnapshot) LoadIteratorsArrayErr: ' messages and any error handler will erase LogErrors Errors the collection qyIt.Close gstrSource = mstrModuleName & ' of errors! Set ReadWspIterators = recIterators "LoadIteratorsArray" On Error GoTo 0 ' Contact: Reshma Tharamal Exit Function Err.Raise vbObjectError + ([email protected]) errLoadRsInArrayFailed, _ ' ReadWspIteratorsErr: gstrSource, _ Option Explicit ' Log the error code raised by Visual Basic LoadResString(errLoadRsInArrayFailed) Call LogErrors(Errors) ' Used to indicate the source module name when On Error GoTo 0 End Sub errors Err.Raise vbObjectError + ' are raised by this class errReadDataFailed, _ Private Const mstrModuleName As String = gstrSource, Attribute VB_Name = "MsgConfirm" ".OpenFiles." LoadResString(errReadDataFailed) ' FILE: MsgConfirm.bas ' Microsoft TPC-H Kit Ver. 1.00 Private mOpenFiles As cNodeCollections End Function ' Copyright Microsoft, 1999 Private Sub LoadIteratorsArray(cStepsCol ' All Rights Reserved Private Const mstrTempDir As String = "\Temp\" As cArrSteps, _ ' recIterators As Recordset) ' ' The maximum number of temporary files that we ' Initializes the step records with the ' PURPOSE: Contains constants for can create in a iterators for confirmation messages that ' session ' the step ' will be displayed by StepMaster Private Const mlngMaxFileIndex As Long = ' Contact: Reshma Tharamal 999999 Dim cNewIt As cIterator ([email protected]) Private Const mstrFileIndexFormat As String = Dim cStepRec As cStep ' "0 00000" Dim lngStepId As Long Option Explicit Private Const mstrTempFilePrefix As String = "SM" On Error GoTo LoadIteratorsArrayErr ' A public enum containing the codes for all the Private Const mstrTempFileSuffix As String = gstrSource = mstrModuleName & confirmation ".cmd" "LoadIteratorsArray" ' messages that will be used by the project - each of the codes Private Const merrFileNotFound As Long = 76 If recIterators.RecordCount = 0 Then ' has the prefix, con Private Function GetFileHandle(strFileName) As Exit Sub Public Enum conConfirmMsgCodes cFileInfo End If conWspDelete = 2000 conSave Dim lngIndex As Long recIterators.MoveFirst conStopRun Dim blnFileOpen As Boolean While Not recIterators.EOF conSaveConnect Set cNewIt = New cIterator conSaveDB If Not mOpenFiles Is Nothing Then End Enum lngStepId = blnFileOpen = False CLng(ErrorOnNullField(recIterators, ' A public enum containing the titles for all the For lngIndex = 0 To mOpenFiles.Count - 1 "s tep_id")) confirmation If mOpenFiles(lngIndex).FileName = If Not cStepRec Is Nothing Then ' messages that will be used by the project - strFileName Then If cStepRec.StepId <> lngStepId each of the codes blnFileOpen = True Then ' has the prefix, cont - most confirmation Exit For Set cStepRec = message codes will End If cStepsCol.QueryStep(lngStepId) ' have a corresponding title code in here Next lngIndex End If Public Enum conConfirmMsgTitleCodes Else contWspDelete = 3000 If blnFileOpen Then Set cStepRec = contSave Set GetFileHandle = mOpenFiles(lngIndex) cStepsCol.QueryStep(lngStepId) contStopRun Else End If contSaveConnect Set GetFileHandle = Nothing contSaveDB End If ' Initialize iterator values End Enum Else Set GetFileHandle = Nothing HP TPC-H FULL DISCLOSURE REPORT 286 © 2005 Hewlett-Packard Company. All rights reserved. End If If StringEmpty(Dir$(strTempDir, Set NewFileInfo = GetFileHandle(strFileName) End Function vbDirectory)) Then ' If the specified directory doesn't If NewFileInfo Is Nothing Then Private Function GetTempFileDir() As exist, try to ' The file has not been opened yet String ' create it. MkDir strTempDir ' If the filename has not been initialized, do not Dim strTempFileDir As String Else ' attempt to open it ' The directory exists - go to it's strFileName = MakePathValid(strFileName) On Error GoTo GetTempFileDirErr sub-directory End If If strFileName <> gstrEmptyString Then strTempFileDir = gstrProjectPath & intStart = InStr(intStart + 1, intHFile = FreeFile mstrTempDir strFileDir, gstrFileSeparator) Open strFileName For Output Shared As Loop intHFile If StringEmpty(Dir$(strTempFileDir, vbDirectory)) Then ' Sanity check Set NewFileInfo = New cFileInfo MkDir strTempFileDir If StringEmpty(Dir$(strFileDir, NewFileInfo.FileHandle = intHFile End If vbDirectory)) Then NewFileInfo.FileName = strFileName ' We were unable to create the file mOpenFiles.Load NewFileInfo GetTempFileDir = strTempFileDir directory Else ShowError errCreateDirectoryFailed, ' Either the directory was invalid or s'thing Exit Function gstrSource, _ failed strFileDir, DoWriteError:=False ' Display the error to the user instead of GetTempFileDirErr: MakePathValid = gstrEmptyString trying ' Log the error code raised by Visual Else ' to log to the file Basic MakePathValid = strTempFile ShowError errInvalidFile, gstrSource, Call LogErrors(Errors) End If strFileName, _ gstrSource = mstrModuleName & Else DoWriteError:=False "GetTempFileDir" ' The specified directory exists - we intHFile = 0 On Error GoTo 0 should be able End If Err.Raise vbObjectError + ' to create the output file in it Else errProgramError, gstrSource, _ MakePathValid = strTempFile intHFile = NewFileInfo.FileHandle LoadResString(errProgramError) End If End If Else End Function ' The user has only specified a filename - OpenFileSM = intHFile Public Function VB will try MakePathValid(strFileName As String) As ' to create it in the current directory Exit Function String MakePathValid = strTempFile ' Checks if the passed in file path is valid End If OpenFileSMErr: ' Log the error code raised by Visual Basic Dim strFileDir As String Exit Function Call LogErrors(Errors) Dim strTempDir As String ' The Open command failed for some reason - Dim strTempFile As String MakePathValidErr: write an error Dim intPos As Integer ' Log the error code raised by Visual Basic ' and let the calling function handle the error Dim intStart As Integer Call LogErrors(Errors) ShowError errInvalidFile, gstrSource, gstrSource = mstrModuleName & strFileName, _ On Error GoTo MakePathValidErr "MakePathValid" DoWriteError:=False gstrSource = mstrModuleName & ' Log the filename for debug OpenFileSM = 0 "MakePathValid" Call WriteError(errInvalidFile, gstrSource, strTempFile) End Function strTempFile = strFileName On Error GoTo 0 Public Function CreateTempFile() As String intPos = InstrR(strFileName, Err.Raise vbObjectError + errProgramError, gstrFileSeparator) gstrSource, _ Dim strTempFileDir As String LoadResString(errProgramError) Dim strTempFileName As String If intPos > 0 Then strFileDir = Left$(strTempFile, intPos - End Function Static lngLastFileIndex As Long 1) Public Function OpenFileSM(strFileName As If StringEmpty(Dir$(strFileDir, String) As Integer On Error GoTo CreateTempFileErr vbDirectory)) Then Dim intHFile As Integer ' Loop through the entire path Dim NewFileInfo As cFileInfo strTempFileDir = GetTempFileDir() starting at the root ' since Mkdir can create only one On Error GoTo OpenFileSMErr Do level of sub-directory gstrSource = mstrModuleName & If lngLastFileIndex = mlngMaxFileIndex Then ' at a time "OpenFileSM" On Error GoTo 0 intStart = InStr(strFileDir, Err.Raise vbObjectError + gstrFileSeparator) If StringEmpty(strFileName) Then errMaxTempFiles, gstrSource, _ On Error GoTo 0 LoadResString(errMaxTempFiles) Do While strTempDir <> strFileDir Err.Raise vbObjectError + errInvalidFile, End If gstrSource, _ If intStart > 0 Then LoadResString(errInvalidFile) lngLastFileIndex = lngLastFileIndex + 1 strTempDir = Left$(strFileDir, End If strTempFileName = mstrTempFilePrefix & _ intStart - 1) Format$(lngLastFileIndex, Else If mOpenFiles Is Nothing Then mstrFileIndexFormat) & _ strTempDir = strFileDir Set mOpenFiles = New cNodeCollections mstrTempFileSuffix End If End If HP TPC-H FULL DISCLOSURE REPORT 287 © 2005 Hewlett-Packard Company. All rights reserved. If Not ' All Rights Reserved StringEmpty(Dir$(strTempFileDir & ' LoadRecordsetInParameterArrayErr: strTempFileName)) Then ' LogErrors Errors ' Remove any files left over from a ' PURPOSE: Contains functionality common gstrSource = mstrModuleName & previous run, across StepMaster and "LoadRecordsetInParameterArray" ' if they still exist ' SMRunOnly, pertaining to parameters On Error GoTo 0 Kill strTempFileDir & ' Specifically, functions to load Err.Raise vbObjectError + strTempFileName parameter records errLoadRsInArrayFailed, gstrSource, _ End If ' in an array. LoadResString(errLoadRsInArrayFailed) ' Contact: Reshma Tharamal End Sub ' Looping in case the file delete doesn't go ([email protected]) Attribute VB_Name = "Public" through for ' ' FILE: Public.bas ' some reason Option Explicit ' Microsoft TPC-H Kit Ver. 1.00 Loop While Not ' Copyright Microsoft, 1999 StringEmpty(Dir$(strTempFileDir & ' Used to indicate the source module name ' All Rights Reserved strTempFileName)) when errors ' ' are raised by this module ' CreateTempFile = Private Const mstrModuleName As String = ' PURPOSE: This module contains all the public GetShortName(strTempFileDir) "P arameterCommon." constants for this project CreateTempFile = CreateTempFile & ' Contact: Reshma Tharamal strTempFileName Public Sub ([email protected]) LoadRecordsetInParameterArray(rstWorkSpac ' Exit Function eParameters As Recordset, _ Option Explicit cParamCol As cArrParameters) CreateTempFileErr: Public Const gsVersion01 As String = "0.1" ' Log the error code raised by Visual Dim cNewParameter As cParameter Public Const gsVersion10 As String = "1.0" Basic Public Const gsVersion21 As String = "2.1" Call LogErrors(Errors) On Error GoTo Public Const gsVersion23 As String = "2.3" gstrSource = gstrSource & LoadRecordsetInParameterArrayErr Public Const gsVersion24 As String = "2.4" "CreateTempFile" Public Const gsVersion241 As String = "2.4.1" On Error GoTo 0 If rstWorkSpaceParameters.RecordCount = Public Const gsVersion242 As String = "2.4.2" Err.Raise vbObjectError + 0 Then Public Const gsVersion243 As String = "2.4.3" errProgramError, gstrSource, _ Exit Sub Public Const gsVersion25 As String = "2.5" LoadResString(errProgramError) End If Public Const gsVersion251 As String = "2.5.1" Public Const gsVersion253 As String = "2.5.3" End Function rstWorkSpaceParameters.MoveFirst Public Const gsVersion254 As String = "2.5.4" Public Sub CloseFileSM(strFileName As While Not rstWorkSpaceParameters.EOF Public Const gsVersion255 As String = "2.5.5" String) Public Const gsVersion As String = gsVersion255 Dim FileToClose As cFileInfo Set cNewParameter = New cParameter ' The same form is used for the creation of new If Not mOpenFiles Is Nothing Then ' Initialize parameter values nodes and cNewParameter.ParameterId = ' updates to existing nodes (where each node can be ' Get the handle to the open file, if it rstWorkSpaceParameters.Fields(0) a parameter, exists ' global step, etc.) A tag is set on each flag is used to Set FileToClose = ' Call a procedure to raise an error if indicate GetFileHandle(strFileName) mandatory fields are ' whether it is being called in the insert or update ' null. mode. The If Not FileToClose Is Nothing Then cNewParameter.ParameterName = CStr( _ ' constants for these modes are defined below Close FileToClose.FileHandle Public Const gstrInsertMode = "Insert" ErrorOnNullField(rstWorkSpaceParameters, Public Const gstrUpdateMode = "Update" ' Remove the file info from the "parameter_name")) Public Const gstrPropertiesMode = "View" collection of open files cNewParameter.ParameterValue = mOpenFiles.Unload CheckForNullField( _ Public Const gstrEmptyString = "" FileToClose.Position rstWorkSpaceParameters, Public Const gstrSQ = "'" End If "parameter_value") Public Const gstrDQ = """" End If cNewParameter.WorkspaceId = CStr( _ Public Const gstrVerSeparator = "." Public Const gstrBlank = " " End Sub ErrorOnNullField(rstWorkSpaceParameters, Public Sub CloseOpenFiles() FLD_ID_WORKSPACE)) ' Constants used to indicate type of node being Dim lIndex As Long cNewParameter.ParameterType = CStr( _ processed ' The constants for the different objects correspond If Not mOpenFiles Is Nothing Then ErrorOnNullField(rstWorkSpaceParameters, to the For lIndex = mOpenFiles.Count - 1 To "parameter_type")) ' indexes in the menu control arrays (for both the 0 cNewParameter.Description = main and popup CloseFileSM CheckForNullField( _ ' menus) that are used to create new objects. That (mOpenFiles(lIndex).FileName) rstWorkSpaceParameters, way we can Next lIndex "description") ' use the index passed in by the click event to End If determine the cParamCol.Load cNewParameter ' type of node being processed End Sub Public Const gintWorkspace = 1 Set cNewParameter = Nothing Attribute VB_Name = "ParameterCommon" rstWorkSpaceParameters.MoveNext ' Decided to leave it here after some debate over ' FILE: ParameterCommon.bas Wend whether it ' Microsoft TPC-H Kit Ver. 1.00 ' actually belongs in the cStep class definition ' Copyright Microsoft, 1999 Exit Sub Public Enum gintStepType HP TPC-H FULL DISCLOSURE REPORT 288 © 2005 Hewlett-Packard Company. All rights reserved. gintGlobalStep = 3 gintImageGlobalClosed Public Const gsTmFormat = "00" gintManagerStep gintImageGlobalOpen Public Const gsMSecondFormat = "000" gintWorkerStep gintImageParameter End Enum gintImageRun ' Default nothing value for a date variable gintImagePending Public Const gdtmEmpty As Currency = 0 Public Const gintRunManager = 6 gintImageStop Public Const gintRunWorker = 7 gintImageDisabled Public Const FMT_WSP_LOG_FILE As String = gintImageAborted "yyyymmdd-hhnnss" Public Enum gintParameterNodeType gintImageFailed gintParameter = 8 End Enum Public gsContCriteria() As String gintNodeParamConnection ' Note: Update the initialization of gintNodeParamExtension ' Public variable used to indicate the name of gsExecutionStatus in Initialize() if the gintNodeParamBuiltIn the function ' InstanceStatus values are modified - also the End Enum ' that raises an error boundary checks Public gstrSource As String Public gsExecutionStatus() As String ' Leave some constants free for newer types of parameters (?) ' Public instances of the different collections Public Const gsConnTypeStatic As String = Public Const gintConnectionDtl = 15 Public gcParameters As cArrParameters "Static" Public gcSteps As cArrSteps Public Const gsConnTypeDynamic As String = Public Enum gintLabelNodeType Public gcConstraints As cArrConstraints "Dynamic" gintGlobalsLabel = 21 Public gcConnections As cConnections gintParameterLabel Public gcConnDtls As cConnDtls #If RUN_ONLY Then gintParamConnectionLabel Public Const gsCaptionRunWsp As String = "Run gintParamExtensionLabel ' Public constants for the index values of the Workspace" gintParamBuiltInLabel different toolbar #End If gintConnDtlLabel ' options. Will be used while dynamically gintGlobalStepLabel enabling/disabling ' Valid operations on a cNode object gintStepLabel ' these options. Public Enum Operation End Enum Public Const tbNew = 1 QueryOp = 1 Public Const tbOpen = 2 InsertOp = 2 Public Enum ConnectionType Public Const tbSave = 3 UpdateOp = 3 ConnTypeStatic = 1 DeleteOp = 4 ConnTypeDynamic Public Const tbCut = 5 End Enum End Enum Public Const tbCopy = 6 Public Const tbPaste = 7 Attribute VB_Name = "RunCommon" Public Const giDefaultConnType As Integer Public Const tbDelete = 8 ' FILE: RunCommon.bas = ConnTypeStatic ' Microsoft TPC-H Kit Ver. 1.00 Public Const tbProperties = 10 ' Copyright Microsoft, 1999 ' The constants defined below are used to Public Const tbRun = 11 ' All Rights Reserved identify the different Public Const tbStop = 12 ' ' tabs. If any more step properties and ' thereby tabs are added ' The initial version # ' PURPOSE: Contains common functions that are ' to the tabbed dialog on the Step Properties Public Const gstrMinVersion As String = "0.0" used during the execution form, they should Public Const gstrGlobalParallelism As String = ' of a workspace. ' be defined here and accessed in the code "0 " ' Contact: Reshma Tharamal only using these Public Const gintMinParallelism As Integer = ([email protected]) ' pre-defined constants 1 ' ' Note: These constants will mainly be used Public Const gintMaxParallelism As Integer = Option Explicit by the functions that 100 ' initialize, customize and display the Step ' Used to indicate the source module name when Properties form ' Constant for the minimum identifier, used for errors Public Const gintDefinition = 0 all identifier, viz. ' are raised by this class Public Const gintExecution = 1 ' step, workspace, etc. Private Const mstrModuleName As String = Public Const gintMgrDefinition = 2 Public Const glMinId As Long = 1 ".RunCommon." Public Const gintPreExecutionSteps = 3 Public Const glInvalidId As Long = -1 Public Const gintPostExecutionSteps = 4 Public Const gintFileLocations = 5 ' A parameter that has a special meaning to Public Function GetInstanceItValue(cInstanceRec Stepmaster As cInstance) As String ' These constants correspond to the index ' The system time will be substituted wherever values in the imagelist it occurs ' Returns the iterator value for the instance, if an ' associated with the tree view control. The ' (typically as a part of the error, log ... file ' iterator has been defined for it imagelist contains names Dim cStepIt As cRunColIt ' the icons that will be displayed for each Public Const gstrTimeStamp As String = Dim cRunIterator As cRunItNode node. "TIMESTAMP" Public Enum TreeImages Public Const gstrEnvVarSeparator = "%" On Error GoTo GetInstanceItValueErr gintImageWorkspaceClosed = 1 Public Const gstrFileSeparator = "\" gintImageWorkspaceOpen Public Const gstrUnderscore = "_" ' Since we create a dummy instance for Disabled gintImageLabelClosed and Pending steps, gintImageLabelOpen ' Constants used by date and time formatting ' doesn't make sense to look at their iterators gintImageManagerClosedDis functions If cInstanceRec.Status <> gintDisabled And gintImageManagerClosedEn Public Const gsTimeSeparator = ":" cInstanceRec.Status <> gintPending Then gintImageManagerOpenDis Public Const gsDateSeparator = "-" Set cStepIt = cInstanceRec.Iterators gintImageManagerOpenEn Public Const gsMsSeparator = "." gintImageWorkerDis Public Const gsDtFormat = "00" gintImageWorkerEn Public Const gsYearFormat = "0000" HP TPC-H FULL DISCLOSURE REPORT 289 © 2005 Hewlett-Packard Company. All rights reserved. If Not Public Function AnyStepRunning(cFreeSteps lngUbound = LBound(vntTempCons) StringEmpty(cInstanceRec.Step.IteratorNam As cVectorLng, arrFree() As Byte) As Boolean lngStep = -1 e) Then Else If cStepIt.Count > 0 Then Dim lngIndex As Long lngLbound = LBound(vntTempCons) Set cRunIterator = cStepIt(0) Dim intPosInByte As Integer lngUbound = UBound(vntTempCons) BugAssert Dim lngTemp As Long lngStep = 1 cRunIterator.IteratorName = End If cInstanceRec.Step.IteratorName, _ ' Check if there are any running instances to "The first iterator in the wait for lngConsCount = 0 collection is the " & _ If cFreeSteps.Count <> "o ne that has been defined for glngNumConcurrentProcesses Then For lngOuter = lngLbound To lngUbound Step the step." lngStep If cRunIterator.IteratorName = ' For every free step, reset the vntTemp = vntTempCons(lngOuter) cInstanceRec.Step.IteratorName Then corresponding element GetInstanceItValue = ' in the byte array to 0 If Not IsEmpty(vntTemp) Then cRunIterator.Value For lngIndex = 0 To cFreeSteps.Count - 1 ' Each of the elements is an array Else For lngInner = LBound(vntTemp) To GetInstanceItValue = lngTemp = cFreeSteps(lngIndex) \ UBound(vntTemp) Step 1 gstrEmptyString gintBitsPerByte If Not IsEmpty(vntTemp(lngInner)) Then End If intPosInByte = cFreeSteps(lngIndex) Set cTempConstraint = Else Mod gintBitsPerByte vntTemp(lngInner) GetInstanceItValue = gstrEmptyString arrFree(lngTemp) = arrFree(lngTemp) If Not cTempConstraint Is Nothing End If Xor 2 ^ intPosInByte Then Else Next lngIndex ReDim Preserve GetInstanceItValue = cConstraints(lngConsCount) gstrEmptyString AnyStepRunning = False Set cConstraints(lngConsCount) = End If cTempConstraint Else ' Check if we have a non-zero bit in the lngConsCount = lngConsCount + 1 GetInstanceItValue = gstrEmptyString byte array End If End If For lngIndex = LBound(arrFree) To End If UBound(arrFree) Step 1 Next lngInner Exit Function If arrFree(lngIndex) <> 0 Then End If ' We are waiting for a step to Next lngOuter GetInstanceItValueErr: complete ' Log the error code raised by Visual AnyStepRunning = True ' Set the return value of the function to the array Basic Exit For of Call LogErrors(Errors) End If ' constraints that has been built above On Error GoTo 0 Next lngIndex If lngConsCount = 0 Then gstrSource = mstrModuleName & OrderConstraints = Empty "GetInstanceItValue" Else Else Err.Raise vbObjectError + AnyStepRunning = False OrderConstraints = cConstraints() errProgramError, gstrSource, _ End If End If LoadResString(errProgramError) End Function Exit Function End Function OrderConstraintsErr: Public Function ' Log the error code raised by Visual Basic Attribute VB_Name = "RunInstHelper" OrderConstraints(vntTempCons() As Variant, Call LogErrors(Errors) ' FILE: RunInstHelper.bas _ On Error GoTo 0 ' Microsoft TPC-H Kit Ver. 1.00 intConsType As ConstraintType) As Err.Raise vbObjectError + ' Copyright Microsoft, 1999 Variant errExecInstanceFailed, _ ' All Rights Reserved ' Returns a variant containing all the mstrModuleName, ' constraint records in the order LoadResString(errExecInstanceFailed) ' ' in which they should be executed ' PURPOSE: This module contains helper End Function procedures that are called by Dim vntTemp As Variant Attribute VB_Name = "ShellSM" ' cRunInst.cls Dim lngOuter As Long ' FILE: ShellSM.bas ' Contact: Reshma Tharamal Dim lngInner As Long ' Microsoft TPC-H Kit Ver. 1.00 ([email protected]) Dim cTempConstraint As cConstraint ' Copyright Microsoft, 1999 ' Dim cConstraints() As cConstraint ' All Rights Reserved Option Explicit Dim lngConsCount As Long ' Dim lngLbound As Long ' ' Used to indicate the source module name Dim lngUbound As Long ' PURPOSE: This module contains a function when errors Dim lngStep As Long that creates a process and ' are raised by this class ' waits for it to complete. Private Const mstrModuleName As String = On Error GoTo OrderConstraintsErr ' Contact: Reshma Tharamal "RunInstHelper." ([email protected]) If intConsType = gintPreStep Then ' ' Should be equal to the number of steps ' Since we are travelling up and we need Option Explicit defined in cRunInst.cls to execute the constraints Public Const glngNumConcurrentProcesses ' for the top-level steps first, reverse the Public Function SyncShell(CommandLine As As Long = 99 order that they String, Optional Timeout As Long, _ Public Const gintBitsPerByte = 8 ' have been stored in the array Optional WaitForInputIdle As Boolean) As lngLbound = UBound(vntTempCons) Boolean HP TPC-H FULL DISCLOSURE REPORT 290 © 2005 Hewlett-Packard Company. All rights reserved. Option Explicit For lngIndex = 0 To mcarrConstraints.Count - 1 Dim proc As Set cUpdateConstraint = PROCESS_INFORMATION Private mcarrConstraints As cNodeCollections mcarrConstraints(lngIndex) Dim Start As STARTUPINFO If intStepType = gintGlobalStep Then Dim ret As Long ' Used to indicate the source module name If cUpdateConstraint.GlobalStepId = Dim nMilliseconds As Long when errors lngStepId And _ ' are raised by this class cUpdateConstraint.IndOperation <> BugMessage "Executing: " & Private mstrSource As String DeleteOp Then CommandLine Private Const mstrModuleName As String = cUpdateConstraint.GlobalVersionNo = If Timeout > 0 Then "c ArrConstraints." strNewVersion nMilliseconds = Timeout Public Sub SaveWspConstraints(ByVal Else lngWorkspace As Long) ' Set the operation to indicate an insert nMilliseconds = INFINITE ' Calls a procedure to commit all changes to cUpdateConstraint.IndOperation = End If the constraints InsertOp ' in the passed in workspace. End If 'Initialize the STARTUPINFO structure: Else Start.cb = Len(Start) Call mcarrConstraints.Save(lngWorkspace) If cUpdateConstraint.StepId = lngStepId Start.dwFlags = And _ STARTF_USESHOWWINDOW End Sub cUpdateConstraint.IndOperation <> Start.wShowWindow = Public Property Set ConstraintDB(vdata As DeleteOp Then SW_SHOWMINNOACTIVE Database) cUpdateConstraint.VersionNo = strNewVersion 'Start the shelled application: Set mcarrConstraints.NodeDB = vdata CreateProcessA 0&, CommandLine, 0&, ' Set the operation to indicate an insert 0&, 1&, _ End Property cUpdateConstraint.IndOperation = NORMAL_PRIORITY_CLASS, 0&, Public Property Get ConstraintDB() As InsertOp 0&, Start, proc Database End If End If If WaitForInputIdle Then Set ConstraintDB = Next lngIndex 'Wait for the shelled application to mcarrConstraints.NodeDB finish setting up its UI: Exit Sub ret = InputIdle(proc.hProcess, End Property nMilliseconds) CreateNewConstraintVersionErr: Else Public Sub Modify(cConsToUpdate As LogErrors Errors 'Wait for the shelled application to cConstraint) gstrSource = mstrModuleName & terminate: "CreateNewConstraintVersion" ret = ' Modify the constraint record On Error GoTo 0 WaitForSingleObject(proc.hProcess, Call Err.Raise vbObjectError + nMilliseconds) mcarrConstraints.Modify(cConsToUpdate) errCreateNewConstraintVersionFailed, _ End If mstrSource, _ End Sub CloseHandle proc.hProcess Public Sub LoadResString(errCreateNewConstraintVersionFail CreateNewConstraintVersion(ByVal lngStepId ed) 'Return True if the application finished. As Long, _ Otherwise it timed out or erred. ByVal strNewVersion As String, _ End Sub SyncShell = (ret = WAIT_OBJECT_0) ByVal strOldVersion As String, _ Private Sub Class_Initialize() End Function ByVal intStepType As Integer) Set mcarrConstraints = New cNodeCollections VERSION 1.0 CLASS ' Does all the processing needed to create BugMessage "cArrConstraints: Initialize event - BEGIN new versions of setting Constraint count to 0" MultiUse = -1 'True ' all the constraints for a given step END ' It inserts new constraint records in the End Sub Attribute VB_Name = "cArrConstraints" database with Attribute VB_GlobalNameSpace = False ' the new version numbers on them Private Sub Class_Terminate() Attribute VB_Creatable = True ' It also updates the version number on all Attribute VB_PredeclaredId = False constraints Set mcarrConstraints = Nothing Attribute VB_Exposed = False ' for the step in the array to the new version BugMessage "cArrConstraints: Terminate event ' FILE: cArrConstraints.cls passed in triggered" ' Microsoft TPC-H Kit Ver. 1.00 ' Since it handles both global and ' Copyright Microsoft, 1999 manager/worker steps, End Sub ' All Rights Reserved ' it checks for the step_id or global_step_id ' fields, Public Sub Add(ByVal cConstraintToAdd As ' ' depending on the type of step cConstraint) ' PURPOSE: Implements an array of cConstraint objects. Dim lngIndex As Long Set cConstraintToAdd.NodeDB = ' Type-safe wrapper around Dim cUpdateConstraint As cConstraint mcarrConstraints.NodeDB cNodeCollections. ' Also contains additional functions On Error GoTo ' Retrieve a unique constraint identifier that determine all the CreateNewConstraintVersionErr cConstraintToAdd.ConstraintId = ' constraints for a step, all mstrSource = mstrModuleName & cConstraintToAdd.NextIdentifier constraints in a workspace, "CreateNewConstraintVersion" ' validation functions, etc. ' Call a procedure to load the constraint record in ' Contact: Reshma Tharamal ' Update the version/global version on the array ([email protected]) Constraint with the Call mcarrConstraints.Add(cConstraintToAdd) ' ' passed in step/global step id HP TPC-H FULL DISCLOSURE REPORT 291 © 2005 Hewlett-Packard Company. All rights reserved. End Sub lngQueryElement = " ( select max( cint( mid( version_no, 1, instr( Public Sub Delete(ByVal cOldConstraint As QueryConstraintIndex(lngConstraintId) version_no, " & gstrDQ & gstrVerSeparator & cConstraint) gstrDQ & " ) - 1 ) ) ) "& _ ' Set the return value to the queried " from att_steps AS d " & _ Dim lngDeleteElement As Long Constraint " WHERE a.step_id = d.step_id " & _ Dim cConsToDelete As cConstraint Set QueryConstraint = " and d.archived_flag = [archived] ) " mcarrConstraints(lngQueryElement) lngDeleteElement = ' Find the highest Y-component of the version QueryConstraintIndex(cOldConstraint.Const End Function number for the highest X-component raintId) strSql = strSql & " AND cint( mid( a.version_no, Set cConsToDelete = Public Sub LoadConstraints(ByVal instr( a.version_no, " & gstrDQ & gstrVerSeparator mcarrConstraints(lngDeleteElement) lngWorkspaceId As Long, rstStepsInWsp As & gstrDQ & " ) + 1 ) ) = "& _ Recordset) " ( select max( cint( mid( version_no, instr( Call version_no, " & gstrDQ & gstrVerSeparator & mcarrConstraints.Delete(cConsToDelete.Pos ' Loads the constraints array with all the gstrDQ & " ) + 1 ) ) ) " & _ ition) constraints " from att_steps AS y " & _ ' for the workspace " Where a.step_id = y.step_id " & _ Set cConsToDelete = Nothing Dim recConstraints As Recordset " AND cint( mid( version_no, 1, instr( Dim qyCons As DAO.QueryDef version_no, " & gstrDQ & gstrVerSeparator & End Sub Dim strSql As String gstrDQ & " ) - 1 ) ) = "& _ Private Function Dim dtStart As Date " ( select max( cint( mid( version_no, 1, instr( QueryConstraintIndex(lngConstraintId As version_no, " & gstrDQ & gstrVerSeparator & Long) _ On Error GoTo LoadConstraintsErr gstrDQ & " ) - 1 ) ) ) "& _ As Long mstrSource = mstrModuleName & " from att_steps AS c "& _ "LoadConstraints" " WHERE y.step_id = c.step_id " & _ Dim lngIndex As Integer " and c.archived_flag = [archived] ) ) ) ) " If rstStepsInWsp.RecordCount = 0 Then ' Find the element in the array to be Exit Sub ' Order the constraints by sequence within a given deleted End If step For lngIndex = 0 To strSql = strSql & " order by a.sequence_no " mcarrConstraints.Count - 1 ' First check if the database object has been set Set qyCons = ' Note: The constraint id is not a If mcarrConstraints.NodeDB Is Nothing mcarrConstraints.NodeDB.CreateQueryDef(gstrEm primary key field in Then ptyString, strSql) ' the database - there can be multiple On Error GoTo 0 qyCons.Parameters("archived").Value = False records with the Err.Raise vbObjectError + ' same constraint_id but for different errSetDBBeforeLoad, _ rstStepsInWsp.MoveFirst versions of a step mstrSource, _ ' However, since we'll always load the While Not rstStepsInWsp.EOF constraint information LoadResString(errSetDBBeforeLoad) ' for the latest version of a step, we'll End If If Not (rstStepsInWsp!global_flag) Then have just one qyCons.Close ' constraint record with a given dtStart = Now BugMessage "Query constraints Read + constraint_id load took: " & CStr(DateDiff("s", dtStart, Now)) If ' Select based on the global step id since Exit Sub mcarrConstraints(lngIndex).ConstraintId = there might End If lngConstraintId Then ' be constraints for a global step that run are QueryConstraintIndex = lngIndex executed qyCons.Parameters("g_s_id").Value = Exit Function ' for the workspace rstStepsInWsp!step_id End If ' This method has the advantage that if the qyCons.Parameters("g_ver_no").Value = steps are queried right, everything else follows rstStepsInWsp!version_no Next lngIndex strSql = "Select a.constraint_id, a.step_id, a.version_no, " & _ Set recConstraints = ' Raise error that Constraint has not been " a.constraint_type, a.global_step_id, qyCons.OpenRecordset(dbOpenSnapshot) found a.global_version_no, " & _ ShowError errConstraintNotFound " a.sequence_no, b.workspace_id " & _ Call On Error GoTo 0 " from step_constraints a, att_steps b " & LoadRecordsetInConstraintArray(recConstraints) Err.Raise vbObjectError + _ recConstraints.Close errConstraintNotFound, mstrSource, _ " where a.global_step_id = b.step_id " & LoadResString(errConstraintNotFound) _ rstStepsInWsp.MoveNext " and a.global_version_no = b.version_no Wend End Function " & _ " and a.global_step_id = [g_s_id] " & _ qyCons.Close Public Function QueryConstraint(ByVal " and a.global_version_no = [g_ver_no] " BugMessage "Query constraints Read + load lngConstraintId As Long) _ & _ took: " & CStr(DateDiff("s", dtStart, Now)) As cConstraint " and b.archived_flag = [archived] " Exit Sub ' Returns a cConstraint object with the ' Find the highest X-component of the property values version number LoadConstraintsErr: ' corresponding to the Constraint strSql = strSql & " AND ( a.step_id = 0 or ( LogErrors Errors Identifier, lngConstraintId cint( mid( a.version_no, 1, instr( a.version_no, gstrSource = mstrModuleName & " & gstrDQ & gstrVerSeparator & gstrDQ & " "LoadConstraints" Dim lngQueryElement As Long ) - 1 ) ) = "& _ On Error GoTo 0 Err.Raise vbObjectError + errLoadDataFailed, _ mstrSource, _ HP TPC-H FULL DISCLOSURE REPORT 292 © 2005 Hewlett-Packard Company. All rights reserved. LoadResString(errLoadDataFailed) cNewConstraint.StepId = CLng(ErrorOnNullField(recConstraints, On Error GoTo ConstraintsForStepErr End Sub "s tep_id")) mstrSource = mstrModuleName & Public Sub UnloadStepConstraints(ByVal cNewConstraint.VersionNo = "ConstraintsForStep" lngStepId As Long) CStr(ErrorOnNullField(recConstraints, "version_no")) lngConstraintCount = 0 ' Unloads all the constraints for the workspace from cNewConstraint.GlobalStepId = ' Find each element in the constraints array ' the constraints array CLng(ErrorOnNullField(recConstraints, For lngIndex = 0 To mcarrConstraints.Count - 1 "global_step_id")) ' If a constraint type has been specified then Dim lngIndex As Long cNewConstraint.GlobalVersionNo = check CStr(ErrorOnNullField(recConstraints, ' if the constraint type for the record matches ' Find all constraints in the array with a "global_version_no")) the matching step id cNewConstraint.SequenceNo = ' passed in type ' It is important to step in reverse order CInt(ErrorOnNullField(recConstraints, Set cTempConstraint = through the array, "s equence_no")) mcarrConstraints(lngIndex) ' since we delete constraint records! If Not blnGlobal Then For lngIndex = mcarrConstraints.Count - cNewConstraint.WorkspaceId = If cTempConstraint.StepId = lngStepId And 1 To 0 Step -1 CLng(ErrorOnNullField(recConstraints, _ If FLD_ID_WORKSPACE)) cTempConstraint.VersionNo = mcarrConstraints(lngIndex).GlobalStepId = cNewConstraint.ConstraintType = strVersionNo And _ lngStepId Then CInt(ErrorOnNullField(recConstraints, cTempConstraint.IndOperation <> "c onstraint_type")) DeleteOp And _ ' Unload the constraint from the (intConstraintType = 0 Or _ array ' Add this record to the array of cTempConstraint.ConstraintType = Call Constraints intConstraintType) Then mcarrConstraints.Unload(lngIndex) mcarrConstraints.Load cNewConstraint ' We have a matching constraint for the given step End If Set cNewConstraint = Nothing AddArrayElement cStepConstraint, _ Next lngIndex recConstraints.MoveNext cTempConstraint, Wend lngConstraintCount End Sub End If Public Sub Exit Sub Else UnloadConstraint(cOldConstraint As If cTempConstraint.GlobalStepId = cConstraint) LoadRecordsetInConsArrayErr: lngStepId And _ ' Unloads the constraint from the LogErrors Errors cTempConstraint.GlobalVersionNo = constraints array gstrSource = mstrModuleName & strVersionNo And _ "LoadRecordsetInConstraintArray" cTempConstraint.IndOperation <> Dim lngDeleteElement As Long On Error GoTo 0 DeleteOp Then Err.Raise vbObjectError + If blnGlobalConstraintsOnly = False Or _ lngDeleteElement = errLoadRsInArrayFailed, _ (blnGlobalConstraintsOnly And _ QueryConstraintIndex(cOldConstraint.Const mstrSource, _ cTempConstraint.StepId = 0 And _ raintId) cTempConstraint.VersionNo = LoadResString(errLoadRsInArrayFailed) gstrMinVersion) Then Call mcarrConstraints.Unload(lngDeleteElement) End Sub ' We have a matching constraint for the global step End Sub Public Function ConstraintsForStep( _ AddArrayElement cStepConstraint, _ Private Sub ByVal lngStepId As Long, _ cTempConstraint, LoadRecordsetInConstraintArray(ByVal ByVal strVersionNo As String, _ lngConstraintCount recConstraints As Recordset) Optional ByVal intConstraintType As End If ' Loads all the constraint records in the ConstraintType = 0, _ End If passed in Optional ByVal blnSort As Boolean = End If ' recordset into the array True, _ Optional ByVal blnGlobal As Boolean = Next lngIndex Dim cNewConstraint As cConstraint False, _ Optional ByVal ' Set the return value of the function to the array On Error GoTo blnGlobalConstraintsOnly As Boolean = False) of LoadRecordsetInConsArrayErr _ ' constraints that has been built above mstrSource = mstrModuleName & As Variant If lngConstraintCount = 0 Then "LoadRecordsetInConstraintArray" ConstraintsForStep = Empty ' Returns a variant containing an array of Else If recConstraints.RecordCount = 0 Then cConstraint objects, ConstraintsForStep = cStepConstraint() Exit Sub ' containing all the constraints that have been End If End If defined for the ' given step. If the Global flag is set to true, ' Sort the constraints recConstraints.MoveFirst the If blnSort Then While Not recConstraints.EOF ' search will be made for all the constraints Call QuickSort(ConstraintsForStep) Set cNewConstraint = New cConstraint that have End If ' a matching global_step_id ' Initialize Constraint values Exit Function cNewConstraint.ConstraintId = Dim lngIndex As Long CLng(ErrorOnNullField(recConstraints, Dim cStepConstraint() As cConstraint ConstraintsForStepErr: "Constraint_id")) Dim lngConstraintCount As Long LogErrors Errors Dim cTempConstraint As cConstraint On Error GoTo 0 HP TPC-H FULL DISCLOSURE REPORT 293 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + cTempConstraint.VersionNo = ' all the constraints of the passed in type errConstraintsForStepFailed, _ gstrMinVersion) Then PostConstraintsForStep = mstrSource, _ ConstraintsForStep(lngStepId, _ ' We have a matching constraint for strVersionNo, gintPostStep, blnSort) LoadResString(errConstraintsForStepFailed) the workspace AddArrayElement cWspConstraint, End Function End Function _ Public Function PostConstraintsForWsp( _ Private Sub AddArrayElement(ByRef cTempConstraint, ByVal lngWorkspaceId As Long, _ arrNodes() As cConstraint, _ lngConstraintCount Optional ByVal blnSort As Boolean) As ByVal objToAdd As cConstraint, _ End If Variant ByRef lngCount As Long) End If ' Adds the passed in object to the array Next lngIndex ' Returns a variant containing an array of cConstraint objects, ' Increase the array dimension and add the ' Set the return value of the function to the ' containing all the Post-execution globals that object to it array of have ReDim Preserve arrNodes(lngCount) ' constraints that has been built above ' been defined for the workspace Set arrNodes(lngCount) = objToAdd If lngConstraintCount = 0 Then lngCount = lngCount + 1 ConstraintsForWsp = Empty ' Call a function that will return a variant Else containing End Sub ConstraintsForWsp = cWspConstraint() ' all the constraints of the passed in type End If PostConstraintsForWsp = Public Function ConstraintsForWsp( _ ConstraintsForWsp(lngWorkspaceId, _ ByVal lngWorkspaceId As Long, _ ' Sort the constraints gintPostStep, blnSort, True) Optional ByVal intConstraintType As If blnSort Then Integer = 0, _ Call QuickSort(ConstraintsForWsp) End Function Optional ByVal blnSort As Boolean = End If Public Function PreConstraintsForWsp( _ True, _ ByVal lngWorkspaceId As Long, _ Optional ByVal Exit Function Optional ByVal blnSort As Boolean) As blnGlobalConstraintsOnly As Boolean = Variant False) _ ConstraintsForWspErr: As Variant LogErrors Errors ' Returns a variant containing an array of On Error GoTo 0 cConstraint objects, ' Returns a variant containing an array of Err.Raise vbObjectError + ' containing all the Pre-execution globals that cConstraint objects, errConstraintsForWspFailed, _ have ' containing all the constraints that have mstrSource, _ ' been defined for the workspace been defined for the ' given workspace. LoadResString(errConstraintsForWspFailed) ' Call a function that will return a variant containing Dim lngIndex As Long End Function ' all the constraints of the passed in type Dim cWspConstraint() As cConstraint Public Function PreConstraintsForStep( _ PreConstraintsForWsp = Dim lngConstraintCount As Long ByVal lngStepId As Long, _ ConstraintsForWsp(lngWorkspaceId, _ Dim cTempConstraint As cConstraint ByVal strVersionNo As String, _ gintPreStep, blnSort, True) Optional ByVal blnSort As Boolean) As On Error GoTo ConstraintsForWspErr Variant End Function mstrSource = mstrModuleName & Public Property Get ConstraintCount() As Long "ConstraintsForWsp" ' Returns a variant containing an array of cConstraint objects, ConstraintCount = mcarrConstraints.Count lngConstraintCount = 0 ' containing all the pre-execution constraints that have End Property ' Find each element in the constraints ' been defined for the given step_id and array version VERSION 1.0 CLASS For lngIndex = 0 To BEGIN mcarrConstraints.Count - 1 ' Call a function that will return a variant MultiUse = -1 'True ' If a constraint type has been specified containing END then check ' all the constraints of the passed in type Attribute VB_Name = "cArrParameters" ' if the constraint type for the record PreConstraintsForStep = Attribute VB_GlobalNameSpace = False matches the ConstraintsForStep(lngStepId, _ Attribute VB_Creatable = True ' passed in type strVersionNo, gintPreStep, blnSort) Attribute VB_PredeclaredId = False Set cTempConstraint = Attribute VB_Exposed = False mcarrConstraints(lngIndex) End Function ' FILE: cArrParameters.cls If cTempConstraint.WorkspaceId = Public Function PostConstraintsForStep( _ ' Microsoft TPC-H Kit Ver. 1.00 lngWorkspaceId And _ ByVal lngStepId As Long, _ ' Copyright Microsoft, 1999 cTempConstraint.IndOperation <> ByVal strVersionNo As String, _ ' All Rights Reserved DeleteOp And _ Optional ByVal blnSort As Boolean) As ' (intConstraintType = 0 Or _ Variant ' cTempConstraint.ConstraintType ' PURPOSE: Implements an array of cParameter = intConstraintType) Then ' Returns a variant containing an array of objects. cConstraint objects, ' Type-safe wrapper around If blnGlobalConstraintsOnly = False ' containing all the Post-execution cNodeCollections. Or _ constraints that have ' Also contains additional functions to (blnGlobalConstraintsOnly And ' been defined for the given step_id and determine parameter _ version ' values, validation functions, etc. cTempConstraint.StepId = 0 ' Contact: Reshma Tharamal And _ ' Call a function that will return a variant ([email protected]) containing ' HP TPC-H FULL DISCLOSURE REPORT 294 © 2005 Hewlett-Packard Company. All rights reserved. Option Explicit Call Validate(cParamToAdd) End If

Private mcarrParameters As ' Retrieve a unique parameter identifier Exit Function cNodeCollections cParamToAdd.ParameterId = cParamToAdd.NextIdentifier GetParameterValueErr: ' Used to indicate the source module name ' Log the error code raised by Visual Basic when errors Call mcarrParameters.Add(cParamToAdd) Call LogErrors(Errors) ' are raised by this class gstrSource = mstrModuleName & Private mstrSource As String End Sub "GetParameterValue" Private Const mstrModuleName As String = On Error GoTo 0 "c ArrParameters." Public Sub Unload(lngParamToDelete As Err.Raise vbObjectError + Long) errGetParamValueFailed, _ Public Sub InitBuiltInsForRun(lWspId As gstrSource, _ Long, lRunId As Long) Dim lngDeleteElement As Long LoadResString(errGetParamValueFailed)

Dim cParamRec As cParameter lngDeleteElement = End Function QueryIndex(lngParamToDelete) Public Sub Delete(lngParamToDelete As Long) ' Initialize the values of the run_id and ' Delete the passed in parameter output_dir built-in parameters and save them Call ' to the database mcarrParameters.Unload(lngDeleteElement) Dim lngDeleteElement As Long Set cParamRec = GetParameterValue(lWspId, End Sub lngDeleteElement = PARAM_RUN_ID) QueryIndex(lngParamToDelete) cParamRec.ParameterValue = Public Sub SaveParametersInWsp(ByVal Call mcarrParameters.Delete(lngDeleteElement) CStr(lRunId) lngWorkspace As Long) Call Modify(cParamRec) ' Calls a procedure to commit all changes to End Sub the parameters Private Function QueryIndex(lngParameterId As Set cParamRec = ' for the passed in workspace. Long) As Long GetParameterValue(lWspId, PARAM_OUTPUT_DIR) ' Call a procedure to save all parameter Dim lngIndex As Long cParamRec.ParameterValue = records for the GetDefaultDir(lWspId, Me) ' workspace ' Find the matching parameter record in the array cParamRec.ParameterValue = Call mcarrParameters.Save(lngWorkspace) For lngIndex = 0 To mcarrParameters.Count - 1 cParamRec.ParameterValue & If mcarrParameters(lngIndex).ParameterId = gstrFileSeparator & CStr(lRunId) End Sub lngParameterId And _ Call Modify(cParamRec) Public Function GetParameterValue(ByVal mcarrParameters(lngIndex).IndOperation lngWorkspace As Long, _ <> DeleteOp Then Call SaveParametersInWsp(lWspId) ByVal strParamName As String) As QueryIndex = lngIndex cParameter Exit Function End Sub ' Returns the value for the passed in End If workspace parameter Next lngIndex

Public Property Set ParamDatabase(vdata Dim cParamRec As cParameter ' Raise error that parameter has not been found As Database) Dim lngIndex As Long On Error GoTo 0 Err.Raise vbObjectError + errParamNotFound, Set mcarrParameters.NodeDB = vdata On Error GoTo GetParameterValueErr "c ArrParameters.QueryIndex", _ LoadResString(errParamNotFound) End Property ' Find all parameters in the array with a Public Sub Modify(cModifiedParam As matching workspace id End Function cParameter) For lngIndex = 0 To mcarrParameters.Count - 1 Public Function QueryParameter(lngParameterId ' First check if the parameter record is Set cParamRec = As Long) _ valid mcarrParameters(lngIndex) As cParameter Call If cParamRec.WorkspaceId = CheckDupParamName(cModifiedParam) lngWorkspace And _ Dim lngQueryElement As Long cParamRec.ParameterName = Call strParamName Then lngQueryElement = QueryIndex(lngParameterId) mcarrParameters.Modify(cModifiedParam) Set GetParameterValue = cParamRec ' Return the queried parameter object End Sub Exit For Set QueryParameter = Public Sub Load(ByRef cParamToAdd As End If mcarrParameters(lngQueryElement) cParameter) Next lngIndex End Function Call If lngIndex > mcarrParameters.Count - 1 Public Property Get ParameterCount() As Long mcarrParameters.Load(cParamToAdd) Then ' The parameter has not been defined for ParameterCount = mcarrParameters.Count End Sub the workspace Public Sub Add(ByRef cParamToAdd As ' Raise an error End Property cParameter) On Error GoTo 0 Public Property Get Item(lngIndex As Long) As Err.Raise vbObjectError + cParameter Set cParamToAdd.NodeDB = errParamNameInvalid, _ Attribute Item.VB_UserMemId = 0 mcarrParameters.NodeDB mstrModuleName & "GetParameterValue", _ Set Item = mcarrParameters(lngIndex) ' First check if the parameter record is valid LoadResString(errParamNameInvalid) End Property HP TPC-H FULL DISCLOSURE REPORT 295 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + Public Sub Validate(ByVal errDuplicateParameterName, _ End Sub cParamToValidate As cParameter) mstrSource, Public Sub Modify(cModifiedStep As cStep) ' This procedure is necessary since the LoadResString(errDuplicateParameterName) class cannot validate End If Dim iAppend As Integer ' all the parameter properties on it's own. Next lngIndex Dim sLabel As String This is 'coz we ' might have created new parameters in End Sub On Error GoTo ModifyErr the workspace, but not ' saved them to the database yet - hence Private Sub Class_Initialize() iAppend = 0 the duplicate check sLabel = cModifiedStep.StepLabel ' has to be repeated in the array 'bugmessage "cArrParameters: Initialize event - setting parameter count to 0" Validate cModifiedStep Dim lngIndex As Long Set mcarrParameters = New Dim cTempParam As cParameter cNodeCollections Call mcarrSteps.Modify(cModifiedStep)

On Error GoTo ValidateErr End Sub Exit Sub

' Check if the parameter name already ModifyErr: exists in the workspace Private Sub Class_Terminate() ' If the error raised by the add function is due to a For lngIndex = 0 To duplication mcarrParameters.Count - 1 Set mcarrParameters = Nothing ' of the step label, then try to generate a unique Set cTempParam = label mcarrParameters(lngIndex) End Sub If Err.Number - vbObjectError = If cTempParam.WorkspaceId = VERSION 1.0 CLASS errStepLabelUnique Then cParamToValidate.WorkspaceId And _ BEGIN iAppend = iAppend + 1 cTempParam.ParameterName = MultiUse = -1 'True cModifiedStep.StepLabel = sLabel & cParamToValidate.ParameterName And _ END CStr(iAppend) cTempParam.IndOperation <> Attribute VB_Name = "cArrSteps" ' Try to insert the step record again DeleteOp Then Attribute VB_GlobalNameSpace = False Resume On Error GoTo 0 Attribute VB_Creatable = True End If Err.Raise vbObjectError + Attribute VB_PredeclaredId = False errDuplicateParameterName, _ Attribute VB_Exposed = False ' Log the error code raised by Visual Basic mstrSource, ' FILE: cArrSteps.cls Call LogErrors(Errors) LoadResString(errDuplicateParameterName ' Microsoft TPC-H Kit Ver. 1.00 On Error GoTo 0 ) ' Copyright Microsoft, 1999 Err.Raise vbObjectError + errModifyStepFailed, End If ' All Rights Reserved _ Next lngIndex ' gstrSource, _ ' LoadResString(errModifyStepFailed) Exit Sub ' PURPOSE: Implements an array of cStep objects. End Sub ValidateErr: ' Type-safe wrapper around Public Sub UpdateParentVersion(ByVal lngStepId LogErrors Errors cNodeCollections. As Long, _ mstrSource = mstrModuleName & ' Also contains additional functions to ByVal strNewVersion As String, _ "Validate" update parent version ByVal strOldVersion As String, _ On Error GoTo 0 ' on substeps, validation functions, etc. ByVal intStepType As Integer) Err.Raise vbObjectError + ' Contact: Reshma Tharamal errValidateFailed, _ ([email protected]) ' Does all the processing needed to update the mstrSource, ' parent version LoadResString(errValidateFailed) Option Explicit ' number on all the sub-steps for a given step ' It updates the parent version no in the database End Sub Private mcarrSteps As cNodeCollections for all Public Sub CheckDupParamName(ByVal ' sub-steps of the passed in step id cParamToValidate As cParameter) ' Used to indicate the source module name ' It also updates the parent version number on all when errors sub-steps Dim lngIndex As Long ' are raised by this class ' in the array to the new version passed in Dim cTempParam As cParameter Private mstrSource As String Private Const mstrModuleName As String = Dim lngIndex As Long ' Check if the parameter name already "c ArrSteps." Dim cUpdateStep As cStep exists in the workspace For lngIndex = 0 To Public Sub Unload(lngStepToDelete As Long) On Error GoTo UpdateParentVersionErr mcarrParameters.Count - 1 Set cTempParam = Dim lngDeleteElement As Long If intStepType <> gintManagerStep Then mcarrParameters(lngIndex) Dim cUnloadStep As cStep ' Only a manager can have sub-steps - if the If cTempParam.WorkspaceId = passed cParamToValidate.WorkspaceId And _ lngDeleteElement = ' in step is not a manager, exit cTempParam.ParameterName = QueryStepIndex(lngStepToDelete) Exit Sub cParamToValidate.ParameterName And _ Set cUnloadStep = End If cTempParam.ParameterId <> QueryStep(lngStepToDelete) cParamToValidate.ParameterId And _ ' For all steps in the array cTempParam.IndOperation <> ' First unload all iterators for the step For lngIndex = 0 To mcarrSteps.Count - 1 DeleteOp Then Call cUnloadStep.UnloadIterators ShowError Set cUpdateStep = mcarrSteps(lngIndex) errDuplicateParameterName ' Unload the step from the collection On Error GoTo 0 Call mcarrSteps.Unload(lngDeleteElement) HP TPC-H FULL DISCLOSURE REPORT 296 © 2005 Hewlett-Packard Company. All rights reserved. ' If the current step is a sub-step of the On Error GoTo ValidateStepErr ' Log the error code raised by Visual Basic passed in step Call LogErrors(Errors) If cUpdateStep.ParentStepId = 'Public wrapper for Validate function (2 On Error GoTo 0 lngStepId And _ many Validates) Err.Raise vbObjectError + errInsertStepFailed, _ cUpdateStep.ParentVersionNo = Call Validate(cCheckStep) gstrSource, _ strOldVersion And _ LoadResString(errInsertStepFailed) Not cUpdateStep.ArchivedFlag Exit Sub Then End Sub ValidateStepErr: Public Sub Load(cStepToLoad As cStep) ' Update the parent version number ShowError errStepLabelUnique for the sub-step On Error GoTo 0 Call mcarrSteps.Load(cStepToLoad) ' in the array Err.Raise vbObjectError + cUpdateStep.ParentVersionNo = errValidateFailed, _ End Sub strNewVersion gstrSource, _ Public Sub SaveStepsInWsp(ByVal lngWorkspace LoadResString(errValidateFailed) As Long) ' Update the parent version number End Sub ' Calls a procedure to commit all changes to the for the sub-step steps ' in the array Private Sub Class_Initialize() ' in the passed in workspace. Call Modify(cUpdateStep) BugMessage "cArrSteps: Initialize event - Dim lngIndex As Integer End If setting step count to 0" Next lngIndex Set mcarrSteps = New cNodeCollections ' Find all steps in the array with a matching workspace id Exit Sub End Sub ' It is important to step in reverse order through the array, UpdateParentVersionErr: Private Sub Class_Terminate() ' since we delete step records sometimes! LogErrors Errors For lngIndex = mcarrSteps.Count - 1 To 0 Step - mstrSource = mstrModuleName & BugMessage "cArrSteps: Terminate event 1 "UpdateParentVersion" triggered" If mcarrSteps(lngIndex).WorkspaceId = On Error GoTo 0 Set mcarrSteps = Nothing lngWorkspace Then Err.Raise vbObjectError + errUpdateParentVersionFailed, _ End Sub ' Call a procedure to commit all changes to mstrSource, _ the Public Sub Add(ByVal cStepToAdd As cStep) ' Step record, if any LoadResString(errUpdateParentVersionFail Call CommitStep(mcarrSteps(lngIndex), ed) Dim iAppend As Integer lngIndex) Dim sLabel As String End Sub End If Private Sub Validate(cCheckStep As cStep) On Error GoTo AddErr Next lngIndex

' Step validations that depend on other iAppend = 0 End Sub steps in the collection sLabel = cStepToAdd.StepLabel Private Sub CommitStep(ByVal cCommitStep As cStep, _ Dim lngIndex As Long Set cStepToAdd.NodeDB = ByVal intIndex As Integer) mcarrSteps.NodeDB ' This procedure checks if any changes have been ' Ensure that the step label is unique in the made to the workspace ' Retrieve a unique step identifier ' passed in Step. If so, it calls the step methods to For lngIndex = 0 To mcarrSteps.Count - 1 cStepToAdd.StepId = commit cStepToAdd.NextStepId ' the changes. ' If the current step is a sub-step of the passed in step Validate cStepToAdd ' First commit all changes to the iterator records If mcarrSteps(lngIndex).WorkspaceId for = cCheckStep.WorkspaceId And _ ' Call a procedure to add the step record ' the step mcarrSteps(lngIndex).StepLabel = Call mcarrSteps.Add(cStepToAdd) cCommitStep.SaveIterators cCheckStep.StepLabel And _ mcarrSteps(lngIndex).StepId <> ' Call a procedure to add all iterators for the Call mcarrSteps.Commit(cCommitStep, intIndex) cCheckStep.StepId And _ step cStepToAdd.AddAllIterators End Sub mcarrSteps(lngIndex).IndOperation <> Public Sub Delete(lngStepToDelete As Long) DeleteOp Then Exit Sub On Error GoTo 0 Dim lngDeleteElement As Long Err.Raise vbObjectError + AddErr: errStepLabelUnique, _ ' If the error raised by the add function is due lngDeleteElement = mstrModuleName & to a duplication QueryStepIndex(lngStepToDelete) "Validate", _ ' of the step label, then try to generate a Call mcarrSteps.Delete(lngDeleteElement) unique label LoadResString(errStepLabelUnique) If Err.Number - vbObjectError = End Sub End If errStepLabelUnique Then Public Function QueryStepIndex(lngStepId As Next lngIndex iAppend = iAppend + 1 Long) As Long cStepToAdd.StepLabel = sLabel & End Sub CStr(iAppend) Dim lngIndex As Long ' Try to insert the step record again Public Sub ValidateStep(cCheckStep As Resume ' Find the element in the array that corresponds to cStep) End If the

HP TPC-H FULL DISCLOSURE REPORT 297 © 2005 Hewlett-Packard Company. All rights reserved. ' passed in step id - note that while there End If mstrSource = mstrModuleName & "SubSteps" will be multiple On Error GoTo 0 ' versions of a step in the database, only End Property Err.Raise vbObjectError + errSubStepsFailed, _ one version will Public Property Set StepDB(vdata As mstrSource, _ ' be currently loaded in the array - Database) LoadResString(errSubStepsFailed) meaning that the stepid ' is enough to uniquely identify a step Set mcarrSteps.NodeDB = vdata End Function For lngIndex = 0 To mcarrSteps.Count - 1 If mcarrSteps(lngIndex).StepId = End Property Public Property Get StepCount() As Integer lngStepId Then Public Function SubSteps(ByVal lngStepId As QueryStepIndex = lngIndex Long, _ StepCount = mcarrSteps.Count Exit Function ByVal strVersionNo As String) As End If Variant End Property Next lngIndex ' Returns a variant containing an array of all VERSION 1.0 CLASS ' Raise error that step has not been found the substeps BEGIN On Error GoTo 0 ' for the passed in step MultiUse = -1 'True Err.Raise vbObjectError + END errStepNotFound, mstrSource, _ Dim intIndex As Integer Attribute VB_Name = "cAsyncShell" LoadResString(errStepNotFound) Dim cSubSteps() As cStep Attribute VB_GlobalNameSpace = False Dim lngStepCount As Long Attribute VB_Creatable = True End Function Dim cQueryStep As cStep Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Public Function QueryStep(ByVal lngStepId On Error GoTo SubStepsErr '------As Long) As cStep ------lngStepCount = 0 ' Copyright © 1997 Microsoft Corporation. All ' Populates the passed in cStep object with rights reserved. the property Set cQueryStep = QueryStep(lngStepId) ' ' values corresponding to the Step ' You have a royalty-free right to use, modify, Identifier, lngStepId ' Only a manager can have sub-steps reproduce and distribute the If cQueryStep.StepType = gintManagerStep ' Sample Application Files (and/or any modified Dim lngQueryElement As Integer Then version) in any way you find ' useful, provided that you agree that Microsoft has lngQueryElement = ' For each element in the Steps array no warranty, obligations or QueryStepIndex(lngStepId) For intIndex = 0 To mcarrSteps.Count - 1 ' liability for any Sample Application Files. ' Check if the parent step id and parent '------' Initialize the passed in step object to the version number ------queried step ' match the passed in step Set QueryStep = If mcarrSteps(intIndex).ParentStepId = Option Explicit mcarrSteps(lngQueryElement) lngStepId And _ ' Used to indicate the source module name when End Function mcarrSteps(intIndex).ParentVersionNo = errors Public Property Get Item(ByVal Position As strVersionNo And _ ' are raised by this class Long) As cStep Private mstrSource As String Attribute Item.VB_UserMemId = 0 mcarrSteps(intIndex).IndOperation <> Private Const mstrModuleName As String = DeleteOp Then "c AsyncShell." ' Returns the element at the passed in position in the array ' Increase the array dimension and Public Event Terminated() If Position >= 0 And Position < add the step mcarrSteps.Count Then ' to it Private WithEvents moTimer As cTimerSM Set Item = mcarrSteps(Position) ReDim Preserve Attribute moTimer.VB_VarHelpID = -1 Else cSubSteps(lngStepCount) Private proc As PROCESS_INFORMATION On Error GoTo 0 Set cSubSteps(lngStepCount) = Private mfShelling As Boolean Err.Raise vbObjectError + mcarrSteps(intIndex) errItemDoesNotExist, mstrSource, _ lngStepCount = lngStepCount + 1 '------LoadResString(errItemDoesNotExist) End If ------End If Next intIndex 'Initialization and cleanup:

End Property End If Private Sub Class_Initialize() Public Property Set Item(ByVal Position As Set moTimer = New cTimerSM Long, _ ' Set the return value of the function to the End Sub ByVal cStepRec As cStep) array of ' Steps that has been built above Private Sub Class_Terminate() ' Returns the element at the passed in If lngStepCount = 0 Then If mfShelling Then CloseHandle proc.hProcess position in the array SubSteps = Empty End Sub If Position >= 0 And Position < Else mcarrSteps.Count Then SubSteps = cSubSteps() '------Set mcarrSteps(Position) = cStepRec End If ------Else 'Shelling: On Error GoTo 0 Exit Function Err.Raise vbObjectError + Public Sub Shell(CommandLine As String, errItemDoesNotExist, mstrSource, _ SubStepsErr: Optional PollingInterval As Long = 1000) LogErrors Errors Dim Start As STARTUPINFO LoadResString(errItemDoesNotExist) HP TPC-H FULL DISCLOSURE REPORT 298 © 2005 Hewlett-Packard Company. All rights reserved. If mfShelling Then GetExitCodeProcess proc.hProcess, Public ConnName As String On Error GoTo 0 nCode Public ConnectionString As String Err.Raise vbObjectError + If nCode = STILL_ACTIVE Then Public ConnType As ConnectionType errInstanceInUse, _ ' Write an error and close the handles Public Position As Long mstrSource, _ to the Public NodeDB As Database LoadResString(errInstanceInUse) ' process anyway End If Call Private mintOperation As Operation mfShelling = True WriteError(errTerminateProcessFailed, mstrSource) ' Used to indicate the source module name when ' Initialize the STARTUPINFO structure: End If errors Start.cb = Len(Start) End If ' are raised by this class Start.dwFlags = Private mstrSource As String STARTF_USESHOWWINDOW ' Close all open handles to the shelled Private Const mstrModuleName As String = Start.wShowWindow = process, even "c ConnDtl." SW_SHOWMINNOACTIVE ' if any of the above calls error out CloseHandle proc.hProcess ' The cSequence class is used to generate unique ' Start the shelled application: moTimer.Enabled = False Connection identifiers CreateProcessA 0&, CommandLine, 0&, mfShelling = False Private mConnectionSeq As cSequence 0&, 1&, _ RaiseEvent Terminated NORMAL_PRIORITY_CLASS, 0&, ' The StringSM class is used to carry out string 0&, Start, proc End If operations Private mFieldValue As cStringSM With moTimer Exit Sub If PollingInterval > 0 Then Private Sub AssignParameters(qyExec As .Interval = PollingInterval AbortErr: DAO.QueryDef) Else Call LogErrors(Errors) ' Assigns values to the parameters in the querydef .Interval = 1000 mstrSource = mstrModuleName & "Abort" object End If On Error GoTo 0 ' The parameter names are cryptic to differentiate .Enabled = True Err.Raise vbObjectError + errProgramError, them from the field names. End With _ ' When the parameter names are the same as the End Sub mstrSource, _ field names, parameters in the where '------LoadResString(errProgramError) ' clause do not get created. ------'Aborting: End Sub Dim prmParam As DAO.Parameter Public Sub Abort() Private Sub moTimer_Timer() Dim nCode As Long Dim nCode As Long On Error GoTo AssignParametersErr ' Dim X As Integer ' Dim ReturnVal As Integer GetExitCodeProcess proc.hProcess, nCode For Each prmParam In qyExec.Parameters If nCode <> STILL_ACTIVE Then Select Case prmParam.Name On Error GoTo AbortErr CloseHandle proc.hProcess Case "[w_id]" moTimer.Enabled = False prmParam.Value = WorkspaceId If Not mfShelling Then mfShelling = False Call WriteError(errProgramError, RaiseEvent Terminated Case "[c_id]" mstrSource) End If prmParam.Value = ConnNameId Else End Sub ' If IsWindow(proc.hProcess) = False VERSION 1.0 CLASS Case "[c_name]" Then Exit Sub BEGIN prmParam.Value = ConnName ' MultiUse = -1 'True ' If (GetWindowLong(proc.hProcess, END Case "[c_str]" GWL_STYLE) And WS_DISABLED) Attribute VB_Name = "cConnDtl" prmParam.Value = ConnectionString Then Exit Sub Attribute VB_GlobalNameSpace = False ' Attribute VB_Creatable = True Case "[c_type]" ' If IsWindow(proc.hProcess) Then Attribute VB_PredeclaredId = False prmParam.Value = ConnType ' If Not Attribute VB_Exposed = False (GetWindowLong(proc.hProcess, ' FILE: cConnDtl.cls Case Else GWL_STYLE) And WS_DISABLED) ' Microsoft TPC-H Kit Ver. 1.00 ' Write the parameter name that is faulty Then ' Copyright Microsoft, 1999 WriteError errInvalidParameter, ' X = PostMessage(proc.hProcess, ' All Rights Reserved mstrSource, prmParam.Name WM_CANCELMODE, 0, 0&) ' On Error GoTo 0 ' X = PostMessage(proc.hProcess, ' Err.Raise errInvalidParameter, WM_CLOSE, 0, 0&) ' PURPOSE: Encapsulates the properties mstrModuleName & "AssignParameters", _ ' End If and methods of a connection. LoadResString(errInvalidParameter) ' End If ' Contains functions to insert, update End Select and delete Next prmParam If TerminateProcess(proc.hProcess, ' connection_dtls records from the 0&) = 0 Then database. Exit Sub Debug.Print "Unable to terminate ' Contact: Reshma Tharamal process: " & proc.hProcess ([email protected]) AssignParametersErr: Call ' WriteError(errTerminateProcessFailed, Option Explicit Call LogErrors(Errors) mstrSource, _ Option Base 0 On Error GoTo 0 ApiError(GetLastError())) Err.Raise vbObjectError + Else ' Local variable(s) to hold property value(s) errAssignParametersFailed, _ ' Should always come here! Public WorkspaceId As Long mstrModuleName & "AssignParameters", Public ConnNameId As Long LoadResString(errAssignParametersFailed) HP TPC-H FULL DISCLOSURE REPORT 299 © 2005 Hewlett-Packard Company. All rights reserved.

End Sub Set rstConnection = End Sub qy.OpenRecordset(dbOpenForwardOnly) Public Sub Add() Public Function Clone() As cConnDtl If rstConnection![Connection_count] > 0 Dim strInsert As String ' Creates a copy of a given Connection Then Dim qy As DAO.QueryDef rstConnection.Close Dim cCloneConn As cConnDtl qy.Close On Error GoTo AddErr ShowError errDupConnDtlName On Error GoTo CloneErr On Error GoTo 0 ' Validate the record before trying to insert the Err.Raise vbObjectError + record Set cCloneConn = New cConnDtl errDupConnDtlName, _ Call Validate mstrSource, ' Copy all the Connection properties to the LoadResString(errDupConnDtlName) ' Create a temporary querydef object newly created Connection End If strInsert = "insert into "& cCloneConn.WorkspaceId = WorkspaceId TBL_CONNECTION_DTLS & _ cCloneConn.ConnNameId = rstConnection.Close "( " & FLD_ID_WORKSPACE & _ ConnNameId qy.Close ", " & FLD_ID_CONN_NAME & _ cCloneConn.ConnName = ConnName ", " & cCloneConn.ConnectionString = Exit Sub FLD_CONN_DTL_CONNECTION_NAME & _ ConnectionString ", " & cCloneConn.ConnType = ConnType CheckDupConnectionNameErr: FLD_CONN_DTL_CONNECTION_STRING & _ cCloneConn.IndOperation = LogErrors Errors ", " & mintOperation mstrSource = mstrModuleName & FLD_CONN_DTL_CONNECTION_TYPE & " ) " cCloneConn.Position = Position "CheckDupConnectionName" & _ On Error GoTo 0 " values ( [w_id], [c_id], " & _ ' And set the return value to the newly Err.Raise vbObjectError + errProgramError, " [c_name], [c_str], [c_type] ) " created Connection _ Set Clone = cCloneConn mstrSource, Set qy = Set cCloneConn = Nothing LoadResString(errProgramError) dbsAttTool.CreateQueryDef(gstrEmptyString, strInsert) Exit Function End Sub Public Property Let IndOperation(ByVal vdata ' Call a procedure to assign the Connection values CloneErr: As Operation) Call AssignParameters(qy) LogErrors Errors mstrSource = mstrModuleName & ' The valid operations are define in the qy.Execute dbFailOnError "Clone" cOperations qy.Close On Error GoTo 0 ' class. Check if the operation is valid Err.Raise vbObjectError + Select Case vdata Exit Sub errCloneFailed, mstrSource, Case QueryOp, InsertOp, UpdateOp, LoadResString(errCloneFailed) DeleteOp AddErr: mintOperation = vdata End Function Call LogErrors(Errors) Private Sub CheckDupConnectionName() Case Else On Error GoTo 0 ' Check if the Connection name already BugAssert True Err.Raise vbObjectError + errInsertFailed, _ exists in the workspace End Select mstrModuleName & "Add", LoadResString(errInsertFailed) Dim rstConnection As Recordset End Property Dim strSql As String Public Sub Validate() End Sub Dim qy As DAO.QueryDef ' Each distinct object will have a Validate Public Sub Delete() method which On Error GoTo ' will check if the class properties are valid. Dim strDelete As String CheckDupConnectionNameErr This method Dim qy As DAO.QueryDef mstrSource = mstrModuleName & ' will be used to check interdependant "CheckDupConnectionName" properties that On Error GoTo DeleteErr ' cannot be validated by the let procedures. ' Create a recordset object to retrieve the ' It should be called by the add and modify strDelete = "delete from " & count of all Connections methods of the class TBL_CONNECTION_DTLS & _ ' for the workspace with the same name " where " & FLD_ID_CONN_NAME & " = strSql = "Select count(*) as If ConnName = gstrEmptyString Then [c_id]" Connection_count " & _ Set qy = " from " & ShowError dbsAttTool.CreateQueryDef(gstrEmptyString, TBL_CONNECTION_DTLS & _ errConnectionNameMandatory strDelete) " where " & FLD_ID_WORKSPACE On Error GoTo 0 & " = [w_id]" & _ ' Propogate this error back to the caller Call AssignParameters(qy) " and " & Err.Raise vbObjectError + qy.Execute dbFailOnError FLD_CONN_DTL_CONNECTION_NAM errConnectionNameMandatory, _ E & " = [c_name]" & _ mstrSource, qy.Close " and " & FLD_ID_CONN_NAME & " LoadResString(errConnectionNameMandatory <> [c_id]" ) Exit Sub End If Set qy = DeleteErr: dbsAttTool.CreateQueryDef(gstrEmptyStrin ' Raise an error if the Connection name LogErrors Errors g, strSql) already exists in the workspace On Error GoTo 0 Call AssignParameters(qy) Call CheckDupConnectionName Err.Raise vbObjectError + errDeleteFailed, _ HP TPC-H FULL DISCLOSURE REPORT 300 © 2005 Hewlett-Packard Company. All rights reserved. mstrModuleName & "Delete", Exit Property LoadResString(errDeleteFailed) Set mcarrConnDtls.NodeDB = vdata NextIdentifierErr: End Sub LogErrors Errors End Property On Error GoTo 0 Public Sub Modify(cModifiedConn As cConnDtl) Public Sub Modify() Err.Raise vbObjectError + errIdGetFailed, _ mstrModuleName & "NextIdentifier", ' First check if the parameter record is valid Dim strUpdate As String LoadResString(errIdGetFailed) Call CheckDupConnName(cModifiedConn) Dim qy As QueryDef End Property Call mcarrConnDtls.Modify(cModifiedConn) On Error GoTo ModifyErr Public Property Get IndOperation() As Operation End Sub ' Validate the updated values before trying Public Sub Load(ByRef cConnToAdd As to modify the db IndOperation = mintOperation cConnDtl) Call Validate End Property Call mcarrConnDtls.Load(cConnToAdd) ' Create a temporary querydef object with the modify string Private Sub Class_Initialize() End Sub strUpdate = "update " & Public Sub Add(ByRef cConnToAdd As cConnDtl) TBL_CONNECTION_DTLS & _ Set mFieldValue = New cStringSM " set " & FLD_ID_WORKSPACE & ' First check if the record is valid " = [w_id], " & _ ' Initialize the operation indicator variable to Call Validate(cConnToAdd) Query FLD_CONN_DTL_CONNECTION_NAM ' It will be modified later by the collection ' Retrieve a unique identifier E & " = [c_name], " & _ class when cConnToAdd.ConnNameId = ' inserts, updates or deletes are performed cConnToAdd.NextIdentifier FLD_CONN_DTL_CONNECTION_STRI mintOperation = QueryOp NG & " = [c_str], " & _ Call mcarrConnDtls.Add(cConnToAdd) ConnType = giDefaultConnType FLD_CONN_DTL_CONNECTION_TYPE End Sub & " = [c_type] " & _ End Sub " where " & Public Sub Unload(lConnNameId As Long) FLD_ID_CONN_NAME & " = [c_id]" Private Sub Class_Terminate() Set qy = Dim lngDeleteElement As Long dbsAttTool.CreateQueryDef(gstrEmptyStrin Set mFieldValue = Nothing g, strUpdate) lngDeleteElement = QueryIndex(lConnNameId) End Sub ' Call a procedure to assign the VERSION 1.0 CLASS Call mcarrConnDtls.Unload(lngDeleteElement) Connection values to the BEGIN ' querydef object MultiUse = -1 'True End Sub Call AssignParameters(qy) END qy.Execute dbFailOnError Attribute VB_Name = "cConnDtls" Public Sub SaveConnDtlsInWsp(ByVal Attribute VB_GlobalNameSpace = False lngWorkspace As Long) qy.Close Attribute VB_Creatable = True ' Call a procedure to save all connection details Attribute VB_PredeclaredId = False records for the workspace Exit Sub Attribute VB_Exposed = False Call mcarrConnDtls.Save(lngWorkspace) ' FILE: cConnDtls.cls ModifyErr: ' Microsoft TPC-H Kit Ver. 1.00 End Sub ' Copyright Microsoft, 1999 Public Function GetConnectionDtl(ByVal Call LogErrors(Errors) ' All Rights Reserved lngWorkspace As Long, _ On Error GoTo 0 ' ByVal strConnectionName As String) As Err.Raise vbObjectError + ' cConnDtl errModifyFailed, _ ' PURPOSE: Implements an array of ' Returns the connection dtl for the passed in mstrModuleName & "Modify", cConnDtl objects. connection name LoadResString(errModifyFailed) ' Type-safe wrapper around cNodeCollections. Dim lngIndex As Long End Sub ' Also contains additional functions to Public Property Get NextIdentifier() As determine the connection ' Find all parameters in the array with a matching Long ' string value, validation functions, etc. workspace id ' Contact: Reshma Tharamal For lngIndex = 0 To mcarrConnDtls.Count - 1 Dim lngNextId As Long ([email protected]) If mcarrConnDtls(lngIndex).WorkspaceId = ' lngWorkspace And _ On Error GoTo NextIdentifierErr Option Explicit mcarrConnDtls(lngIndex).ConnName = strConnectionName Then ' Retrieve the next identifier using the Private mcarrConnDtls As cNodeCollections sequence class Set GetConnectionDtl = Set mConnectionSeq = New cSequence ' Used to indicate the source module name mcarrConnDtls(lngIndex) Set mConnectionSeq.IdDatabase = when errors Exit For dbsAttTool ' are raised by this class End If mConnectionSeq.IdentifierColumn = Private mstrSource As String Next lngIndex FLD_ID_CONN_NAME Private Const mstrModuleName As String = lngNextId = mConnectionSeq.Identifier "c ConnDtls." If lngIndex > mcarrConnDtls.Count - 1 Then Set mConnectionSeq = Nothing ' The parameter has not been defined for the Public Property Set ConnDb(vdata As workspace NextIdentifier = lngNextId Database) ' Raise an error HP TPC-H FULL DISCLOSURE REPORT 301 © 2005 Hewlett-Packard Company. All rights reserved. On Error GoTo 0 End Property Private Sub Class_Terminate() Err.Raise vbObjectError + errConnNameInvalid, mstrModuleName & Private Sub Validate(ByVal cConnToValidate Set mcarrConnDtls = Nothing "GetConnection", _ As cConnDtl) ' This procedure is necessary since the class End Sub LoadResString(errConnNameInvalid) cannot validate VERSION 1.0 CLASS End If ' all the connection_dtl properties on it's BEGIN own. This is 'coz we MultiUse = -1 'True End Function ' might have created new connections in the END Public Sub Delete(lConnNameId As Long) workspace, but not Attribute VB_Name = "cConnection" ' Delete the passed in parameter ' saved them to the database yet - hence the Attribute VB_GlobalNameSpace = False duplicate check Attribute VB_Creatable = True Dim lngDeleteElement As Long ' has to be repeated in the array Attribute VB_PredeclaredId = False Attribute VB_Exposed = False lngDeleteElement = Dim lngIndex As Long ' FILE: cConnection.cls QueryIndex(lConnNameId) Dim cTempParam As cConnDtl ' Microsoft TPC-H Kit Ver. 1.00 Call ' Copyright Microsoft, 1999 mcarrConnDtls.Delete(lngDeleteElement) ' Check if the parameter name already exists ' All Rights Reserved in the workspace ' End Sub For lngIndex = 0 To mcarrConnDtls.Count - ' Private Function QueryIndex(lConnNameId 1 ' PURPOSE: Encapsulates the properties and As Long) As Long Set cTempParam = methods of a connection string. mcarrConnDtls(lngIndex) ' Contains functions to insert, update and Dim lngIndex As Long If cTempParam.WorkspaceId = delete cConnToValidate.WorkspaceId And _ ' workspace_connections records from the ' Find the matching parameter record in cTempParam.ConnName = database. the array cConnToValidate.ConnName And _ ' Contact: Reshma Tharamal For lngIndex = 0 To cTempParam.IndOperation <> ([email protected]) mcarrConnDtls.Count - 1 DeleteOp Then ' If On Error GoTo 0 Option Explicit mcarrConnDtls(lngIndex).ConnNameId = Err.Raise vbObjectError + Option Base 0 lConnNameId And _ errDupConnDtlName, _ mstrSource, ' Local variable(s) to hold property value(s) mcarrConnDtls(lngIndex).IndOperation <> LoadResString(errDupConnDtlName) Public WorkspaceId As Long DeleteOp Then End If Public ConnectionId As Long QueryIndex = lngIndex Next lngIndex Public ConnectionValue As String Exit Function Public Description As String End If End Sub Public NodeDB As Database Next lngIndex Private Sub CheckDupConnName(ByVal Public Position As Long cConnToValidate As cConnDtl) Public NoCountDisplay As Boolean ' Raise error that parameter has not been Public NoExecute As Boolean found Dim lngIndex As Long Public ParseQueryOnly As Boolean On Error GoTo 0 Dim cTempParam As cConnDtl Public QuotedIdentifiers As Boolean Err.Raise vbObjectError + Public AnsiNulls As Boolean errQueryIndexFailed, ' Check if the parameter name already exists Public ShowQueryPlan As Boolean "c ArrParameters.QueryIndex", _ in the workspace Public ShowStatsTime As Boolean LoadResString(errQueryIndexFailed) For lngIndex = 0 To mcarrConnDtls.Count - Public ShowStatsIO As Boolean 1 Public ParseOdbcMsg As Boolean End Function Set cTempParam = Public RowCount As Long mcarrConnDtls(lngIndex) Public TsqlBatchSeparator As String Public Function If cTempParam.WorkspaceId = Public QueryTimeOut As Long QueryConnDtl(lConnNameId As Long) As cConnToValidate.WorkspaceId And _ Public ServerLanguage As String cConnDtl cTempParam.ConnName = Public CharacterTranslation As Boolean cConnToValidate.ConnName And _ Public RegionalSettings As Boolean Dim lngQueryElement As Long cTempParam.ConnNameId <> cConnToValidate.ConnNameId And _ Private mstrConnectionName As String lngQueryElement = cTempParam.IndOperation <> Private mintOperation As Operation QueryIndex(lConnNameId) DeleteOp Then ShowError errDupConnDtlName ' Used to indicate the source module name when ' Return the queried connection object On Error GoTo 0 errors Set QueryConnDtl = Err.Raise vbObjectError + ' are raised by this class mcarrConnDtls(lngQueryElement) errDupConnDtlName, _ Private mstrSource As String mstrSource, Private Const mstrModuleName As String = End Function LoadResString(errDupConnDtlName) "c Connection." Public Property Get Count() As Long End If Next lngIndex ' The cSequence class is used to generate unique Count = mcarrConnDtls.Count Connection identifiers End Sub Private mConnectionSeq As cSequence End Property Public Property Get Item(lngIndex As Long) Private Sub Class_Initialize() ' The StringSM class is used to carry out string As cConnDtl operations Attribute Item.VB_UserMemId = 0 Set mcarrConnDtls = New cNodeCollections Private mFieldValue As cStringSM

Set Item = mcarrConnDtls(lngIndex) End Sub Private Sub AssignParameters(qyExec As DAO.QueryDef) HP TPC-H FULL DISCLOSURE REPORT 302 © 2005 Hewlett-Packard Company. All rights reserved. ' Assigns values to the parameters in the prmParam.Value = ServerLanguage cCloneConn.TsqlBatchSeparator = querydef object TsqlBatchSeparator ' The parameter names are cryptic to Case "[char_trans]" cCloneConn.QueryTimeOut = QueryTimeOut differentiate them from the field names. prmParam.Value = cCloneConn.ServerLanguage = ServerLanguage ' When the parameter names are the same CharacterTranslation cCloneConn.CharacterTranslation = as the field names, parameters in the where CharacterTranslation ' clause do not get created. Case "[reg_settings]" cCloneConn.RegionalSettings = RegionalSettings prmParam.Value = RegionalSettings Dim prmParam As DAO.Parameter ' And set the return value to the newly created Case Else Connection On Error GoTo AssignParametersErr ' Write the parameter name that is Set Clone = cCloneConn faulty Set cCloneConn = Nothing For Each prmParam In WriteError errInvalidParameter, qyExec.Parameters mstrSource, prmParam.Name Exit Function Select Case prmParam.Name On Error GoTo 0 Case "[w_id]" Err.Raise errInvalidParameter, CloneErr: prmParam.Value = WorkspaceId mstrModuleName & "AssignParameters", _ LogErrors Errors mstrSource = mstrModuleName & "Clone" Case "[c_id]" LoadResString(errInvalidParameter) On Error GoTo 0 prmParam.Value = ConnectionId End Select Err.Raise vbObjectError + errCloneFailed, Next prmParam mstrSource, LoadResString(errCloneFailed) Case "[c_name]" prmParam.Value = Exit Sub End Function mstrConnectionName Private Sub CheckDupConnectionName() AssignParametersErr: ' Check if the Connection name already exists in Case "[c_value]" the workspace prmParam.Value = Call LogErrors(Errors) ConnectionValue On Error GoTo 0 Dim rstConnection As Recordset Err.Raise vbObjectError + Dim strSql As String Case "[desc]" errAssignParametersFailed, _ Dim qy As DAO.QueryDef prmParam.Value = Description mstrModuleName & "AssignParameters", LoadResString(errAssignParametersFailed) On Error GoTo CheckDupConnectionNameErr Case "[no_count]" mstrSource = mstrModuleName & prmParam.Value = End Sub "CheckDupConnectionName" NoCountDisplay Public Function Clone() As cConnection ' Create a recordset object to retrieve the count of Case "[no_exec]" all Connections prmParam.Value = NoExecute ' Creates a copy of a given Connection ' for the workspace with the same name strSql = "Select count(*) as Connection_count " Case "[parse_only]" Dim cCloneConn As cConnection & _ prmParam.Value = " from workspace_connections " & _ ParseQueryOnly On Error GoTo CloneErr " where workspace_id = [w_id]" & _ " and connection_name = [c_name]" & _ Case "[quoted_id]" Set cCloneConn = New cConnection " and connection_id <> [c_id]" prmParam.Value = QuotedIdentifiers ' Copy all the Connection properties to the Set qy = newly NodeDB.CreateQueryDef(gstrEmptyString, strSql) Case "[a_nulls]" ' created Connection Call AssignParameters(qy) prmParam.Value = AnsiNulls Set cCloneConn.NodeDB = NodeDB cCloneConn.WorkspaceId = WorkspaceId Set rstConnection = Case "[show_qp]" cCloneConn.ConnectionId = ConnectionId qy.OpenRecordset(dbOpenForwardOnly) prmParam.Value = cCloneConn.ConnectionName = ShowQueryPlan mstrConnectionName If rstConnection![Connection_count] > 0 Then cCloneConn.ConnectionValue = rstConnection.Close Case "[stats_tm]" ConnectionValue qy.Close prmParam.Value = cCloneConn.Description = Description ShowError errDuplicateConnectionName ShowStatsTime cCloneConn.IndOperation = mintOperation On Error GoTo 0 cCloneConn.Position = Position Err.Raise vbObjectError + Case "[stats_io]" cCloneConn.NoCountDisplay = errDuplicateConnectionName, _ prmParam.Value = ShowStatsIO NoCountDisplay mstrSource, cCloneConn.NoExecute = NoExecute LoadResString(errDuplicateConnectionName) Case "[parse_odbc]" cCloneConn.ParseQueryOnly = End If prmParam.Value = ParseOdbcMsg ParseQueryOnly cCloneConn.QuotedIdentifiers = rstConnection.Close Case "[row_cnt]" QuotedIdentifiers qy.Close prmParam.Value = RowCount cCloneConn.AnsiNulls = AnsiNulls cCloneConn.ShowQueryPlan = Exit Sub Case "[batch_sep]" ShowQueryPlan prmParam.Value = cCloneConn.ShowStatsTime = CheckDupConnectionNameErr: TsqlBatchSeparator ShowStatsTime LogErrors Errors cCloneConn.ShowStatsIO = ShowStatsIO mstrSource = mstrModuleName & Case "[qry_tmout]" cCloneConn.ParseOdbcMsg = "CheckDupConnectionName" prmParam.Value = QueryTimeOut ParseOdbcMsg On Error GoTo 0 cCloneConn.RowCount = RowCount Err.Raise vbObjectError + errProgramError, _ Case "[lang]" mstrSource, LoadResString(errProgramError) HP TPC-H FULL DISCLOSURE REPORT 303 © 2005 Hewlett-Packard Company. All rights reserved. Set qy = End Sub On Error GoTo AddErr NodeDB.CreateQueryDef(gstrEmptyString, Private Sub CheckDB() strDelete) ' Check if the database object has been ' Validate the record before trying to insert initialized the record Call AssignParameters(qy) Call Validate qy.Execute dbFailOnError If NodeDB Is Nothing Then On Error GoTo 0 ' Create a temporary querydef object qy.Close Err.Raise vbObjectError + strInsert = "insert into errInvalidDB, _ workspace_connections " & _ Exit Sub mstrModuleName & "CheckDB", "( workspace_id, connection_id, " & _ LoadResString(errInvalidDB) "c onnection_name, connection_value, DeleteErr: End If " & _ LogErrors Errors "description, no_count_display, " & _ On Error GoTo 0 End Sub "no_execute, parse_query_only, " & _ Err.Raise vbObjectError + errDeleteFailed, _ Public Property Let ConnectionName(vdata "ANSI_quoted_identifiers, mstrModuleName & "Delete", As String) ANSI_nulls, " & _ LoadResString(errDeleteFailed) "s how_query_plan, show_stats_time, " If vdata = gstrEmptyString Then & _ End Sub "s how_stats_io, ShowError parse_odbc_msg_prefixes, " & _ Public Sub Modify() errConnectionNameMandatory "row_count, tsql_batch_separator, " & On Error GoTo 0 _ Dim strUpdate As String ' Propogate this error back to the caller "query_time_out, server_language, " & Dim qy As QueryDef Err.Raise vbObjectError + _ errConnectionNameMandatory, _ "c haracter_translation, On Error GoTo ModifyErr mstrSource, regional_settings ) " & _ LoadResString(errConnectionNameMandato " values ( [w_id], [c_id], [c_name], ' Validate the updated values before trying to ry) [c_value], " & _ modify the db Else " [desc], [no_count], [no_exec], Call Validate mstrConnectionName = vdata [parse_only], " & _ End If " [quoted_id], [a_nulls], [show_qp], ' Create a temporary querydef object with the [stats_tm], " & _ modify string End Property " [stats_io], [parse_odbc], [row_cnt], strUpdate = "update workspace_connections " & [batch_sep], " & _ _ Public Property Let IndOperation(ByVal " [qry_tmout], [lang], [char_trans], " set workspace_id = [w_id], " & _ vdata As Operation) [reg_settings] ) " "c onnection_name = [c_name], " & _ "c onnection_value = [c_value], " & _ ' The valid operations are define in the Set qy = "description = [desc], " & _ cOperations NodeDB.CreateQueryDef(gstrEmptyString, "no_count_display = [no_count], " & _ ' class. Check if the operation is valid strInsert) "no_execute = [no_exec], " & _ Select Case vdata "parse_query_only = [parse_only], " & _ Case QueryOp, InsertOp, UpdateOp, ' Call a procedure to assign the Connection "ANSI_quoted_identifiers = [quoted_id], " DeleteOp values & _ mintOperation = vdata Call AssignParameters(qy) "ANSI_nulls = [a_nulls], " & _ "s how_query_plan = [show_qp], " & _ Case Else qy.Execute dbFailOnError "s how_stats_time = [stats_tm], " & _ BugAssert True qy.Close "s how_stats_io = [stats_io], " & _ End Select "parse_odbc_msg_prefixes = [parse_odbc], Exit Sub " & _ End Property "r ow_count = [row_cnt], " & _ Public Sub Validate() AddErr: "t sql_batch_separator = [batch_sep], " & _ ' Each distinct object will have a Validate "query_time_out = [qry_tmout], " & _ method which Call LogErrors(Errors) "s erver_language = [lang], " & _ ' will check if the class properties are On Error GoTo 0 "c haracter_translation = [char_trans], " & _ valid. This method Err.Raise vbObjectError + errInsertFailed, _ "r egional_settings = [reg_settings] " & _ ' will be used to check interdependant mstrModuleName & "Add", " where connection_id = [c_id]" properties that LoadResString(errInsertFailed) Set qy = ' cannot be validated by the let NodeDB.CreateQueryDef(gstrEmptyString, procedures. End Sub strUpdate) ' It should be called by the add and Public Sub Delete() modify methods of the class ' Call a procedure to assign the Connection values Dim strDelete As String to the ' Check if the db object is valid Dim qy As DAO.QueryDef ' querydef object Call CheckDB Call AssignParameters(qy) On Error GoTo DeleteErr qy.Execute dbFailOnError ' Raise an error if the Connection name already exists in the workspace ' Check if the db object is valid qy.Close Call CheckDupConnectionName Call CheckDB Exit Sub End Sub strDelete = "delete from Public Sub Add() workspace_connections " & _ ModifyErr: " where connection_id = [c_id]" Dim strInsert As String Call LogErrors(Errors) Dim qy As DAO.QueryDef On Error GoTo 0 HP TPC-H FULL DISCLOSURE REPORT 304 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + ShowStatsTime = errModifyFailed, _ DEF_SHOW_STATS_TIME End Sub mstrModuleName & "Modify", ShowStatsIO = DEF_SHOW_STATS_IO Public Sub Load(ByRef cConnToAdd As LoadResString(errModifyFailed) ParseOdbcMsg = cConnection) DEF_PARSE_ODBC_MSG_PREFIXES End Sub RowCount = DEF_ROW_COUNT Call mcarrConnections.Load(cConnToAdd) Public Property Get ConnectionName() As TsqlBatchSeparator = String DEF_TSQL_BATCH_SEPARATOR End Sub QueryTimeOut = Public Sub Add(ByRef cConnToAdd As ConnectionName = mstrConnectionName DEF_QUERY_TIME_OUT cConnection) ServerLanguage = End Property DEF_SERVER_LANGUAGE Set cConnToAdd.NodeDB = CharacterTranslation = mcarrConnections.NodeDB Public Property Get NextIdentifier() As DEF_CHARACTER_TRANSLATION Long RegionalSettings = ' First check if the record is valid DEF_REGIONAL_SETTINGS Call Validate(cConnToAdd) Dim lngNextId As Long End Sub ' Retrieve a unique identifier On Error GoTo NextIdentifierErr cConnToAdd.ConnectionId = Private Sub Class_Terminate() cConnToAdd.NextIdentifier ' First check if the database object is valid Call CheckDB Set NodeDB = Nothing Call mcarrConnections.Add(cConnToAdd) Set mFieldValue = Nothing ' Retrieve the next identifier using the End Sub sequence class End Sub Set mConnectionSeq = New cSequence VERSION 1.0 CLASS Public Sub Unload(lngConnId As Long) Set mConnectionSeq.IdDatabase = BEGIN NodeDB MultiUse = -1 'True Dim lngDeleteElement As Long mConnectionSeq.IdentifierColumn = END "c onnection_id" Attribute VB_Name = "c Connections" lngDeleteElement = QueryIndex(lngConnId) lngNextId = mConnectionSeq.Identifier Attribute VB_GlobalNameSpace = False Set mConnectionSeq = Nothing Attribute VB_Creatable = True Call Attribute VB_PredeclaredId = False mcarrConnections.Unload(lngDeleteElement) NextIdentifier = lngNextId Attribute VB_Exposed = False Exit Property ' FILE: cConnections.cls End Sub ' Microsoft TPC-H Kit Ver. 1.00 NextIdentifierErr: ' Copyright Microsoft, 1999 Public Sub SaveConnectionsInWsp(ByVal LogErrors Errors ' All Rights Reserved lngWorkspace As Long) On Error GoTo 0 ' ' Call a procedure to save all connection records Err.Raise vbObjectError + errIdGetFailed, ' for the workspace _ ' PURPOSE: Implements an array of Call mcarrConnections.Save(lngWorkspace) mstrModuleName & "NextIdentifier", cConnection objects. LoadResString(errIdGetFailed) ' Type-safe wrapper around End Sub cNodeCollections. Public Function GetConnection(ByVal End Property ' Also contains validation functions, lngWorkspace As Long, _ Public Property Get IndOperation() As etc. ByVal strConnectionName As String) As Operation ' Contact: Reshma Tharamal cConnection ([email protected]) ' Returns the connection string for the passed in IndOperation = mintOperation ' connection name Option Explicit End Property Dim lngIndex As Long Private mcarrConnections As Private Sub Class_Initialize() cNodeCollections ' Find all parameters in the array with a matching workspace id Set mFieldValue = New cStringSM ' Used to indicate the source module name For lngIndex = 0 To mcarrConnections.Count - 1 when errors If mcarrConnections(lngIndex).WorkspaceId = ' Initialize the operation indicator variable ' are raised by this class lngWorkspace And _ to Query Private mstrSource As String ' It will be modified later by the collection Private Const mstrModuleName As String = mcarrConnections(lngIndex).ConnectionName = class when "c Connections." strConnectionName Then ' inserts, updates or deletes are performed mintOperation = QueryOp Public Property Set ConnDb(vdata As Set GetConnection = Database) mcarrConnections(lngIndex) ' Initialize connection properties to their Exit For default values Set mcarrConnections.NodeDB = vdata End If NoCountDisplay = Next lngIndex DEF_NO_COUNT_DISPLAY End Property NoExecute = DEF_NO_EXECUTE Public Sub Modify(cModifiedConn As If lngIndex > mcarrConnections.Count - 1 Then ParseQueryOnly = cConnection) ' The parameter has not been defined for the DEF_PARSE_QUERY_ONLY workspace QuotedIdentifiers = ' First check if the parameter record is valid ' Raise an error DEF_ANSI_QUOTED_IDENTIFIERS Call CheckDupConnName(cModifiedConn) On Error GoTo 0 AnsiNulls = DEF_ANSI_NULLS Err.Raise vbObjectError + ShowQueryPlan = Call errConnNameInvalid, mstrModuleName & DEF_SHOW_QUERY_PLAN mcarrConnections.Modify(cModifiedConn) "GetConnection", _ HP TPC-H FULL DISCLOSURE REPORT 305 © 2005 Hewlett-Packard Company. All rights reserved. Public Sub Validate(ByVal cConnToValidate Private Sub Class_Terminate() LoadResString(errConnNameInvalid) As cConnection) End If ' This procedure is necessary since the class Set mcarrConnections = Nothing cannot validate End Function ' all the parameter properties on it's own. End Sub Public Sub Delete(lngConnId As Long) This is 'coz we VERSION 1.0 CLASS ' Delete the passed in parameter ' might have created new parameters in the BEGIN workspace, but not MultiUse = -1 'True Dim lngDeleteElement As Long ' saved them to the database yet - hence the END duplicate check Attribute VB_Name = "cConstraint" lngDeleteElement = ' has to be repeated in the array Attribute VB_GlobalNameSpace = False QueryIndex(lngConnId) Attribute VB_Creatable = True Call Dim lngIndex As Long Attribute VB_PredeclaredId = False mcarrConnections.Delete(lngDeleteElement Dim cTempParam As cConnection Attribute VB_Exposed = False ) ' FILE: cConstraint.cls ' Check if the parameter name already exists ' Microsoft TPC-H Kit Ver. 1.00 End Sub in the workspace ' Copyright Microsoft, 1999 Private Function QueryIndex(lngConnId As For lngIndex = 0 To ' All Rights Reserved Long) As Long mcarrConnections.Count - 1 ' Set cTempParam = ' Dim lngIndex As Long mcarrConnections(lngIndex) ' PURPOSE: Encapsulates the properties and If cTempParam.WorkspaceId = methods of a constraint. ' Find the matching parameter record in cConnToValidate.WorkspaceId And _ ' Contains functions to insert, update and the array cTempParam.ConnectionName = delete For lngIndex = 0 To cConnToValidate.ConnectionName And _ ' step_constraints records from the mcarrConnections.Count - 1 cTempParam.IndOperation <> database. If DeleteOp Then ' Contact: Reshma Tharamal mcarrConnections(lngIndex).ConnectionId On Error GoTo 0 ([email protected]) = lngConnId And _ Err.Raise vbObjectError + ' errDuplicateConnectionName, _ Option Explicit mcarrConnections(lngIndex).IndOperation mstrSource, <> DeleteOp Then LoadResString(errDuplicateConnectionName) ' Module level variables to store the property values QueryIndex = lngIndex End If Private mlngConstraintId As Long Exit Function Next lngIndex Private mlngStepId As Long End If Private mstrVersionNo As String Next lngIndex End Sub Private mintConstraintType As Integer Public Sub CheckDupConnName(ByVal Private mlngGlobalStepId As Long ' Raise error that parameter has not been cConnToValidate As cConnection) Private mstrGlobalVersionNo As String found Private mintSequenceNo As Integer On Error GoTo 0 Dim lngIndex As Long Private mdbsConstraintDB As Database Err.Raise vbObjectError + Dim cTempParam As cConnection Private mlngWorkspaceId As Integer errQueryIndexFailed, Private mintOperation As Operation "c ArrParameters.QueryIndex", _ ' Check if the parameter name already exists Private mlngPosition As Long LoadResString(errQueryIndexFailed) in the workspace For lngIndex = 0 To ' The cSequence class is used to generate unique End Function mcarrConnections.Count - 1 step identifiers Set cTempParam = Private mConstraintSeq As cSequence Public Function mcarrConnections(lngIndex) QueryConnection(lngConnId As Long) As If cTempParam.WorkspaceId = Private Const mstrModuleName As String = cConnection cConnToValidate.WorkspaceId And _ ".cConstraint." cTempParam.ConnectionName = Private mstrSource As String Dim lngQueryElement As Long cConnToValidate.ConnectionName And _ cTempParam.ConnectionId <> Public Enum ConstraintType lngQueryElement = cConnToValidate.ConnectionId And _ gintPreStep = 1 QueryIndex(lngConnId) cTempParam.IndOperation <> gintPostStep = 2 DeleteOp Then End Enum ' Return the queried connection object ShowError Set QueryConnection = errDuplicateConnectionName Private Const mstrSQ As String = "'" mcarrConnections(lngQueryElement) On Error GoTo 0 Public Property Get WorkspaceId() As Long Err.Raise vbObjectError + WorkspaceId = mlngWorkspaceId End Function errDuplicateConnectionName, _ End Property Public Property Get Count() As Long mstrSource, Public Property Let WorkspaceId(ByVal vdata As LoadResString(errDuplicateConnectionName) Long) Count = mcarrConnections.Count End If mlngWorkspaceId = vdata Next lngIndex End Property End Property Public Property Get Item(lngIndex As Long) End Sub Public Property Get IndOperation() As Operation As cConnection Attribute Item.VB_UserMemId = 0 Private Sub Class_Initialize() IndOperation = mintOperation

Set Item = mcarrConnections(lngIndex) Set mcarrConnections = New End Property cNodeCollections Public Property Let IndOperation(ByVal vdata As End Property Operation) End Sub On Error GoTo IndOperationErr HP TPC-H FULL DISCLOSURE REPORT 306 © 2005 Hewlett-Packard Company. All rights reserved. mstrSource = mstrModuleName & On Error GoTo 0 AddErr: "IndOperation" Err.Raise vbObjectError + errCloneFailed, _ LogErrors Errors mstrSource, mstrSource = mstrModuleName & "Add" ' The valid operations are define in the LoadResString(errCloneFailed) On Error GoTo 0 cOperations Err.Raise vbObjectError + ' class. Check if the operation is valid End Function errAddConstraintFailed, _ Select Case vdata mstrSource, _ Case QueryOp, InsertOp, UpdateOp, Public Property Get SequenceNo() As Integer LoadResString(errAddConstraintFailed) DeleteOp End Sub mintOperation = vdata SequenceNo = mintSequenceNo Private Sub AssignParameters(qyExec As DAO.QueryDef) Case Else End Property ' Assigns values to the parameters in the querydef On Error GoTo 0 object Err.Raise vbObjectError + Public Property Let SequenceNo(ByVal vdata ' The parameter names are cryptic to make them errInvalidOperation, _ As Integer) different mstrSource, mintSequenceNo = vdata ' from the field names. When the parameter LoadResString(errInvalidOperation) End Property names are End Select ' the same as the field names, parameters in the Public Sub Add() where Exit Property ' Inserts a new step constraint into the ' clause do not get created. database IndOperationErr: Dim prmParam As DAO.Parameter LogErrors Errors Dim strInsert As String mstrSource = mstrModuleName & Dim qy As DAO.QueryDef On Error GoTo AssignParametersErr "IndOperation" mstrSource = mstrModuleName & On Error GoTo 0 On Error GoTo AddErr "AssignParameters" Err.Raise vbObjectError + errLetOperationFailed, _ ' First check if the database object is valid For Each prmParam In qyExec.Parameters mstrSource, Call CheckDB Select Case prmParam.Name LoadResString(errLetOperationFailed) Case "[cons_id]" ' Any record validations prmParam.Value = mlngConstraintId End Property Call Validate Case "[s_id]" Public Function Clone() As cConstraint ' Create a temporary querydef object prmParam.Value = mlngStepId strInsert = "insert into step_constraints " & _ ' Creates a copy of a given constraint "( constraint_id, step_id, version_no, " Case "[ver_no]" & _ prmParam.Value = mstrVersionNo Dim cConsClone As cConstraint " constraint_type, global_step_id, global_version_no, sequence_no ) " & _ Case "[cons_type]" On Error GoTo CloneErr " values ( [cons_id], [s_id], [ver_no], " prmParam.Value = mintConstraintType mstrSource = mstrModuleName & & _ "Clone" " [cons_type], [g_step_id], [g_ver_no], Case "[g_step_id]" " & _ prmParam.Value = mlngGlobalStepId Set cConsClone = New cConstraint " [seq_no] )" Set qy = Case "[g_ver_no]" ' Copy all the workspace properties to the mdbsConstraintDB.CreateQueryDef(gstrEmpt prmParam.Value = mstrGlobalVersionNo newly yString, strInsert) ' created workspace Case "[seq_no]" cConsClone.ConstraintId = ' Call a procedure to execute the Querydef prmParam.Value = mintSequenceNo mlngConstraintId object cConsClone.StepId = mlngStepId Call AssignParameters(qy) Case Else cConsClone.VersionNo = mstrVersionNo ' Write the parameter name that is faulty cConsClone.ConstraintType = qy.Execute dbFailOnError WriteError errInvalidParameter, mintConstraintType qy.Close mstrSource, _ cConsClone.GlobalStepId = prmParam.Name mlngGlobalStepId ' strInsert = "insert into step_constraints " & On Error GoTo 0 cConsClone.GlobalVersionNo = _ Err.Raise errInvalidParameter, mstrGlobalVersionNo ' "( constraint_id, step_id, version_no, " & mstrSource, _ cConsClone.SequenceNo = _ LoadResString(errInvalidParameter) mintSequenceNo ' " constraint_type, global_step_id, End Select cConsClone.WorkspaceId = global_version_no, sequence_no ) " & _ Next prmParam mlngWorkspaceId ' " values ( " & _ cConsClone.IndOperation = ' Str(mlngConstraintId) & ", " & Exit Sub mintOperation Str(mlngStepId) & ", " & _ ' mstrSQ & mstrVersionNo & mstrSQ & ", AssignParametersErr: ' And set the return value to the newly " & Str(mintConstraintType) & ", " & _ created constraint ' Str(mlngGlobalStepId) & ", " & mstrSQ mstrSource = mstrModuleName & Set Clone = cConsClone & mstrGlobalVersionNo & mstrSQ & ", " & _ "AssignParameters" ' Str(mintSequenceNo) & " ) " Call LogErrors(Errors) Exit Function ' On Error GoTo 0 ' BugMessage strInsert Err.Raise vbObjectError + CloneErr: ' mdbsConstraintDB.Execute strInsert, errAssignParametersFailed, _ LogErrors Errors dbFailOnError mstrSource, mstrSource = mstrModuleName & Exit Sub LoadResString(errAssignParametersFailed) "Clone" HP TPC-H FULL DISCLOSURE REPORT 307 © 2005 Hewlett-Packard Company. All rights reserved. End Sub " where constraint_id = [cons_id]" & _ Call AssignParameters(qy) Public Property Get NextIdentifier() As " and step_id = [s_id] " & _ qy.Execute dbFailOnError Long " and version_no = [ver_no] " Set qy = qy.Close Dim lngNextId As Long mdbsConstraintDB.CreateQueryDef(gstrEmpt yString, strDelete) ' strUpdate = "Update step_constraints " & _ On Error GoTo NextIdentifierErr ' " set sequence_no = " & Call AssignParameters(qy) Str(mintSequenceNo) & _ ' First check if the database object is valid qy.Execute dbFailOnError ' " where constraint_id = " & Call CheckDB Str(mlngConstraintId) & _ qy.Close ' " and step_id = " & Str(mlngStepId) & _ ' Retrieve the next constraint identifier ' " and version_no = " & mstrSQ & using the ' strDelete = "Delete from step_constraints " mstrVersionNo & mstrSQ ' sequence class & _ ' Set mConstraintSeq = New cSequence ' " where constraint_id = " & ' 'BugMessage strUpdate Set mConstraintSeq.IdDatabase = Str(mlngConstraintId) & _ ' mdbsConstraintDB.Execute strUpdate, mdbsConstraintDB ' " and step_id = " & Str(mlngStepId) & dbFailOnError mConstraintSeq.IdentifierColumn = _ Exit Sub "c onstraint_id" ' " and version_no = " & mstrSQ & lngNextId = mConstraintSeq.Identifier mstrVersionNo & mstrSQ Modify: Set mConstraintSeq = Nothing ' LogErrors Errors ' 'BugMessage strDelete mstrSource = mstrModuleName & "Modify" NextIdentifier = lngNextId ' mdbsConstraintDB.Execute strDelete, On Error GoTo 0 Exit Property dbFailOnError Err.Raise vbObjectError + errUpdateConstraintFailed, _ NextIdentifierErr: Exit Sub mstrSource, _ LogErrors Errors LoadResString(errUpdateConstraintFailed) mstrSource = mstrModuleName & DeleteErr: End Sub "NextIdentifier" LogErrors Errors Public Property Get Position() As Long On Error GoTo 0 mstrSource = mstrModuleName & "Delete" Err.Raise vbObjectError + On Error GoTo 0 Position = mlngPosition errStepIdGetFailed, _ Err.Raise vbObjectError + mstrSource, errDeleteConstraintFailed, _ End Property LoadResString(errStepIdGetFailed) mstrSource, _ Public Property Let Position(ByVal RHS As Long)

End Property LoadResString(errDeleteConstraintFailed) mlngPosition = RHS End Sub Private Sub CheckDB() Public Sub Modify() End Property ' Check if the database object has been ' Updates the sequence no of the step initialized constraint record Public Sub Validate() ' in the database ' Each distinct object will have a Validate method If mdbsConstraintDB Is Nothing Then which ShowError errInvalidDB Dim strUpdate As String ' will check if the class properties are valid. This On Error GoTo 0 Dim qy As QueryDef method Err.Raise vbObjectError + ' will be used to check interdependant properties errInvalidDB, _ On Error GoTo Modify that mstrModuleName, ' cannot be validated by the let procedures. LoadResString(errInvalidDB) ' First check if the database object is valid ' It should be called by the add and modify End If Call CheckDB methods of the class

End Sub ' Any record validations ' No validations are necessary for the constraint Call Validate object Public Sub Delete() ' Deletes the step constraint record from ' There can be multiple constraints for a step, End Sub the database ' meaning that there can be multiple constraint records Public Property Set NodeDB(vdata As Database) Dim strDelete As String ' with the same constraint_id. Only a Dim qy As DAO.QueryDef combination Set mdbsConstraintDB = vdata ' of the step_id, version and constraint_id On Error GoTo DeleteErr will be End Property mstrSource = mstrModuleName & ' unique "Delete" ' Create a temporary querydef object with Public Property Get NodeDB() As Database the modify string ' There can be multiple constraints for a strUpdate = "Update step_constraints " & _ Set NodeDB = mdbsConstraintDB step, " set sequence_no = [seq_no] " & _ ' meaning that there can be multiple " where constraint_id = [cons_id] " & _ End Property constraint records " and step_id = [s_id] " & _ ' with the same constraint_id. Only a " and version_no = [ver_no] " Public Property Get GlobalVersionNo() As String combination Set qy = ' of the step_id, version and constraint_id mdbsConstraintDB.CreateQueryDef(gstrEmpt GlobalVersionNo = mstrGlobalVersionNo will be yString, strUpdate) ' unique End Property strDelete = "delete from step_constraints ' Call a procedure to assign the parameter " & _ values to the Public Property Let GlobalVersionNo(ByVal vdata ' querydef object As String) HP TPC-H FULL DISCLOSURE REPORT 308 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Let GlobalStepId(ByVal vdata Private Sub Class_Initialize() mstrGlobalVersionNo = vdata As Long) ' Initialize the operation indicator variable to End Property On Error GoTo GlobalStepIdErr Query mstrSource = mstrModuleName & ' It will be modified later by the collection class Public Property Get GlobalStepId() As Long "GlobalStepId" when ' inserts, updates or deletes are performed GlobalStepId = mlngGlobalStepId If (vdata > 0) Then mintOperation = QueryOp mlngGlobalStepId = vdata End Property Else End Sub ' Propogate this error back to the caller Public Property Get ConstraintId() As Long On Error GoTo 0 Err.Raise vbObjectError + VERSION 1.0 CLASS ConstraintId = mlngConstraintId errGlobalStepIdInvalid, _ BEGIN mstrSource, MultiUse = -1 'True End Property LoadResString(errGlobalStepIdInvalid) END End If Attribute VB_Name = "cFailedStep" Public Property Get VersionNo() As String Attribute VB_GlobalNameSpace = False Exit Property Attribute VB_Creatable = True VersionNo = mstrVersionNo Attribute VB_PredeclaredId = False GlobalStepIdErr: Attribute VB_Exposed = False End Property LogErrors Errors ' FILE: cFailedStep.cls mstrSource = mstrModuleName & ' Microsoft TPC-H Kit Ver. 1.00 Public Property Get StepId() As Long "GlobalStepId" ' Copyright Microsoft, 1999 On Error GoTo 0 ' All Rights Reserved StepId = mlngStepId Err.Raise vbObjectError + ' errGlobalStepIdSetFailed, _ ' End Property mstrSource, ' PURPOSE: Properties of a step execution LoadResString(errGlobalStepIdSetFailed) failure. Public Property Let VersionNo(ByVal vdata ' Contact: Reshma Tharamal As String) End Property ([email protected]) ' mstrVersionNo = vdata Public Property Let ConstraintType(ByVal Option Explicit vdata As ConstraintType) End Property Public InstanceId As Long On Error GoTo ConstraintTypeErr Public StepId As Long Public Property Let StepId(ByVal vdata As Public ParentStepId As Long Long) ' A global step can be either a pre- or a post- Public ContCriteria As ContinuationCriteria execution step. Public EndTime As Currency mlngStepId = vdata ' These constants have been defined in the Public AskResponse As Long enumeration, VERSION 1.0 CLASS End Property ' ConstraintType, which is exposed BEGIN Select Case vdata MultiUse = -1 'True Public Property Let ConstraintId(ByVal Case gintPreStep, gintPostStep END vdata As Long) mintConstraintType = vdata Attribute VB_Name = "cFailedSteps" On Error GoTo ConstraintIdErr Attribute VB_GlobalNameSpace = False mstrSource = mstrModuleName & Case Else Attribute VB_Creatable = True "ConstraintId" On Error GoTo 0 Attribute VB_PredeclaredId = False Err.Raise vbObjectError + Attribute VB_Exposed = False If (vdata > 0) Then errConstraintTypeInvalid, _ ' FILE: cFailedSteps.cls mlngConstraintId = vdata mstrSource, ' Microsoft TPC-H Kit Ver. 1.00 Else LoadResString(errConstraintTypeInvalid) ' Copyright Microsoft, 1999 ' Propogate this error back to the caller End Select ' All Rights Reserved On Error GoTo 0 ' Err.Raise vbObjectError + Exit Property ' errConstraintIdInvalid, _ ' PURPOSE: This module encapsulates a mstrSource, ConstraintTypeErr: collection of failed steps. It LoadResString(errConstraintIdInvalid) LogErrors Errors ' also determines whether sub-steps of a End If mstrSource = mstrModuleName & passed in step need "ConstraintType" ' to be skipped due to a failure. Exit Property On Error GoTo 0 ' Contact: Reshma Tharamal Err.Raise vbObjectError + ([email protected]) ConstraintIdErr: errConstraintTypeLetFailed, _ ' LogErrors Errors mstrSource, Option Explicit mstrSource = mstrModuleName & LoadResString(errConstraintTypeLetFailed) "ConstraintId" Private mcFailedSteps As cVector On Error GoTo 0 End Property Public Function ExecuteSubStep(lParentStepId As Err.Raise vbObjectError + Long) As Boolean errConstraintIdSetFailed, _ Public Property Get ConstraintType() As ' Returns False if there is any condition that mstrSource, ConstraintType prevents sub-steps of the passed LoadResString(errConstraintIdSetFailed) ' in instance from being executed ConstraintType = mintConstraintType Dim lIndex As Long End Property End Property ExecuteSubStep = True

HP TPC-H FULL DISCLOSURE REPORT 309 © 2005 Hewlett-Packard Company. All rights reserved. For lIndex = 0 To Count() - 1 For lIndex = 0 To Count() - 1 Set NodeDB = mdbsNodeDb If mcFailedSteps(lIndex).ContCriteria If mcFailedSteps(lIndex).StepId = lStepId = gintOnFailureCompleteSiblings And _ Then End Property lParentStepId <> StepFailed = True Public Property Get Position() As Long mcFailedSteps(lIndex).ParentStepId Then Exit For ExecuteSubStep = False End If Position = mlngPosition Exit For Next lIndex End If End Property End Function Public Property Let Position(ByVal vdata As Long) If mcFailedSteps(lIndex).ContCriteria = gintOnFailureAbortSiblings And _ Private Sub Class_Initialize() mlngPosition = vdata lParentStepId = mcFailedSteps(lIndex).ParentStepId Then Set mcFailedSteps = New cVector End Property ExecuteSubStep = False Exit For End Sub Public Property Get FileHandle() As Integer End If Private Sub Class_Terminate() FileHandle = mintFileHandle If mcFailedSteps(lIndex).ContCriteria = gintOnFailureSkipSiblings And _ Set mcFailedSteps = Nothing End Property lParentStepId = mcFailedSteps(lIndex).ParentStepId Then End Sub VERSION 1.0 CLASS ExecuteSubStep = False VERSION 1.0 CLASS BEGIN Exit For BEGIN MultiUse = -1 'True End If MultiUse = -1 'True END END Attribute VB_Name = "cFileSM" If mcFailedSteps(lIndex).ContCriteria Attribute VB_Name = "cFileInfo" Attribute VB_GlobalNameSpace = False = gintOnFailureAbort Then Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True ExecuteSubStep = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Exit For Attribute VB_PredeclaredId = False Attribute VB_Exposed = False End If Attribute VB_Exposed = False Attribute VB_Ext_KEY = ' FILE: cFileInfo.cls "SavedWithClassBuilder" ,"Yes" Next lIndex ' Microsoft TPC-H Kit Ver. 1.00 Attribute VB_Ext_KEY = "Top_Level" ,"Yes" ' Copyright Microsoft, 1999 ' FILE: cFileSM.cls End Function ' All Rights Reserved ' Microsoft TPC-H Kit Ver. 1.00 Public Sub Add(ByVal objItem As ' ' Copyright Microsoft, 1999 cFailedStep) ' ' All Rights Reserved ' PURPOSE: File Properties viz. name, ' mcFailedSteps.Add objItem handle, etc. ' ' Contact: Reshma Tharamal ' PURPOSE: Encapsulates functions to open a End Sub ([email protected]) file and write to it. Public Function Delete(ByVal lPosition As ' ' Contact: Reshma Tharamal Long) As cFailedStep Option Explicit ([email protected]) ' Set Delete = Private mstrFileName As String Option Explicit mcFailedSteps.Delete(lPosition) Private mintFileHandle As Integer Private mdbsNodeDb As Database ' Since it is ' Used to indicate the source module name when End Function used to form a cNodeCollection errors Private mlngPosition As Long ' Since it is used ' are raised by this class Public Sub Clear() to form a cNodeCollection Private Const mstrModuleName As String = Public Property Get FileName() As String "c FileSM." mcFailedSteps.Clear Private mstrSource As String FileName = mstrFileName End Sub Private mstrFileName As String Public Function Count() As Long End Property Private mintHFile As Integer Public Property Let FileName(ByVal vdata As Private mstrFileHeader As String Count = mcFailedSteps.Count String) Private mstrProjectName As String

End Function mstrFileName = vdata Public Sub CloseFile() Public Property Get Item(ByVal Position As Long) As cFailedStep End Property ' Close the file Attribute Item.VB_UserMemId = 0 Public Property Let FileHandle(ByVal vdata If mintHFile > 0 Then As Integer) Call CloseFileSM(mstrFileName) Set Item = mcFailedSteps.Item(Position) mintHFile = 0 mintFileHandle = vdata End If End Property End Property End Sub Public Function StepFailed(lStepId As Public Property Set NodeDB(vdata As Long) As Boolean Database) Public Property Let ProjectName(ByVal vdata As String) ' Returns True if a failure record already Set mdbsNodeDb = vdata ' An optional field - will be appended to the file exists for the passed in step ' header string if specified Dim lIndex As Long End Property Const strProjectHdr As String = "Project Name:" StepFailed = False Public Property Get NodeDB() As Database mstrProjectName = vdata HP TPC-H FULL DISCLOSURE REPORT 310 © 2005 Hewlett-Packard Company. All rights reserved. mstrFileHeader = mstrFileHeader & _ End If ' Space$(1) & strProjectHdr & End If ' Space$(1) & _ End If ' PURPOSE: Encapsulates the properties and gstrSQ & vdata & gstrSQ End If methods of a global step. ' Implements the cStep class - carries out End Property If mintHFile <> 0 Then initializations Public Property Get ProjectName() As If strMsg = gstrEmptyString Then ' and validations that are specific to global String Print #mintHFile, steps. Else ' Contact: Reshma Tharamal ProjectName = mstrProjectName If blnContinue Then ([email protected]) ' Write the message to the file - ' End Property continue Option Explicit Public Property Get FileName() As String ' all subsequent characters on the same line Implements cStep FileName = mstrFileName Print #mintHFile, strMsg; Else ' Object variable to keep the reference in End Property ' Write the message to the file Private mcStep As cStep Public Property Let FileName(ByVal vdata Print #mintHFile, strMsg As String) End If ' Used to indicate the source module name when End If errors mstrFileName = vdata Else ' are raised by this class ' Display the string to the user instead of Private mstrSource As String End Property ' trying to write it to the file Private Const mstrModuleName As String = Public Sub WriteLine(strMsg As String) ' This could be the project error log that "c GlobalStep." we were ' Writes the passed in string to the file ' trying to open! Play it safe and display Private Sub cStep_AddAllIterators() Call WriteToFile(strMsg, False) errors - do ' not try to log them. Call mcStep.AddAllIterators End Sub MsgBox strMsg, vbOKOnly End If End Sub Public Sub WriteField(strMsg As String) Exit Sub Private Sub cStep_AddIterator(cItRecord As ' Writes the passed in string to the file cIterator) Call WriteToFile(strMsg, True) WriteToFileErr: ' Log the error code raised by Visual Basic Call mcStep.AddIterator(cItRecord) End Sub Call DisplayErrors(Errors) End Sub Private Sub WriteToFile(strMsg As String, _ ' Display the string to the user instead of blnContinue As Boolean) ' trying to write it to the file Private Property Let cStep_ArchivedFlag(ByVal ' Writes the passed in string to the file - MsgBox strMsg, vbOKOnly RHS As Boolean) the ' Continue flag indicates whether the next End Sub mcStep.ArchivedFlag = RHS line will Public Property Let FileHeader(ByVal vdata ' be continued on the same line or printed As String) End Property on a new one mstrFileHeader = vdata Private Property Get cStep_ArchivedFlag() As On Error GoTo WriteToFileErr Boolean End Property ' Open the file if it hasn't been already Public Property Get FileHeader() As String cStep_ArchivedFlag = mcStep.ArchivedFlag If mintHFile = 0 Then FileHeader = mstrFileHeader End Property ' If the filename has not been initialized, do not End Property Private Sub Class_Initialize() ' attempt to open it If mstrFileName <> gstrEmptyString Private Sub Class_Terminate() ' Create the object Then Set mcStep = New cStep ' Close the file opened by this instance mintHFile = Call CloseFile ' Initialize the object with valid values for a OpenFileSM(mstrFileName) global step End Sub ' The global flag should be the first field to be If mintHFile = 0 Then initialized ' The Open File command failed ' since subsequent validations might try to check for some reason VERSION 1.0 CLASS if the ' No point in trying to write the BEGIN ' step being created is global file header MultiUse = -1 'True mcStep.GlobalFlag = True Else END mcStep.StepType = gintGlobalStep ' Print a file header, if a header Attribute VB_Name = "cGlobalStep" string has been Attribute VB_GlobalNameSpace = False ' A global step cannot have any sub-steps ' initialized Attribute VB_Creatable = True associated with it If mstrFileHeader <> Attribute VB_PredeclaredId = False ' Hence, it will always be at Step Level 0 gstrEmptyString Then Attribute VB_Exposed = False mcStep.ParentStepId = 0 Print #mintHFile, ' FILE: cGlobalStep.cls mcStep.ParentVersionNo = gstrMinVersion Print #mintHFile, ' Microsoft TPC-H Kit Ver. 1.00 mcStep.StepLevel = 0 mstrFileHeader ' Copyright Microsoft, 1999 Print #mintHFile, ' All Rights Reserved HP TPC-H FULL DISCLOSURE REPORT 311 © 2005 Hewlett-Packard Company. All rights reserved. ' The enabled flag must be False for all ' global step Private Property Get cStep_ErrorFile() As String global steps mcStep.ContinuationCriteria = 0 ' Global steps can be of two types cStep_ErrorFile = mcStep.ErrorFile ' a. Those that are run globally within a End Property workspace either End Property ' before every step, after every step or Private Property Let during the entire cStep_DegreeParallelism(ByVal RHS As Private Property Let ' run, depending on the global run String) cStep_ExecutionMechanism(ByVal RHS As method ExecutionMethod) ' b. Those that are not run globally, but ' Will always be zero for a global step qualify to be either mcStep.DegreeParallelism = ' Whether or not the Execution Mechanism is ' pre or post-execution steps for other gstrGlobalParallelism valid will be steps in the workspace. ' checked by the Step class ' Whether or not such a step will be End Property mcStep.ExecutionMechanism = RHS executed depends on ' whether the step for which it is defined Private Property Get End Property as a pre/post cStep_DegreeParallelism() As String ' step will be executed Private Property Get cStep_ExecutionMechanism() mcStep.EnabledFlag = False cStep_DegreeParallelism = As ExecutionMethod mcStep.DegreeParallelism mcStep.ContinuationCriteria = cStep_ExecutionMechanism = gintNoOption End Property mcStep.ExecutionMechanism mcStep.DegreeParallelism = gstrGlobalParallelism Private Sub cStep_DeleteIterator(cItRecord As End Property cIterator) End Sub Private Property Let cStep_FailureDetails(ByVal Private Sub Class_Terminate() Call mcStep.DeleteIterator(cItRecord) RHS As String)

' Remove the step object End Sub ' Whether or not the Failure Details are valid for Set mcStep = Nothing the Private Sub cStep_Delete() ' selected failure criteria will be checked by the End Sub Step class mcStep.Delete mcStep.FailureDetails = RHS Private Sub cStep_Add() End Sub End Property ' Call a private procedure to see if the step text has been Private Property Get cStep_EnabledFlag() As Private Property Get cStep_FailureDetails() As ' entered - since a global step actually Boolean String executes a step, entry ' of the text is mandatory cStep_EnabledFlag = mcStep.EnabledFlag cStep_FailureDetails = mcStep.FailureDetails Call StepTextOrFileEntered End Property End Property ' Call the Add method of the step class to carry out the insert Private Property Let Private Property Get cStep_GlobalFlag() As mcStep.Add cStep_EnabledFlag(ByVal RHS As Boolean) Boolean

End Sub ' The enabled flag must be False for all cStep_GlobalFlag = mcStep.GlobalFlag global steps Private Function cStep_Clone(Optional ' Global steps can be of two types End Property cCloneStep As cStep) As cStep ' a. Those that are run globally within a workspace either Private Property Let cStep_GlobalFlag(ByVal RHS Dim cNewGlobal As cGlobalStep ' before every step, after every step or As Boolean) during the entire Set cNewGlobal = New cGlobalStep ' run, depending on the global run method ' Set the global flag to true Set cStep_Clone = ' b. Those that are not run globally, but mcStep.GlobalFlag = True mcStep.Clone(cNewGlobal) qualify to be either ' pre or post-execution steps for other steps End Property End Function in the workspace. ' Whether or not such a step will be Private Function cStep_IncVersionX() As String executed depends on Private Property Get ' whether the step for which it is defined as cStep_IncVersionX = mcStep.IncVersionX cStep_ContinuationCriteria() As a pre/post ContinuationCriteria ' step will be executed End Function mcStep.EnabledFlag = False cStep_ContinuationCriteria = Private Function cStep_IncVersionY() As String mcStep.ContinuationCriteria End Property cStep_IncVersionY = mcStep.IncVersionY End Property Private Property Let cStep_ErrorFile(ByVal RHS As String) End Function Private Property Let cStep_ContinuationCriteria(ByVal RHS As mcStep.ErrorFile = RHS ContinuationCriteria) 'Private Property Let End Property cStep_GlobalRunMethod(ByVal RHS As Integer) ' The continuation criteria field will ' always be empty for a HP TPC-H FULL DISCLOSURE REPORT 312 © 2005 Hewlett-Packard Company. All rights reserved. ' ' Whether or not the Global Run Method Private Sub cStep_LoadIterator(cItRecord As End Property is valid for the step cIterator) ' ' will be checked by the Step class Private Property Get cStep_OutputFile() As String ' mcStep.GlobalRunMethod = RHS Call mcStep.LoadIterator(cItRecord) ' cStep_OutputFile = mcStep.OutputFile 'End Property End Sub ' End Property 'Private Property Get 'Private Property Let cStep_LogFile(ByVal cStep_GlobalRunMethod() As Integer RHS As String) Private Property Let cStep_ParentStepId(ByVal ' ' RHS As Long) ' cStep_GlobalRunMethod = ' mcStep.LogFile = RHS mcStep.GlobalRunMethod ' ' A global step cannot have any sub-steps ' 'End Property associated with it 'End Property ' ' Hence, the parent step id and parent version ' 'Private Property Get cStep_LogFile() As number will be zero Private Property Get cStep_IndOperation() String mcStep.ParentStepId = 0 As Operation ' ' cStep_LogFile = mcStep.LogFile End Property cStep_IndOperation = ' mcStep.IndOperation 'End Property Private Property Get cStep_ParentStepId() As Long

End Property Private Sub cStep_ModifyIterator(cItRecord cStep_ParentStepId = mcStep.ParentStepId As cIterator) Private Property Let End Property cStep_IndOperation(ByVal RHS As Call mcStep.ModifyIterator(cItRecord) Operation) Private Property Let cStep_ParentVersionNo(ByVal End Sub RHS As String) mcStep.IndOperation = RHS Private Sub cStep_Modify() ' A global step cannot have any sub-steps End Property associated with it ' Call a private procedure to see if the step ' Hence, the parent step id and parent version Private Sub cStep_InsertIterator(cItRecord text has been number will be zero As cIterator) ' entered - since a global step actually mcStep.ParentVersionNo = gstrMinVersion executes a step, Call mcStep.InsertIterator(cItRecord) ' entry of the text is mandatory End Property Call StepTextOrFileEntered End Sub Private Property Get cStep_ParentVersionNo() As ' Call the Modify method of the step class to String Private Function cStep_IsNewVersion() As carry out the update Boolean mcStep.Modify cStep_ParentVersionNo = cStep_IsNewVersion = mcStep.ParentVersionNo mcStep.IsNewVersion End Sub End Function End Property Private Property Get cStep_NextStepId() As Private Function cStep_IteratorCount() As Long Private Property Let cStep_Position(ByVal RHS As Long Long) cStep_NextStepId = mcStep.NextStepId cStep_IteratorCount = mcStep.Position = RHS mcStep.IteratorCount End Property End Property End Function Private Property Set cStep_NodeDB(RHS As DAO.Database) Private Property Get cStep_Position() As Long Private Property Let cStep_IteratorName(ByVal RHS As String) Set mcStep.NodeDB = RHS cStep_Position = mcStep.Position

mcStep.IteratorName = RHS End Property End Property

End Property Private Property Get cStep_NodeDB() As Private Sub cStep_RemoveIterator(cItRecord As DAO.Database cIterator) Private Property Get cStep_IteratorName() As String Set cStep_NodeDB = mcStep.NodeDB Call mcStep.RemoveIterator(cItRecord)

cStep_IteratorName = End Property End Sub mcStep.IteratorName Private Function cStep_OldVersionNo() As Private Sub cStep_SaveIterators() End Property String cStep_OldVersionNo = Call mcStep.SaveIterators Private Function cStep_Iterators() As mcStep.OldVersionNo Variant End Function End Sub

cStep_Iterators = mcStep.Iterators Private Property Let cStep_OutputFile(ByVal Private Property Let cStep_SequenceNo(ByVal RHS As String) RHS As Integer) End Function mcStep.OutputFile = RHS mcStep.SequenceNo = RHS

HP TPC-H FULL DISCLOSURE REPORT 313 © 2005 Hewlett-Packard Company. All rights reserved. End Property ShowError errStepLevelZeroForGlobal Private Property Get cStep_StepText() As On Error GoTo 0 Private Property Get cStep_SequenceNo() String Err.Raise vbObjectError + errValidateFailed, _ As Integer gstrSource, _ cStep_StepText = mcStep.StepText LoadResString(errValidateFailed) cStep_SequenceNo = End If mcStep.SequenceNo End Property If mcStep.EnabledFlag Then End Property Private Property Let ShowError errEnabledFlagFalseForGlobal cStep_StepTextFile(ByVal RHS As String) On Error GoTo 0 Private Property Let cStep_StepId(ByVal Err.Raise vbObjectError + errValidateFailed, _ RHS As Long) mcStep.StepTextFile = RHS gstrSource, _ LoadResString(errValidateFailed) mcStep.StepId = RHS End Property End If

End Property Private Property Get cStep_StepTextFile() As If mcStep.DegreeParallelism > 0 Then Private Property Get cStep_StepId() As String ShowError errDegParallelismNullForGlobal Long On Error GoTo 0 cStep_StepTextFile = mcStep.StepTextFile Err.Raise vbObjectError + errValidateFailed, _ cStep_StepId = mcStep.StepId gstrSource, _ End Property LoadResString(errValidateFailed) End Property End If Private Property Let cStep_StepType(RHS As gintStepType) If mcStep.ContinuationCriteria > 0 Then Private Property Let ShowError errContCriteriaNullForGlobal cStep_StepLabel(ByVal RHS As String) mcStep.StepType = gintGlobalStep On Error GoTo 0 Err.Raise vbObjectError + errValidateFailed, _ mcStep.StepLabel = RHS End Property gstrSource, _ LoadResString(errValidateFailed) End Property Private Property Get cStep_StepType() As End If gintStepType Private Property Get cStep_StepLabel() As mcStep.Validate String cStep_StepType = mcStep.StepType Exit Sub cStep_StepLabel = mcStep.StepLabel End Property cStep_ValidateErr: End Property Private Sub cStep_UnloadIterators() LogErrors Errors mstrSource = mstrModuleName & Private Property Let cStep_StartDir(ByVal Call mcStep.UnloadIterators "c Step_Validate" RHS As String) On Error GoTo 0 End Sub Err.Raise vbObjectError + errValidateFailed, _ mcStep.StartDir = RHS mstrSource, _ Private Sub cStep_UpdateIterator(cItRecord LoadResString(errValidateFailed) End Property As cIterator) End Sub Private Sub StepTextOrFileEntered() Private Property Get cStep_StartDir() As Call mcStep.UpdateIterator(cItRecord) ' Checks if either the step text or the name of the String file containing End Sub ' the text has been entered cStep_StartDir = mcStep.StartDir ' If both of them are null or both of them are not Private Sub cStep_UpdateIteratorVersion() null, End Property ' the global step is invalid and an error is raised Call mcStep.UpdateIteratorVersion Private Property Let If StringEmpty(mcStep.StepText) And cStep_StepLevel(ByVal RHS As Integer) End Sub StringEmpty(mcStep.StepTextFile) Then ShowError errStepTextAndFileNull ' A global step cannot have any sub-steps Private Sub cStep_Validate() On Error GoTo 0 associated with it ' The validate routines for each of the steps Err.Raise vbObjectError + ' Hence, it will always be at step level 0 will errStepTextAndFileNull, _ mcStep.StepLevel = 0 ' carry out the specific validations for the mstrSource, type and LoadResString(errStepTextAndFileNull) End Property ' call the generic validation routine ElseIf Not StringEmpty(mcStep.StepText) And Not StringEmpty(mcStep.StepTextFile) Then Private Property Get cStep_StepLevel() As On Error GoTo cStep_ValidateErr ShowError errStepTextOrFile Integer mstrSource = mstrModuleName & On Error GoTo 0 "c Step_Validate" Err.Raise vbObjectError + errStepTextOrFile, cStep_StepLevel = mcStep.StepLevel _ ' Validations specific to global steps mstrSource, End Property LoadResString(errStepTextOrFile) ' Check if the step text or a file name has End If Private Property Let cStep_StepText(ByVal been RHS As String) ' specified End Sub Call StepTextOrFileEntered mcStep.StepText = RHS Private Property Let cStep_VersionNo(ByVal RHS ' The step level must be zero for all globals As String) End Property If mcStep.StepLevel <> 0 Then HP TPC-H FULL DISCLOSURE REPORT 314 © 2005 Hewlett-Packard Company. All rights reserved. mcStep.VersionNo = RHS ValidForIteration = ' A collection of all the sub-steps for this step (cSubStepRec.LastIterator.Sequence = _ End Property Private mcSubSteps As cSubSteps gintMinIteratorSequence) Public Sub UpdateStartTime(lStepId As Long, Else Private Property Get cStep_VersionNo() As Optional ByVal StartTm As Currency = ValidForIteration = String gdtmEmpty, _ (cSubStepRec.LastIterator.Value = _ Optional ByVal EndTm As Currency = cStep_VersionNo = mcStep.VersionNo gdtmEmpty, _ cSubStepRec.LastIterator.RangeFrom) Optional ByVal Elapsed As Currency = 0) End If End Property ' We do not maintain start and end Else timestamps for the constraint ' Post-execution constraints will only be Private Property Let ' of a step. Hence we check if the process executed cStep_WorkspaceId(ByVal RHS As Long) that just started/ ' after the last iteration - check if there are ' terminated is the worker step that is being any mcStep.WorkspaceId = RHS executed. If so, ' pending iterations ' we update the start/end time and status on ValidForIteration = End Property the instance record. cSubStepRec.NextIteration(mcStep) Is Nothing End If Private Property Get cStep_WorkspaceId() BugAssert (StartTm <> gdtmEmpty) Or Else As Long (EndTm <> gdtmEmpty), "Mandatory ValidForIteration = True parameter missing." End If cStep_WorkspaceId = mcStep.WorkspaceId ' Make sure that we are executing the actual Exit Function step and not End Property ' a pre or post-execution constraint ValidForIterationErr: VERSION 1.0 CLASS If mcStep.StepId = lStepId Then ' Log the error code raised by Visual Basic BEGIN If StartTm <> 0 Then Call LogErrors(Errors) MultiUse = -1 'True StartTime = StartTm On Error GoTo 0 END mintStatus = gintRunning mstrSource = mstrModuleName & Attribute VB_Name = "cInstance" Else "ValidForIteration" Attribute VB_GlobalNameSpace = False EndTime = EndTm Err.Raise vbObjectError + Attribute VB_Creatable = True ElapsedTime = Elapsed errExecInstanceFailed, _ Attribute VB_PredeclaredId = False mintStatus = gintComplete mstrSource, Attribute VB_Exposed = False End If LoadResString(errExecInstanceFailed) ' FILE: cInstance.cls End If ' Microsoft TPC-H Kit Ver. 1.00 End Function ' Copyright Microsoft, 1999 End Sub ' All Rights Reserved Public Function Public Sub CreateSubStep(cSubStepDtls As cStep, ' ValidForIteration(cParentInstance As RunParams As cArrParameters) ' cInstance, _ ' PURPOSE: Encapsulates the properties ByVal intConsType As ConstraintType) Dim cNewSubStep As cSubStep and methods of an instance. As Boolean ' An instance is created when a step ' Returns true if the instance passed in is the On Error GoTo CreateSubStepErr is executed for a first or ' particular iterator value (if ' last iteration for the step, depending on the Set cNewSubStep = New cSubStep applicable) at 'run' time. constraint type ' Contains functions to determine if cNewSubStep.StepId = cSubStepDtls.StepId an instance is running, Dim cSubStepRec As cSubStep cNewSubStep.TasksComplete = 0 ' complete, and so on. Dim vntIterators As Variant cNewSubStep.TasksRunning = 0 ' Contact: Reshma Tharamal ([email protected]) On Error GoTo ValidForIterationErr ' Initialize the iterator for the instance ' Set cNewSubStep.LastIterator = New Option Explicit If cParentInstance Is Nothing Then cRunItDetails ' This will only be true for the dummy Call cNewSubStep.InitializeIt(cSubStepDtls, ' Used to indicate the source module name instance, which RunParams) when errors ' cannot have any iterators defined for it ' are raised by this class ValidForIteration = True ' Add add the substep to the collection Private Const mstrModuleName As String = Exit Function mcSubSteps.Add cNewSubStep "c Instance." End If Private mstrSource As String Set cNewSubStep = Nothing vnt Iterators = mcStep.Iterators Private mcStep As cStep Exit Sub Public Key As String ' Node key for the step If Not StringEmpty(mcStep.IteratorName) being executed And Not IsEmpty(vntIterators) Then CreateSubStepErr: Public InstanceId As Long ' Log the error code raised by Visual Basic Public ParentInstanceId As Long ' The Set cSubStepRec = Call LogErrors(Errors) parent instance cParentInstance.QuerySubStep(mcStep.StepId) On Error GoTo 0 Private mblnNoMoreToStart As Boolean mstrSource = mstrModuleName & Private mblnComplete As Boolean If intConsType = gintPreStep Then "CreateSubStep" Public StartTime As Currency ' Pre-execution constraints will only be Err.Raise vbObjectError + errProgramError, Public EndTime As Currency executed mstrSource, _ Public ElapsedTime As Currency ' before the first iteration LoadResString(errProgramError) Private mintStatus As InstanceStatus If Public DegreeParallelism As Integer cSubStepRec.LastIterator.IteratorType = End Sub Private mcIterators As cRunColIt gintValue Then HP TPC-H FULL DISCLOSURE REPORT 315 © 2005 Hewlett-Packard Company. All rights reserved. Public Function QuerySubStep(ByVal ' " = " & SubStepId As Long) As cSubStep On Error GoTo ChildExecutedErr mcSubSteps(lngIndex).TasksRunning ' Retrieves the sub-step record for the passed in sub-step id BugAssert mcStep.StepType = BugAssert gintManagerStep mcSubSteps(lngIndex).TasksRunning >= 0, _ Dim lngIndex As Long "Tasks running for " & For lngIndex = 0 To mcSubSteps.Count - 1 CStr(mlngStepId) & _ On Error GoTo QuerySubStepErr If mcSubSteps(lngIndex).StepId = " Instance Id " & InstanceId & " is less mlngStepId Then than 0." ' Find the sub-step node with the matching mcSubSteps(lngIndex).TasksRunning = Exit For step id _ End If For lngIndex = 0 To mcSubSteps.Count - Next lngIndex 1 mcSubSteps(lngIndex).TasksRunning + 1 If mcSubSteps(lngIndex).StepId = ' BugMessage "Tasks Running for Step If lngIndex > mcSubSteps.Count - 1 Then SubStepId Then Id : " & _ ' The child step wasn't found - raise an error Set QuerySubStep = ' On Error GoTo 0 mcSubSteps(lngIndex) CStr(mcSubSteps(lngIndex).StepId) & _ Err.Raise errInvalidChild, mstrModuleName & Exit For ' " Instance Id: " & InstanceId & _ "ChildTerminated", _ End If ' " = " & LoadResString(errInvalidChild) Next lngIndex mcSubSteps(lngIndex).TasksRunning End If Exit For Exit Function End If Exit Sub Next lngIndex QuerySubStepErr: ChildTerminatedErr: ' Log the error code raised by Visual If lngIndex > mcSubSteps.Count - 1 Then ' Log the error code raised by Visual Basic Basic ' The child step wasn't found - raise an Call LogErrors(Errors) Call LogErrors(Errors) error On Error GoTo 0 On Error GoTo 0 On Error GoTo 0 mstrSource = mstrModuleName & mstrSource = mstrModuleName & Err.Raise vbObjectError + "ChildTerminated" "QuerySubStep" errInvalidChild, mstrModuleName, _ Err.Raise vbObjectError + errInstanceOpFailed, Err.Raise vbObjectError + LoadResString(errInvalidChild) mstrSource, _ errNavInstancesFailed, _ End If LoadResString(errInstanceOpFailed) mstrSource, LoadResString(errNavInstancesFailed) Exit Sub End Sub Public Sub ChildCompleted(mlngStepId As Long) End Function ChildExecutedErr: ' This procedure is called when any a sub-step Public Property Let AllStarted(ByVal vdata ' Log the error code raised by Visual Basic completes As Boolean) Call LogErrors(Errors) ' execution. Note: The TasksComplete field will On Error GoTo 0 be 'bugmessage "Set All Started to " & vData Err.Raise vbObjectError + ' incremented. & " for : " & _ errInstanceOpFailed, mstrModuleName & Dim lngIndex As Long mstrKey "ChildExecuted", _ LoadResString(errInstanceOpFailed) On Error GoTo ChildCompletedErr mblnNoMoreToStart = vdata End Sub BugAssert mcStep.StepType = gintManagerStep End Property Public Sub ChildTerminated(mlngStepId As Public Property Get AllStarted() As Boolean Long) For lngIndex = 0 To mcSubSteps.Count - 1 ' This procedure is called when any sub-step BugAssert AllStarted = mblnNoMoreToStart process mcSubSteps(lngIndex).TasksComplete >= 0, _ ' terminates. Note: The TasksComplete field "Tasks complete for " & End Property will be CStr(mcSubSteps(lngIndex).StepId) & _ Public Property Let AllComplete(ByVal ' updated only when all the instances for a " Instance Id " & InstanceId & " is less vdata As Boolean) sub-step than 0." ' complete execution. 'bugmessage "Set All Complete to " & Dim lngIndex As Long If mcSubSteps(lngIndex).StepId = mlngStepId vD ata & " for : " & _ Then mstrKey On Error GoTo ChildTerminatedErr mcSubSteps(lngIndex).TasksComplete = _ mcSubSteps(lngIndex).TasksComplete mblnComplete = vdata BugAssert mcStep.StepType = + 1 gintManagerStep ' BugMessage "Tasks Complete for Step Id : End Property " & _ For lngIndex = 0 To mcSubSteps.Count - 1 ' CStr(mcSubSteps(lngIndex).StepId) & Public Property Get AllComplete() As _ Boolean If mcSubSteps(lngIndex).StepId = ' " Instance Id: " & InstanceId & _ mlngStepId Then ' " = " & AllComplete = mblnComplete mcSubSteps(lngIndex).TasksRunning = mcSubSteps(lngIndex).TasksComplete _ Exit For End Property End If mcSubSteps(lngIndex).TasksRunning - 1 Next lngIndex Public Sub ChildExecuted(mlngStepId As ' BugMessage "Tasks Running for Step Long) Id : " & _ If lngIndex > mcSubSteps.Count - 1 Then ' This procedure is called when a sub-step ' ' The child step wasn't found - raise an error executes. CStr(mcSubSteps(lngIndex).StepId) & _ On Error GoTo 0 ' " Instance Id: " & InstanceId & _ Err.Raise errInvalidChild, mstrModuleName, _ Dim lngIndex As Long LoadResString(errInvalidChild) HP TPC-H FULL DISCLOSURE REPORT 316 © 2005 Hewlett-Packard Company. All rights reserved. End If If mcStep.StepType <> gintManagerStep ' has a degree of parallelism greater than the Then total Exit Sub On Error GoTo 0 ' number of sub-steps available to execute mstrSource = mstrModuleName & IsPending = False ChildCompletedErr: "RaiseErrForWorker" End If ' Log the error code raised by Visual Err.Raise vbObjectError + Basic errInvalidForWorker, _ End Property Call LogErrors(Errors) mstrSource, _ Public Property Get IsRunning() As Boolean On Error GoTo 0 LoadResString(errInvalidForWorker) ' Returns true if the any one of the substeps is still Err.Raise vbObjectError + End If ' executing errInstanceOpFailed, mstrModuleName & Dim lngIndex As Long "ChildCompleted", _ End Sub LoadResString(errInstanceOpFailed) Call RaiseErrForWorker Public Property Get Step() As cStep End Sub IsRunning = False Public Sub ChildDeleted(mlngStepId As Set Step = mcStep Long) ' If a substep has no currently executing tasks and ' This procedure is called when a sub-step End Property ' the tasks completed is greater than zero, then we needs to be re-executed Public Property Get Iterators() As cRunColIt can ' Note: The TasksComplete field is ' assume that it has completed execution decremented. We needn't worry about Set Iterators = mcIterators (otherwise we ' the TasksRunning field since no steps ' would've run a new task the moment one are currently running. End Property completed!) Dim lngIndex As Long Public Property Get SubSteps() As cSubSteps For lngIndex = 0 To mcSubSteps.Count - 1 If mcSubSteps(lngIndex).TasksRunning > 0 On Error GoTo ChildDeletedErr Call RaiseErrForWorker Then IsRunning = True BugAssert mcStep.StepType = Set SubSteps = mcSubSteps Exit For gintManagerStep End If End Property Next lngIndex For lngIndex = 0 To mcSubSteps.Count - Public Property Set Step(cRunStep As cStep) 1 End Property Set mcStep = cRunStep Public Property Get TotalRunning() As Long If mcSubSteps(lngIndex).StepId = ' Returns the total number of substeps that are mlngStepId Then End Property executing Dim lngTotalProcesses As Long mcSubSteps(lngIndex).TasksRunning = _ Public Property Set Iterators(cIts As Dim lngIndex As Long cRunColIt) mcSubSteps(lngIndex).TasksRunning - 1 Call RaiseErrForWorker Set mcIterators = cIts BugAssert lngTotalProcesses = 0 mcSubSteps(lngIndex).TasksRunning >= 0, End Property For lngIndex = 0 To mcSubSteps.Count - 1 _ Public Property Get IsPending() As Boolean BugAssert "Tasks running for " & ' Returns true if the step has any substeps mcSubSteps(lngIndex).TasksRunning >= 0, _ CStr(mcSubSteps(lngIndex).StepId) & _ that need "Tasks running for " & " Instance Id " & InstanceId & " ' execution CStr(mcSubSteps(lngIndex).StepId) & _ is less than 0." Dim lngIndex As Long " is less than 0." Exit For Dim lngRunning As Long lngTotalProcesses = lngTotalProcesses + End If mcSubSteps(lngIndex).TasksRunning Next lngIndex Call RaiseErrForWorker Next lngIndex

If lngIndex > mcSubSteps.Count - 1 Then If Not mblnComplete And Not TotalRunning = lngTotalProcesses ' The child step wasn't found - raise an mblnNoMoreToStart Then End Property error ' Get a count of all the substeps that are Public Property Get RunningForStep(lngSubStepId On Error GoTo 0 already being As Long) As Long Err.Raise errInvalidChild, ' executed ' Returns the total number of instances of the mstrModuleName, _ lngRunning = 0 substep LoadResString(errInvalidChild) For lngIndex = 0 To mcSubSteps.Count - ' that are executing End If 1 Dim lngIndex As Long lngRunning = lngRunning + Exit Sub mcSubSteps(lngIndex).TasksRunning Call RaiseErrForWorker Next lngIndex ChildDeletedErr: For lngIndex = 0 To mcSubSteps.Count - 1 ' Log the error code raised by Visual IsPending = (lngRunning < BugAssert Basic DegreeParallelism) mcSubSteps(lngIndex).TasksRunning >= 0, _ Call LogErrors(Errors) Else "Tasks running for " & On Error GoTo 0 ' This should be sufficient to prove that CStr(mcSubSteps(lngIndex).StepId) & _ Err.Raise vbObjectError + there r no " is less than 0." errInstanceOpFailed, mstrModuleName & ' more sub-steps to be executed. "ChildDeleted", _ ' mblnComplete: Handles the case where If mcSubSteps(lngIndex).StepId = LoadResString(errInstanceOpFailed) all steps have lngSubStepId Then ' been executed RunningForStep = End Sub ' mblnNoMoreToStart: Handles the case mcSubSteps(lngIndex).TasksRunning Private Sub RaiseErrForWorker() where the step Exit For End If HP TPC-H FULL DISCLOSURE REPORT 317 © 2005 Hewlett-Packard Company. All rights reserved. Next lngIndex Private mcInstances As cVector ' calling procedure does not pass a manager step If lngIndex > mcSubSteps.Count - 1 Then Public Function QueryInstance(ByVal ' identifier, the procedure will error out. ' The child step wasn't found - raise an InstanceId As Long) As cInstance If mcInstances(lngIndex).IsPending Then error ' Retrieves the record for the passed in Set QueryPendingInstance = On Error GoTo 0 instance from mcInstances(lngIndex) Err.Raise errInvalidChild, mstrSource, ' the collection Exit For _ End If LoadResString(errInvalidChild) Dim lngIndex As Long End If End If Next lngIndex On Error GoTo QueryInstanceErr End Property Exit Function ' Check for valid values of the instance id Public Property Let Status(ByVal vdata As If InstanceId > 0 Then QueryPendingInstanceErr: InstanceStatus) ' Find the run node with the matching step ' Log the error code raised by Visual Basic id Call LogErrors(Errors) mintStatus = vdata For lngIndex = 0 To Count() - 1 On Error GoTo 0 If mcInstances(lngIndex).InstanceId = mstrSource = mstrModuleName & End Property InstanceId Then "QueryPendingInstance" Set QueryInstance = Err.Raise vbObjectError + errQueryFailed, _ Public Property Get Status() As mcInstances(lngIndex) mstrSource, LoadResString(errQueryFailed) InstanceStatus Exit For End If End Function Status = mintStatus Next lngIndex Public Function InstanceAborted(cSubStepRec As cSubStep) As Boolean End Property If lngIndex > mcInstances.Count - 1 Then Private Sub Class_Initialize() On Error GoTo 0 Dim lIndex As Long Err.Raise vbObjectError + Set mcSubSteps = New cSubSteps errQueryFailed, mstrSource, _ InstanceAborted = False LoadResString(errQueryFailed) mblnNoMoreToStart = False End If For lIndex = 0 To Count() - 1 mblnComplete = False Else If mcInstances(lIndex).Step.StepId = StartTime = gdtmEmpty On Error GoTo 0 cSubStepRec.StepId And _ EndTime = gdtmEmpty Err.Raise vbObjectError + mcInstances(lIndex).Status = gintAborted errQueryFailed, mstrSource, _ Then End Sub LoadResString(errQueryFailed) InstanceAborted = True End If Exit For Private Sub Class_Terminate() End If Exit Function Next lIndex mcSubSteps.Clear Set mcSubSteps = Nothing QueryInstanceErr: End Function ' Log the error code raised by Visual Basic Public Function End Sub Call LogErrors(Errors) CompletedInstanceExists(lParentInstance As Long, VERSION 1.0 CLASS On Error GoTo 0 _ BEGIN mstrSource = mstrModuleName & cSubStepDtls As cStep) As Boolean MultiUse = -1 'True "QueryInstance" ' Checks if there is a completed instance of the END Err.Raise vbObjectError + errQueryFailed, _ passed in step Attribute VB_Name = "cInstances" mstrSource, Attribute VB_GlobalNameSpace = False LoadResString(errQueryFailed) Dim lngIndex As Long Attribute VB_Creatable = True Attribute VB_PredeclaredId = False End Function CompletedInstanceExists = False Attribute VB_Exposed = False ' FILE: cInstances.cls Public Function QueryPendingInstance(ByVal If cSubStepDtls.StepType = gintManagerStep ' Microsoft TPC-H Kit Ver. 1.00 ParentInstanceId As Long, _ Then ' Copyright Microsoft, 1999 ByVal lngSubStepId As Long) As ' Find the run node with the matching step id ' All Rights Reserved cInstance For lngIndex = 0 To Count() - 1 ' ' Retrieves a pending instance for the passed If mcInstances(lngIndex).ParentInstanceId = ' in substep lParentInstance And _ ' PURPOSE: Implements a collection of ' and the given parent instance id. mcInstances(lngIndex).Step.StepId = cInstance objects. cSubStepDtls.StepId Then ' Type-safe wrapper around cVector. Dim lngIndex As Long ' Put in a separate if condition since the ' Also contains additional functions IsPending to query an instance, etc. On Error GoTo QueryPendingInstanceErr ' property is valid only for manager steps. ' Contact: Reshma Tharamal BugAssert (Not ([email protected]) ' Find the run node with the matching step id mcInstances(lngIndex).IsPending), "Pending ' For lngIndex = 0 To Count() - 1 instance exists!" Option Explicit If mcInstances(lngIndex).ParentInstanceId = ParentInstanceId And _ CompletedInstanceExists = True ' Used to indicate the source module name mcInstances(lngIndex).Step.StepId = Exit Function when errors lngSubStepId Then End If ' are raised by this class ' Put in a separate if condition since the Next lngIndex Private Const mstrModuleName As String = IsPending End If "c Instance." ' property is valid only for manager Private mstrSource As String steps. If the End Function Public Sub Add(ByVal objItem As cInstance) HP TPC-H FULL DISCLOSURE REPORT 318 © 2005 Hewlett-Packard Company. All rights reserved. ' FILE: cIterator.cls mstrSource, mcInstances.Add objItem ' Microsoft TPC-H Kit Ver. 1.00 LoadResString(errInvalidOperation) ' Copyright Microsoft, 1999 End Select End Sub ' All Rights Reserved ' Exit Property ' Public Sub Clear() ' PURPOSE: Encapsulates the properties IndOperationErr: and methods of an iterator. LogErrors Errors mcInstances.Clear ' Contains functions to insert, update mstrSource = mstrModuleName & and delete "IndOperation" End Sub ' iterator_values records from the On Error GoTo 0 database. Err.Raise vbObjectError + ' Contact: Reshma Tharamal errLetOperationFailed, _ Public Function Count() As Long ([email protected]) mstrSource, ' LoadResString(errLetOperationFailed) Count = mcInstances.Count Option Explicit End Property End Function Implements cNode Public Function Clone() As cIterator ' Module level variables to store the property Public Function Delete(ByVal lngDelete As values ' Creates a copy of a given Iterator Long) As cInstance Private mintType As Integer Private mintSequenceNo As Integer Dim cItClone As cIterator Set Delete = Private mstrValue As String mcInstances.Delete(lngDelete) Private mdbsIteratorDB As Database On Error GoTo CloneErr Private mintOperation As Integer End Function Private mlngPosition As Long Set cItClone = New cIterator

Private Const mstrModuleName As String = ' Copy all the iterator properties to the newly Public Property Set Item(Optional ByVal "c Iterator." ' created object Position As Long, _ Private mstrSource As String cItClone.IteratorType = mintType RHS As cInstance) cItClone.SequenceNo = mintSequenceNo Public Enum ValueType cItClone.IndOperation = mintOperation If Position = -1 Then gintFrom = 1 cItClone.Value = mstrValue Position = 0 gintTo End If gintStep ' And set the return value to the newly created Set mcInstances(Position) = RHS gintValue Iterator End Enum Set Clone = cItClone End Property Public Property Get Value() As String Exit Function Public Property Get Item(Optional ByVal Value = mstrValue Position As Long = -1) _ CloneErr: As cInstance End Property LogErrors Errors Attribute Item.VB_UserMemId = 0 Public Property Let Value(ByVal vdata As mstrSource = mstrModuleName & "Clone" String) On Error GoTo 0 If Position = -1 Then Err.Raise vbObjectError + errCloneFailed, _ Position = 0 mstrValue = vdata mstrSource, LoadResString(errCloneFailed) End If Set Item = mcInstances.Item(Position) End Property End Function Public Property Get SequenceNo() As Integer End Property Public Property Get IndOperation() As Operation SequenceNo = mintSequenceNo Private Sub Class_Initialize() IndOperation = mintOperation End Property Set mcInstances = New cVector End Property Public Property Let SequenceNo(ByVal vdata As End Sub Public Property Let IndOperation(ByVal vdata Integer) As Operation) mintSequenceNo = vdata End Property Private Sub Class_Terminate() On Error GoTo IndOperationErr mstrSource = mstrModuleName & Public Sub Add(ByVal lngStepId As Long, _ Set mcInstances = Nothing "IndOperation" strVersion As String) ' Inserts a new iterator values record into the End Sub ' The valid operations are define in the database cOperations ' class. Check if the operation is valid Dim strInsert As String VERSION 1.0 CLASS Select Case vdata Dim qy As DAO.QueryDef BEGIN Case QueryOp, InsertOp, UpdateOp, MultiUse = -1 'True DeleteOp On Error GoTo AddIteratorErr END mintOperation = vdata Attribute VB_Name = "cIterator" ' First check if the database object is valid Attribute VB_GlobalNameSpace = False Case Else Call CheckDB Attribute VB_Creatable = True On Error GoTo 0 Attribute VB_PredeclaredId = False Err.Raise vbObjectError + ' Create a temporary querydef object Attribute VB_Exposed = False errInvalidOperation, _ strInsert = "insert into iterator_values " & _ HP TPC-H FULL DISCLOSURE REPORT 319 © 2005 Hewlett-Packard Company. All rights reserved. "( step_id, version_no, type, " & _ prmParam.Name mstrSource = mstrModuleName & " iterator_value, sequence_no ) " & _ On Error GoTo 0 "DeleteIterator" " values ( [st_id], [ver_no], [it_typ], Err.Raise errInvalidParameter, On Error GoTo 0 " & _ mstrSource, _ Err.Raise vbObjectError + " [it_val], [seq_no] )" errDeleteIteratorFailed, _ Set qy = LoadResString(errInvalidParameter) mstrSource, _ mdbsIteratorDB.CreateQueryDef(gstrEmpty End Select LoadResString(errDeleteIteratorFailed) String, strInsert) Next prmParam End Sub Public Sub Update(ByVal lngStepId As Long, ' Call a procedure to execute the Querydef Exit Sub strVersion As String) object ' Updates the sequence no of the step iterator Call AssignParameters(qy, lngStepId, AssignParametersErr: record strVersion) ' in the database mstrSource = mstrModuleName & qy.Execute dbFailOnError "AssignParameters" Dim strUpdate As String qy.Close Call LogErrors(Errors) Dim qy As QueryDef On Error GoTo 0 Exit Sub Err.Raise vbObjectError + On Error GoTo UpdateErr errAssignParametersFailed, _ AddIteratorErr: mstrSource, ' First check if the database object is valid LogErrors Errors LoadResString(errAssignParametersFailed) Call CheckDB mstrSource = mstrModuleName & "AddIterator" End Sub If mintType = gintValue Then On Error GoTo 0 Private Sub CheckDB() ' If the iterator is of type value, only the Err.Raise vbObjectError + ' Check if the database object has been sequence of the values can get updated errInsertIteratorFailed, _ initialized strUpdate = "Update iterator_values " & _ mstrSource, _ " set sequence_no = [seq_no] " & _ If mdbsIteratorDB Is Nothing Then " where step_id = [st_id]" & _ LoadResString(errInsertIteratorFailed) ShowError errInvalidDB " and version_no = [ver_no]" & _ End Sub On Error GoTo 0 " and iterator_value = [it_val] " Err.Raise vbObjectError + errInvalidDB, Else Private Sub AssignParameters(qyExec As _ ' If the iterator is of type range, only the values DAO.QueryDef, _ mstrModuleName, can get updated ByVal lngStepId As Long, _ LoadResString(errInvalidDB) strUpdate = "Update iterator_values " & _ strVersion As String) End If " set iterator_value = [it_val] " & _ ' Assigns values to the parameters in the " where step_id = [st_id]" & _ querydef object End Sub " and version_no = [ver_no]" & _ ' The parameter names are cryptic to make " and type = [it_typ] " them different Public Sub Delete(ByVal lngStepId As Long, _ End If ' from the field names. When the strVersion As String) parameter names are ' Deletes the step iterator record from the Set qy = ' the same as the field names, parameters database mdbsIteratorDB.CreateQueryDef(gstrEmptyString, in the where strUpdate) ' clause do not get created. Dim strDelete As String Dim qy As DAO.QueryDef ' Call a procedure to assign the parameter values Dim prmParam As DAO.Parameter to the On Error GoTo DeleteIteratorErr ' querydef object On Error GoTo AssignParametersErr mstrSource = mstrModuleName & Call AssignParameters(qy, lngStepId, strVersion) mstrSource = mstrModuleName & "DeleteIterator" qy.Execute dbFailOnError "AssignParameters" ' There can be multiple iterators for a step. qy.Close For Each prmParam In ' However the values that an iterator for a qyExec.Parameters step can Exit Sub Select Case prmParam.Name ' assume will be unique, meaning that a Case "[st_id]" combination of UpdateErr: prmParam.Value = lngStepId ' the iterator_id and value will be unique. LogErrors Errors strDelete = "delete from iterator_values " & mstrSource = mstrModuleName & "Update" Case "[ver_no]" _ On Error GoTo 0 prmParam.Value = strVersion " where step_id = [st_id]" & _ Err.Raise vbObjectError + " and version_no = [ver_no]" & _ errUpdateConstraintFailed, _ Case "[it_typ]" " and iterator_value = [it_val] " mstrSource, _ prmParam.Value = mintType Set qy = LoadResString(errUpdateConstraintFailed) mdbsIteratorDB.CreateQueryDef(gstrEmptyStr Case "[it_val]" ing, strDelete) End Sub prmParam.Value = mstrValue Public Property Set NodeDB(vdata As Database) Call AssignParameters(qy, lngStepId, Case "[seq_no]" strVersion) Set mdbsIteratorDB = vdata prmParam.Value = qy.Execute dbFailOnError mintSequenceNo End Property qy.Close Case Else Public Property Get NodeDB() As Database ' Write the parameter name that is Exit Sub faulty Set NodeDB = mdbsIteratorDB WriteError errInvalidParameter, DeleteIteratorErr: mstrSource, _ LogErrors Errors End Property HP TPC-H FULL DISCLOSURE REPORT 320 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Get Position() As Long Private Property Let cNode_IndOperation(ByVal vdata As Private Sub cNode_Validate() Position = mlngPosition Operation) ' No validations necessary for the iterator class End Property On Error GoTo IndOperationErr Public Property Let Position(ByVal vdata mstrSource = mstrModuleName & End Sub As Long) "IndOperation"

mlngPosition = vdata ' The valid operations are define in the Private Property Let cNode_Value(ByVal vdata As cOperations String) End Property ' class. Check if the operation is valid Select Case vdata mstrValue = vdata Public Property Let IteratorType(ByVal Case QueryOp, InsertOp, UpdateOp, vdata As ValueType) DeleteOp End Property mintOperation = vdata On Error GoTo TypeErr Private Property Get cNode_Value() As String mstrSource = mstrModuleName & Case Else "Type" On Error GoTo 0 Value = mstrValue Err.Raise vbObjectError + ' These constants have been defined in the errInvalidOperation, _ End Property enumeration, mstrSource, VERSION 1.0 CLASS ' Type, which is exposed LoadResString(errInvalidOperation) BEGIN Select Case vdata End Select MultiUse = -1 'True Case gintFrom, gintTo, gintStep, END gintValue Exit Property Attribute VB_Name = "cManager" mintType = vdata Attribute VB_GlobalNameSpace = False IndOperationErr: Attribute VB_Creatable = True Case Else LogErrors Errors Attribute VB_PredeclaredId = False On Error GoTo 0 mstrSource = mstrModuleName & Attribute VB_Exposed = False Err.Raise vbObjectError + "IndOperation" ' FILE: cManager.cls errTypeInvalid, _ On Error GoTo 0 ' Microsoft TPC-H Kit Ver. 1.00 mstrSource, Err.Raise vbObjectError + ' Copyright Microsoft, 1999 LoadResString(errTypeInvalid) errLetOperationFailed, _ ' All Rights Reserved End Select mstrSource, ' LoadResString(errLetOperationFailed) ' Exit Property ' PURPOSE: Encapsulates the properties and End Property methods of a manager step. TypeErr: ' Implements the cStep class - carries out LogErrors Errors Private Property Get cNode_IndOperation() As initializations mstrSource = mstrModuleName & Operation ' and validations that are specific to "Type" manager steps. On Error GoTo 0 IndOperation = mintOperation ' Contact: Reshma Tharamal Err.Raise vbObjectError + ([email protected]) errTypeInvalid, _ End Property ' mstrSource, Option Explicit LoadResString(errTypeInvalid) Private Property Set cNode_NodeDB(RHS As DAO.Database) Implements cStep End Property Set mdbsIteratorDB = RHS ' Object variable to keep the step reference in Public Property Get IteratorType() As Private mcStep As cStep ValueType End Property ' Used to indicate the source module name when IteratorType = mintType Private Property Get cNode_NodeDB() As errors DAO.Database ' are raised by this class End Property Private mstrSource As String Public Sub Validate() Set cNode_NodeDB = mdbsIteratorDB Private Const mstrModuleName As String = "c Manager." ' No validations necessary for the iterator End Property Private Sub cStep_AddAllIterators() class Call mcStep.AddAllIterators End Sub Private Property Let cNode_Position(ByVal vdata As Long) End Sub Private Sub Class_Initialize() mlngPosition = vdata Private Property Let cStep_StartDir(ByVal RHS As ' Initialize the operation indicator variable String) to Query End Property ' It will be modified later by the collection mcStep.StartDir = RHS class when ' inserts, updates or deletes are performed Private Property Get cNode_Position() As End Property mintOperation = QueryOp Long Private Property Get cStep_StartDir() As String End Sub cNode_Position = mlngPosition cStep_StartDir = mcStep.StartDir End Property End Property HP TPC-H FULL DISCLOSURE REPORT 321 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cStep_Delete() Private Property Get cStep_IndOperation() As End Property Operation Call mcStep.Delete Private Sub cStep_SaveIterators() cStep_IndOperation = mcStep.IndOperation End Sub Call mcStep.SaveIterators End Property Private Property Set cStep_NodeDB(RHS As DAO.Database) End Sub Private Property Let cStep_IndOperation(ByVal Private Sub cStep_LoadIterator(cItRecord As RHS As Operation) Set mcStep.NodeDB = RHS cIterator) mcStep.IndOperation = RHS End Property Call mcStep.LoadIterator(cItRecord) End Property Private Function cStep_IncVersionY() As End Sub String Private Property Get cStep_NextStepId() As Long Private Property Let cStep_Position(ByVal cStep_IncVersionY = RHS As Long) cStep_NextStepId = mcStep.NextStepId mcStep.IncVersionY mcStep.Position = RHS End Property End Function Private Function cStep_IsNewVersion() As End Property Private Property Let cStep_OutputFile(ByVal RHS Boolean Private Sub cStep_InsertIterator(cItRecord As As String) cStep_IsNewVersion = cIterator) mcStep.IsNewVersion mcStep.OutputFile = RHS End Function Call mcStep.InsertIterator(cItRecord) Private Function cStep_OldVersionNo() As End Property String End Sub cStep_OldVersionNo = Private Function cStep_Iterators() As Variant Private Property Get cStep_OutputFile() As String mcStep.OldVersionNo End Function cStep_Iterators = mcStep.Iterators cStep_OutputFile = mcStep.OutputFile

Private Function cStep_IncVersionX() As End Function End Property String Private Sub cStep_ModifyIterator(cItRecord As cIterator) Private Property Let cStep_ErrorFile(ByVal RHS cStep_IncVersionX = As String) mcStep.IncVersionX Call mcStep.ModifyIterator(cItRecord) mcStep.ErrorFile = RHS End Function End Sub Private Sub cStep_UpdateIteratorVersion() Private Sub cStep_RemoveIterator(cItRecord End Property As cIterator) Call mcStep.UpdateIteratorVersion Private Property Get cStep_ErrorFile() As String Call mcStep.RemoveIterator(cItRecord) End Sub cStep_ErrorFile = mcStep.ErrorFile End Sub Private Function cStep_IteratorCount() As Private Sub cStep_UpdateIterator(cItRecord End Property Long As cIterator) 'Private Property Let cStep_LogFile(ByVal RHS As String) cStep_IteratorCount = Call mcStep.UpdateIterator(cItRecord) ' mcStep.IteratorCount ' mcStep.LogFile = RHS End Sub ' End Function Private Sub cStep_AddIterator(cItRecord As 'End Property cIterator) ' Private Sub cStep_UnloadIterators() 'Private Property Get cStep_LogFile() As String Call mcStep.AddIterator(cItRecord) ' Call mcStep.UnloadIterators ' cStep_LogFile = mcStep.LogFile End Sub ' End Sub 'End Property Private Property Get cStep_Position() As Long Private Sub cStep_DeleteIterator(cItRecord Private Property Let cStep_ArchivedFlag(ByVal As cIterator) cStep_Position = mcStep.Position RHS As Boolean)

Call mcStep.DeleteIterator(cItRecord) End Property mcStep.ArchivedFlag = RHS

End Sub Private Function cStep_Clone(Optional End Property Private Property Get cStep_IteratorName() cCloneStep As cStep) As cStep As String Private Property Get cStep_ArchivedFlag() As Dim cNewManager As cManager Boolean cStep_IteratorName = mcStep.IteratorName Set cNewManager = New cManager cStep_ArchivedFlag = mcStep.ArchivedFlag Set cStep_Clone = End Property mcStep.Clone(cNewManager) End Property Private Property Let cStep_IteratorName(ByVal RHS As String) End Function Private Property Get cStep_NodeDB() As DAO.Database mcStep.IteratorName = RHS HP TPC-H FULL DISCLOSURE REPORT 322 © 2005 Hewlett-Packard Company. All rights reserved. Set cStep_NodeDB = mcStep.NodeDB mcStep.DegreeParallelism = RHS End Property End Property End Property Private Property Get cStep_FailureDetails() As Private Sub Class_Initialize() Private Property Get String cStep_DegreeParallelism() As String ' Create the object cStep_FailureDetails = mcStep.FailureDetails Set mcStep = New cStep cStep_DegreeParallelism = mcStep.DegreeParallelism End Property ' Initialize the object with valid values for a manager step End Property Private Property Get cStep_GlobalFlag() As ' The global flag should be the first field Boolean to be initialized Private Sub cStep_DeleteStep() ' since subsequent validations might try to cStep_GlobalFlag = mcStep.GlobalFlag check if the On Error GoTo cStep_DeleteStepErr ' step being created is global mstrSource = mstrModuleName & End Property mcStep.GlobalFlag = False "c Step_DeleteStep" ' mcStep.GlobalRunMethod = Private Property Let cStep_GlobalFlag(ByVal RHS gintNoOption mcStep.Delete As Boolean) mcStep.StepType = gintManagerStep Exit Sub ' Set the global flag to false - this flag is ' Since the manager step does not take any cStep_DeleteStepErr: initialized when action, the step LogErrors Errors ' an instance of the class is created. Just making ' text and file name will always be empty mstrSource = mstrModuleName & sure that mcStep.StepText = gstrEmptyString "c Step_DeleteStep" ' nobody changes the value inadvertently mcStep.StepTextFile = gstrEmptyString On Error GoTo 0 mcStep.GlobalFlag = False Err.Raise vbObjectError + ' Since the manager step does not take any errDeleteStepFailed, _ End Property action, execution mstrSource, _ Private Sub cStep_Modify() ' properties for the step will be empty LoadResString(errDeleteStepFailed) mcStep.ExecutionMechanism = ' Call the Modify method of the step class to gintNoOption End Sub carry out the update mcStep.FailureDetails = gstrEmptyString mcStep.Modify mcStep.ContinuationCriteria = Private Property Get cStep_EnabledFlag() As gintNoOption Boolean End Sub

End Sub cStep_EnabledFlag = mcStep.EnabledFlag Private Property Let cStep_ParentStepId(ByVal Private Sub Class_Terminate() RHS As Long) End Property ' Remove the step object mcStep.ParentStepId = RHS Set mcStep = Nothing Private Property Let cStep_EnabledFlag(ByVal RHS As Boolean) End Property End Sub Private Sub cStep_Add() mcStep.EnabledFlag = RHS Private Property Get cStep_ParentStepId() As Long

' Call the Add method of the step class to End Property cStep_ParentStepId = mcStep.ParentStepId carry out the insert mcStep.Add Private Property Let End Property cStep_ExecutionMechanism(ByVal RHS As End Sub ExecutionMethod) Private Property Let cStep_ParentVersionNo(ByVal Private Property Get RHS As String) cStep_ContinuationCriteria() As ' Since a manager step cannot take any ContinuationCriteria action, the Execution mcStep.ParentVersionNo = RHS ' Mechanism property does not apply to it cStep_ContinuationCriteria = mcStep.ExecutionMechanism = End Property mcStep.ContinuationCriteria gintNoOption Private Property Get cStep_ParentVersionNo() As End Property End Property String

Private Property Let Private Property Get cStep_ParentVersionNo = cStep_ContinuationCriteria(ByVal RHS As cStep_ExecutionMechanism() As mcStep.ParentVersionNo ContinuationCriteria) ExecutionMethod End Property ' Since a manager step cannot take any cStep_ExecutionMechanism = action, the continuation mcStep.ExecutionMechanism Private Property Let cStep_SequenceNo(ByVal ' criteria property does not apply to it RHS As Integer) mcStep.ContinuationCriteria = End Property gintNoOption mcStep.SequenceNo = RHS Private Property Let End Property cStep_FailureDetails(ByVal RHS As String) End Property

Private Property Let ' Since a manager step cannot take any Private Property Get cStep_SequenceNo() As cStep_DegreeParallelism(ByVal RHS As action, the Failure Integer String) ' Details property does not apply to it mcStep.FailureDetails = gstrEmptyString cStep_SequenceNo = mcStep.SequenceNo HP TPC-H FULL DISCLOSURE REPORT 323 © 2005 Hewlett-Packard Company. All rights reserved. Private Property Get cStep_StepTextFile() As gstrSource, _ End Property String LoadResString(errValidateFailed) End If Private Property Let cStep_StepId(ByVal cStep_StepTextFile = mcStep.StepTextFile RHS As Long) mcStep.Validate End Property mcStep.StepId = RHS Exit Sub Private Property Let cStep_StepType(RHS As End Property gintStepType) cStep_ValidateErr: LogErrors Errors Private Property Get cStep_StepId() As mcStep.StepType = gintManagerStep mstrSource = mstrModuleName & Long "c Step_Validate" End Property On Error GoTo 0 cStep_StepId = mcStep.StepId Err.Raise vbObjectError + errValidateFailed, _ Private Property Get cStep_StepType() As mstrSource, _ End Property gintStepType LoadResString(errValidateFailed) End Sub cStep_StepType = mcStep.StepType Private Property Let Private Property Let cStep_VersionNo(ByVal RHS cStep_StepLabel(ByVal RHS As String) End Property As String)

mcStep.StepLabel = RHS Private Sub cStep_Validate() mcStep.VersionNo = RHS ' The validate routines for each of the steps End Property will End Property ' carry out the specific validations for the Private Property Get cStep_StepLabel() As type and Private Property Get cStep_VersionNo() As String String ' call the generic validation routine cStep_VersionNo = mcStep.VersionNo cStep_StepLabel = mcStep.StepLabel On Error GoTo cStep_ValidateErr mstrSource = mstrModuleName & End Property End Property "c Step_Validate" Private Property Let cStep_WorkspaceId(ByVal ' Validations specific to manager steps RHS As Long) Private Property Let cStep_StepLevel(ByVal RHS As Integer) ' Check if the step text or a file name has mcStep.WorkspaceId = RHS been mcStep.StepLevel = RHS ' specified End Property If Not StringEmpty(mcStep.StepText) Or End Property Not StringEmpty(mcStep.StepTextFile) Then Private Property Get cStep_WorkspaceId() As Long ShowError Private Property Get cStep_StepLevel() As errTextAndFileNullForManager cStep_WorkspaceId = mcStep.WorkspaceId Integer On Error GoTo 0 Err.Raise vbObjectError + End Property cStep_StepLevel = mcStep.StepLevel errValidateFailed, _ VERSION 1.0 CLASS gstrSource, _ BEGIN End Property LoadResString(errValidateFailed) MultiUse = -1 'True End If END Private Property Let cStep_StepText(ByVal Attribute VB_Name = "c Node" RHS As String) If mcStep.ExecutionMechanism <> Attribute VB_GlobalNameSpace = False gintNoOption Then Attribute VB_Creatable = True ' Since the manager step does not take any ShowError Attribute VB_PredeclaredId = False action, the step errExecutionMechanismInvalid Attribute VB_Exposed = False ' text and file name will always be empty On Error GoTo 0 ' FILE: cNode.cls mcStep.StepText = gstrEmptyString Err.Raise vbObjectError + ' Microsoft TPC-H Kit Ver. 1.00 errValidateFailed, _ ' Copyright Microsoft, 1999 End Property gstrSource, _ ' All Rights Reserved LoadResString(errValidateFailed) ' Private Property Get cStep_StepText() As End If ' String ' PURPOSE: Defines the properties that an If mcStep.FailureDetails <> object has to implement. cStep_StepText = mcStep.StepText gstrEmptyString Then ' Contact: Reshma Tharamal ShowError errFailureDetailsNullForMgr ([email protected]) End Property On Error GoTo 0 ' Err.Raise vbObjectError + Option Explicit Private Property Let errValidateFailed, _ cStep_StepTextFile(ByVal RHS As String) gstrSource, _ Public Property Get IndOperation() As Operation LoadResString(errValidateFailed) End Property ' Since the manager step does not take any End If Public Property Let IndOperation(ByVal vdata As action, the step Operation) ' text and file name will always be empty If mcStep.ContinuationCriteria <> End Property mcStep.StepTextFile = gstrEmptyString gintNoOption Then Public Sub Validate() ShowError errContCriteriaInvalid End Sub End Property On Error GoTo 0 Public Property Get Value() As String Err.Raise vbObjectError + End Property errValidateFailed, _ Public Property Let Value(ByVal vdata As String) HP TPC-H FULL DISCLOSURE REPORT 324 © 2005 Hewlett-Packard Company. All rights reserved. End Property Else If mcarrNodes(lngIndex).WorkspaceId = On Error GoTo 0 lngWorkspace Then Public Property Get NodeDB() As Database Err.Raise vbObjectError + End Property errItemDoesNotExist, mstrSource, _ ' Call a procedure to commit all changes to Public Property Set NodeDB(vdata As LoadResString(errItemDoesNotExist) the Database) End If ' parameter record, if any End Property Call Commit(mcarrNodes(lngIndex), End Property lngIndex) Public Property Get Position() As Long End Property Public Sub Commit(ByVal cSaveObj As End If Public Property Let Position(ByVal vdata Object, _ Next lngIndex As Long) ByVal lngIndex As Long) End Property ' This procedure checks if any changes have Exit Sub been made to the VERSION 1.0 CLASS ' passed in object. If so, it calls the SaveErr: BEGIN corresponding method LogErrors Errors MultiUse = -1 'True ' to commit the changes. mstrSource = mstrModuleName & "Save" END On Error GoTo 0 Attribute VB_Name = "cNodeCollections" On Error GoTo CommitErr Err.Raise vbObjectError + errSaveFailed, _ Attribute VB_GlobalNameSpace = False mstrSource = mstrModuleName & mstrSource, _ Attribute VB_Creatable = True "Commit" LoadResString(errSaveFailed) Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Select Case cSaveObj.IndOperation End Sub ' FILE: cNodeCollections.cls Case QueryOp Public Property Get Count() As Long ' Microsoft TPC-H Kit Ver. 1.00 ' No changes were made to the queried ' Copyright Microsoft, 1999 parameter. Count = mlngNodeCount ' All Rights Reserved ' Do nothing ' End Property ' Case InsertOp ' PURPOSE: Implements an array of cSaveObj.Add Public Property Get NodeDB() As Database objects. cSaveObj.IndOperation = QueryOp ' Contact: Reshma Tharamal Set NodeDB = mdbsNodeDb ([email protected]) Case UpdateOp ' cSaveObj.Modify End Property Option Explicit cSaveObj.IndOperation = QueryOp Public Property Set NodeDB(vdata As Database)

' Node counter Case DeleteOp Set mdbsNodeDb = vdata Private mlngNodeCount As Long cSaveObj.Delete Private mdbsNodeDb As Database ' Now we can remove the record from End Property Private mcarrNodes() As Object the array Call Unload(lngIndex) Public Sub Load(cNodeToLoad As Object) ' Used to indicate the source module name ' Adds the passed in object to the array when errors End Select ' are raised by this class On Error GoTo LoadErr Private mstrSource As String Exit Sub Private Const mstrModuleName As String = ' If this procedure is called by the add to array "c NodeCollections." CommitErr: procedure, LogErrors Errors ' the database object has already been initialized Public Property Set Item(ByVal Position As mstrSource = mstrModuleName & If cNodeToLoad.NodeDB Is Nothing Then Long, _ "Commit" ByVal objNode As Object) On Error GoTo 0 ' All the Nodes will be initialized with the Err.Raise vbObjectError + errCommitFailed, database ' Returns the element at the passed in _ ' objects before being added to the array position in the array mstrSource, _ Set cNodeToLoad.NodeDB = mdbsNodeDb If Position >= 0 And Position < LoadResString(errCommitFailed) mlngNodeCount Then End If Set mcarrNodes(Position) = objNode End Sub Else Public Sub Save(ByVal lngWorkspace As ReDim Preserve mcarrNodes(mlngNodeCount) On Error GoTo 0 Long) Err.Raise vbObjectError + ' Calls a procedure to commit all changes for ' Set the newly added element in the array to the errItemDoesNotExist, mstrSource, _ the passed passed in Node ' in workspace. cNodeToLoad.Position = mlngNodeCount LoadResString(errItemDoesNotExist) Set mcarrNodes(mlngNodeCount) = End If Dim lngIndex As Long cNodeToLoad

End Property On Error GoTo SaveErr mlngNodeCount = mlngNodeCount + 1 Public Property Get Item(ByVal Position As Long) As Object ' Find all parameters in the array with a Exit Sub Attribute Item.VB_UserMemId = 0 matching workspace id ' It is important to step backwards through LoadErr: ' Returns the element at the passed in the array, since LogErrors Errors position in the array ' we delete parameter records as we go On Error GoTo 0 If Position >= 0 And Position < along! Err.Raise vbObjectError + errLoadFailed, mlngNodeCount Then For lngIndex = mlngNodeCount - 1 To 0 mstrModuleName & "Load", _ Set Item = mcarrNodes(Position) Step -1 LoadResString(errLoadFailed) HP TPC-H FULL DISCLOSURE REPORT 325 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + errAddFailed, _ End Sub DeleteErr: mstrSource, _ Public Sub Unload(lngDeletePosition As LogErrors Errors LoadResString(errAddFailed) Long) mstrSource = mstrModuleName & "Delete" ' Unloads the passed in object from the On Error GoTo 0 End Sub array Err.Raise vbObjectError + errDeleteFailed, _ mstrSource, _ Private Sub Class_Terminate() On Error GoTo UnloadErr LoadResString(errDeleteFailed) ReDim mcarrNodes(0) If lngDeletePosition < (mlngNodeCount - End Sub mlngNodeCount = 0 1) Then Public Sub Modify(cModifiedNode As Object) ' Sets the object at the passed in position to End Sub ' Set the Node at the position being the deleted to ' modified object passed in ' the last Node in the Node array Attribute VB_Name = "Common" Set mcarrNodes(lngDeletePosition) = On Error GoTo ModifyErr ' FILE: Common.bas mcarrNodes(mlngNodeCount - 1) ' Microsoft TPC-H Kit Ver. 1.00 ' First check if the record is valid - all objects ' Copyright Microsoft, 1999 mcarrNodes(lngDeletePosition).Position = that ' All Rights Reserved lngDeletePosition ' use this collection class must have a ' End If Validate routine ' cModifiedNode.Validate ' PURPOSE: Module containing common ' Delete the last Node from the array functionality throughout mlngNodeCount = mlngNodeCount - 1 ' If we are updating a record that hasn't yet ' StepMaster If mlngNodeCount > 0 Then been inserted, ' Contact: Reshma Tharamal ReDim Preserve mcarrNodes(0 To ' do not change the operation indicator - or ([email protected]) mlngNodeCount - 1) we try to update ' Else ' a non-existant record Option Explicit ReDim mcarrNodes(0) If cModifiedNode.IndOperation <> InsertOp End If Then Private Const mstrModuleName As String = ' Set the operations to indicate an update "Common." Exit Sub cModifiedNode.IndOperation = UpdateOp ' Used to separate the variable data from the UnloadErr: End If constant error LogErrors Errors ' message being raised when a context-sensitive mstrSource = mstrModuleName & ' Modify the object at the queried position - error is displayed "Unload" the Position Private Const mintDelimiter As String = " : " On Error GoTo 0 ' will be maintained by this class Private Const mstrFormatString = "mmddyy" Err.Raise vbObjectError + Set mcarrNodes(cModifiedNode.Position) = errUnloadFailed, _ cModifiedNode ' Identifiers for the different labels that need to be mstrSource, _ loaded LoadResString(errUnloadFailed) Exit Sub ' into the tree view for each workspace Public Const mstrWorkspacePrefix = "W" End Sub ModifyErr: Public Const mstrParameterPrefix = "P" Public Sub Delete(lngDeletePosition As LogErrors Errors Public Const mstrParamConnectionPrefix = "C" Long) mstrSource = mstrModuleName & "Modify" Public Const mstrConnectionDtlPrefix = "N" ' Deletes the object at the specified On Error GoTo 0 Public Const mstrParamExtensionPrefix = "E" position in the Err.Raise vbObjectError + errModifyFailed, Public Const mstrParamBuiltInPrefix = "B" ' array _ Public Const gstrGlobalStepPrefix = "G" mstrSource, _ Public Const gstrManagerStepPrefix = "M" Dim cDeleteObj As Object LoadResString(errModifyFailed) Public Const gstrWorkerStepPrefix = "S" Public Const gstrDummyPrefix = "D" On Error GoTo DeleteErr End Sub Public Const mstrLabelPrefix = "L" mstrSource = mstrModuleName & Public Sub Add(cNodeToAdd As Object) Public Const mstrInstancePrefix = "I" "Delete" Public Function LabelStep(lngWorkspaceIdentifier On Error GoTo AddErr As Long) As String Set cDeleteObj = ' Returns the step label for the workspace mcarrNodes(lngDeletePosition) Set cNodeToAdd.NodeDB = mdbsNodeDb identifier passed in ' Basically this is a wrapper around the If cDeleteObj.IndOperation = InsertOp ' First check if the record is valid MakeKeyValid function Then cNodeToAdd.Validate ' If we are deleting a record that has just LabelStep = MakeKeyValid(gintStepLabel, been inserted, ' Set the operation to indicate an insert gintStepLabel, lngWorkspaceIdentifier) ' blow it away cNodeToAdd.IndOperation = InsertOp Call Unload(lngDeletePosition) End Function Else ' Call a procedure to load the record in the ' Set the operation for the deleted object array to indicate a Call Load(cNodeToAdd) Public Function JulianDateToString(dt64Bit As ' delete - we actually delete the element Currency) As String only at the time Exit Sub ' of a save operation Dim lYear As Long cDeleteObj.IndOperation = DeleteOp AddErr: Dim lMonth As Long End If LogErrors Errors Dim lDay As Long mstrSource = mstrModuleName & "Add" Dim lHour As Long Exit Sub On Error GoTo 0 Dim lMin As Long HP TPC-H FULL DISCLOSURE REPORT 326 © 2005 Hewlett-Packard Company. All rights reserved. Dim lSec As Long ' 1. Nodes that contain data for the Case gintWorkspace Dim lMs As Long workspace - this could strPrefixChar = mstrWorkspacePrefix ' be data for the different types of steps or Case gintGlobalStep Call JulianToTime(dt64Bit, lYear, parameters strPrefixChar = gstrGlobalStepPrefix lMonth, lDay, lHour, lMin, lSec, lMs) ' 2. Nodes that display static data - these kind Case gintManagerStep JulianDateToString = Format$(lYear, of nodes strPrefixChar = gstrManagerStepPrefix gsYearFormat) & gsDateSeparator & _ ' are referred to as label nodes e.g. "Global Case gintWorkerStep Format$(lMonth, gsDtFormat) & Steps" is a strPrefixChar = gstrWorkerStepPrefix gsDateSeparator & _ ' label node Case gintRunManager, gintRunWorker Format$(lDay, gsDtFormat) & ' This function returns True if the passed in If InstanceId = 0 Then gstrBlank & _ key corresponds On Error GoTo 0 Format$(lHour, gsTmFormat) & ' to a label node Err.Raise vbObjectError + gsTimeSeparator & _ errMandatoryParameterMissing, _ Format$(lMin, gsTmFormat) & IsLabel = InStr(strKey, mstrLabelPrefix) > 0 gstrSource, _ gsTimeSeparator & _ Format$(lSec, gsTmFormat) & End Function LoadResString(errMandatoryParameterMissing) gsMsSeparator & _ End If Format$(lMs, gsMSecondFormat) Function MakeKeyValid(lngIdentifier As ' Concatenate the instance identifier and the Long, _ step End Function intTypeOfNode As Integer, _ ' identifier to form a unique key Public Sub DeleteFile(strFile As String, Optional ByVal WorkspaceId As Long = 0, strPrefixChar = Trim$(Str$(InstanceId)) & Optional ByVal bCheckIfEmpty As Boolean _ mstrInstancePrefix = False) Optional ByVal InstanceId As Long = 0) As Case gintParameter String strPrefixChar = mstrParameterPrefix ' Ensure that there is only a single file of Case gintNodeParamConnection the name before delete, since ' We use a numbering scheme while loading strPrefixChar = mstrParamConnectionPrefix ' Kill supports wildcards and can the tree view with Case gintConnectionDtl potentially delete a number of files ' all node data, since it needs a unique key strPrefixChar = mstrConnectionDtlPrefix Dim strTemp As String and we want to Case gintNodeParamExtension ' use the key to identify the data it contains. strPrefixChar = mstrParamExtensionPrefix If CheckFileExists(strFile) Then ' Moreover, add a character to the beginning Case gintNodeParamBuiltIn If bCheckIfEmpty Then of the identifier strPrefixChar = mstrParamBuiltInPrefix If FileLen(strFile) = 0 Then ' so that the tree view control accepts it as a Case gintGlobalsLabel, gintParameterLabel, Kill strFile valid string, gintParamConnectionLabel, _ End If ' viz. "456" doesn't work, so change it to gintConnDtlLabel, _ Else "W456" gintParamExtensionLabel, Kill strFile ' The general scheme is to concatenate a gintParamBuiltInLabel, gintGlobalStepLabel, _ End If Label with the Identifier gintStepLabel End If ' e.g A Global Step Node will have the If WorkspaceId = 0 Then Label, G and the Step Id ' The Workspace Id has to be specified for End Sub ' concatenated to form the unique key a label node Public Function CheckFileExists(strFile As ' The list of all such node types is given ' Otherwise it will not be possible to String) As Boolean below generate unique label ' 1. "W" + Workspace_Id for Workspace ' identifiers if multiple workspaces are ' Returns true if the passed in file exists nodes open ' Raises an error if multiple files are found ' 2. "P"+ Parameter_Id for Parameter nodes On Error GoTo 0 (filename contains a wildcard) ' 3. "M" + Step_Id for Manager Step nodes Err.Raise vbObjectError + CheckFileExists = False ' 4. "S" + Step_Id for Worker Step nodes errWorkspaceIdMandatory, _ ' 5. "G" + Step_Id for Global Step nodes gstrSource, _ If Not StringEmpty(Dir(strFile)) Then ' 6. Instance_id + "I" + Step_Id for Instance If Not StringEmpty(Dir()) Then nodes LoadResString(errWorkspaceIdMandatory) On Error GoTo 0 ' 7. Workspace_id + "L" + the label End If Err.Raise vbObjectError + identifier = node type for all Label nodes ' For all labels, the workspace identifier and errDeleteSingleFile, _ ' Since the manager, worker and global steps the mstrModuleName & "DeleteFile", are stored in the ' label prefix are concatenated to form the LoadResString(errDeleteSingleFile) ' same table and the step identifiers will key End If always be unique, we strPrefixChar = Trim$(Str$(WorkspaceId)) ' can use the same character as the prefix, but & mstrLabelPrefix CheckFileExists = True this is a Case Else End If ' convenient way to know the type of step On Error GoTo 0 being processed. Err.Raise vbObjectError + End Function ' The workspace id is appended to the label errInvalidNodeType, _ identifier to make gstrSource, _ Public Function GetVersionString() As ' it unique, since multiple workspaces may LoadResString(errInvalidNodeType) String be open during a session End Select GetVersionString = "Version " & gsVersion ' Strip the prefix characters off while saving End Function the Ids to the db MakeKeyValid = strPrefixChar & Trim$(Str$(lngIdentifier)) Function IsLabel(strKey As String) As Dim strPrefixChar As String Boolean Exit Function On Error GoTo MakeKeyValidErr ' The tree view control on frmMain can gstrSource = mstrModuleName & MakeKeyValidErr: contain two types of "MakeKeyValid" Call LogErrors(Errors) ' nodes - On Error GoTo 0 Select Case intTypeOfNode HP TPC-H FULL DISCLOSURE REPORT 327 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + ' Modifies the mousepointer to indicate that Public Sub AddArrayElement(ByRef arrNodes() As errMakeKeyValidFailed, _ the Object, _ gstrSource, _ ' application is busy ByVal objToAdd As Object, _ ByRef lngCount As Long) LoadResString(errMakeKeyValidFailed) On Error Resume Next ' Adds the passed in object to the array

End Function Screen.MousePointer = vbHourglass On Error GoTo AddArrayElementErr

Function MakeIdentifierValid(strKey As End Sub ' Increase the array dimension and add the object String) As Long Public Sub ShowFree() to it ' Modifies the mousepointer to indicate that ReDim Preserve arrNodes(lngCount) ' Returns the Identifier corresponding to the Set arrNodes(lngCount) = objToAdd the passed in key ' application has finished processing and is lngCount = lngCount + 1 ' (Reverse of what was done in ready MakeKeyValid) ' to accept user input Exit Sub

On Error GoTo MakeIdentifierValidErr On Error Resume Next AddArrayElementErr: LogErrors Errors If IsLabel(strKey) Then Screen.MousePointer = vbDefault gstrSource = mstrModuleName & ' If the key corresponds to a label node, "AddArrayElement" the identifier End Sub On Error GoTo 0 ' appears to the right of the label prefix Err.Raise vbObjectError + MakeIdentifierValid = Val(Mid(strKey, Public Function InstrR(strMain As String, _ errAddArrayElementFailed, _ InStr(strKey, mstrLabelPrefix) + 1)) strSearch As String) As Integer gstrSource, _ ElseIf InStr(strKey, mstrInstancePrefix) = ' Finds the last occurrence of the passed in LoadResString(errAddArrayElementFailed) 0 Then string ' For all other nodes, stripping the first End Sub character off Dim intPos As Integer ' returns a valid Id Dim intPrev As Integer MakeIdentifierValid = Val(Mid(strKey, Public Function CheckForNullField(rstRecords As 2)) On Error GoTo InstrRErr Recordset, strFieldName As String) As String Else ' Instance node - strip of all characters intPrev = intPos ' Returns an empty string if a given field is null till the intPos = InStr(1, strMain, strSearch) On Error GoTo CheckForNullFieldErr ' instance prefix MakeIdentifierValid = Val(Mid(strKey, Do While intPos > 0 If IsNull(rstRecords.Fields(strFieldName)) Then InStr(strKey, mstrInstancePrefix) + 1)) intPrev = intPos CheckForNullField = gstrEmptyString End If intPos = InStr(intPos + 1, strMain, Else strSearch) CheckForNullField = Exit Function Loop rstRecords.Fields(strFieldName) InstrR = intPrev End If MakeIdentifierValidErr: Exit Function Call LogErrors(Errors) Exit Function On Error GoTo 0 CheckForNullFieldErr: Err.Raise vbObjectError + InstrRErr: Call LogErrors(Errors) errMakeIdentifierValidFailed, _ Call LogErrors(Errors) On Error GoTo 0 mstrModuleName & gstrSource = mstrModuleName & "InstrR" Err.Raise vbObjectError + "MakeIdentifierValid", _ On Error GoTo 0 errCheckForNullFieldFailed, _ Err.Raise vbObjectError + errInstrRFailed, _ mstrModuleName & "CheckForNullField", LoadResString(errMakeIdentifierValidFaile gstrSource, _ _ d) LoadResString(errInstrRFailed) LoadResString(errCheckForNullFieldFailed) End Function End Function Public Function IsInstanceNode(strNodeKey End Function As String) As Boolean Public Function GetDefaultDir(lWspId As Long, WspParameters As cArrParameters) As Public Function ErrorOnNullField(rstRecords As ' Returns true if the passed in node key String Recordset, strFieldName As String) As Variant corresponds to a step instance IsInstanceNode = InStr(strNodeKey, Dim sDir As String ' If a given field is null, raises an error mstrInstancePrefix) > 0 sDir = SubstituteParameters( _ ' Else, returns the field value in a variant gstrEnvVarSeparator & ' The calling function must convert the return End Function PARAM_DEFAULT_DIR & value to the Public Function IsBuiltInLabel(strNodeKey gstrEnvVarSeparator, _ ' appropriate type As String) As Boolean lWspId, On Error GoTo ErrorOnNullFieldErr WspParameters:=WspParameters) gstrSource = mstrModuleName & ' Returns true if the passed in node key MakePathValid (sDir & gstrFileSeparator & "ErrorOnNullField" corresponds to a step instance "a.txt") IsBuiltInLabel = (IsLabel(strNodeKey) GetDefaultDir = GetShortName(sDir) If IsNull(rstRecords.Fields(strFieldName)) Then And _ If StringEmpty(GetDefaultDir) Then On Error GoTo 0 (MakeIdentifierValid(strNodeKey) = GetDefaultDir = App.Path Err.Raise vbObjectError + gintParamBuiltInLabel)) End If errMandatoryFieldNull, _ gstrSource, _ End Function End Function strFieldName & mintDelimiter & LoadResString(errMandatoryFieldNull) Public Sub ShowBusy() Else HP TPC-H FULL DISCLOSURE REPORT 328 © 2005 Hewlett-Packard Company. All rights reserved. ErrorOnNullField = ' Get the value of the variable and call a rstRecords.Fields(strFieldName) LoadResString(errGetParamValueFailed) function End If ' to replace the variable with it's value Exit Function End Function strValue = GetValue(strEnvVariable, Public Function SubstituteParameters(ByVal lngWorkspaceId, StepIterators, WspParameters) ErrorOnNullFieldErr: strComString As String, _ ' The function raises an error if the variable Call LogErrors(Errors) ByVal lngWorkspaceId As Long, _ is On Error GoTo 0 Optional StepIterators As cRunColIt = ' not found Err.Raise vbObjectError + Nothing, _ strCommand = errUnableToCheckNull, _ Optional WspParameters As cTempStr.ReplaceSubString(strCommand, _ gstrSource, _ cArrParameters = Nothing) As String gstrEnvVarSeparator & strEnvVariable strFieldName & mintDelimiter & ' This function substitutes all parameter & gstrEnvVarSeparator, _ LoadResString(errUnableToCheckNull) names and strValue) ' environment variables in the passed in End If End Function string with Public Function ' their values. It also substitutes the value for intPos = InStr(intPos, strCommand, StringEmpty(strCheckString As String) As the gstrEnvVarSeparator) Boolean ' iterators, if any. Loop ' Since the syntax is to enclose parameter StringEmpty = (strCheckString = names and strCommand = gstrEmptyString) ' environment variables in "%", we check if cTempStr.ReplaceSubString(strCommand, _ a given gstrEnvVarSeparator & End Function ' variable is a parameter - if so, we substitute gstrEnvVarSeparator, gstrEnvVarSeparator) Public Function the GetIteratorValue(cStepIterators As ' parameter value - else we try to get the Set cTempStr = Nothing cRunColIt, _ value from SubstituteParameters = strCommand ByVal strItName As String) ' the environment End Function Dim lngIndex As Long Dim intPos As Integer Private Function GetValue(ByVal strParameter As Dim strValue As String Dim intEndPos As Integer String, _ Dim strEnvVariable As String ByVal lngWorkspaceId As Long, _ On Error GoTo GetIteratorValueErr Dim strValue As String cStepIterators As cRunColIt, _ gstrSource = mstrModuleName & Dim strCommand As String WspParameters As cArrParameters) As String "GetIteratorValue" Dim cTempStr As cStringSM ' This function returns the value for the passed in ' parameter - it may be a workspace parameter, an ' Find the iterator in the Iterators ' Initialize the return value of the function to ' environment variable or an iterator collection the For lngIndex = 0 To cStepIterators.Count ' passed in command Dim intPos As Integer - 1 strCommand = strComString Dim intEndPos As Integer If Dim strVariable As String cStepIterators(lngIndex).IteratorName = If WspParameters Is Nothing Then Set Dim strValue As String strItName Then WspParameters = gcParameters Dim cParamRec As cParameter strValue = cStepIterators(lngIndex).Value Set cTempStr = New cStringSM On Error GoTo GetValueErr Exit For End If intPos = InStr(strCommand, ' Initialize the return value of the function to the Next lngIndex gstrEnvVarSeparator) ' empty Do While intPos <> 0 strValue = gstrEmptyString If lngIndex > cStepIterators.Count - 1 If Mid(strCommand, intPos + 1, 1) = Then gstrEnvVarSeparator Then intPos = InStr(strParameter, ' The iterator has not been defined for ' Wildcard character - to be substituted gstrEnvVarSeparator) the branch by a single % - later! If intPos > 0 Then ' Raise an error intPos = intPos + 2 ' Extract the variable from the passed in string On Error GoTo 0 If intPos > Len(strCommand) Then intEndPos = InStr(intPos + 1, strParameter, Err.Raise vbObjectError + Exit Do gstrEnvVarSeparator) errParamNameInvalid, _ Else If intEndPos = 0 Then gstrSource, _ ' Extract the environment variable from intEndPos = Len(strParameter) the passed End If LoadResString(errParamNameInvalid) ' in string End If intEndPos = InStr(intPos + 1, strVariable = Mid(strParameter, intPos + 1, strCommand, gstrEnvVarSeparator) intEndPos - intPos - 1) GetIteratorValue = strValue Else Exit Function If intEndPos > 0 Then ' The separator charactor has not been passed strEnvVariable = Mid(strCommand, in - GetIteratorValueErr: intPos + 1, intEndPos - intPos - 1) ' try to find the value of the passed in ' Log the error code raised by Visual Else parameter Basic On Error GoTo 0 strVariable = strParameter Call LogErrors(Errors) Err.Raise vbObjectError + End If gstrSource = mstrModuleName & errParamSeparatorMissing, _ "GetIteratorValue" gstrSource, _ If Not StringEmpty(strVariable) Then On Error GoTo 0 ' Check if this is the timestamp parameter first Err.Raise vbObjectError + LoadResString(errParamSeparatorMissing) If strVariable = gstrTimeStamp Then errGetParamValueFailed, _ End If strValue = Format$(Now, mstrFormatString, gstrSource, _ strValue = gstrEmptyString _

HP TPC-H FULL DISCLOSURE REPORT 329 © 2005 Hewlett-Packard Company. All rights reserved. vbUseSystemDayOfWeek, gstrSource, _ TranslateStepLabel = vbUseSystem) LoadResString(errSubValuesFailed) & cTempStr.ReplaceSubString(TranslateStepLabel, Else "P arameter: "& gstrSQ & strVariable & gstrDQ, gstrUnderscore) ' Try to find a parameter for the gstrSQ TranslateStepLabel = workspace with cTempStr.ReplaceSubString(TranslateStepLabel, ' the same name End Function "< ", gstrUnderscore) Set cParamRec = Public Function SQLFixup(strField As String) TranslateStepLabel = WspParameters.GetParameterValue(lngWor As String cTempStr.ReplaceSubString(TranslateStepLabel, kspaceId, _ ' Returns a string that can be executed by "> ", gstrUnderscore) strVariable) SQL Server TranslateStepLabel = If cParamRec Is Nothing Then cTempStr.ReplaceSubString(TranslateStepLabel, If Not cStepIterators Is Nothing Dim cMyStr As New cStringSM "|", gstrUnderscore) Then Dim strTemp As String TranslateStepLabel = ' If the string is not a parameter, cTempStr.ReplaceSubString(TranslateStepLabel, then check On Error GoTo SQLFixupErr gstrBlank, gstrUnderscore) ' if it is an iterator strValue = strTemp = strField ' Commas are substituted with underscores since GetIteratorValue(cStepIterators, strVariable) SQLFixup = strTemp the command shell uses a comma to End If ' delimit commands ' Single-quotes have to be replaced by two TranslateStepLabel = If StringEmpty(strValue) Then single-quotes, cTempStr.ReplaceSubString(TranslateStepLabel, ' Neither - Check if it is an ' since a single-quote is the identifier ",", gstrUnderscore) environment variable delimiter strValue = ' character - call a procedure to do the If Len(TranslateStepLabel) > MAX_PATH Then Environ$(strVariable) replace TranslateStepLabel = Mid(TranslateStepLabel, If StringEmpty(strValue) Then ' SQLFixup = 1, MAX_PATH) On Error GoTo 0 cMyStr.ReplaceSubString(strTemp, gstrDQ, End If WriteError "\" & gstrDQ) errSubValuesFailed, _ End Function OptArgs:="Invalid ' Replace pipe characters with the parameter: " & gstrSQ & strVariable & corresponding chr function Public Function TypeOfObject(ByVal objNode As gstrSQ ' SQLFixup = Object) As Integer Err.Raise vbObjectError + cMyStr.ReplaceSubString(strTemp, gstrDQ, ' Determines the type of object that is passed in errSubValuesFailed, _ gstrDQ & gstrDQ) mstrModuleName & On Error GoTo TypeOfObjectErr "GetValue", _ Exit Function gstrSource = mstrModuleName & "TypeOfObject" LoadResString(errSubValuesFailed) & SQLFixupErr: "Invalid parameter: " & gstrSQ & gstrSource = mstrModuleName & Select Case TypeName(objNode) strVariable & gstrSQ "SQLFixup" Case "cWorkspace" End If LogErrors Errors TypeOfObject = gintWorkspace End If On Error GoTo 0 Else Err.Raise vbObjectError + Case "cParameter" strValue = errMakeFieldValidFailed, _ TypeOfObject = gintParameter cParamRec.ParameterValue gstrSource, End If LoadResString(errMakeFieldValidFailed) Case "cConnection" End If TypeOfObject = gintParameterConnect End If End Function Public Function TranslateStepLabel(sLabel As Case "cConnDtl" GetValue = strValue String) As String TypeOfObject = gintConnectionDtl ' Translates the passed in step label to a valid Exit Function file name Case "cGlobalStep" ' All characters in the label that are invalid TypeOfObject = gintGlobalStep GetValueErr: for filenames (viz. \ / : * ? "< > |) If Err.Number = vbObjectError + ' and spaces are substituted with underscores Case "cManager" errParamNameInvalid Then - also ensure that the resulting filename TypeOfObject = gintManagerStep ' If the parameter has not been defined ' is not greater than 255 characters for the Dim cTempStr As New cStringSM Case "cWorker" ' workspace then check if it is an TranslateStepLabel = TypeOfObject = gintWorkerStep environment cTempStr.ReplaceSubString(sLabel, ' variable gstrFileSeparator, "_") Case "cStep" Resume Next TranslateStepLabel = ' If a step record is passed in, call a function End If cTempStr.ReplaceSubString(TranslateStepLab ' to determine the type of step el, "/", gstrUnderscore) TypeOfObject = ' Log the error code raised by Visual TranslateStepLabel = TypeOfStep(StepClass:=objNode) Basic cTempStr.ReplaceSubString(TranslateStepLab Call LogErrors(Errors) el, ":", gstrUnderscore) Case Else gstrSource = mstrModuleName & TranslateStepLabel = WriteError errTypeOfObjectFailed, "GetValue" cTempStr.ReplaceSubString(TranslateStepLab gstrSource, _ WriteError errSubValuesFailed, el, "*", gstrUnderscore) TypeName(objNode) gstrSource, "Parameter: " & gstrSQ & TranslateStepLabel = On Error GoTo 0 strVariable & gstrSQ cTempStr.ReplaceSubString(TranslateStepLab Err.Raise vbObjectError + On Error GoTo 0 el, "?", gstrUnderscore) errTypeOfObjectFailed, _ Err.Raise vbObjectError + gstrSource, _ errSubValuesFailed, _ HP TPC-H FULL DISCLOSURE REPORT 330 © 2005 Hewlett-Packard Company. All rights reserved. cNewConnDtl.ConnectionString = cNewConnection.WorkspaceId = LoadResString(errTypeOfObjectFailed) CheckForNullField(rstConns, CStr(ErrorOnNullField(rstConns, End Select FLD_CONN_DTL_CONNECTION_STRING FLD_ID_WORKSPACE)) ) cNewConnection.ConnectionName = Exit Function cNewConnDtl.ConnType = CStr(ErrorOnNullField(rstConns, CheckForNullField(rstConns, "c onnection_name")) TypeOfObjectErr: FLD_CONN_DTL_CONNECTION_TYPE) cNewConnection.ConnectionValue = ' Log the error code raised by Visual CheckForNullField(rstConns, "connection_value") Basic cConns.Load cNewConnDtl cNewConnection.Description = Call LogErrors(Errors) CheckForNullField(rstConns, "description") On Error GoTo 0 Set cNewConnDtl = Nothing Err.Raise vbObjectError + rstConns.MoveNext cNewConnection.NoCountDisplay = errTypeOfObjectFailed, _ Wend CheckForNullField(rstConns, "no_count_display") gstrSource, _ cNewConnection.NoExecute = Exit Sub CheckForNullField(rstConns, "no_execute") LoadResString(errTypeOfObjectFailed) cNewConnection.ParseQueryOnly = LoadRSInConnDtlArrayErr: CheckForNullField(rstConns, "parse_query_only") End Function LogErrors Errors cNewConnection.QuotedIdentifiers = Attribute VB_Name = "ConnDtlCommon" gstrSource = mstrModuleName & CheckForNullField(rstConns, ' FILE: ConnDtlCommon.bas "LoadRSInConnDtlArray" "ANSI_quoted_identifiers") ' Microsoft TPC-H Kit Ver. 1.00 On Error GoTo 0 cNewConnection.AnsiNulls = ' Copyright Microsoft, 1999 Err.Raise vbObjectError + CheckForNullField(rstConns, "ANSI_nulls") ' All Rights Reserved errLoadRsInArrayFailed, gstrSource, _ cNewConnection.ShowQueryPlan = ' CheckForNullField(rstConns, "show_query_plan") ' LoadResString(errLoadRsInArrayFailed) cNewConnection.ShowStatsTime = ' PURPOSE: Contains functionality End Sub CheckForNullField(rstConns, "show_stats_time") common across StepMaster and Attribute VB_Name = "ConnectionCommon" cNewConnection.ShowStatsIO = ' SMRunOnly, pertaining to ' FILE: ConnnectionCommon.bas CheckForNullField(rstConns, "show_stats_io") connections ' Microsoft TPC-H Kit Ver. 1.00 cNewConnection.ParseOdbcMsg = ' Specifically, functions to load ' Copyright Microsoft, 1999 CheckForNullField(rstConns, connections in an array ' All Rights Reserved "parse_odbc_msg_prefixes") ' and so on. ' cNewConnection.RowCount = ' Contact: Reshma Tharamal ' CheckForNullField(rstConns, "row_count") ([email protected]) ' PURPOSE: Contains functionality common cNewConnection.TsqlBatchSeparator = ' across StepMaster and CheckForNullField(rstConns, Option Explicit ' SMRunOnly, pertaining to connection "t sql_batch_separator") strings cNewConnection.QueryTimeOut = ' Used to indicate the source module name ' Specifically, functions to load CheckForNullField(rstConns, "query_time_out") when errors connections strings cNewConnection.ServerLanguage = ' are raised by this module ' in an array and so on. CheckForNullField(rstConns, "server_language") Private Const mstrModuleName As String = ' Contact: Reshma Tharamal cNewConnection.CharacterTranslation = "ConnDtlCommon." ([email protected]) CheckForNullField(rstConns, ' "c haracter_translation") Public Sub Option Explicit cNewConnection.RegionalSettings = LoadRSInConnDtlArray(rstConns As CheckForNullField(rstConns, "regional_settings") Recordset, cConns As cConnDtls) ' Used to indicate the source module name when errors cConns.Load cNewConnection Dim cNewConnDtl As cConnDtl ' are raised by this module Private Const mstrModuleName As String = Set cNewConnection = Nothing On Error GoTo "ConnectionCommon." rstConns.MoveNext LoadRSInConnDtlArrayErr Wend Public Sub If rstConns.RecordCount = 0 Then LoadRecordsetInConnectionArray(rstConns Exit Sub Exit Sub As Recordset, cConns As cConnections) End If LoadRecordsetInConnectionArrayErr: Dim cNewConnection As cConnection LogErrors Errors rstConns.MoveFirst gstrSource = mstrModuleName & While Not rstConns.EOF On Error GoTo "LoadRecordsetInConnectionArray" LoadRecordsetInConnectionArrayErr On Error GoTo 0 Set cNewConnDtl = New cConnDtl Err.Raise vbObjectError + If rstConns.RecordCount = 0 Then errLoadRsInArrayFailed, gstrSource, _ ' Initialize ConnDtl values Exit Sub LoadResString(errLoadRsInArrayFailed) ' Call a procedure to raise an error if End If End Sub mandatory fields are null. VERSION 1.0 CLASS cNewConnDtl.ConnNameId = rstConns.MoveFirst BEGIN ErrorOnNullField(rstConns, While Not rstConns.EOF MultiUse = -1 'True FLD_ID_CONN_NAME) END cNewConnDtl.WorkspaceId = Set cNewConnection = New cConnection Attribute VB_Name = "cParameter" ErrorOnNullField(rstConns, Attribute VB_GlobalNameSpace = False FLD_ID_WORKSPACE) ' Initialize Connection values Attribute VB_Creatable = True cNewConnDtl.ConnName = ' Call a procedure to raise an error if Attribute VB_PredeclaredId = False CStr(ErrorOnNullField(rstConns, mandatory fields are null. Attribute VB_Exposed = False FLD_CONN_DTL_CONNECTION_NAM cNewConnection.ConnectionId = ' FILE: cParameter.cls E)) ErrorOnNullField(rstConns, "connection_id") ' Microsoft TPC-H Kit Ver. 1.00 ' Copyright Microsoft, 1999 HP TPC-H FULL DISCLOSURE REPORT 331 © 2005 Hewlett-Packard Company. All rights reserved. ' All Rights Reserved prmParam.Value = mlngParameterId On Error GoTo CloneErr ' mstrSource = mstrModuleName & "Clone" ' Case "[p_name]" ' PURPOSE: Encapsulates the properties prmParam.Value = Set cCloneParam = New cParameter and methods of a parameter. mstrParameterName ' Contains functions to insert, ' Copy all the parameter properties to the newly update and delete Case "[p_value]" ' created parameter ' workspace_parameters records prmParam.Value = Set cCloneParam.NodeDB = mdbsStepMaster from the database. mstrParameterValue cCloneParam.WorkspaceId = mlngWorkspaceId ' Contact: Reshma Tharamal cCloneParam.ParameterId = mlngParameterId ([email protected]) Case "[desc]" cCloneParam.ParameterName = ' prmParam.Value = mstrDescription mstrParameterName Option Explicit cCloneParam.ParameterValue = Option Base 0 Case "[p_type]" mstrParameterValue prmParam.Value = cCloneParam.Description = mstrDescription ' Local variable(s) to hold property value(s) mintParameterType cCloneParam.ParameterType = Private mlngWorkspaceId As Long mintParameterType Private mlngParameterId As Long Case Else cCloneParam.IndOperation = mintOperation Private mstrParameterName As String ' Write the parameter name that is cCloneParam.Position = mlngPosition Private mstrParameterValue As String faulty Private mstrDescription As String WriteError errInvalidParameter, ' And set the return value to the newly created Private mintParameterType As Integer mstrSource, _ parameter Private mdbsStepMaster As Database prmParam.Name Set Clone = cCloneParam Private mintOperation As Operation On Error GoTo 0 Set cCloneParam = Nothing Private mlngPosition As Long Err.Raise errInvalidParameter, mstrModuleName & "AssignParameters", _ Exit Function ' Used to indicate the source module name when errors LoadResString(errInvalidParameter) CloneErr: ' are raised by this class End Select LogErrors Errors Private mstrSource As String Next prmParam mstrSource = mstrModuleName & "Clone" Private Const mstrModuleName As String = On Error GoTo 0 "c Parameter." ' qyExec.Parameters("w_id").Value = Err.Raise vbObjectError + errCloneFailed, _ mlngWorkspaceId mstrSource, LoadResString(errCloneFailed) ' The cSequence class is used to generate ' qyExec.Parameters("p_id").Value = unique parameter identifiers mlngParameterId End Function Private mParameterSeq As cSequence ' qyExec.Parameters("p_name").Value = Public Property Set NodeDB(vdata As Database) mstrParameterName ' The StringSM class is used to carry out ' qyExec.Parameters("p_value").Value = Set mdbsStepMaster = vdata string operations mstrParameterValue Private mFieldValue As cStringSM ' End Property Public Property Get NodeDB() As Database ' Parameter types Exit Sub Public Enum ParameterType Set NodeDB = mdbsStepMaster gintParameterGeneric = 0 AssignParametersErr: gintParameterConnect End Property gintParameterApplication mstrSource = mstrModuleName & gintParameterBuiltIn "AssignParameters" Private Sub CheckDupParameterName() End Enum Call LogErrors(Errors) ' Check if the parameter name already exists in On Error GoTo 0 the workspace Err.Raise vbObjectError + Private Sub AssignParameters(qyExec As errAssignParametersFailed, _ Dim rstParameter As Recordset DAO.QueryDef) mstrSource, Dim strSql As String ' Assigns values to the parameters in the LoadResString(errAssignParametersFailed) Dim qy As DAO.QueryDef querydef object ' The parameter names are cryptic to make End Sub On Error GoTo CheckDupParameterNameErr them different mstrSource = mstrModuleName & ' from the field names. When the Public Property Let Position(ByVal RHS As "CheckDupParameterName" parameter names are Long) ' the same as the field names, parameters ' Create a recordset object to retrieve the count of in the where mlngPosition = RHS all parameters ' clause do not get created. ' for the workspace with the same name End Property strSql = "Select count(*) as parameter_count " & Dim prmParam As DAO.Parameter _ Public Property Get Position() As Long " from workspace_parameters " & _ On Error GoTo AssignParametersErr " where workspace_id = [w_id]" & _ Position = mlngPosition " and parameter_name = [p_name]" & _ For Each prmParam In " and parameter_id <> [p_id]" qyExec.Parameters End Property Select Case prmParam.Name Set qy = Case "[w_id]" Public Function Clone() As cParameter mdbsStepMaster.CreateQueryDef(gstrEmptyString, prmParam.Value = strSql) mlngWorkspaceId ' Creates a copy of a given parameter Call AssignParameters(qy)

Case "[p_id]" Dim cCloneParam As cParameter Set rstParameter = qy.OpenRecordset(dbOpenForwardOnly) HP TPC-H FULL DISCLOSURE REPORT 332 © 2005 Hewlett-Packard Company. All rights reserved. mstrSource, If rstParameter![parameter_count] > 0 LoadResString(errParameterNameMandatory) End Property Then Else rstParameter.Close mstrParameterName = vdata Public Sub Add() qy.Close End If ShowError Dim strInsert As String errDuplicateParameterName End Property Dim qy As DAO.QueryDef On Error GoTo 0 Err.Raise vbObjectError + Public Property Let ParameterId(vdata As On Error GoTo AddErr errDuplicateParameterName, _ Long) mstrSource, mlngParameterId = vdata ' Validate the record before trying to insert the LoadResString(errDuplicateParameterName End Property record ) Call Validate End If Public Property Let IndOperation(ByVal vdata As Operation) ' Create a temporary querydef object rstParameter.Close strInsert = "insert into workspace_parameters " & qy.Close ' The valid operations are define in the _ cOperations "( workspace_id, parameter_id, " & _ Exit Sub ' class. Check if the operation is valid " parameter_name, parameter_value, " & _ Select Case vdata " description, parameter_type ) " & _ CheckDupParameterNameErr: Case QueryOp, InsertOp, UpdateOp, " values ( [w_id], [p_id], [p_name], LogErrors Errors DeleteOp [p_value], [desc], [p_type] ) " mstrSource = mstrModuleName & mintOperation = vdata Set qy = "CheckDupParameterName" mdbsStepMaster.CreateQueryDef(gstrEmptyString, On Error GoTo 0 Case Else strInsert) Err.Raise vbObjectError + On Error GoTo 0 errCheckDupParameterNameFailed, _ Err.Raise vbObjectError + ' Call a procedure to assign the parameter values mstrSource, errInvalidOperation, _ Call AssignParameters(qy) LoadResString(errCheckDupParameterNam mstrSource, eFailed) LoadResString(errInvalidOperation) qy.Execute dbFailOnError End Select qy.Close End Sub Private Sub CheckDB() End Property ' strInsert = "insert into workspace_parameters " ' Check if the database object has been Public Sub Validate() & _ initialized ' Each distinct object will have a Validate ' "( workspace_id, parameter_id, " & _ method which ' " parameter_name, parameter_value ) " & _ If mdbsStepMaster Is Nothing Then ' will check if the class properties are valid. ' " values ( " & _ On Error GoTo 0 This method ' Str(mlngWorkspaceId) & ", " & Err.Raise vbObjectError + ' will be used to check interdependant Str(mlngParameterId) & _ errInvalidDB, _ properties that ' ", " & mstrModuleName & "CheckDB", ' cannot be validated by the let procedures. mFieldValue.MakeStringFieldValid(mstrParameter LoadResString(errInvalidDB) ' It should be called by the add and modify Name) & _ End If methods of the class ' ", " & mFieldValue.MakeStringFieldValid(mstrParameter End Sub On Error GoTo ValidateErr Value) & " ) " Public Property Let ParameterValue(vdata ' mdbsStepMaster.Execute strInsert, As String) ' Check if the db object is valid dbFailOnError + dbSQLPassThrough Call CheckDB mstrParameterValue = vdata Exit Sub ' Call procedure to raise an error if the End Property parameter name AddErr: Public Property Let Description(vdata As ' already exists in the workspace - String) ' if there are duplicates, we don't know what mstrSource = mstrModuleName & "Add" value for the Call LogErrors(Errors) mstrDescription = vdata ' parameter to use at runtime On Error GoTo 0 Call CheckDupParameterName Err.Raise vbObjectError + End Property errParameterInsertFailed, _ Public Property Let ParameterType(vdata Exit Sub mstrSource, As ParameterType) LoadResString(errParameterInsertFailed) ValidateErr: mintParameterType = vdata End Sub mstrSource = mstrModuleName & Public Sub Delete() End Property "Validate" Call LogErrors(Errors) Dim strDelete As String Public Property Let ParameterName(vdata On Error GoTo 0 Dim qy As DAO.QueryDef As String) Err.Raise vbObjectError + errValidateFailed, _ On Error GoTo DeleteErr If vdata = gstrEmptyString Then mstrSource, LoadResString(errValidateFailed) ' Check if the db object is valid ShowError Call CheckDB errParameterNameMandatory End Sub On Error GoTo 0 Public Property Let WorkspaceId(vdata As strDelete = "delete from workspace_parameters " ' Propogate this error back to the caller Long) & _ Err.Raise vbObjectError + " where parameter_id = [p_id]" errParameterNameMandatory, _ mlngWorkspaceId = vdata HP TPC-H FULL DISCLOSURE REPORT 333 © 2005 Hewlett-Packard Company. All rights reserved. Set qy = Public Property Get ParameterName() As mdbsStepMaster.CreateQueryDef(gstrEmpt String Private Sub Class_Initialize() yString, strDelete) ParameterName = mstrParameterName Set mFieldValue = New cStringSM Call AssignParameters(qy) qy.Execute dbFailOnError End Property ' Initialize the operation indicator variable to Query qy.Close Public Property Get ParameterId() As Long ' It will be modified later by the collection class when Exit Sub ParameterId = mlngParameterId ' inserts, updates or deletes are performed mintOperation = QueryOp DeleteErr: End Property LogErrors Errors Public Property Get NextIdentifier() As Long End Sub mstrSource = mstrModuleName & "Delete" Dim lngNextId As Long Private Sub Class_Terminate() On Error GoTo 0 Err.Raise vbObjectError + On Error GoTo NextIdentifierErr Set mdbsStepMaster = Nothing errDeleteParameterFailed, _ Set mFieldValue = Nothing mstrSource, _ ' First check if the database object is valid Call CheckDB End Sub LoadResString(errDeleteParameterFailed) VERSION 1.0 CLASS ' Retrieve the next identifier using the BEGIN End Sub sequence class MultiUse = -1 'True Set mParameterSeq = New cSequence END Public Sub Modify() Set mParameterSeq.IdDatabase = Attribute VB_Name = "cRunColIt" mdbsStepMaster Attribute VB_GlobalNameSpace = False Dim strUpdate As String mParameterSeq.IdentifierColumn = Attribute VB_Creatable = True Dim qy As QueryDef FLD_ID_PARAMETER Attribute VB_PredeclaredId = False lngNextId = mParameterSeq.Identifier Attribute VB_Exposed = False On Error GoTo ModifyErr Set mParameterSeq = Nothing ' FILE: cRunColIt.cls ' Microsoft TPC-H Kit Ver. 1.00 ' Validate the updated values before trying NextIdentifier = lngNextId ' Copyright Microsoft, 1999 to modify the db Exit Property ' All Rights Reserved Call Validate ' NextIdentifierErr: ' ' Create a temporary querydef object with LogErrors Errors ' PURPOSE: This module implements a stack of the modify string mstrSource = mstrModuleName & Iterator nodes. strUpdate = "update "NextIdentifier" ' Ensures that only cRunItNode objects are workspace_parameters " & _ On Error GoTo 0 stored in the stack. " set workspace_id = [w_id], " & _ Err.Raise vbObjectError + errIdGetFailed, _ ' Contact: Reshma Tharamal "parameter_name = [p_name], " & _ mstrSource, ([email protected]) "parameter_value = [p_value], " & _ LoadResString(errIdGetFailed) ' "description = [desc], " & _ Option Explicit "parameter_type = [p_type] " & _ End Property " where parameter_id = [p_id]" Public Property Get IndOperation() As ' Used to indicate the source module name when Set qy = Operation errors mdbsStepMaster.CreateQueryDef(gstrEmpt ' are raised by this class yString, strUpdate) IndOperation = mintOperation Private Const mstrModuleName As String = "c RunColIt." ' Call a procedure to assign the parameter End Property Private mstrSource As String values to the ' querydef object Public Property Get WorkspaceId() As Long Private mcIterators As cStack Call AssignParameters(qy) Public Sub Clear() qy.Execute dbFailOnError WorkspaceId = mlngWorkspaceId mcIterators.Clear qy.Close End Property End Sub ' mdbsStepMaster.Execute strUpdate, Public Property Get ParameterValue() As dbFailOnError String Private Sub Class_Initialize() ' Exit Sub ParameterValue = mstrParameterValue Set mcIterators = New cStack

ModifyErr: End Property End Sub Public Property Get Description() As String mstrSource = mstrModuleName & Private Sub Class_Terminate() "Modify" Description = mstrDescription Call LogErrors(Errors) Set mcIterators = Nothing On Error GoTo 0 End Property Err.Raise vbObjectError + Public Property Get ParameterType() As End Sub errParameterUpdateFailed, _ ParameterType mstrSource, LoadResString(errParameterUpdateFailed) ParameterType = mintParameterType Public Function Value(strItName As String) As String End Sub End Property Dim lngIndex As Long HP TPC-H FULL DISCLOSURE REPORT 334 © 2005 Hewlett-Packard Company. All rights reserved. Attribute cExecStep3.VB_VarHelpID = -1 For lngIndex = 0 To mcIterators.Count - 1 ' Local variable(s) to hold property value(s) Private WithEvents cExecStep4 As cRunStep If mcIterators(lngIndex).IteratorName Private mstrRootKey As String Attribute cExecStep4.VB_VarHelpID = -1 = strItName Then Public WspId As Long Private WithEvents cExecStep5 As cRunStep Value = mcIterators(lngIndex).Value Private mcParameters As cArrParameters Attribute cExecStep5.VB_VarHelpID = -1 Exit For Private mcRunSteps As cArrSteps Private WithEvents cExecStep6 As cRunStep End If Private mcRunConstraints As cArrConstraints Attribute cExecStep6.VB_VarHelpID = -1 Next lngIndex Public RunConnections As cConnections Private WithEvents cExecStep7 As cRunStep Public RunConnDtls As cConnDtls Attribute cExecStep7.VB_VarHelpID = -1 End Function Private mcvntWspPreCons As Variant Private WithEvents cExecStep8 As cRunStep Private mcvntWspPostCons As Variant Attribute cExecStep8.VB_VarHelpID = -1 Public Property Get Item(ByVal Position As Private mcNavSteps As cStepTree Private WithEvents cExecStep9 As cRunStep Long) As cRunItNode Attribute cExecStep9.VB_VarHelpID = -1 Attribute Item.VB_UserMemId = 0 Private mcInstances As cInstances Private mcFreeSteps As cVectorLng Private WithEvents cExecStep10 As cRunStep Set Item = mcIterators(Position) Private mcFailures As cFailedSteps Attribute cExecStep10.VB_VarHelpID = -1 Private mblnAsk As Boolean ' Set to True Private WithEvents cExecStep11 As cRunStep End Property when the a step with continuation criteria=Ask Attribute cExecStep11.VB_VarHelpID = -1 fails Private WithEvents cExecStep12 As cRunStep Private mblnAbort As Boolean ' Set to True Attribute cExecStep12.VB_VarHelpID = -1 Public Function Count() As Long when the run is aborted Private WithEvents cExecStep13 As cRunStep Private msAbortDtls As String Attribute cExecStep13.VB_VarHelpID = -1 Count = mcIterators.Count Private mbarrFree() As Byte Private WithEvents cExecStep14 As cRunStep Private WithEvents mcTermSteps As Attribute cExecStep14.VB_VarHelpID = -1 End Function cTermSteps Private WithEvents cExecStep15 As cRunStep Attribute mcTermSteps.VB_VarHelpID = -1 Attribute cExecStep15.VB_VarHelpID = -1 Public Function Pop() As cRunItNode Public RunId As Long Private WithEvents cExecStep16 As cRunStep Public CreateInputFiles As Boolean Attribute cExecStep16.VB_VarHelpID = -1 Set Pop = mcIterators.Pop Private Enum WspLogEvents Private WithEvents cExecStep17 As cRunStep mintRunStart Attribute cExecStep17.VB_VarHelpID = -1 End Function mintRunComplete Private WithEvents cExecStep18 As cRunStep mintStepStart Attribute cExecStep18.VB_VarHelpID = -1 Public Sub Push(objToPush As mintStepComplete Private WithEvents cExecStep19 As cRunStep cRunItNode) End Enum Attribute cExecStep19.VB_VarHelpID = -1

Call mcIterators.Push(objToPush) Private mcWspLog As cFileSM Private WithEvents cExecStep20 As cRunStep Private mstrCurBranchRoot As String Attribute cExecStep20.VB_VarHelpID = -1 End Sub Private mcDummyRootInstance As cInstance Private WithEvents cExecStep21 As cRunStep ' Key for the dummy root instance - Should be Attribute cExecStep21.VB_VarHelpID = -1 a key that is invalid for an actual step record Private WithEvents cExecStep22 As cRunStep VERSION 1.0 CLASS Private Const mstrDummyRootKey As String Attribute cExecStep22.VB_VarHelpID = -1 BEGIN = "D" Private WithEvents cExecStep23 As cRunStep MultiUse = -1 'True ' Public events to notify the calling function of Attribute cExecStep23.VB_VarHelpID = -1 Persistable = 0 'NotPersistable the Private WithEvents cExecStep24 As cRunStep DataBindingBehavior = 0 'vbNone ' start and end time for each step Attribute cExecStep24.VB_VarHelpID = -1 DataSourceBehavior = 0 'vbNone Public Event RunStart(dtmStartTime As Private WithEvents cExecStep25 As cRunStep MTSTransactionMode = 0 Currency, strWspLog As String) Attribute cExecStep25.VB_VarHelpID = -1 'NotAnMTSObject Public Event RunComplete(dtmEndTime As Private WithEvents cExecStep26 As cRunStep END Currency) Attribute cExecStep26.VB_VarHelpID = -1 Attribute VB_Name = "cRunInst" Public Event StepStart(cStepRecord As cStep, Private WithEvents cExecStep27 As cRunStep Attribute VB_GlobalNameSpace = False dtmStartTime As Currency, _ Attribute cExecStep27.VB_VarHelpID = -1 Attribute VB_Creatable = True lngInstanceId As Long, lParentInstanceId Private WithEvents cExecStep28 As cRunStep Attribute VB_PredeclaredId = False As Long, sPath As String, _ Attribute cExecStep28.VB_VarHelpID = -1 Attribute VB_Exposed = False sIts As String, sItValue As String) Private WithEvents cExecStep29 As cRunStep ' FILE: cRunColIt.cls Public Event StepComplete(cStepRecord As Attribute cExecStep29.VB_VarHelpID = -1 ' Microsoft TPC-H Kit Ver. 1.00 cStep, dtmEndTime As Currency, ' Copyright Microsoft, 1999 lngInstanceId As Long, lElapsed As Long) Private WithEvents cExecStep30 As cRunStep ' All Rights Reserved Public Event ProcessStart(cStepRecord As Attribute cExecStep30.VB_VarHelpID = -1 ' cStep, strCommand As String, _ Private WithEvents cExecStep31 As cRunStep ' dtmStartTime As Currency, lngInstanceId Attribute cExecStep31.VB_VarHelpID = -1 ' PURPOSE: This module controls the As Long, lParentInstanceId As Long, _ Private WithEvents cExecStep32 As cRunStep run processing. It runs a branch sItValue As String) Attribute cExecStep32.VB_VarHelpID = -1 ' at a time and raises events when Public Event ProcessComplete(cStepRecord Private WithEvents cExecStep33 As cRunStep each step completes execution. As cStep, dtmEndTime As Currency, Attribute cExecStep33.VB_VarHelpID = -1 ' Contact: Reshma Tharamal lngInstanceId As Long, lElapsed As Long) Private WithEvents cExecStep34 As cRunStep ([email protected]) ' The class that will execute each step - we trap Attribute cExecStep34.VB_VarHelpID = -1 ' the events Private WithEvents cExecStep35 As cRunStep Option Explicit ' that are raised by it when a step Attribute cExecStep35.VB_VarHelpID = -1 starts/completes Private WithEvents cExecStep36 As cRunStep ' Used to indicate the source module name ' execution Attribute cExecStep36.VB_VarHelpID = -1 when errors Private WithEvents cExecStep1 As cRunStep Private WithEvents cExecStep37 As cRunStep ' are raised by this class Attribute cExecStep1.VB_VarHelpID = -1 Attribute cExecStep37.VB_VarHelpID = -1 Private Const mstrModuleName As String = Private WithEvents cExecStep2 As cRunStep Private WithEvents cExecStep38 As cRunStep "c RunInst." Attribute cExecStep2.VB_VarHelpID = -1 Attribute cExecStep38.VB_VarHelpID = -1 Private mstrSource As String Private WithEvents cExecStep3 As cRunStep Private WithEvents cExecStep39 As cRunStep HP TPC-H FULL DISCLOSURE REPORT 335 © 2005 Hewlett-Packard Company. All rights reserved. Attribute cExecStep39.VB_VarHelpID = -1 Attribute cExecStep63.VB_VarHelpID = -1 Attribute cExecStep99.VB_VarHelpID = -1 Private WithEvents cExecStep64 As cRunStep Private WithEvents cExecStep40 As Attribute cExecStep64.VB_VarHelpID = -1 Private Const msIt As String = " Iterator: " cRunStep Private WithEvents cExecStep65 As cRunStep Private Const msItValue As String = " Value: " Attribute cExecStep40.VB_VarHelpID = -1 Attribute cExecStep65.VB_VarHelpID = -1 Public Sub Abort() Private WithEvents cExecStep41 As Private WithEvents cExecStep66 As cRunStep cRunStep Attribute cExecStep66.VB_VarHelpID = -1 On Error GoTo AbortErr Attribute cExecStep41.VB_VarHelpID = -1 Private WithEvents cExecStep67 As cRunStep Private WithEvents cExecStep42 As Attribute cExecStep67.VB_VarHelpID = -1 ' Make sure that we don't execute any more steps cRunStep Private WithEvents cExecStep68 As cRunStep Call StopRun Attribute cExecStep42.VB_VarHelpID = -1 Attribute cExecStep68.VB_VarHelpID = -1 Private WithEvents cExecStep43 As Private WithEvents cExecStep69 As cRunStep If cExecStep1 Is Nothing And cExecStep2 Is cRunStep Attribute cExecStep69.VB_VarHelpID = -1 Nothing And cExecStep3 Is Nothing And Attribute cExecStep43.VB_VarHelpID = -1 cExecStep4 Is Nothing And cExecStep5 Is Nothing Private WithEvents cExecStep44 As Private WithEvents cExecStep70 As cRunStep And cExecStep6 Is Nothing And cExecStep7 Is cRunStep Attribute cExecStep70.VB_VarHelpID = -1 Nothing And cExecStep8 Is Nothing And Attribute cExecStep44.VB_VarHelpID = -1 Private WithEvents cExecStep71 As cRunStep cExecStep9 Is Nothing And _ Private WithEvents cExecStep45 As Attribute cExecStep71.VB_VarHelpID = -1 cExecStep10 Is Nothing And cExecStep11 Is cRunStep Private WithEvents cExecStep72 As cRunStep Nothing And cExecStep12 Is Nothing And Attribute cExecStep45.VB_VarHelpID = -1 Attribute cExecStep72.VB_VarHelpID = -1 cExecStep13 Is Nothing And cExecStep14 Is Private WithEvents cExecStep46 As Private WithEvents cExecStep73 As cRunStep Nothing And cExecStep15 Is Nothing And cRunStep Attribute cExecStep73.VB_VarHelpID = -1 cExecStep16 Is Nothing And cExecStep17 Is Attribute cExecStep46.VB_VarHelpID = -1 Private WithEvents cExecStep74 As cRunStep Nothing And cExecStep18 Is Nothing And Private WithEvents cExecStep47 As Attribute cExecStep74.VB_VarHelpID = -1 cExecStep19 Is Nothing And _ cRunStep Private WithEvents cExecStep75 As cRunStep cExecStep20 Is Nothing And cExecStep21 Is Attribute cExecStep47.VB_VarHelpID = -1 Attribute cExecStep75.VB_VarHelpID = -1 Nothing And cExecStep22 Is Nothing And Private WithEvents cExecStep48 As Private WithEvents cExecStep76 As cRunStep cExecStep23 Is Nothing And cExecStep24 Is cRunStep Attribute cExecStep76.VB_VarHelpID = -1 Nothing And cExecStep25 Is Nothing And Attribute cExecStep48.VB_VarHelpID = -1 Private WithEvents cExecStep77 As cRunStep cExecStep26 Is Nothing And cExecStep27 Is Private WithEvents cExecStep49 As Attribute cExecStep77.VB_VarHelpID = -1 Nothing And cExecStep28 Is Nothing And cRunStep Private WithEvents cExecStep78 As cRunStep cExecStep29 Is Nothing And _ Attribute cExecStep49.VB_VarHelpID = -1 Attribute cExecStep78.VB_VarHelpID = -1 cExecStep30 Is Nothing And cExecStep31 Is Private WithEvents cExecStep79 As cRunStep Nothing And cExecStep32 Is Nothing And Private WithEvents cExecStep50 As Attribute cExecStep79.VB_VarHelpID = -1 cExecStep33 Is Nothing And cExecStep34 Is cRunStep Nothing And cExecStep35 Is Nothing And Attribute cExecStep50.VB_VarHelpID = -1 Private WithEvents cExecStep80 As cRunStep cExecStep36 Is Nothing And cExecStep37 Is Private WithEvents cExecStep51 As Attribute cExecStep80.VB_VarHelpID = -1 Nothing And cExecStep38 Is Nothing And cRunStep Private WithEvents cExecStep81 As cRunStep cExecStep39 Is Nothing And _ Attribute cExecStep51.VB_VarHelpID = -1 Attribute cExecStep81.VB_VarHelpID = -1 cExecStep40 Is Nothing And cExecStep41 Is Private WithEvents cExecStep52 As Private WithEvents cExecStep82 As cRunStep Nothing And cExecStep42 Is Nothing And cRunStep Attribute cExecStep82.VB_VarHelpID = -1 cExecStep43 Is Nothing And cExecStep44 Is Attribute cExecStep52.VB_VarHelpID = -1 Private WithEvents cExecStep83 As cRunStep Nothing And cExecStep45 Is Nothing And Private WithEvents cExecStep53 As Attribute cExecStep83.VB_VarHelpID = -1 cExecStep46 Is Nothing And cExecStep47 Is cRunStep Private WithEvents cExecStep84 As cRunStep Nothing And cExecStep48 Is Nothing And Attribute cExecStep53.VB_VarHelpID = -1 Attribute cExecStep84.VB_VarHelpID = -1 cExecStep49 Is Nothing And _ Private WithEvents cExecStep54 As Private WithEvents cExecStep85 As cRunStep cExecStep50 Is Nothing And cExecStep51 Is cRunStep Attribute cExecStep85.VB_VarHelpID = -1 Nothing And cExecStep52 Is Nothing And Attribute cExecStep54.VB_VarHelpID = -1 Private WithEvents cExecStep86 As cRunStep cExecStep53 Is Nothing And cExecStep54 Is Private WithEvents cExecStep55 As Attribute cExecStep86.VB_VarHelpID = -1 Nothing And cExecStep55 Is Nothing And cRunStep Private WithEvents cExecStep87 As cRunStep cExecStep56 Is Nothing And cExecStep57 Is Attribute cExecStep55.VB_VarHelpID = -1 Attribute cExecStep87.VB_VarHelpID = -1 Nothing And cExecStep58 Is Nothing And Private WithEvents cExecStep56 As Private WithEvents cExecStep88 As cRunStep cExecStep59 Is Nothing And _ cRunStep Attribute cExecStep88.VB_VarHelpID = -1 cExecStep60 Is Nothing And cExecStep61 Is Attribute cExecStep56.VB_VarHelpID = -1 Private WithEvents cExecStep89 As cRunStep Nothing And cExecStep62 Is Nothing And Private WithEvents cExecStep57 As Attribute cExecStep89.VB_VarHelpID = -1 cExecStep63 Is Nothing And cExecStep64 Is cRunStep Nothing And cExecStep65 Is Nothing And Attribute cExecStep57.VB_VarHelpID = -1 Private WithEvents cExecStep90 As cRunStep cExecStep66 Is Nothing And cExecStep67 Is Private WithEvents cExecStep58 As Attribute cExecStep90.VB_VarHelpID = -1 Nothing And cExecStep68 Is Nothing And cRunStep Private WithEvents cExecStep91 As cRunStep cExecStep69 Is Nothing And _ Attribute cExecStep58.VB_VarHelpID = -1 Attribute cExecStep91.VB_VarHelpID = -1 cExecStep70 Is Nothing And cExecStep71 Is Private WithEvents cExecStep59 As Private WithEvents cExecStep92 As cRunStep Nothing And cExecStep72 Is Nothing And cRunStep Attribute cExecStep92.VB_VarHelpID = -1 cExecStep73 Is Nothing And cExecStep74 Is Attribute cExecStep59.VB_VarHelpID = -1 Private WithEvents cExecStep93 As cRunStep Nothing And cExecStep75 Is Nothing And Attribute cExecStep93.VB_VarHelpID = -1 cExecStep76 Is Nothing And cExecStep77 Is Private WithEvents cExecStep60 As Private WithEvents cExecStep94 As cRunStep Nothing And cExecStep78 Is Nothing And cRunStep Attribute cExecStep94.VB_VarHelpID = -1 cExecStep79 Is Nothing And _ Attribute cExecStep60.VB_VarHelpID = -1 Private WithEvents cExecStep95 As cRunStep cExecStep80 Is Nothing And cExecStep81 Is Private WithEvents cExecStep61 As Attribute cExecStep95.VB_VarHelpID = -1 Nothing And cExecStep82 Is Nothing And cRunStep Private WithEvents cExecStep96 As cRunStep cExecStep83 Is Nothing And cExecStep84 Is Attribute cExecStep61.VB_VarHelpID = -1 Attribute cExecStep96.VB_VarHelpID = -1 Nothing And cExecStep85 Is Nothing And Private WithEvents cExecStep62 As Private WithEvents cExecStep97 As cRunStep cExecStep86 Is Nothing And cExecStep87 Is cRunStep Attribute cExecStep97.VB_VarHelpID = -1 Nothing And cExecStep88 Is Nothing And Attribute cExecStep62.VB_VarHelpID = -1 Private WithEvents cExecStep98 As cRunStep cExecStep89 Is Nothing And _ Private WithEvents cExecStep63 As Attribute cExecStep98.VB_VarHelpID = -1 cExecStep90 Is Nothing And cExecStep91 Is cRunStep Private WithEvents cExecStep99 As cRunStep Nothing And cExecStep92 Is Nothing And HP TPC-H FULL DISCLOSURE REPORT 336 © 2005 Hewlett-Packard Company. All rights reserved. cExecStep93 Is Nothing And cExecStep94 End If Is Nothing And cExecStep95 Is Nothing If Not cExecStep38 Is Nothing Then And cExecStep96 Is Nothing And If Not cExecStep20 Is Nothing Then cExecStep38.Abort cExecStep97 Is Nothing And cExecStep98 cExecStep20.Abort End If Is Nothing And cExecStep99 Is Nothing End If Then If Not cExecStep39 Is Nothing Then ' Then... If Not cExecStep21 Is Nothing Then cExecStep39.Abort WriteToWspLog (mintRunComplete) cExecStep21.Abort End If RaiseEvent End If RunComplete(Determine64BitTime()) ' ======40 - 49 Else If Not cExecStep22 Is Nothing Then ======' Abort each of the steps that is cExecStep22.Abort If Not cExecStep40 Is Nothing Then currently executing. End If cExecStep40.Abort If Not cExecStep1 Is Nothing Then End If cExecStep1.Abort If Not cExecStep23 Is Nothing Then End If cExecStep23.Abort If Not cExecStep41 Is Nothing Then If Not cExecStep2 Is Nothing Then End If cExecStep41.Abort cExecStep2.Abort End If End If If Not cExecStep24 Is Nothing Then If Not cExecStep3 Is Nothing Then cExecStep24.Abort If Not cExecStep42 Is Nothing Then cExecStep3.Abort End If cExecStep42.Abort End If End If If Not cExecStep4 Is Nothing Then If Not cExecStep25 Is Nothing Then cExecStep4.Abort cExecStep25.Abort If Not cExecStep43 Is Nothing Then End If End If cExecStep43.Abort If Not cExecStep5 Is Nothing Then End If cExecStep5.Abort If Not cExecStep26 Is Nothing Then End If cExecStep26.Abort If Not cExecStep44 Is Nothing Then If Not cExecStep6 Is Nothing Then End If cExecStep44.Abort cExecStep6.Abort End If End If If Not cExecStep27 Is Nothing Then If Not cExecStep7 Is Nothing Then cExecStep27.Abort If Not cExecStep45 Is Nothing Then cExecStep7.Abort End If cExecStep45.Abort End If End If If Not cExecStep8 Is Nothing Then If Not cExecStep28 Is Nothing Then cExecStep8.Abort cExecStep28.Abort If Not cExecStep46 Is Nothing Then End If End If cExecStep46.Abort If Not cExecStep9 Is Nothing Then End If cExecStep9.Abort If Not cExecStep29 Is Nothing Then End If cExecStep29.Abort If Not cExecStep47 Is Nothing Then If Not cExecStep10 Is Nothing Then End If cExecStep47.Abort cExecStep10.Abort End If End If ' ======30 - 39 If Not cExecStep11 Is Nothing Then ======If Not cExecStep48 Is Nothing Then cExecStep11.Abort If Not cExecStep30 Is Nothing Then cExecStep48.Abort End If cExecStep30.Abort End If If Not cExecStep12 Is Nothing Then End If cExecStep12.Abort If Not cExecStep49 Is Nothing Then End If If Not cExecStep31 Is Nothing Then cExecStep49.Abort If Not cExecStep13 Is Nothing Then cExecStep31.Abort End If cExecStep13.Abort End If End If ' ======50 - 59 If Not cExecStep32 Is Nothing Then ======If Not cExecStep14 Is Nothing Then cExecStep32.Abort If Not cExecStep50 Is Nothing Then cExecStep14.Abort End If cExecStep50.Abort End If End If If Not cExecStep33 Is Nothing Then If Not cExecStep15 Is Nothing Then cExecStep33.Abort If Not cExecStep51 Is Nothing Then cExecStep15.Abort End If cExecStep51.Abort End If End If If Not cExecStep34 Is Nothing Then If Not cExecStep16 Is Nothing Then cExecStep34.Abort If Not cExecStep52 Is Nothing Then cExecStep16.Abort End If cExecStep52.Abort End If End If If Not cExecStep35 Is Nothing Then If Not cExecStep17 Is Nothing Then cExecStep35.Abort If Not cExecStep53 Is Nothing Then cExecStep17.Abort End If cExecStep53.Abort End If End If If Not cExecStep36 Is Nothing Then If Not cExecStep18 Is Nothing Then cExecStep36.Abort If Not cExecStep54 Is Nothing Then cExecStep18.Abort End If cExecStep54.Abort End If End If If Not cExecStep37 Is Nothing Then If Not cExecStep19 Is Nothing Then cExecStep37.Abort If Not cExecStep55 Is Nothing Then cExecStep19.Abort End If cExecStep55.Abort HP TPC-H FULL DISCLOSURE REPORT 337 © 2005 Hewlett-Packard Company. All rights reserved. End If cExecStep73.Abort If Not cExecStep91 Is Nothing Then End If cExecStep91.Abort If Not cExecStep56 Is Nothing Then End If cExecStep56.Abort If Not cExecStep74 Is Nothing Then End If cExecStep74.Abort If Not cExecStep92 Is Nothing Then End If cExecStep92.Abort If Not cExecStep57 Is Nothing Then End If cExecStep57.Abort If Not cExecStep75 Is Nothing Then End If cExecStep75.Abort If Not cExecStep93 Is Nothing Then End If cExecStep93.Abort If Not cExecStep58 Is Nothing Then End If cExecStep58.Abort If Not cExecStep76 Is Nothing Then End If cExecStep76.Abort If Not cExecStep94 Is Nothing Then End If cExecStep94.Abort If Not cExecStep59 Is Nothing Then End If cExecStep59.Abort If Not cExecStep77 Is Nothing Then End If cExecStep77.Abort If Not cExecStep95 Is Nothing Then End If cExecStep95.Abort ' ======60 - 69 End If ======If Not cExecStep78 Is Nothing Then If Not cExecStep60 Is Nothing Then cExecStep78.Abort If Not cExecStep96 Is Nothing Then cExecStep60.Abort End If cExecStep96.Abort End If End If If Not cExecStep79 Is Nothing Then If Not cExecStep61 Is Nothing Then cExecStep79.Abort If Not cExecStep97 Is Nothing Then cExecStep61.Abort End If cExecStep97.Abort End If End If ' ======80 - 89 If Not cExecStep62 Is Nothing Then ======If Not cExecStep98 Is Nothing Then cExecStep62.Abort If Not cExecStep80 Is Nothing Then cExecStep98.Abort End If cExecStep80.Abort End If End If If Not cExecStep63 Is Nothing Then If Not cExecStep99 Is Nothing Then cExecStep63.Abort If Not cExecStep81 Is Nothing Then cExecStep99.Abort End If cExecStep81.Abort End If End If If Not cExecStep64 Is Nothing Then End If cExecStep64.Abort If Not cExecStep82 Is Nothing Then End If cExecStep82.Abort Exit Sub End If If Not cExecStep65 Is Nothing Then AbortErr: cExecStep65.Abort If Not cExecStep83 Is Nothing Then Call LogErrors(Errors) End If cExecStep83.Abort On Error GoTo 0 End If ShowError errAbortFailed If Not cExecStep66 Is Nothing Then ' Try to abort the remaining steps, if any cExecStep66.Abort If Not cExecStep84 Is Nothing Then Resume Next End If cExecStep84.Abort End If End Sub If Not cExecStep67 Is Nothing Then Public Sub AbortSiblings(cTermInstance As cExecStep67.Abort If Not cExecStep85 Is Nothing Then cInstance) End If cExecStep85.Abort End If On Error GoTo AbortSiblingsErr If Not cExecStep68 Is Nothing Then cExecStep68.Abort If Not cExecStep86 Is Nothing Then ' Abort each of the steps that is currently End If cExecStep86.Abort executing. End If If Not cExecStep1 Is Nothing Then If Not cExecStep69 Is Nothing Then If cExecStep1.ExecuteStep.ParentStepId = cExecStep69.Abort If Not cExecStep87 Is Nothing Then cTermInstance.Step.ParentStepId Then End If cExecStep87.Abort cExecStep1.Abort End If End If ' ======70 - 79 End If ======If Not cExecStep88 Is Nothing Then If Not cExecStep70 Is Nothing Then cExecStep88.Abort If Not cExecStep2 Is Nothing Then cExecStep70.Abort End If If cExecStep2.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep89 Is Nothing Then cExecStep2.Abort If Not cExecStep71 Is Nothing Then cExecStep89.Abort End If cExecStep71.Abort End If End If End If ' ======90 - 99 If Not cExecStep3 Is Nothing Then If Not cExecStep72 Is Nothing Then ======If cExecStep3.ExecuteStep.ParentStepId = cExecStep72.Abort If Not cExecStep90 Is Nothing Then cTermInstance.Step.ParentStepId Then End If cExecStep90.Abort cExecStep3.Abort End If End If If Not cExecStep73 Is Nothing Then End If HP TPC-H FULL DISCLOSURE REPORT 338 © 2005 Hewlett-Packard Company. All rights reserved. If cExecStep13.ExecuteStep.ParentStepId If Not cExecStep4 Is Nothing Then = cTermInstance.Step.ParentStepId Then If Not cExecStep24 Is Nothing Then If cExecStep13.Abort If cExecStep24.ExecuteStep.ParentStepId = cExecStep4.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then End If cExecStep24.Abort cExecStep4.Abort End If End If If Not cExecStep14 Is Nothing Then End If End If If cExecStep14.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then If Not cExecStep25 Is Nothing Then If Not cExecStep5 Is Nothing Then cExecStep14.Abort If cExecStep25.ExecuteStep.ParentStepId = If End If cTermInstance.Step.ParentStepId Then cExecStep5.ExecuteStep.ParentStepId = End If cExecStep25.Abort cTermInstance.Step.ParentStepId Then End If cExecStep5.Abort If Not cExecStep15 Is Nothing Then End If End If If cExecStep15.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then If Not cExecStep26 Is Nothing Then cExecStep15.Abort If cExecStep26.ExecuteStep.ParentStepId = If Not cExecStep6 Is Nothing Then End If cTermInstance.Step.ParentStepId Then If End If cExecStep26.Abort cExecStep6.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep16 Is Nothing Then End If cExecStep6.Abort If cExecStep16.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then If Not cExecStep27 Is Nothing Then End If cExecStep16.Abort If cExecStep27.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep7 Is Nothing Then End If cExecStep27.Abort If End If cExecStep7.ExecuteStep.ParentStepId = If Not cExecStep17 Is Nothing Then End If cTermInstance.Step.ParentStepId Then If cExecStep17.ExecuteStep.ParentStepId cExecStep7.Abort = cTermInstance.Step.ParentStepId Then If Not cExecStep28 Is Nothing Then End If cExecStep17.Abort If cExecStep28.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then End If cExecStep28.Abort If Not cExecStep8 Is Nothing Then End If If If Not cExecStep18 Is Nothing Then End If cExecStep8.ExecuteStep.ParentStepId = If cExecStep18.ExecuteStep.ParentStepId cTermInstance.Step.ParentStepId Then = cTermInstance.Step.ParentStepId Then If Not cExecStep29 Is Nothing Then cExecStep8.Abort cExecStep18.Abort If cExecStep29.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then End If End If cExecStep29.Abort End If If Not cExecStep9 Is Nothing Then If Not cExecStep19 Is Nothing Then End If If If cExecStep19.ExecuteStep.ParentStepId cExecStep9.ExecuteStep.ParentStepId = = cTermInstance.Step.ParentStepId Then ' ======30 ======cTermInstance.Step.ParentStepId Then cExecStep19.Abort If Not cExecStep30 Is Nothing Then cExecStep9.Abort End If If cExecStep30.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then End If cExecStep30.Abort If Not cExecStep20 Is Nothing Then End If If Not cExecStep10 Is Nothing Then If cExecStep20.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then cExecStep10.ExecuteStep.ParentStepId = cExecStep20.Abort If Not cExecStep31 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep31.ExecuteStep.ParentStepId = cExecStep10.Abort End If cTermInstance.Step.ParentStepId Then End If cExecStep31.Abort End If If Not cExecStep21 Is Nothing Then End If If cExecStep21.ExecuteStep.ParentStepId End If If Not cExecStep11 Is Nothing Then = cTermInstance.Step.ParentStepId Then If cExecStep21.Abort If Not cExecStep32 Is Nothing Then cExecStep11.ExecuteStep.ParentStepId = End If If cExecStep32.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep11.Abort cExecStep32.Abort End If If Not cExecStep22 Is Nothing Then End If End If If cExecStep22.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then If Not cExecStep12 Is Nothing Then cExecStep22.Abort If Not cExecStep33 Is Nothing Then If End If If cExecStep33.ExecuteStep.ParentStepId = cExecStep12.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep33.Abort cExecStep12.Abort If Not cExecStep23 Is Nothing Then End If End If If cExecStep23.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then cExecStep23.Abort If Not cExecStep34 Is Nothing Then If Not cExecStep13 Is Nothing Then End If If cExecStep34.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then HP TPC-H FULL DISCLOSURE REPORT 339 © 2005 Hewlett-Packard Company. All rights reserved. cExecStep34.Abort End If If Not cExecStep54 Is Nothing Then End If End If If cExecStep54.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep44 Is Nothing Then cExecStep54.Abort If Not cExecStep35 Is Nothing Then If cExecStep44.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep35.ExecuteStep.ParentStepId = cExecStep44.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep55 Is Nothing Then cExecStep35.Abort End If If cExecStep55.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then End If If Not cExecStep45 Is Nothing Then cExecStep55.Abort If cExecStep45.ExecuteStep.ParentStepId End If If Not cExecStep36 Is Nothing Then = cTermInstance.Step.ParentStepId Then End If If cExecStep45.Abort cExecStep36.ExecuteStep.ParentStepId = End If If Not cExecStep56 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep56.ExecuteStep.ParentStepId = cExecStep36.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep46 Is Nothing Then cExecStep56.Abort End If If cExecStep46.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then End If If Not cExecStep37 Is Nothing Then cExecStep46.Abort If End If If Not cExecStep57 Is Nothing Then cExecStep37.ExecuteStep.ParentStepId = End If If cExecStep57.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep37.Abort If Not cExecStep47 Is Nothing Then cExecStep57.Abort End If If cExecStep47.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If cExecStep47.Abort If Not cExecStep38 Is Nothing Then End If If Not cExecStep58 Is Nothing Then If End If If cExecStep58.ExecuteStep.ParentStepId = cExecStep38.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then If Not cExecStep48 Is Nothing Then cExecStep58.Abort cExecStep38.Abort If cExecStep48.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If End If cExecStep48.Abort End If If Not cExecStep59 Is Nothing Then If Not cExecStep39 Is Nothing Then End If If cExecStep59.ExecuteStep.ParentStepId = If cTermInstance.Step.ParentStepId Then cExecStep39.ExecuteStep.ParentStepId = If Not cExecStep49 Is Nothing Then cExecStep59.Abort cTermInstance.Step.ParentStepId Then If cExecStep49.ExecuteStep.ParentStepId End If cExecStep39.Abort = cTermInstance.Step.ParentStepId Then End If End If cExecStep49.Abort End If End If ' ======60 ======End If If Not cExecStep60 Is Nothing Then ' ======40 If cExecStep60.ExecuteStep.ParentStepId ======' ======50 cTermInstance.Step.ParentStepId Then If Not cExecStep40 Is Nothing Then ======cExecStep60.Abort If If Not cExecStep50 Is Nothing Then End If cExecStep40.ExecuteStep.ParentStepId = If cExecStep50.ExecuteStep.ParentStepId End If cTermInstance.Step.ParentStepId Then = cTermInstance.Step.ParentStepId Then cExecStep40.Abort cExecStep50.Abort If Not cExecStep61 Is Nothing Then End If End If If cExecStep61.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then cExecStep61.Abort If Not cExecStep41 Is Nothing Then If Not cExecStep51 Is Nothing Then End If If If cExecStep51.ExecuteStep.ParentStepId End If cExecStep41.ExecuteStep.ParentStepId = = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep51.Abort If Not cExecStep62 Is Nothing Then cExecStep41.Abort End If If cExecStep62.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then End If cExecStep62.Abort If Not cExecStep52 Is Nothing Then End If If Not cExecStep42 Is Nothing Then If cExecStep52.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then cExecStep42.ExecuteStep.ParentStepId = cExecStep52.Abort If Not cExecStep63 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep63.ExecuteStep.ParentStepId = cExecStep42.Abort End If cTermInstance.Step.ParentStepId Then End If cExecStep63.Abort End If If Not cExecStep53 Is Nothing Then End If If cExecStep53.ExecuteStep.ParentStepId End If If Not cExecStep43 Is Nothing Then = cTermInstance.Step.ParentStepId Then If cExecStep53.Abort If Not cExecStep64 Is Nothing Then cExecStep43.ExecuteStep.ParentStepId = End If If cExecStep64.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep43.Abort cExecStep64.Abort HP TPC-H FULL DISCLOSURE REPORT 340 © 2005 Hewlett-Packard Company. All rights reserved. End If End If If cExecStep84.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then If Not cExecStep74 Is Nothing Then cExecStep84.Abort If Not cExecStep65 Is Nothing Then If cExecStep74.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then End If cExecStep65.ExecuteStep.ParentStepId = cExecStep74.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep85 Is Nothing Then cExecStep65.Abort End If If cExecStep85.ExecuteStep.ParentStepId = End If cTermInstance.Step.ParentStepId Then End If If Not cExecStep75 Is Nothing Then cExecStep85.Abort If cExecStep75.ExecuteStep.ParentStepId End If If Not cExecStep66 Is Nothing Then = cTermInstance.Step.ParentStepId Then End If If cExecStep75.Abort cExecStep66.ExecuteStep.ParentStepId = End If If Not cExecStep86 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep86.ExecuteStep.ParentStepId = cExecStep66.Abort cTermInstance.Step.ParentStepId Then End If If Not cExecStep76 Is Nothing Then cExecStep86.Abort End If If cExecStep76.ExecuteStep.ParentStepId End If = cTermInstance.Step.ParentStepId Then End If If Not cExecStep67 Is Nothing Then cExecStep76.Abort If End If If Not cExecStep87 Is Nothing Then cExecStep67.ExecuteStep.ParentStepId = End If If cExecStep87.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep67.Abort If Not cExecStep77 Is Nothing Then cExecStep87.Abort End If If cExecStep77.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If cExecStep77.Abort If Not cExecStep68 Is Nothing Then End If If Not cExecStep88 Is Nothing Then If End If If cExecStep88.ExecuteStep.ParentStepId = cExecStep68.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then If Not cExecStep78 Is Nothing Then cExecStep88.Abort cExecStep68.Abort If cExecStep78.ExecuteStep.ParentStepId End If End If = cTermInstance.Step.ParentStepId Then End If End If cExecStep78.Abort End If If Not cExecStep89 Is Nothing Then If Not cExecStep69 Is Nothing Then End If If cExecStep89.ExecuteStep.ParentStepId = If cTermInstance.Step.ParentStepId Then cExecStep69.ExecuteStep.ParentStepId = If Not cExecStep79 Is Nothing Then cExecStep89.Abort cTermInstance.Step.ParentStepId Then If cExecStep79.ExecuteStep.ParentStepId End If cExecStep69.Abort = cTermInstance.Step.ParentStepId Then End If End If cExecStep79.Abort End If End If ' ======90 ======End If If Not cExecStep90 Is Nothing Then ' ======70 If cExecStep90.ExecuteStep.ParentStepId ======' ======80 cTermInstance.Step.ParentStepId Then If Not cExecStep70 Is Nothing Then ======cExecStep90.Abort If If Not cExecStep80 Is Nothing Then End If cExecStep70.ExecuteStep.ParentStepId = If cExecStep80.ExecuteStep.ParentStepId End If cTermInstance.Step.ParentStepId Then = cTermInstance.Step.ParentStepId Then cExecStep70.Abort cExecStep80.Abort If Not cExecStep91 Is Nothing Then End If End If If cExecStep91.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then cExecStep91.Abort If Not cExecStep71 Is Nothing Then If Not cExecStep81 Is Nothing Then End If If If cExecStep81.ExecuteStep.ParentStepId End If cExecStep71.ExecuteStep.ParentStepId = = cTermInstance.Step.ParentStepId Then cTermInstance.Step.ParentStepId Then cExecStep81.Abort If Not cExecStep92 Is Nothing Then cExecStep71.Abort End If If cExecStep92.ExecuteStep.ParentStepId = End If End If cTermInstance.Step.ParentStepId Then End If cExecStep92.Abort If Not cExecStep82 Is Nothing Then End If If Not cExecStep72 Is Nothing Then If cExecStep82.ExecuteStep.ParentStepId End If If = cTermInstance.Step.ParentStepId Then cExecStep72.ExecuteStep.ParentStepId = cExecStep82.Abort If Not cExecStep93 Is Nothing Then cTermInstance.Step.ParentStepId Then End If If cExecStep93.ExecuteStep.ParentStepId = cExecStep72.Abort End If cTermInstance.Step.ParentStepId Then End If cExecStep93.Abort End If If Not cExecStep83 Is Nothing Then End If If cExecStep83.ExecuteStep.ParentStepId End If If Not cExecStep73 Is Nothing Then = cTermInstance.Step.ParentStepId Then If cExecStep83.Abort If Not cExecStep94 Is Nothing Then cExecStep73.ExecuteStep.ParentStepId = End If If cExecStep94.ExecuteStep.ParentStepId = cTermInstance.Step.ParentStepId Then End If cTermInstance.Step.ParentStepId Then cExecStep73.Abort cExecStep94.Abort End If If Not cExecStep84 Is Nothing Then End If HP TPC-H FULL DISCLOSURE REPORT 341 © 2005 Hewlett-Packard Company. All rights reserved. End If ' Frees an instance of a cExecuteSM object Case 36 depending on the index Set cExecStep36 = Nothing If Not cExecStep95 Is Nothing Then On Error GoTo FreeExecStepErr Case 37 If Set cExecStep37 = Nothing cExecStep95.ExecuteStep.ParentStepId = Select Case lngIndex + 1 Case 38 cTermInstance.Step.ParentStepId Then Case 1 Set cExecStep38 = Nothing cExecStep95.Abort Set cExecStep1 = Nothing Case 39 End If Case 2 Set cExecStep39 = Nothing End If Set cExecStep2 = Nothing Case 40 Case 3 Set cExecStep40 = Nothing If Not cExecStep96 Is Nothing Then Set cExecStep3 = Nothing Case 41 If Case 4 Set cExecStep41 = Nothing cExecStep96.ExecuteStep.ParentStepId = Set cExecStep4 = Nothing Case 42 cTermInstance.Step.ParentStepId Then Case 5 Set cExecStep42 = Nothing cExecStep96.Abort Set cExecStep5 = Nothing Case 43 End If Case 6 Set cExecStep43 = Nothing End If Set cExecStep6 = Nothing Case 44 Case 7 Set cExecStep44 = Nothing If Not cExecStep97 Is Nothing Then Set cExecStep7 = Nothing Case 45 If Case 8 Set cExecStep45 = Nothing cExecStep97.ExecuteStep.ParentStepId = Set cExecStep8 = Nothing Case 46 cTermInstance.Step.ParentStepId Then Case 9 Set cExecStep46 = Nothing cExecStep97.Abort Set cExecStep9 = Nothing Case 47 End If Case 10 Set cExecStep47 = Nothing End If Set cExecStep10 = Nothing Case 48 Case 11 Set cExecStep48 = Nothing If Not cExecStep98 Is Nothing Then Set cExecStep11 = Nothing Case 49 If Case 12 Set cExecStep49 = Nothing cExecStep98.ExecuteStep.ParentStepId = Set cExecStep12 = Nothing Case 50 cTermInstance.Step.ParentStepId Then Case 13 Set cExecStep50 = Nothing cExecStep98.Abort Set cExecStep13 = Nothing Case 51 End If Case 14 Set cExecStep51 = Nothing End If Set cExecStep14 = Nothing Case 52 Case 15 Set cExecStep52 = Nothing If Not cExecStep99 Is Nothing Then Set cExecStep15 = Nothing Case 53 If Case 16 Set cExecStep53 = Nothing cExecStep99.ExecuteStep.ParentStepId = Set cExecStep16 = Nothing Case 54 cTermInstance.Step.ParentStepId Then Case 17 Set cExecStep54 = Nothing cExecStep99.Abort Set cExecStep17 = Nothing Case 55 End If Case 18 Set cExecStep55 = Nothing End If Set cExecStep18 = Nothing Case 56 Case 19 Set cExecStep56 = Nothing Exit Sub Set cExecStep19 = Nothing Case 57 Case 20 Set cExecStep57 = Nothing AbortSiblingsErr: Set cExecStep20 = Nothing Case 58 Call LogErrors(Errors) Case 21 Set cExecStep58 = Nothing On Error GoTo 0 Set cExecStep21 = Nothing Case 59 ShowError errAbortFailed Case 22 Set cExecStep59 = Nothing ' Try to abort the remaining steps, if any Set cExecStep22 = Nothing Case 60 Resume Next Case 23 Set cExecStep60 = Nothing Set cExecStep23 = Nothing Case 61 End Sub Case 24 Set cExecStep61 = Nothing Private Sub ExecutionFailed(cTermStep As Set cExecStep24 = Nothing Case 62 cRunStep) Case 25 Set cExecStep62 = Nothing ' Called when execution of a step fails for Set cExecStep25 = Nothing Case 63 any reason - ensure that execution Case 26 Set cExecStep63 = Nothing ' continues Set cExecStep26 = Nothing Case 64 Case 27 Set cExecStep64 = Nothing On Error GoTo ExecutionFailedErr Set cExecStep27 = Nothing Case 65 Case 28 Set cExecStep65 = Nothing Call AddFreeProcess(cTermStep.Index) Set cExecStep28 = Nothing Case 66 Case 29 Set cExecStep66 = Nothing Call RunBranch(mstrCurBranchRoot) Set cExecStep29 = Nothing Case 67 Case 30 Set cExecStep67 = Nothing Exit Sub Set cExecStep30 = Nothing Case 68 Case 31 Set cExecStep68 = Nothing ExecutionFailedErr: Set cExecStep31 = Nothing Case 69 ' Log the error code raised by Visual Case 32 Set cExecStep69 = Nothing Basic - do not raise an error here! Set cExecStep32 = Nothing Case 70 Call LogErrors(Errors) Case 33 Set cExecStep70 = Nothing Set cExecStep33 = Nothing Case 71 End Sub Case 34 Set cExecStep71 = Nothing Private Sub FreeExecStep(lngIndex As Set cExecStep34 = Nothing Case 72 Long) Case 35 Set cExecStep72 = Nothing Set cExecStep35 = Nothing Case 73 HP TPC-H FULL DISCLOSURE REPORT 342 © 2005 Hewlett-Packard Company. All rights reserved. Set cExecStep73 = Nothing ' 1. An abort response to any failure results ' Navigate in reverse order since we'll be Case 74 in an immediate abort of the run deleting items from the collection Set cExecStep74 = Nothing ' 2. A continue means the run continues - this For lIndex = mcFailures.Count - 1 To 0 Step -1 Case 75 failure is popped off the failure list. If mcFailures(lIndex).ContCriteria = Set cExecStep75 = Nothing ' 3. A retry means that the execution details gintOnFailureAsk Then Case 76 for the instance are cleared and the mblnAsk = False Set cExecStep76 = Nothing ' step is re-executed. Set cFailureRec = Case 77 Dim lIndex As Long mcFailures.Delete(lIndex) Set cExecStep77 = Nothing Dim cStepRec As cStep Case 78 Dim cNextInst As cInstance Select Case cFailureRec.AskResponse Set cExecStep78 = Nothing Dim cFailureRec As cFailedStep Case IDABORT Case 79 BugAssert True Set cExecStep79 = Nothing On Error GoTo ProcessAskFailuresErr Case 80 Case IDRETRY Set cExecStep80 = Nothing ' Display a popup message for all steps that ' Delete all instances for the failed Case 81 have failed with a continuation step and re-try Set cExecStep81 = Nothing ' criteria of Ask ' Returns a parent instance reference Case 82 For lIndex = mcFailures.Count - 1 To 0 Step Set cNextInst = Set cExecStep82 = Nothing -1 ProcessRetryStep(cFailureRec) Case 83 Call Set cExecStep83 = Nothing Set cFailureRec = mcFailures(lIndex) RunPendingStepInBranch(mstrCurBranchRoot, Case 84 cNextInst) Set cExecStep84 = Nothing If cFailureRec.ContCriteria = Case 85 gintOnFailureAsk Then Case IDIGNORE Set cExecStep85 = Nothing Set cStepRec = Set cNextInst = Case 86 mcRunSteps.QueryStep(cFailureRec.StepId) mcInstances.QueryInstance(cFailureRec.InstanceId) Set cExecStep86 = Nothing ' Ask the user whether to Call RunPendingSiblings(cNextInst, Case 87 abort/retry/continue cFailureRec.EndTime) Set cExecStep87 = Nothing #If RUN_ONLY Then Case 88 cFailureRec.AskResponse = End Select Set cExecStep88 = Nothing ShowMessageBox(0, _ End If Case 89 "Step '" & Next lIndex Set cExecStep89 = Nothing GetStepNodeText(cStepRec) & "' failed. " & _ End If Case 90 "Select Abort to abort run and Set cExecStep90 = Nothing Ignore to continue. " & _ Exit Sub Case 91 "Select Retry to re-execute the Set cExecStep91 = Nothing failed step.", _ ProcessAskFailuresErr: Case 92 "Step Failure", _ ' Log the error code raised by Visual Basic Set cExecStep92 = Nothing MB_ABORTRETRYIGNORE Call LogErrors(Errors) Case 93 + MB_APPLMODAL + Err.Raise vbObjectError + Set cExecStep93 = Nothing MB_ICONEXCLAMATION) errExecuteBranchFailed, mstrModuleName, _ Case 94 #Else LoadResString(errExecuteBranchFailed) Set cExecStep94 = Nothing cFailureRec.AskResponse = Case 95 ShowMessageBox(frmRunning.hWnd, _ End Sub Set cExecStep95 = Nothing "Step '" & Private Function ProcessRetryStep(cFailureRec As Case 96 GetStepNodeText(cStepRec) & "' failed. " & _ cFailedStep) As cInstance Set cExecStep96 = Nothing "Select Abort to abort run and ' This procedure is called when a step with a Case 97 Ignore to continue. " & _ continuation criteria = Ask has failed Set cExecStep97 = Nothing "Select Retry to re-execute the ' and the user wants to re-execute the step. Case 98 failed step.", _ ' We delete all existing instances for the step and Set cExecStep98 = Nothing "Step Failure", _ reset the iterator, if Case 99 MB_ABORTRETRYIGNORE ' any on the parent instance - this way we ensure Set cExecStep99 = Nothing + MB_APPLMODAL + that the step will be executed Case Else MB_ICONEXCLAMATION) ' in the next pass. BugAssert False, "FreeExecStep: #End If Dim lIndex As Long Invalid index value!" Dim cParentInstance As cInstance End Select ' Process an abort response immediately Dim cSubStepRec As cSubStep If cFailureRec.AskResponse = Dim cStepRec As cStep Exit Sub IDABORT Then mblnAbort = True On Error GoTo ProcessRetryStepErr FreeExecStepErr: Set cNextInst = ' Log the error code raised by Visual mcInstances.QueryInstance(cFailureRec.Instan ' Navigate in reverse order since we'll be deleting Basic ceId) items from the collection Call LogErrors(Errors) Call RunPendingSiblings(cNextInst, For lIndex = mcInstances.Count - 1 To 0 Step -1 cFailureRec.EndTime) End Sub Exit For If mcInstances(lIndex).Step.StepId = Private Sub ProcessAskFailures() End If cFailureRec.StepId Then ' This procedure is called when a step End If Set cParentInstance = with a continuation criteria = Ask has failed. mcInstances.QueryInstance(mcInstances(lIndex).Pa ' Wait for all running processes to Next lIndex rentInstanceId) complete before displaying an Set cSubStepRec = Abort/Retry/Fail ' Process all failed steps for which we have cParentInstance.QuerySubStep(cFailureRec.StepId) ' message to the user. We process every Ignore and Retry responses. Set cStepRec = Ask step that has failed and use a simple If Not mblnAbort Then mcRunSteps.QueryStep(cFailureRec.StepId) ' algorithm to determine what to do next. HP TPC-H FULL DISCLOSURE REPORT 343 © 2005 Hewlett-Packard Company. All rights reserved. ' Decrement the child count on the cFailure.InstanceId = End If parent instance and reset the cTermInstance.InstanceId ' step iterators on the sub-step record, cFailure.StepId = Exit Sub if any - cTermInstance.Step.StepId ' all the iterations of the step will be cFailure.ParentStepId = RunNextStepErr: re-executed. cTermInstance.Step.ParentStepId ' Log the error code raised by Visual Basic cParentInstance.ChildDeleted cFailure.ContCriteria = Call LogErrors(Errors) cFailureRec.StepId cTermInstance.Step.ContinuationCriteria WriteError errExecuteBranchFailed, mstrSource cParentInstance.AllComplete = False cFailure.EndTime = dtmCompleteTime Call ResetForm(lngIndex) cParentInstance.AllStarted = False mcFailures.Add cFailure Set cFailure = Nothing End Sub cSubStepRec.InitializeIt cStepRec, End If Public Sub StopRun() mcParameters End If ' Setting the Abort flag to True will ensure that ' Now delete the current instance If ExecutionStatus = gintFailed And we Set ProcessRetryStep = cTermInstance.Step.ContinuationCriteria = ' don't execute any more steps mcInstances.Delete(lIndex) gintOnFailureAbort Then mblnAbort = True End If If StringEmpty(msAbortDtls) Then Next lIndex ' Initialize the abort message End Sub msAbortDtls = "Step '" & Exit Function GetStepNodeText(cTermInstance.Step) & "' Private Sub CreateDummyInstance(strRootKey As failed. " & _ String) ProcessRetryStepErr: "Aborting execution. Please check ' Log the error code raised by Visual the error file for details." Dim cNewInstance As cInstance Basic End If Dim cSubStepDtls As cStep Call LogErrors(Errors) Call Abort Dim lngSubStepId As Long Err.Raise vbObjectError + ElseIf ExecutionStatus = gintFailed And errExecuteBranchFailed, mstrModuleName, cTermInstance.Step.ContinuationCriteria = On Error GoTo CreateDummyInstanceErr _ gintOnFailureAsk Then mblnAsk = True ' Create a new instance of the step LoadResString(errExecuteBranchFailed) ' initialize substeps for the step ' If the step failed due to a Cancel Set cNewInstance = New cInstance End Function operation (Abort), abort the run If mblnAbort Then ' There can be multiple iterations of the top level Call nodes Private Sub RunNextStep(ByVal RunPendingSiblings(cTermInstance, ' running at the same time, but only one branch at dtmCompleteTime As Currency, ByVal dtmCompleteTime) any lngIndex As Long, _ End If ' time - so enforce a degree of parallelism of 1 on ByVal InstanceId As Long, ByVal Else this ExecutionStatus As InstanceStatus) Call RunPendingSiblings(cTermInstance, ' node! ' Checks if there are any steps remaining dtmCompleteTime) Set cNewInstance.Step = New cStep to be End If cNewInstance.DegreeParallelism = 1 ' executed in the current branch. If so, it cNewInstance.Key = mstrDummyRootKey executes If mblnAbort Then ' the step. If Not AnyStepRunning(mcFreeSteps, cNewInstance.InstanceId = NewInstanceId Dim cTermInstance As cInstance mbarrFree) And Not cNewInstance.ParentInstanceId = 0 Dim cFailure As cFailedStep StringEmpty(msAbortDtls) Then ' Display an error only if the abort is lngSubStepId = On Error GoTo RunNextStepErr due to a failure MakeIdentifierValid(strRootKey) ' We had to abort since a step failed - BugMessage "RunNextStep: cExecStep" since no other steps are currently Set cSubStepDtls = & CStr(lngIndex + 1) & " has completed." ' running, we can display a message to mcRunSteps.QueryStep(lngSubStepId) the user saying that we had to abort If cSubStepDtls.EnabledFlag Then Call mcTermSteps.Delete #If RUN_ONLY Then ' Create a child node for the step corresponding Call FreeExecStep(lngIndex) Call ShowMessageBox(0, to msAbortDtls, "Run Aborted", _ ' the root node of the branch being currently ' Call a procedure to add the freed up MB_APPLMODAL + MB_OK executed, object to the list + MB_ICONEXCLAMATION) ' only if it has been enabled Call AddFreeProcess(lngIndex) #Else Call Call cNewInstance.CreateSubStep(cSubStepDtls, Set cTermInstance = ShowMessageBox(frmRunning.hWnd, mcParameters) mcInstances.QueryInstance(InstanceId) msAbortDtls, "Run Aborted", _ End If cTermInstance.Status = ExecutionStatus MB_APPLMODAL + MB_OK + MB_ICONEXCLAMATION) mcInstances.Add cNewInstance If ExecutionStatus = gintFailed Then #End If Set cNewInstance.Iterators = If ' MsgBox msAbortDtls, vbOKOnly, DetermineIterators(cNewInstance) cTermInstance.Step.ContinuationCriteria = "Run Aborted" gintOnFailureAbortSiblings Then End If ' Set a reference to the newly created dummy Call AbortSiblings(cTermInstance) ElseIf mblnAsk Then instance End If If Not AnyStepRunning(mcFreeSteps, Set mcDummyRootInstance = cNewInstance mbarrFree) Then If Not ' Ask the user whether to Set cNewInstance = Nothing mcFailures.StepFailed(cTermInstance.Step. abort/retry/ignore failed steps StepId) Then Call ProcessAskFailures Exit Sub Set cFailure = New cFailedStep End If HP TPC-H FULL DISCLOSURE REPORT 344 © 2005 Hewlett-Packard Company. All rights reserved. CreateDummyInstanceErr: ' Log the error code raised by Visual mcInstances.Add cNewInstance If Not cStepIt Is Nothing Then Basic Set cNewInstance.Iterators = ' Add the iterator details to the collection Call LogErrors(Errors) DetermineIterators(cNewInstance) since On Error GoTo 0 ' an iterator has been defined for the step mstrSource = mstrModuleName & ' Increment the number of executing steps on Set cRunIt = New cRunItNode "CreateDummyInstance" the parent cRunIt.IteratorName = Err.Raise vbObjectError + cParentInstance.ChildExecuted cSubStepDtls.IteratorName errCreateInstanceFailed, _ (cExecStep.StepId) cRunIt.Value = mstrSource, SubstituteParameters(cStepIt.Value, LoadResString(errCreateInstanceFailed) Set CreateInstance = cNewInstance cSubStepDtls.WorkspaceId, WspParameters:=mcParameters) End Sub Exit Function cRunIt.StepId = cSubStepRec.StepId Private Function CreateInstance(cExecStep cRunIts.Push cRunIt As cStep, _ CreateInstanceErr: End If cParentInstance As cInstance) As ' Log the error code raised by Visual Basic cInstance Call LogErrors(Errors) ' Since the parent instance has all the iterators ' Creates a new instance of the passed in On Error GoTo 0 upto step. Returns mstrSource = mstrModuleName & ' that level, read them and push them on to the ' a reference to the newly created instance "CreateInstance" stack for object. Err.Raise vbObjectError + ' this instance errCreateInstanceFailed, _ For lngIndex = 0 To Dim cNewInstance As cInstance mstrSource, cParentInst.Iterators.Count - 1 Dim nodChild As cStep LoadResString(errCreateInstanceFailed) Set cRunIt = cParentInst.Iterators(lngIndex) Dim lngSubStepId As Long cRunIts.Push cRunIt End Function Next lngIndex On Error GoTo CreateInstanceErr Private Function End If DetermineIterators(cInstanceRec As cInstance) ' Create a new instance of the step As cRunColIt Set DetermineIterators = cRunIts ' initialize substeps for the step ' Returns a collection of all the iterator Set cNewInstance = New cInstance values for this Exit Function Set cNewInstance.Step = cExecStep ' instance - since an iterator that is defined at cNewInstance.Key = a DetermineIteratorsErr: MakeKeyValid(cExecStep.StepId, ' particular level can be used in all it's ' Log the error code raised by Visual Basic cExecStep.StepType) substeps, we Call LogErrors(Errors) cNewInstance.ParentInstanceId = ' need to navigate the step tree all the way to On Error GoTo 0 cParentInstance.InstanceId the root mstrSource = mstrModuleName & cNewInstance.InstanceId = "DetermineIterators" NewInstanceId Dim cRunIts As cRunColIt Err.Raise vbObjectError + ' Validate the degree of parallelism field Dim cRunIt As cRunItNode errExecInstanceFailed, _ before assigning it to the instance - Dim cStepIt As cIterator mstrSource, ' (the parameter value might have been set Dim cParentInst As cInstance LoadResString(errExecInstanceFailed) to an invalid value at runtime) Dim cSubStepRec As cSubStep Call Dim cSubStepDtls As cStep End Function ValidateParallelism(cExecStep.DegreeParall Dim lngSubStepId As Long Private Function elism, _ Dim lngIndex As Long DetermineConstraints(cInstanceRec As cInstance, _ cExecStep.WorkspaceId, intConsType As ConstraintType) As Variant ParamsInWsp:=mcParameters) On Error GoTo DetermineIteratorsErr ' Returns a collection of all the constraints for this cNewInstance.DegreeParallelism = ' instance of the passed in type - all the SubstituteParameters(cExecStep.DegreePara Set cRunIts = New cRunColIt constraints defined llelism, _ ' for the manager are executed first, followed by cExecStep.WorkspaceId, If cInstanceRec.ParentInstanceId > 0 Then those defined WspParameters:=mcParameters) ' The last iterator for an instance of a step ' for the step. If a step has an iterator defined for is stored it, each If ' on it's parent! So navigate up before ' constraint is executed only once. mcNavSteps.HasChild(StepKey:=cNewInsta beginning the nce.Key) Then ' search for iterator values. Dim cParentInst As cInstance Set nodChild = Set cParentInst = Dim cTempInst As cInstance mcNavSteps.ChildStep(StepKey:=cNewInst mcInstances.QueryInstance(cInstanceRec.Pare Dim vntConstraints As Variant ance.Key) ntInstanceId) Dim vntTempCons As Variant Do Dim cColConstraints() As Variant If nodChild.EnabledFlag Then ' Get the sub-step record for the current Dim lngConsCount As Long ' Create nodes for all it's substeps step only ' on it's parent's instance! On Error GoTo DetermineConstraintsErr ' if the substeps have been enabled lngSubStepId = cInstanceRec.Step.StepId Call Set cSubStepRec = Set cTempInst = cInstanceRec cNewInstance.CreateSubStep(nodChild, cParentInst.QuerySubStep(lngSubStepId) lngConsCount = 0 mcParameters) Set cSubStepDtls = End If mcRunSteps.QueryStep(lngSubStepId) ' Go all the way to the root Do Set nodChild = ' And determine the next iteration value If cTempInst.ParentInstanceId > 0 Then mcNavSteps.NextStep(StepId:=nodChild.St for the Set cParentInst = epId) ' substep in this instance mcInstances.QueryInstance(cTempInst.ParentInstan Loop While (Not nodChild Is Nothing) Set cStepIt = ceId) End If cSubStepRec.NewIteration(cSubStepDtls) Else HP TPC-H FULL DISCLOSURE REPORT 345 © 2005 Hewlett-Packard Company. All rights reserved. Set cParentInst = Nothing Not End If End If mcInstances.CompletedInstanceExists(cParent Node.InstanceId, cSubStepDtls) Then ' Set the return value of the function to the array ' Check if the step has an iterator ' The sub-step hasn't been executed yet. of defined for it ' Create an instance for it and exit ' constraints that has been built above If Set cSubStepInst = Set InstancesForStep = cStepInstances cTempInst.ValidForIteration(cParentInst, CreateInstance(cSubStepDtls, cParentNode) intConsType) Then Else Set cStepInstances = Nothing vntTempCons = Set cSubStepInst = Nothing Exit Function mcRunConstraints.ConstraintsForStep( _ End If cTempInst.Step.StepId, Else InstancesForStepErr: cTempInst.Step.VersionNo, _ ' Check if there are pending iterations for ' Log the error code raised by Visual Basic intConsType, blnSort:=True, _ the sub-step Call LogErrors(Errors) blnGlobal:=False, If Not On Error GoTo 0 blnGlobalConstraintsOnly:=False) cSubStepRec.NextIteration(cSubStepDtls) Is mstrSource = mstrModuleName & Nothing Then "InstancesForStep" If Not IsEmpty(vntTempCons) Then ' Pending iterations exist - create an Err.Raise vbObjectError + ReDim Preserve instance for the sub-step and exit errNavInstancesFailed, mstrSource, _ cColConstraints(lngConsCount) Set cSubStepInst = LoadResString(errNavInstancesFailed) cColConstraints(lngConsCount) = CreateInstance(cSubStepDtls, cParentNode) vntTempCons Else End Function lngConsCount = lngConsCount + ' No more iterations - continue with the Private Sub 1 next substep RemoveFreeProcess(lngRunningProcess As Long) End If Set cSubStepInst = Nothing ' Removes the passed in element from the End If End If collection of End If ' free objects Set cTempInst = cParentInst Set GetInstanceToExecute = cSubStepInst ' Confirm that the last element in the array is the Loop While Not cTempInst Is Nothing Exit Function one ' we need to delete If lngConsCount > 0 Then GetInstanceToExecuteErr: If mcFreeSteps(mcFreeSteps.Count - 1) = vntTempCons = ' Log the error code raised by Visual Basic lngRunningProcess Then OrderConstraints(cColConstraints, Call LogErrors(Errors) mcFreeSteps.Delete intConsType) On Error GoTo 0 Position:=mcFreeSteps.Count - 1 End If mstrSource = mstrModuleName & Else "GetInstanceToExecute" ' Ask the class to find the element and delete it DetermineConstraints = vntTempCons Err.Raise vbObjectError + mcFreeSteps.Delete Item:=lngRunningProcess errNavInstancesFailed, _ End If Exit Function mstrSource, LoadResString(errNavInstancesFailed) End Sub DetermineConstraintsErr: Private Sub AddFreeProcess(lngTerminatedProcess ' Log the error code raised by Visual End Function As Long) Basic ' Adds the passed in element to the collection of Call LogErrors(Errors) Public Function InstancesForStep(lngStepId ' free objects On Error GoTo 0 As Long, ByRef StepStatus As InstanceStatus) mstrSource = mstrModuleName & As cInstances mcFreeSteps.Add lngTerminatedProcess "DetermineConstraints" ' Returns an array of all the instances for a Err.Raise vbObjectError + step End Sub errExecInstanceFailed, _ Dim lngIndex As Long mstrSource, Dim cTempInst As cInstance Private Sub ResetForm(Optional ByVal lngIndex LoadResString(errExecInstanceFailed) Dim cStepInstances As cInstances As Long) Dim cStepRec As cStep End Function Dim lngTemp As Long Private Function On Error GoTo InstancesForStepErr GetInstanceToExecute(cParentNode As On Error GoTo ResetFormErr cInstance, _ Set cStepInstances = New cInstances cSubStepRec As cSubStep, _ ' Check if there are any running instances to wait cSubStepDtls As cStep) As cInstance For lngIndex = 0 To mcInstances.Count - 1 for Set cTempInst = mcInstances(lngIndex) If mcFreeSteps.Count <> Dim cSubStepInst As cInstance glngNumConcurrentProcesses Then If cTempInst.Step.StepId = lngStepId On Error GoTo GetInstanceToExecuteErr Then For lngTemp = 0 To mcFreeSteps.Count - 1 cStepInstances.Add cTempInst If mcFreeSteps(lngTemp) = lngIndex Then BugAssert Not (cParentNode Is Nothing End If Exit For Or _ Next lngIndex End If cSubStepRec Is Nothing Or _ Next lngTemp cSubStepDtls Is Nothing), _ If cStepInstances.Count = 0 Then "GetInstanceToExecute: Input Set cStepRec = If lngTemp <= mcFreeSteps.Count - 1 Then invalid" mcRunSteps.QueryStep(lngStepId) ' This process that just completed did not If Not exist in the list of ' Check if it has iterators mcFailures.ExecuteSubStep(cStepRec.ParentSt ' free processes If cSubStepDtls.IteratorCount = 0 Then epId) Then Call AddFreeProcess(lngIndex) ' Check if the step has been executed StepStatus = gintAborted End If If cSubStepRec.TasksRunning = 0 And End If cSubStepRec.TasksComplete = 0 And _ Set cStepRec = Nothing HP TPC-H FULL DISCLOSURE REPORT 346 © 2005 Hewlett-Packard Company. All rights reserved. If Not AnyStepRunning(mcFreeSteps, If StringEmpty(strCurBranchRoot) Or mstrModuleName & mbarrFree) Then mcDummyRootInstance Is Nothing Then "RunPendingStepInBranch", WriteToWspLog ' Run complete - event raised by Run LoadResString(errNavInstancesFailed) (mintRunComplete) method ' All steps are complete Set RunPendingStepInBranch = End Function RaiseEvent Nothing Private Function RunComplete(Determine64BitTime()) Exit Function RunPendingSibling(cTermInstance As cInstance, _ End If End If dtmCompleteTime As Currency) As cInstance Else ' This process is called when a step terminates. WriteToWspLog (mintRunComplete) ' If there are no pending steps on the root Tries to RaiseEvent instance, ' run a sibling of the terminated step, if one is RunComplete(Determine64BitTime()) ' then there are no steps within the branch pending End If that need ' execution. ' to be executed Exit Sub If mcDummyRootInstance.AllComplete Dim cParentInstance As cInstance Or mcDummyRootInstance.AllStarted Then Dim cNextInst As cInstance ResetFormErr: Set RunPendingStepInBranch = Nothing On Error GoTo RunPendingSiblingErr End Sub Exit Function Private Function NewInstanceId() As Long End If If StringEmpty(mstrCurBranchRoot) Or ' Will return new instance id's - uses a mcDummyRootInstance Is Nothing Then static counter Set cParentInstance = ' Run complete - event raised by Run method ' that it increments each time mcDummyRootInstance Set RunPendingSibling = Nothing Static lngInstance As Long End If Exit Function End If lngInstance = lngInstance + 1 Do NewInstanceId = lngInstance Set cNextInst = BugAssert cTermInstance.ParentInstanceId > 0, GetSubStepToExecute(cParentInstance) "Orphaned instance in array!" End Function If cNextInst Is Nothing Then ' There are no steps within the branch ' When a worker step terminates, then we need to Private Function that can ' decremement the number of running steps on it's RunPendingStepInBranch(strCurBranchRoo ' be executed - If we are at the dummy ' manager t As String, _ instance, Set cParentInstance = Optional cExecInstance As cInstance = ' this branch has completed executing mcInstances.QueryInstance(cTermInstance.ParentIn Nothing) As cInstance If cParentInstance.Key = stanceId) ' Runs a worker step in the branch being mstrDummyRootKey Then executed, if Set cNextInst = Nothing ' Decrement the number of running processes on ' there are any pending execution Exit Do the ' This function is also called when a step Else ' parent by 1 has just completed ' Go to the parent instance and try to Call ' execution - in which case the terminated find cParentInstance.ChildTerminated(cTermInstance.St instance is ' some other sibling is pending ep.StepId) ' passed in as the optional parameter. execution When that happens, Set cNextInst = ' The first step that terminates has to be a worker ' we first try to execute the siblings of the mcInstances.QueryInstance(cParentInstance.Pa ' If it is complete, update the completed steps on terminated rentInstanceId) the ' step if any are pending execution. ' parent by 1. ' If the terminated instance has not been If cParentInstance.SubSteps.Count = Call passed in, we 0 Then cParentInstance.ChildCompleted(cTermInstance.St ' start with the dummy root instance and cNextInst.ChildTerminated ep.StepId) navigate down, cParentInstance.Step.StepId cParentInstance.AllStarted = False ' trying to find a pending worker step. End If End If Do Dim cExecSubStep As cStep End If Set cNextInst = Dim cParentInstance As cInstance GetSubStepToExecute(cParentInstance, Dim cNextInst As cInstance BugAssert Not cNextInst Is Nothing dtmCompleteTime) Set cParentInstance = cNextInst If cNextInst Is Nothing Then On Error GoTo If cParentInstance.Key = RunPendingStepInBranchErr Loop While cNextInst.Step.StepType <> mstrDummyRootKey Then gintWorkerStep Set cNextInst = Nothing If Not cExecInstance Is Nothing Then Exit Do ' Called when an instance has If Not cNextInst Is Nothing Then Else terminated Call ExecuteStep(cNextInst) ' Go to the parent instance and try to find ' When a worker step terminates, then End If ' some other sibling is pending execution we need to Set cNextInst = ' decremement the number of running Set RunPendingStepInBranch = cNextInst mcInstances.QueryInstance(cParentInstance.ParentI steps on it's nstanceId) ' manager Exit Function If cParentInstance.IsRunning Then Set cParentInstance = _ cNextInst.AllStarted = True RunPendingStepInBranchErr: Else mcInstances.QueryInstance(cExecInstance.P ' Log the error code raised by Visual Basic ' No more sub-steps to execute arentInstanceId) Call LogErrors(Errors) Call On Error GoTo 0 cNextInst.ChildCompleted(cParentInstance.Step.Ste Else Err.Raise vbObjectError + pId) errNavInstancesFailed, _ HP TPC-H FULL DISCLOSURE REPORT 347 © 2005 Hewlett-Packard Company. All rights reserved. Call Set cExecInst = Dim cSubStepRec As cSubStep cNextInst.ChildTerminated(cParentInstance. RunPendingStepInBranch(mstrCurBranchRoot Dim cSubStepDtls As cStep Step.StepId) , cExecInst) Dim cSubStepInst As cInstance cNextInst.AllStarted = False Loop While Not cExecInst Is Nothing End If Else On Error GoTo GetSubStepToExecuteErr End If If Not mcDummyRootInstance.IsRunning End If Then ' There are a number of cases that need to be ' All steps have been executed in the accounted BugAssert Not cNextInst Is Nothing branch - run ' for here. Set cParentInstance = cNextInst ' a new branch ' 1. While traversing through all enabled nodes Call RunNewBranch for the Loop While cNextInst.Step.StepType <> Else ' first time - instance records may not exist for the gintWorkerStep ' There are no more steps to execute in ' substeps. the current ' 2. Instance records exist, and there are processes If Not cNextInst Is Nothing Then ' branch but we have running processes. ' that need to be executed for a sub-step Call ExecuteStep(cNextInst) End If ' 3. There are no more processes that need to be End If End If currently ' executed (till a process completes) Set RunPendingSibling = cNextInst Exit Sub ' 4. There are no more processes that need to be executed Exit Function RunPendingSiblingsErr: ' (All substeps have completed execution) ' Log the error code raised by Visual Basic RunPendingSiblingErr: Call LogErrors(Errors) ' This is the only point where we check the Abort ' Log the error code raised by Visual On Error GoTo 0 flag - Basic mstrSource = mstrModuleName & ' since this is the heart of the navigation routine Call LogErrors(Errors) "RunPendingSiblings" that On Error GoTo 0 Err.Raise vbObjectError + ' selects processes to execute. Also, when a step mstrSource = mstrModuleName & errNavInstancesFailed, _ terminates "RunPendingSibling" mstrSource, ' selection of the next process goes through here. Err.Raise vbObjectError + LoadResString(errNavInstancesFailed) If mblnAbort Then errNavInstancesFailed, mstrSource, _ Set GetSubStepToExecute = Nothing LoadResString(errNavInstancesFailed) End Sub cParentNode.Status = gintAborted Exit Function End Function Private Sub End If Private Sub NoSubStepsToExecute(cMgrInstance As RunPendingSiblings(cTermInstance As cInstance, Optional dtmCompleteTime As If mblnAsk Then cInstance, _ Currency = gdtmEmpty) Set GetSubStepToExecute = Nothing dtmCompleteTime As Currency) ' Called when we cannot find any more Exit Function ' This process is called when a step substeps to run for End If terminates. Tries to ' manager step - set the allcomplete or ' run siblings of the terminated step, if allstarted If Not they are pending ' properties to true mcFailures.ExecuteSubStep(cParentNode.Step.Step ' execution. Id) Then If cMgrInstance.IsRunning() Then Set GetSubStepToExecute = Nothing Dim cExecInst As cInstance cMgrInstance.AllStarted = True cParentNode.Status = gintAborted Else Exit Function On Error GoTo RunPendingSiblingsErr cMgrInstance.AllComplete = True End If BugMessage "In RunPendingSiblings" If dtmCompleteTime <> gdtmEmpty Then ' First check if there are pending steps for the ' Call a procedure to run the sibling of the ' Update the end time on the manager parent! terminated step If cParentNode.IsPending Then ' step, if any. This procedure will also Call ' Loop through all the sub-steps for the parent update the TimeCompleteUpdateForStep(cMgrInstance, node ' number of complete/running tasks on the dtmCompleteTime) For lngIndex = 0 To manager steps. End If cParentNode.SubSteps.Count - 1 Set cExecInst = End If Set cSubStepRec = RunPendingSibling(cTermInstance, cParentNode.SubSteps(lngIndex) dtmCompleteTime) End Sub Set cSubStepDtls = mcRunSteps.QueryStep(cSubStepRec.StepId) If Not cExecInst Is Nothing Then Private Function If Not Do GetSubStepToExecute(cParentNode As mcInstances.InstanceAborted(cSubStepRec) Then ' Execute any other pending steps in cInstance, _ ' Check if the sub-step is a worker the branch. Optional dtmCompleteTime As Currency If cSubStepDtls.StepType = ' The step that has just terminated = 0) As cInstance gintWorkerStep Then might be ' Returns the child of the passed in node that ' Find/create an instance to execute ' the last one that was executing in a is to be Set cSubStepInst = sub-branch. ' executed next. Checks if we are in the GetInstanceToExecute( _ ' That would mean that we can middle of an instance cParentNode, cSubStepRec, execute another ' being executed in which case it returns the cSubStepDtls) ' sub-branch that might involve more pending If Not cSubStepInst Is Nothing Then than 1 step. ' instance. Creates a new instance if there are Exit For ' Pass the just executed step as a pending Else parameter. ' instances for a sub-step. ' Continue w/ the next sub-step End If Dim lngIndex As Long Else HP TPC-H FULL DISCLOSURE REPORT 348 © 2005 Hewlett-Packard Company. All rights reserved. ' The sub-step is a manager step On Error GoTo ' Check if there are any pending TimeCompleteUpdateForStepErr Set cStartInst = cInstRec instances for iItIndex = 0 ' the manager If cMgrInstance.Key <> Do While cInstRec.Key <> mstrDummyRootKey Set cSubStepInst = mstrDummyRootKey Then sLogLabel = gstrSQ & mcInstances.QueryPendingInstance( _ cMgrInstance.EndTime = EndTime cInstRec.Step.StepLabel & gstrSQ cParentNode.InstanceId, cMgrInstance.Status = gintComplete cSubStepRec.StepId) lElapsed = (EndTime - If iItIndex < cInstRec.Iterators.Count Then If cSubStepInst Is Nothing Then cMgrInstance.StartTime) * 10000 If cStartInst.Iterators(iItIndex).StepId = ' Find/create an instance to cMgrInstance.ElapsedTime = lElapsed cInstRec.Step.StepId Then execute RaiseEvent sLogLabel = sLogLabel & msIt & gstrSQ Set cSubStepInst = StepComplete(cMgrInstance.Step, EndTime, & cStartInst.Iterators(iItIndex).IteratorName & GetInstanceToExecute( _ cMgrInstance.InstanceId, lElapsed) gstrSQ & _ cParentNode, End If msItValue & gstrSQ & cSubStepRec, cSubStepDtls) cStartInst.Iterators(iItIndex).Value & gstrSQ If Not cSubStepInst Is Exit Sub iItIndex = iItIndex + 1 Nothing Then End If Exit For TimeCompleteUpdateForStepErr: End If Else ' Log the error code raised by Visual Basic ' Continue w/ the next sub- Call LogErrors(Errors) If cInstRec.Key = cStartInst.Key Then step WriteError errUpdateDisplayFailed, ' Append the execution status End If mstrModuleName & sLogLabel = sLogLabel & " Status: " & Else "TimeCompleteUpdateForStep" gstrSQ & gsExecutionStatus(ExecutionStatus) & ' We have found a pending gstrSQ instance for the End Sub If ExecutionStatus = gintFailed Then ' sub-step (manager) - exit the ' Append the continuation criteria for the loop Private Function GetFreeObject() As Long step since it failed Exit For sLogLabel = sLogLabel & " Continuation End If ' Check the array of free objects and retrieve Criteria: " & gstrSQ & End If the first one gsContCriteria(cInstRec.Step.ContinuationCriteria) End If If mcFreeSteps.Count > 0 Then & gstrSQ Next lngIndex GetFreeObject = End If mcFreeSteps(mcFreeSteps.Count - 1) End If If lngIndex > Else LogLabels.Add sLogLabel cParentNode.SubSteps.Count - 1 Or mstrSource = mstrModuleName & cParentNode.SubSteps.Count = 0 Then "GetFreeObject" Set cInstRec = ' If we could not find any sub-steps ShowError errMaxProcessesExceeded mcInstances.QueryInstance(cInstRec.ParentInstanc to execute, On Error GoTo 0 eId) ' mark the parent node as Err.Raise vbObjectError + Loop complete/all started errMaxProcessesExceeded, _ Call mstrSource, _ Call WriteToWspLog(mintStepComplete, NoSubStepsToExecute(cParentNode, LogLabels, dtmCompleteTime) dtmCompleteTime) LoadResString(errMaxProcessesExceeded) Set LogLabels = Nothing Set cSubStepInst = Nothing End If End If ' Adds the terminated step details to a queue. End If End Function Set cTermRec = New cTermStep Private Function cTermRec.ExecutionStatus = ExecutionStatus Set GetSubStepToExecute = cSubStepInst StepTerminated(cCompleteStep As cStep, cTermRec.Index = lngIndex Exit Function ByVal dtmCompleteTime As Currency, _ cTermRec.InstanceId = InstanceId ByVal lngIndex As Long, ByVal cTermRec.TimeComplete = dtmCompleteTime GetSubStepToExecuteErr: InstanceId As Long, ByVal ExecutionStatus Call mcTermSteps.Add(cTermRec) ' Log the error code raised by Visual As InstanceStatus) As cStep Set cTermRec = Nothing Basic ' This procedure is called whenever a step Call LogErrors(Errors) terminates. RaiseEvent StepComplete(cCompleteStep, On Error GoTo 0 Dim cTermRec As cTermStep dtmCompleteTime, InstanceId, lElapsed) mstrSource = mstrModuleName & Dim cInstRec As cInstance "GetSubStepToExecute" Dim cStartInst As cInstance Exit Function Err.Raise vbObjectError + Dim lElapsed As Long errNavInstancesFailed, mstrSource, _ Dim sLogLabel As String StepTerminatedErr: LoadResString(errNavInstancesFailed) Dim LogLabels As New cVectorStr ' Log the error code raised by Visual Basic Dim iItIndex As Long Call LogErrors(Errors) End Function WriteError errExecuteBranchFailed, mstrSource On Error GoTo StepTerminatedErr Call ResetForm(lngIndex) Private Sub TimeCompleteUpdateForStep(cMgrInstance Set cInstRec = End Function As cInstance, ByVal EndTime As Currency) mcInstances.QueryInstance(InstanceId) Public Property Let RootKey(ByVal vdata As If dtmCompleteTime <> 0 And String) ' Called when there are no more sub-steps cInstRec.StartTime <> 0 Then to execute for ' Convert to milliseconds since that is the mstrRootKey = vdata ' the manager step. It updates the end time default precision and status on lElapsed = (dtmCompleteTime - End Property ' the manager. cInstRec.StartTime) * 10000 Dim lElapsed As Long Else Public Property Get RootKey() As String lElapsed = 0 RootKey = mstrRootKey End If End Property HP TPC-H FULL DISCLOSURE REPORT 349 © 2005 Hewlett-Packard Company. All rights reserved. Set cExecStep19 = New cRunStep Set cExecStep44 = New cRunStep Private Function InitExecStep() As Set InitExecStep = cExecStep19 Set InitExecStep = cExecStep44 cRunStep Case 20 Case 45 ' Since arrays of objects cannot be Set cExecStep20 = New cRunStep Set cExecStep45 = New cRunStep declared as WithEvents, Set InitExecStep = cExecStep20 Set InitExecStep = cExecStep45 ' we use a limited number of objects and Case 21 Case 46 set a maximum Set cExecStep21 = New cRunStep Set cExecStep46 = New cRunStep ' on the number of steps that can run in Set InitExecStep = cExecStep21 Set InitExecStep = cExecStep46 parallel Case 22 Case 47 ' This is a wrapper that will create an Set cExecStep22 = New cRunStep Set cExecStep47 = New cRunStep instance of Set InitExecStep = cExecStep22 Set InitExecStep = cExecStep47 ' a cExecuteSM object depending on the Case 23 Case 48 index Set cExecStep23 = New cRunStep Set cExecStep48 = New cRunStep Dim lngIndex As Long Set InitExecStep = cExecStep23 Set InitExecStep = cExecStep48 Case 24 Case 49 On Error GoTo InitExecStepErr Set cExecStep24 = New cRunStep Set cExecStep49 = New cRunStep Set InitExecStep = cExecStep24 Set InitExecStep = cExecStep49 lngIndex = GetFreeObject Case 25 Case 50 Set cExecStep25 = New cRunStep Set cExecStep50 = New cRunStep Select Case lngIndex + 1 Set InitExecStep = cExecStep25 Set InitExecStep = cExecStep50 Case 1 Case 26 Case 51 Set cExecStep1 = New cRunStep Set cExecStep26 = New cRunStep Set cExecStep51 = New cRunStep Set InitExecStep = cExecStep1 Set InitExecStep = cExecStep26 Set InitExecStep = cExecStep51 Case 2 Case 27 Case 52 Set cExecStep2 = New cRunStep Set cExecStep27 = New cRunStep Set cExecStep52 = New cRunStep Set InitExecStep = cExecStep2 Set InitExecStep = cExecStep27 Set InitExecStep = cExecStep52 Case 3 Case 28 Case 53 Set cExecStep3 = New cRunStep Set cExecStep28 = New cRunStep Set cExecStep53 = New cRunStep Set InitExecStep = cExecStep3 Set InitExecStep = cExecStep28 Set InitExecStep = cExecStep53 Case 4 Case 29 Case 54 Set cExecStep4 = New cRunStep Set cExecStep29 = New cRunStep Set cExecStep54 = New cRunStep Set InitExecStep = cExecStep4 Set InitExecStep = cExecStep29 Set InitExecStep = cExecStep54 Case 5 Case 30 Case 55 Set cExecStep5 = New cRunStep Set cExecStep30 = New cRunStep Set cExecStep55 = New cRunStep Set InitExecStep = cExecStep5 Set InitExecStep = cExecStep30 Set InitExecStep = cExecStep55 Case 6 Case 31 Case 56 Set cExecStep6 = New cRunStep Set cExecStep31 = New cRunStep Set cExecStep56 = New cRunStep Set InitExecStep = cExecStep6 Set InitExecStep = cExecStep31 Set InitExecStep = cExecStep56 Case 7 Case 32 Case 57 Set cExecStep7 = New cRunStep Set cExecStep32 = New cRunStep Set cExecStep57 = New cRunStep Set InitExecStep = cExecStep7 Set InitExecStep = cExecStep32 Set InitExecStep = cExecStep57 Case 8 Case 33 Case 58 Set cExecStep8 = New cRunStep Set cExecStep33 = New cRunStep Set cExecStep58 = New cRunStep Set InitExecStep = cExecStep8 Set InitExecStep = cExecStep33 Set InitExecStep = cExecStep58 Case 9 Case 34 Case 59 Set cExecStep9 = New cRunStep Set cExecStep34 = New cRunStep Set cExecStep59 = New cRunStep Set InitExecStep = cExecStep9 Set InitExecStep = cExecStep34 Set InitExecStep = cExecStep59 Case 10 Case 35 Case 60 Set cExecStep10 = New cRunStep Set cExecStep35 = New cRunStep Set cExecStep60 = New cRunStep Set InitExecStep = cExecStep10 Set InitExecStep = cExecStep35 Set InitExecStep = cExecStep60 Case 11 Case 36 Case 61 Set cExecStep11 = New cRunStep Set cExecStep36 = New cRunStep Set cExecStep61 = New cRunStep Set InitExecStep = cExecStep11 Set InitExecStep = cExecStep36 Set InitExecStep = cExecStep61 Case 12 Case 37 Case 62 Set cExecStep12 = New cRunStep Set cExecStep37 = New cRunStep Set cExecStep62 = New cRunStep Set InitExecStep = cExecStep12 Set InitExecStep = cExecStep37 Set InitExecStep = cExecStep62 Case 13 Case 38 Case 63 Set cExecStep13 = New cRunStep Set cExecStep38 = New cRunStep Set cExecStep63 = New cRunStep Set InitExecStep = cExecStep13 Set InitExecStep = cExecStep38 Set InitExecStep = cExecStep63 Case 14 Case 39 Case 64 Set cExecStep14 = New cRunStep Set cExecStep39 = New cRunStep Set cExecStep64 = New cRunStep Set InitExecStep = cExecStep14 Set InitExecStep = cExecStep39 Set InitExecStep = cExecStep64 Case 15 Case 40 Case 65 Set cExecStep15 = New cRunStep Set cExecStep40 = New cRunStep Set cExecStep65 = New cRunStep Set InitExecStep = cExecStep15 Set InitExecStep = cExecStep40 Set InitExecStep = cExecStep65 Case 16 Case 41 Case 66 Set cExecStep16 = New cRunStep Set cExecStep41 = New cRunStep Set cExecStep66 = New cRunStep Set InitExecStep = cExecStep16 Set InitExecStep = cExecStep41 Set InitExecStep = cExecStep66 Case 17 Case 42 Case 67 Set cExecStep17 = New cRunStep Set cExecStep42 = New cRunStep Set cExecStep67 = New cRunStep Set InitExecStep = cExecStep17 Set InitExecStep = cExecStep42 Set InitExecStep = cExecStep67 Case 18 Case 43 Case 68 Set cExecStep18 = New cRunStep Set cExecStep43 = New cRunStep Set cExecStep68 = New cRunStep Set InitExecStep = cExecStep18 Set InitExecStep = cExecStep43 Set InitExecStep = cExecStep68 Case 19 Case 44 Case 69 HP TPC-H FULL DISCLOSURE REPORT 350 © 2005 Hewlett-Packard Company. All rights reserved. Set cExecStep69 = New cRunStep Set cExecStep94 = New cRunStep Set InitExecStep = cExecStep69 Set InitExecStep = cExecStep94 Call Case 70 Case 95 CreateDummyInstance(mstrCurBranchRoot) Set cExecStep70 = New cRunStep Set cExecStep95 = New cRunStep Set InitExecStep = cExecStep70 Set InitExecStep = cExecStep95 ' Run all pending steps in the branch Case 71 Case 96 If Not RunBranch(mstrCurBranchRoot) Set cExecStep71 = New cRunStep Set cExecStep96 = New cRunStep Then Set InitExecStep = cExecStep71 Set InitExecStep = cExecStep96 ' Execute a new branch if there aren't any Case 72 Case 97 ' steps to run Set cExecStep72 = New cRunStep Set cExecStep97 = New cRunStep Call RunNewBranch Set InitExecStep = cExecStep72 Set InitExecStep = cExecStep97 End If Case 73 Case 98 Else Set cExecStep73 = New cRunStep Set cExecStep98 = New cRunStep WriteToWspLog (mintRunComplete) Set InitExecStep = cExecStep73 Set InitExecStep = cExecStep98 ' No children to execute - the run is complete Case 74 Case 99 RaiseEvent Set cExecStep74 = New cRunStep Set cExecStep99 = New cRunStep RunComplete(Determine64BitTime()) Set InitExecStep = cExecStep74 Set InitExecStep = cExecStep99 End If Case 75 Case Else End If Set cExecStep75 = New cRunStep Set InitExecStep = Nothing Set InitExecStep = cExecStep75 End Select Exit Sub Case 76 Set cExecStep76 = New cRunStep BugMessage "Sending cExecStep" & RunErr: Set InitExecStep = cExecStep76 (lngIndex + 1) & "!" ' Log the error code raised by Visual Basic Case 77 Call LogErrors(Errors) Set cExecStep77 = New cRunStep If Not InitExecStep Is Nothing Then Call ShowError(errExecuteBranchFailed, Set InitExecStep = cExecStep77 InitExecStep.Index = lngIndex OptArgs:=mstrCurBranchRoot) Case 78 Call ResetForm Set cExecStep78 = New cRunStep ' Remove this element from the collection Set InitExecStep = cExecStep78 of free objects End Sub Case 79 Call RemoveFreeProcess(lngIndex) Private Sub RunNewBranch() Set cExecStep79 = New cRunStep End If ' We will build a tree of all instances that occur Set InitExecStep = cExecStep79 and Case 80 Exit Function ' the count of the sub-steps that are running will Set cExecStep80 = New cRunStep be Set InitExecStep = cExecStep80 InitExecStepErr: ' stored at each node in the tree (maintained Case 81 ' Log the error code raised by Visual Basic internally Set cExecStep81 = New cRunStep Call LogErrors(Errors) ' as an array). Since there can be multiple Set InitExecStep = cExecStep81 Set InitExecStep = Nothing iterations Case 82 ' of the top level nodes running at the same time, Set cExecStep82 = New cRunStep End Function we Set InitExecStep = cExecStep82 Public Sub Run() ' create a dummy node at the root that keeps a Case 83 ' Calls procedures to build a list of all the record of Set cExecStep83 = New cRunStep steps that ' the instances of the top level node. Set InitExecStep = cExecStep83 ' need to be executed and to execute them Case 84 ' Determines whether the run has ' Determines whether the run has Set cExecStep84 = New cRunStep started/terminated and started/terminated and Set InitExecStep = cExecStep84 ' raises the Run Start and Complete events. ' raises the Run Start and Complete events. Case 85 Dim cTempStep As cStep Dim cNextStep As cStep Set cExecStep85 = New cRunStep Dim bRunComplete As Boolean Set InitExecStep = cExecStep85 On Error GoTo RunErr Case 86 On Error GoTo RunNewBranchErr Set cExecStep86 = New cRunStep If StringEmpty(mstrRootKey) Then Set InitExecStep = cExecStep86 Call ShowError(errExecuteBranchFailed) bRunComplete = False Case 87 On Error GoTo 0 Set cExecStep87 = New cRunStep Err.Raise vbObjectError + Do Set InitExecStep = cExecStep87 errExecuteBranchFailed, mstrModuleName & If StringEmpty(mstrCurBranchRoot) Then Case 88 "Run", _ Exit Do Set cExecStep88 = New cRunStep ' On Error GoTo 0 Set InitExecStep = cExecStep88 LoadResString(errExecuteBranchFailed) ' Err.Raise vbObjectError + Case 89 Else errExecuteBranchFailed, mstrSource, _ Set cExecStep89 = New cRunStep ' Execute the first branch ' LoadResString(errExecuteBranchFailed) Set InitExecStep = cExecStep89 WriteToWspLog (mintRunStart) Else Case 90 RaiseEvent Set cNextStep = Set cExecStep90 = New cRunStep RunStart(Determine64BitTime(), mcNavSteps.NextStep(StepKey:=mstrCurBranchRo Set InitExecStep = cExecStep90 mcWspLog.FileName) ot) Case 91 If cNextStep Is Nothing Then Set cExecStep91 = New cRunStep If mstrCurBranchRoot = gstrEmptyString Set InitExecStep = cExecStep91 mcNavSteps.HasChild(StepKey:=mstrRootKe bRunComplete = True Case 92 y) Then Exit Do Set cExecStep92 = New cRunStep Set cTempStep = Else Set InitExecStep = cExecStep92 mcNavSteps.ChildStep(StepKey:=mstrRootKe ' Starting execution of a new branch - Case 93 y) initialize the Set cExecStep93 = New cRunStep mstrCurBranchRoot = ' module-level variable Set InitExecStep = cExecStep93 MakeKeyValid(cTempStep.StepId, Case 94 cTempStep.StepType) HP TPC-H FULL DISCLOSURE REPORT 351 © 2005 Hewlett-Packard Company. All rights reserved. mstrCurBranchRoot = RunBranch = ByVal StartTime As Currency) MakeKeyValid(cNextStep.StepId, mcDummyRootInstance.IsRunning cNextStep.StepType) End If ' Called when a step starts execution. Checks if Call this is the CreateDummyInstance(mstrCurBranchRoot) Exit Function ' first enabled child of the manager step. If so, End If updates End If RunBranchErr: ' the start time and status on the manager. Debug.Print "Running new branch: " & ' Log the error code raised by Visual Basic ' Also raises the Step Start event for the mstrCurBranchRoot Call LogErrors(Errors) completed step. On Error GoTo 0 ' Loop until we find a branch that has mstrSource = mstrModuleName & Dim cStartInst As cInstance steps to execute "RunBranch" Dim cInstanceRec As cInstance Loop While Not Err.Raise vbObjectError + Dim LogLabels As New cVectorStr RunBranch(mstrCurBranchRoot) errExecuteBranchFailed, _ Dim iItIndex As Long mstrSource, Dim sLogLabel As String If bRunComplete Then LoadResString(errExecuteBranchFailed) Dim sPath As String WriteToWspLog (mintRunComplete) Dim sIt As String ' Run is complete End Function Dim sItVal As String RaiseEvent Private Sub RunComplete(Determine64BitTime()) TimeUpdateForProcess(StepRecord As cStep, On Error GoTo TimeStartUpdateForStepErr End If _ ByVal InstanceId As Long, _ Set cStartInst = Exit Sub Optional ByVal StartTime As Currency = mcInstances.QueryInstance(InstanceId) 0, _ RunNewBranchErr: Optional ByVal EndTime As Currency = ' Determine the step path and iterator values for ' Log the error code raised by Visual 0, _ the step and raise a step start event Basic Optional ByVal ElapsedTime As Long = Set cInstanceRec = cStartInst Call LogErrors(Errors) 0, _ Do While cInstanceRec.Key <> Call ShowError(errExecuteBranchFailed, Optional Command As String) mstrDummyRootKey OptArgs:=mstrCurBranchRoot) ' We do not maintain start and end If Not StringEmpty(sPath) Then On Error GoTo 0 timestamps for the constraint sPath = sPath & gstrFileSeparator mstrSource = mstrModuleName & ' of a step. Hence we check if the process End If "RunNewBranch" that just started/ sPath = sPath & gstrSQ & Err.Raise vbObjectError + ' terminated is the worker step that is being cInstanceRec.Step.StepLabel & gstrSQ errExecuteBranchFailed, mstrSource, _ executed. If so, Set cInstanceRec = ' we update the start/end time and status on mcInstances.QueryInstance(cInstanceRec.ParentIns LoadResString(errExecuteBranchFailed) the instance record. tanceId) Loop End Sub Dim cInstanceRec As cInstance Private Function RunBranch(strRootNode Dim sItVal As String For iItIndex = cStartInst.Iterators.Count - 1 To 0 As String) As Boolean Step -1 ' This procedure is called to run all the On Error GoTo TimeUpdateForProcessErr If Not StringEmpty(sIt) Then necessary steps sIt = sIt & gstrFileSeparator ' in a branch. It can also be called when a Set cInstanceRec = End If step terminates, mcInstances.QueryInstance(InstanceId) sIt = sIt & gstrSQ & ' in which case the terminated step is cStartInst.Iterators(iItIndex).Value & gstrSQ passed in as the If StartTime = 0 Then Next iItIndex ' optional parameter. When a step RaiseEvent ProcessComplete(StepRecord, terminates, we need to EndTime, InstanceId, ElapsedTime) sItVal = GetInstanceItValue(cStartInst) ' either wait for some other steps to Else RaiseEvent StepStart(StepRecord, StartTime, terminate before sItVal = InstanceId, cStartInst.ParentInstanceId, _ ' we execute more steps or run as many GetInstanceItValue(cInstanceRec) sPath, sIt, sItVal) steps as necessary RaiseEvent ProcessStart(StepRecord, ' Returns True if there are steps currently Command, StartTime, InstanceId, _ iItIndex = 0 executing cInstanceRec.ParentInstanceId, Set cInstanceRec = cStartInst ' in the branch, else returns False sItVal) ' Raise a StepStart event for the manager step, if Dim cRunning As cInstance End If this is it's first sub-step being executed Do While cInstanceRec.Key <> On Error GoTo RunBranchErr Call mstrDummyRootKey cInstanceRec.UpdateStartTime(StepRecord.Ste If Not StringEmpty(strRootNode) Then pId, StartTime, EndTime, ElapsedTime) sLogLabel = gstrSQ & ' Call a procedure to execute all the cInstanceRec.Step.StepLabel & gstrSQ enabled steps Exit Sub If iItIndex < cStartInst.Iterators.Count Then ' in the branch - will return the step If cStartInst.Iterators(iItIndex).StepId = node that is TimeUpdateForProcessErr: cInstanceRec.Step.StepId Then ' being executed - nothing means 'No ' Log the error code raised by Visual Basic sLogLabel = sLogLabel & msIt & gstrSQ more steps to Call LogErrors(Errors) & cStartInst.Iterators(iItIndex).IteratorName & ' execute in the branch'. WriteError errUpdateDisplayFailed, gstrSQ & _ Do mstrModuleName & "TimeUpdateForProcess" msItValue & gstrSQ & Set cRunning = cStartInst.Iterators(iItIndex).Value & gstrSQ RunPendingStepInBranch(strRootNode, End Sub iItIndex = iItIndex + 1 cRunning) Private Sub End If TimeStartUpdateForStep(StepRecord As End If Loop While Not cRunning Is Nothing cStep, _ LogLabels.Add sLogLabel ByVal InstanceId As Long, _ HP TPC-H FULL DISCLOSURE REPORT 352 © 2005 Hewlett-Packard Company. All rights reserved. If cInstanceRec.Key <> cStartInst.Key For lIndex = 0 To mcWspLog.WriteLine And cInstanceRec.StartTime = 0 Then mcParameters.ParameterCount - 1 (JulianDateToString(Determine64BitTime()) & " cInstanceRec.StartTime = StartTime If Comp. Run: " & vbTab & gstrSQ & cInstanceRec.Status = gintRunning mcParameters(lIndex).ParameterType <> GetWorkspaceDetails(WorkspaceId:=WspId)) & sItVal = gintParameterApplication Then gstrSQ GetInstanceItValue(cInstanceRec) If Not bHdr Then Set mcWspLog = Nothing ' The step path and iterator values are mcWspLog.WriteField not needed for manager steps, since JulianDateToString(Determine64BitTime()) & Case mintStepStart ' they are primarily used by the run " Parameters: " For lIndex = StepDtls.Count - 1 To 0 Step -1 status form bHdr = True sLabel = StepDtls(lIndex) RaiseEvent Else If lIndex = StepDtls.Count - 1 Then StepStart(cInstanceRec.Step, StartTime, mcWspLog.WriteField vbTab mcWspLog.WriteLine cInstanceRec.InstanceId, _ & vbTab & vbTab JulianDateToString(dtStamp) & " Start Step: " & cInstanceRec.ParentInstanceId, End If vbTab & sLabel gstrEmptyString, gstrEmptyString, _ mcWspLog.WriteLine vbTab & Else sItVal) gstrSQ & mcWspLog.WriteLine vbTab & vbTab End If mcParameters(lIndex).ParameterName & & vbTab & vbTab & sLabel gstrSQ & vbTab & vbTab & gstrSQ & End If Set cInstanceRec = mcParameters(lIndex).ParameterValue & Next lIndex mcInstances.QueryInstance(cInstanceRec.Pa gstrSQ rentInstanceId) End If Case mintStepComplete Loop Next lIndex For lIndex = StepDtls.Count - 1 To 0 Step -1 sLabel = StepDtls(lIndex) Call WriteToWspLog(mintStepStart, ' Write all connection properties to the If lIndex = StepDtls.Count - 1 Then LogLabels, StartTime) log mcWspLog.WriteLine Set LogLabels = Nothing For lIndex = 0 To JulianDateToString(dtStamp) & " Comp. Step: " & RunConnections.Count - 1 vbTab & sLabel Exit Sub Set cTempConn = Else RunConnections(lIndex) mcWspLog.WriteLine vbTab & vbTab TimeStartUpdateForStepErr: If lIndex = 0 Then & vbTab & vbTab & sLabel ' Log the error code raised by Visual mcWspLog.WriteField End If Basic JulianDateToString(Determine64BitTime()) & Next lIndex Call LogErrors(Errors) " Connections: " WriteError errUpdateDisplayFailed, Else End Select mstrModuleName & mcWspLog.WriteField vbTab & "TimeStartUpdateForStep" vbTab & vbTab Exit Sub End If End Sub mcWspLog.WriteLine vbTab & WriteToWspLogErr: Private Sub WriteToWspLog(iLogEvent As gstrSQ & cTempConn.ConnectionName & If Not bError Then WspLogEvents, Optional StepDtls As gstrSQ & _ bError = True cVectorStr, _ vbTab & vbTab & gstrSQ & End If Optional dtStamp As Currency = cTempConn.ConnectionValue & gstrSQ & _ gdtmEmpty) vbTab & "No Count: " & End Sub gstrSQ & cTempConn.NoCountDisplay & 'Private Sub WriteToWspLog(iLogEvent As ' Writes to the workspace log that is gstrSQ & gstrBlank & _ WspLogEvents, Optional StepDtls As cVectorStr, _ generated for the run. The last three "No Execute: " & gstrSQ & ' Optional dtStamp As Date = gdtmEmpty) ' parameters are valid only for Step Start cTempConn.NoExecute & gstrSQ & gstrBlank ' and Step Complete events. & _ ' This function uses the LogWriter dll - memory Static bError As Boolean "P arse Query Only: " & gstrSQ corruption problems since the vb exe Dim sLabel As String & cTempConn.ParseQueryOnly & gstrSQ & ' and the vc Execute Dll both use the same dll to Dim lIndex As Long gstrBlank & _ write. Dim bHdr As Boolean "Quoted Identifiers: " & gstrSQ ' ' Writes to the workspace log that is generated Dim cTempConn As cConnection & cTempConn.QuotedIdentifiers & gstrSQ & for the run. The last three gstrBlank & _ ' ' parameters are valid only for StepStart and On Error GoTo WriteToWspLogErr "ANSI Nulls: " & gstrSQ & StepComplete events. cTempConn.AnsiNulls & gstrSQ & gstrBlank ' Static bError As Boolean Select Case iLogEvent & _ ' Static sFile As String Case mintRunStart "Show Query Plan: " & gstrSQ ' Dim sLabel As String Set mcWspLog = New cFileSM & cTempConn.ShowQueryPlan & gstrSQ & ' Dim lIndex As Long mcWspLog.FileName = gstrBlank & _ ' Dim bHdr As Boolean GetDefaultDir(WspId, mcParameters) & "Show Stats Time: " & gstrSQ ' gstrFileSeparator & _ & cTempConn.ShowStatsTime & gstrSQ & ' On Error GoTo WriteToWspLogErr Trim(Str(RunId)) & gstrBlank & _ ' gstrFileSeparator & "SMLog-" & "Show Stats IO: " & gstrSQ & ' Select Case iLogEvent Format(Now, FMT_WSP_LOG_FILE) & cTempConn.ShowStatsIO & gstrSQ & ' Case mintRunStart gstrLogFileSuffix gstrBlank & _ ' Set mcWspLog = New mcWspLog.WriteLine "Row Count" & gstrSQ & LOGWRITERLib.SMLog (JulianDateToString(Determine64BitTime() cTempConn.RowCount & gstrSQ & gstrBlank ' sFile = App.Path & "\" & "SMLog-" & ) & " Start Run: " & vbTab & gstrSQ & & _ Format(Now, FMT_WSP_LOG_FILE) & GetWorkspaceDetails(WorkspaceId:=WspId "Query Timeout" & gstrSQ & gstrLogFileSuffix )) & gstrSQ cTempConn.QueryTimeOut & gstrSQ ' mcWspLog.FileName = sFile Next lIndex ' mcWspLog.Init ' Write all current parameter values ' mcWspLog.WriteLine (Format(Now, to the log Case mintRunComplete FMT_WSP_LOG_DATE) & " Start Run: " & bHdr = False BugAssert Not mcWspLog Is Nothing vbTab & gstrSQ & HP TPC-H FULL DISCLOSURE REPORT 353 © 2005 Hewlett-Packard Company. All rights reserved. GetWorkspaceDetails(WorkspaceId:=WspId ' )) & gstrSQ 'WriteToWspLogErr: ' Initialize all the pre and post-execution ' ' If Not bError Then constraints that ' ' Write all current parameter values ' bError = True ' have been defined globally for the workspace to the log ' End If cExecStep.WspPreCons = mcvntWspPreCons ' bHdr = False ' cExecStep.WspPostCons = mcvntWspPostCons ' For lIndex = 0 To 'End Sub mcParameters.ParameterCount - 1 ' ' Initialize all the pre and post-execution ' If Public Property Get WspPreExecution() As constraints for mcParameters(lIndex).ParameterType <> Variant ' the step being executed gintParameterApplication Then WspPreExecution = mcvntWspPreCons cExecStep.PreCons = ' If Not bHdr Then End Property DetermineConstraints(cCurStep, gintPreStep) ' 'mcWspLog.WriteLine Public Property Let WspPreExecution(ByVal cExecStep.PostCons = Format(Now, FMT_WSP_LOG_DATE) & vdata As Variant) DetermineConstraints(cCurStep, gintPostStep) " Parameters: " & vbTab & gstrSQ & mcvntWspPreCons = vdata mcParameters(lIndex).ParameterName & End Property cExecStep.RunId = RunId gstrSQ & vbTab & vbTab & gstrSQ & cExecStep.CreateInputFiles = CreateInputFiles mcParameters(lIndex).ParameterValue & Public Property Get WspPostExecution() As gstrSQ Variant ' Call the execute method to execute the step ' bHdr = True WspPostExecution = mcvntWspPostCons cExecStep.Execute ' Else End Property ' 'mcWspLog.WriteLine Public Property Let WspPostExecution(ByVal Set cExecStep = Nothing vbTab & vbTab & vbTab & vbTab & vdata As Variant) gstrSQ & mcvntWspPostCons = vdata Exit Sub mcParameters(lIndex).ParameterName & End Property gstrSQ & vbTab & vbTab & gstrSQ & ExecuteStepErr: mcParameters(lIndex).ParameterValue & Private Sub ExecuteStep(cCurStep As ' Log the error code raised by Visual Basic gstrSQ cInstance) Call LogErrors(Errors) ' End If ' Initializes a cRunStep object with all the On Error GoTo 0 ' End If properties Call ExecutionFailed(cExecStep) ' Next lIndex ' corresponding to the step to be executed ' and calls it's End Sub ' Case mintRunComplete ' execute method to execute the step ' BugAssert Not mcWspLog Is Public Property Set Steps(cRunSteps As cArrSteps) Nothing Dim cExecStep As cRunStep ' mcWspLog.WriteLine Set mcRunSteps = cRunSteps (Format(Now, FMT_WSP_LOG_DATE) & On Error GoTo ExecuteStepErr Set mcNavSteps.StepRecords = cRunSteps " Comp. Run: " & vbTab & gstrSQ & mstrSource = mstrModuleName & GetWorkspaceDetails(WorkspaceId:=WspId "ExecuteStep" End Property )) & gstrSQ Public Property Set Parameters(cParameters As ' Set mcWspLog = Nothing ' Confirm that the step is a worker cArrParameters) ' If cCurStep.Step.StepType <> ' A reference to the parameter array - we use it to ' Case mintStepStart gintWorkerStep Then ' substitute parameter values in the step text ' For lIndex = StepDtls.Count - 1 To On Error GoTo 0 0 Step -1 Err.Raise vbObjectError + Set mcParameters = cParameters ' sLabel = StepDtls(lIndex) errExecInstanceFailed, mstrSource, _ ' If lIndex = StepDtls.Count - 1 End Property Then LoadResString(errExecInstanceFailed) Public Property Get Steps() As cArrSteps ' mcWspLog.WriteLine End If Format(dtStamp, FMT_WSP_LOG_DATE) Set Steps = mcRunSteps & " Start Step: " & vbTab & sLabel Set cExecStep = InitExecStep() ' Else ' Exceeded the number of processes that we End Property ' mcWspLog.WriteLine vbTab can run simultaneously Public Property Get Constraints() As & vbTab & vbTab & vbTab & sLabel If cExecStep Is Nothing Then cArrConstraints ' End If ' Raise an error ' Next lIndex On Error GoTo 0 Set Constraints = mcRunConstraints ' Err.Raise vbObjectError + ' Case mintStepComplete errProgramError, mstrSource, _ End Property ' For lIndex = StepDtls.Count - 1 To LoadResString(errProgramError) Public Property Set Constraints(vdata As 0 Step -1 End If cArrConstraints) ' sLabel = StepDtls(lIndex) ' Initialize the instance id - not needed for ' If lIndex = StepDtls.Count - 1 step execution Set mcRunConstraints = vdata Then ' but necessary to identify later which ' mcWspLog.WriteLine instance completed End Property Format(dtStamp, FMT_WSP_LOG_DATE) cExecStep.InstanceId = cCurStep.InstanceId & " Comp. Step: " & vbTab & sLabel ' Else Set cExecStep.ExecuteStep = cCurStep.Step Private Sub ' mcWspLog.WriteLine vbTab Set cExecStep.Iterators = cCurStep.Iterators cExecStep1_ProcessComplete(cStepRecord As & vbTab & vbTab & vbTab & sLabel Set cExecStep.Globals = mcRunSteps cStep, _ ' End If Set cExecStep.WspParameters = dtmEndTime As Currency, lngInstanceId As ' Next lIndex mcParameters Long, lElapsed As Long) ' Set cExecStep.WspConnections = ' End Select RunConnections Call TimeUpdateForProcess(cStepRecord, ' Set cExecStep.WspConnDtls = lngInstanceId, EndTime:=dtmEndTime, ' Exit Sub RunConnDtls ElapsedTime:=lElapsed) HP TPC-H FULL DISCLOSURE REPORT 354 © 2005 Hewlett-Packard Company. All rights reserved. Call TimeUpdateForProcess(cStepRecord, End Sub Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep9.Index, InstanceId, ElapsedTime:=lElapsed) Status) Private Sub End Sub cExecStep1_ProcessStart(cStepRecord As End Sub cStep, _ strCommand As String, dtmStartTime Private Sub Private Sub As Currency, lngInstanceId As Long) cExecStep9_StepStart(cStepRecord As cStep, cExecStep11_ProcessStart(cStepRecord As cStep, _ _ strCommand As String, dtmStartTime As Call dtmStartTime As Currency, InstanceId As Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, Long) lngInstanceId, StartTime:=dtmStartTime, Call TimeUpdateForProcess(cStepRecord, Command:=strCommand) Call TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) End Sub End Sub End Sub

Private Sub Private Sub cExecStep1_StepComplete(cStepRecord As cExecStep10_ProcessComplete(cStepRecord Private Sub cStep, _ As cStep, _ cExecStep11_StepComplete(cStepRecord As cStep, dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId _ As Long, Status As InstanceStatus) As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep1.Index, InstanceId, lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, dtmEndTime, Status) ElapsedTime:=lElapsed) cExecStep11.Index, InstanceId, Status)

End Sub End Sub End Sub

Private Sub Private Sub cExecStep11_StepStart(cStepRecord cExecStep1_StepStart(cStepRecord As Private Sub As cStep, _ cStep, _ cExecStep10_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As dtmStartTime As Currency, InstanceId cStep, _ Long) As Long) strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) TimeStartUpdateForStep(cStepRecord, Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) Private Sub End Sub cExecStep12_ProcessComplete(cStepRecord As End Sub cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId As cExecStep9_ProcessComplete(cStepRecord Long, lElapsed As Long) As cStep, _ Private Sub dtmEndTime As Currency, cExecStep10_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, lngInstanceId As Long, lElapsed As Long) cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime, cExecStep10.Index, InstanceId, Status) Private Sub End Sub cExecStep12_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) Private Sub Private Sub cExecStep9_ProcessStart(cStepRecord As cExecStep10_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cStep, _ _ lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Command:=strCommand) As Currency, lngInstanceId As Long) Long) End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep12_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep11_ProcessComplete(cStepRecord Long, Status As InstanceStatus) As cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, cExecStep9_StepComplete(cStepRecord As As Long, lElapsed As Long) cExecStep12.Index, InstanceId, Status) cStep, _ dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) HP TPC-H FULL DISCLOSURE REPORT 355 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Private Sub cExecStep15_StepStart(cStepRecord cExecStep12_StepStart(cStepRecord As Private Sub As cStep, _ cStep, _ cExecStep14_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As dtmStartTime As Currency, InstanceId cStep, _ Long) As Long) strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) TimeStartUpdateForStep(cStepRecord, Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) Private Sub End Sub cExecStep16_ProcessComplete(cStepRecord As Private Sub End Sub cStep, _ cExecStep13_ProcessComplete(cStepRecor dtmEndTime As Currency, lngInstanceId As d As cStep, _ Long, lElapsed As Long) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep14_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, EndTime:=dtmEndTime, Call dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep14.Index, InstanceId, End Sub Status) Private Sub cExecStep16_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As Private Sub Currency, lngInstanceId As Long) cExecStep13_ProcessStart(cStepRecord As Private Sub cStep, _ cExecStep14_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime _ lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Command:=strCommand) Long) Call End Sub TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) Private Sub End Sub cExecStep16_StepComplete(cStepRecord As cStep, End Sub Private Sub _ cExecStep15_ProcessComplete(cStepRecord dtmEndTime As Currency, InstanceId As As cStep, _ Long, Status As InstanceStatus) Private Sub dtmEndTime As Currency, lngInstanceId cExecStep13_StepComplete(cStepRecord As Long, lElapsed As Long) Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ cExecStep16.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, Private Sub cExecStep16_StepStart(cStepRecord dtmEndTime, cExecStep13.Index, End Sub As cStep, _ InstanceId, Status) dtmStartTime As Currency, InstanceId As Long) End Sub Private Sub cExecStep15_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, Private Sub cStep, _ InstanceId, dtmStartTime) cExecStep13_StepStart(cStepRecord As strCommand As String, dtmStartTime As cStep, _ Currency, lngInstanceId As Long) End Sub dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep17_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub Private Sub ElapsedTime:=lElapsed) cExecStep14_ProcessComplete(cStepRecor cExecStep15_StepComplete(cStepRecord As d As cStep, _ cStep, _ End Sub dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) Private Sub Call Call StepTerminated(cStepRecord, cExecStep17_ProcessStart(cStepRecord As cStep, _ TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep15.Index, InstanceId, strCommand As String, dtmStartTime As lngInstanceId, EndTime:=dtmEndTime, Status) Currency, lngInstanceId As Long) ElapsedTime:=lElapsed) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) HP TPC-H FULL DISCLOSURE REPORT 356 © 2005 Hewlett-Packard Company. All rights reserved. Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) End Sub

End Sub Private Sub Private Sub cExecStep20_StepComplete(cStepRecord As cStep, cExecStep17_StepComplete(cStepRecord Private Sub _ As cStep, _ cExecStep19_ProcessComplete(cStepRecord dtmEndTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId As cStep, _ Long, Status As InstanceStatus) As Long, Status As InstanceStatus) dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, dtmEndTime, Call StepTerminated(cStepRecord, cExecStep20.Index, InstanceId, Status) dtmEndTime, cExecStep17.Index, Call TimeUpdateForProcess(cStepRecord, InstanceId, Status) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) End Sub Private Sub cExecStep20_StepStart(cStepRecord End Sub As cStep, _ Private Sub dtmStartTime As Currency, InstanceId As cExecStep17_StepStart(cStepRecord As Long) cStep, _ Private Sub dtmStartTime As Currency, InstanceId cExecStep19_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, As Long) cStep, _ InstanceId, dtmStartTime) strCommand As String, dtmStartTime As Call Currency, lngInstanceId As Long) End Sub TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep21_ProcessComplete(cStepRecord As End Sub Command:=strCommand) cStep, _ dtmEndTime As Currency, lngInstanceId As Private Sub End Sub Long, lElapsed As Long) cExecStep18_ProcessComplete(cStepRecor d As cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, Private Sub lngInstanceId, EndTime:=dtmEndTime, lngInstanceId As Long, lElapsed As Long) cExecStep19_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cStep, _ Call dtmEndTime As Currency, InstanceId As End Sub TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, cExecStep21_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep19.Index, InstanceId, strCommand As String, dtmStartTime As End Sub Status) Currency, lngInstanceId As Long)

End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep18_ProcessStart(cStepRecord As Private Sub Command:=strCommand) cStep, _ cExecStep19_StepStart(cStepRecord As cStep, strCommand As String, dtmStartTime _ End Sub As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Long) Private Sub Call cExecStep21_StepComplete(cStepRecord As cStep, TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, _ lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Command:=strCommand) Long, Status As InstanceStatus) End Sub End Sub Call StepTerminated(cStepRecord, dtmEndTime, Private Sub cExecStep21.Index, InstanceId, Status) cExecStep20_ProcessComplete(cStepRecord Private Sub As cStep, _ End Sub cExecStep18_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId As cStep, _ As Long, lElapsed As Long) Private Sub cExecStep21_StepStart(cStepRecord dtmEndTime As Currency, InstanceId As cStep, _ As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, Long) Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime, cExecStep18.Index, Call TimeStartUpdateForStep(cStepRecord, InstanceId, Status) End Sub InstanceId, dtmStartTime)

End Sub Private Sub End Sub cExecStep20_ProcessStart(cStepRecord As Private Sub cStep, _ Private Sub cExecStep18_StepStart(cStepRecord As strCommand As String, dtmStartTime As cExecStep22_ProcessComplete(cStepRecord As cStep, _ Currency, lngInstanceId As Long) cStep, _ dtmStartTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId As As Long) Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) HP TPC-H FULL DISCLOSURE REPORT 357 © 2005 Hewlett-Packard Company. All rights reserved. Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep23.Index, InstanceId, Private Sub ElapsedTime:=lElapsed) Status) cExecStep25_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As End Sub End Sub Currency, lngInstanceId As Long)

Private Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep22_ProcessStart(cStepRecord As cExecStep23_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cStep, _ _ Command:=strCommand) strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As As Currency, lngInstanceId As Long) Long) End Sub

Call Call TimeStartUpdateForStep(cStepRecord, Private Sub TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) cExecStep25_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, _ Command:=strCommand) End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) End Sub Private Sub cExecStep24_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, Private Sub As cStep, _ cExecStep25.Index, InstanceId, Status) cExecStep22_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId As cStep, _ As Long, lElapsed As Long) End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep25_StepStart(cStepRecord lngInstanceId, EndTime:=dtmEndTime, As cStep, _ Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep22.Index, Long) InstanceId, Status) End Sub Call TimeStartUpdateForStep(cStepRecord, End Sub Private Sub InstanceId, dtmStartTime) cExecStep24_ProcessStart(cStepRecord As Private Sub cStep, _ End Sub cExecStep22_StepStart(cStepRecord As strCommand As String, dtmStartTime As cStep, _ Currency, lngInstanceId As Long) Private Sub dtmStartTime As Currency, InstanceId cExecStep26_ProcessComplete(cStepRecord As As Long) Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Call Command:=strCommand) Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Private Sub ElapsedTime:=lElapsed) cExecStep24_StepComplete(cStepRecord As Private Sub cStep, _ End Sub cExecStep23_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As d As cStep, _ Long, Status As InstanceStatus) Private Sub dtmEndTime As Currency, cExecStep26_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As dtmEndTime, cExecStep24.Index, InstanceId, Currency, lngInstanceId As Long) Call Status) TimeUpdateForProcess(cStepRecord, Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Command:=strCommand) Private Sub End Sub cExecStep24_StepStart(cStepRecord As cStep, End Sub _ Private Sub dtmStartTime As Currency, InstanceId As Private Sub cExecStep23_ProcessStart(cStepRecord As Long) cExecStep26_StepComplete(cStepRecord As cStep, cStep, _ _ strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) Long, Status As InstanceStatus)

Call End Sub Call StepTerminated(cStepRecord, dtmEndTime, TimeUpdateForProcess(cStepRecord, cExecStep26.Index, InstanceId, Status) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) cExecStep25_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub cExecStep26_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ Private Sub dtmStartTime As Currency, InstanceId As cExecStep23_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, Long) As cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, As Long, Status As InstanceStatus) InstanceId, dtmStartTime) HP TPC-H FULL DISCLOSURE REPORT 358 © 2005 Hewlett-Packard Company. All rights reserved. lngInstanceId, StartTime:=dtmStartTime, Private Sub End Sub Command:=strCommand) cExecStep30_ProcessComplete(cStepRecord As cStep, _ Private Sub End Sub dtmEndTime As Currency, lngInstanceId As cExecStep27_ProcessComplete(cStepRecor Long, lElapsed As Long) d As cStep, _ Private Sub dtmEndTime As Currency, cExecStep28_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, lngInstanceId As Long, lElapsed As Long) cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime, cExecStep28.Index, InstanceId, Private Sub Status) cExecStep30_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub cExecStep27_ProcessStart(cStepRecord As Private Sub Call TimeUpdateForProcess(cStepRecord, cStep, _ cExecStep28_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime _ Command:=strCommand) As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Long) End Sub Call TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) cExecStep30_StepComplete(cStepRecord As cStep, Command:=strCommand) _ End Sub dtmEndTime As Currency, InstanceId As End Sub Long, Status As InstanceStatus) Private Sub Private Sub cExecStep29_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, cExecStep27_StepComplete(cStepRecord As cStep, _ cExecStep30.Index, InstanceId, Status) As cStep, _ dtmEndTime As Currency, lngInstanceId dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep30_StepStart(cStepRecord Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ dtmEndTime, cExecStep27.Index, ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As InstanceId, Status) Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) Private Sub cExecStep29_ProcessStart(cStepRecord As cExecStep27_StepStart(cStepRecord As cStep, _ End Sub cStep, _ strCommand As String, dtmStartTime As dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) Private Sub As Long) cExecStep31_ProcessComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ Call lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Command:=strCommand) Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) Private Sub cExecStep29_StepComplete(cStepRecord As cExecStep28_ProcessComplete(cStepRecor cStep, _ End Sub d As cStep, _ dtmEndTime As Currency, InstanceId As dtmEndTime As Currency, Long, Status As InstanceStatus) Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep31_ProcessStart(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As Call dtmEndTime, cExecStep29.Index, InstanceId, Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, Status) lngInstanceId, EndTime:=dtmEndTime, Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) End Sub lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) End Sub Private Sub cExecStep29_StepStart(cStepRecord As cStep, End Sub Private Sub _ cExecStep28_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As Private Sub cStep, _ Long) cExecStep31_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime _ As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As InstanceId, dtmStartTime) Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, End Sub Call StepTerminated(cStepRecord, dtmEndTime, cExecStep31.Index, InstanceId, Status) HP TPC-H FULL DISCLOSURE REPORT 359 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cExecStep34_StepStart(cStepRecord End Sub End Sub As cStep, _ dtmStartTime As Currency, InstanceId As Private Sub Private Sub Long) cExecStep31_StepStart(cStepRecord As cExecStep33_ProcessStart(cStepRecord As cStep, _ cStep, _ Call TimeStartUpdateForStep(cStepRecord, dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As InstanceId, dtmStartTime) As Long) Currency, lngInstanceId As Long) End Sub Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Private Sub InstanceId, dtmStartTime) Command:=strCommand) cExecStep35_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub Private Sub cExecStep32_ProcessComplete(cStepRecor cExecStep33_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, d As cStep, _ cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub Call Call StepTerminated(cStepRecord, TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep33.Index, InstanceId, Private Sub lngInstanceId, EndTime:=dtmEndTime, Status) cExecStep35_ProcessStart(cStepRecord As cStep, _ ElapsedTime:=lElapsed) strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) End Sub Private Sub Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep33_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cExecStep32_ProcessStart(cStepRecord As _ Command:=strCommand) cStep, _ dtmStartTime As Currency, InstanceId As strCommand As String, dtmStartTime Long) End Sub As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Private Sub Call InstanceId, dtmStartTime) cExecStep35_StepComplete(cStepRecord As cStep, TimeUpdateForProcess(cStepRecord, _ lngInstanceId, StartTime:=dtmStartTime, End Sub dtmEndTime As Currency, InstanceId As Command:=strCommand) Long, Status As InstanceStatus) Private Sub End Sub cExecStep34_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ cExecStep35.Index, InstanceId, Status) Private Sub dtmEndTime As Currency, lngInstanceId cExecStep32_StepComplete(cStepRecord As Long, lElapsed As Long) End Sub As cStep, _ dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep35_StepStart(cStepRecord As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, As cStep, _ ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Call StepTerminated(cStepRecord, Long) dtmEndTime, cExecStep32.Index, End Sub InstanceId, Status) Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) End Sub cExecStep34_ProcessStart(cStepRecord As cStep, _ End Sub Private Sub strCommand As String, dtmStartTime As cExecStep32_StepStart(cStepRecord As Currency, lngInstanceId As Long) Private Sub cStep, _ cExecStep36_ProcessComplete(cStepRecord As dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cStep, _ As Long) lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Command:=strCommand) Long, lElapsed As Long) Call TimeStartUpdateForStep(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) End Sub cExecStep34_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep33_ProcessComplete(cStepRecor Long, Status As InstanceStatus) Private Sub d As cStep, _ cExecStep36_ProcessStart(cStepRecord As cStep, _ dtmEndTime As Currency, Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep34.Index, InstanceId, Currency, lngInstanceId As Long) Status) Call Call TimeUpdateForProcess(cStepRecord, TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, lngInstanceId, EndTime:=dtmEndTime, Command:=strCommand) ElapsedTime:=lElapsed) HP TPC-H FULL DISCLOSURE REPORT 360 © 2005 Hewlett-Packard Company. All rights reserved. End Sub dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) Private Sub cExecStep38_ProcessComplete(cStepRecord cExecStep36_StepComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ dtmEndTime As Currency, lngInstanceId cExecStep39.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) As Long, Status As InstanceStatus) End Sub Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep39_StepStart(cStepRecord dtmEndTime, cExecStep36.Index, ElapsedTime:=lElapsed) As cStep, _ InstanceId, Status) dtmStartTime As Currency, InstanceId As End Sub Long) End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub cExecStep38_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cExecStep36_StepStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As End Sub dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) As Long) Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep40_ProcessComplete(cStepRecord As Call lngInstanceId, StartTime:=dtmStartTime, cStep, _ TimeStartUpdateForStep(cStepRecord, Command:=strCommand) dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Long, lElapsed As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep38_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cExecStep37_ProcessComplete(cStepRecor cStep, _ d As cStep, _ dtmEndTime As Currency, InstanceId As End Sub dtmEndTime As Currency, Long, Status As InstanceStatus) lngInstanceId As Long, lElapsed As Long) Private Sub Call StepTerminated(cStepRecord, cExecStep40_ProcessStart(cStepRecord As cStep, _ Call dtmEndTime, cExecStep38.Index, InstanceId, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, Status) Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Private Sub Command:=strCommand) cExecStep38_StepStart(cStepRecord As cStep, Private Sub _ End Sub cExecStep37_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As cStep, _ Long) Private Sub strCommand As String, dtmStartTime cExecStep40_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, _ InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) Private Sub cExecStep40.Index, InstanceId, Status) cExecStep39_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub As Long, lElapsed As Long) Private Sub cExecStep40_StepStart(cStepRecord cExecStep37_StepComplete(cStepRecord As cStep, _ As cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId lngInstanceId, EndTime:=dtmEndTime, Long) As Long, Status As InstanceStatus) ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, Call StepTerminated(cStepRecord, End Sub InstanceId, dtmStartTime) dtmEndTime, cExecStep37.Index, InstanceId, Status) Private Sub End Sub cExecStep39_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As cExecStep41_ProcessComplete(cStepRecord As Private Sub Currency, lngInstanceId As Long) cStep, _ cExecStep37_StepStart(cStepRecord As dtmEndTime As Currency, lngInstanceId As cStep, _ Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) dtmStartTime As Currency, InstanceId lngInstanceId, StartTime:=dtmStartTime, As Long) Command:=strCommand) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Call End Sub ElapsedTime:=lElapsed) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) Private Sub End Sub cExecStep39_StepComplete(cStepRecord As End Sub cStep, _ HP TPC-H FULL DISCLOSURE REPORT 361 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Private Sub cExecStep41_ProcessStart(cStepRecord As cExecStep42_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cStep, _ _ lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Command:=strCommand) As Currency, lngInstanceId As Long) Long) End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep44_StepComplete(cStepRecord As cStep, Command:=strCommand) End Sub _ dtmEndTime As Currency, InstanceId As End Sub Private Sub Long, Status As InstanceStatus) cExecStep43_ProcessComplete(cStepRecord Private Sub As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, cExecStep41_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId cExecStep44.Index, InstanceId, Status) As cStep, _ As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep44_StepStart(cStepRecord Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) As cStep, _ dtmEndTime, cExecStep41.Index, dtmStartTime As Currency, InstanceId As InstanceId, Status) End Sub Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep43_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep41_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep45_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub Private Sub lngInstanceId, EndTime:=dtmEndTime, cExecStep43_StepComplete(cStepRecord As ElapsedTime:=lElapsed) Private Sub cStep, _ cExecStep42_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As End Sub d As cStep, _ Long, Status As InstanceStatus) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, cExecStep45_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep43.Index, InstanceId, strCommand As String, dtmStartTime As Call Status) Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep43_StepStart(cStepRecord As cStep, _ End Sub Private Sub dtmStartTime As Currency, InstanceId As cExecStep42_ProcessStart(cStepRecord As Long) Private Sub cStep, _ cExecStep45_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, _ As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep45.Index, InstanceId, Status) Command:=strCommand) cExecStep44_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub cExecStep45_StepStart(cStepRecord Private Sub As cStep, _ cExecStep42_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Long) dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) As Long, Status As InstanceStatus) Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep42.Index, Private Sub End Sub InstanceId, Status) cExecStep44_ProcessStart(cStepRecord As cStep, _ Private Sub End Sub strCommand As String, dtmStartTime As cExecStep46_ProcessComplete(cStepRecord As Currency, lngInstanceId As Long) cStep, _ HP TPC-H FULL DISCLOSURE REPORT 362 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep47_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, EndTime:=dtmEndTime, Call dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep47.Index, InstanceId, Private Sub End Sub Status) cExecStep49_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As Private Sub End Sub Currency, lngInstanceId As Long) cExecStep46_ProcessStart(cStepRecord As cStep, _ Private Sub Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime cExecStep47_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) _ Command:=strCommand) dtmStartTime As Currency, InstanceId As Call Long) End Sub TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Call TimeStartUpdateForStep(cStepRecord, Private Sub Command:=strCommand) InstanceId, dtmStartTime) cExecStep49_StepComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Private Sub Private Sub cExecStep46_StepComplete(cStepRecord cExecStep48_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ As cStep, _ cExecStep49.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId As Long, Status As InstanceStatus) As Long, lElapsed As Long) End Sub

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep49_StepStart(cStepRecord dtmEndTime, cExecStep46.Index, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ InstanceId, Status) ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub Private Sub InstanceId, dtmStartTime) cExecStep46_StepStart(cStepRecord As cExecStep48_ProcessStart(cStepRecord As cStep, _ cStep, _ End Sub dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) Private Sub cExecStep50_ProcessComplete(cStepRecord As Call Call TimeUpdateForProcess(cStepRecord, cStep, _ TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Command:=strCommand) Long, lElapsed As Long)

End Sub End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub Private Sub ElapsedTime:=lElapsed) cExecStep47_ProcessComplete(cStepRecor cExecStep48_StepComplete(cStepRecord As d As cStep, _ cStep, _ End Sub dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) Private Sub cExecStep50_ProcessStart(cStepRecord As cStep, _ Call Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep48.Index, InstanceId, Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, Status) ElapsedTime:=lElapsed) Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) Private Sub Private Sub cExecStep48_StepStart(cStepRecord As cStep, End Sub cExecStep47_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As Private Sub strCommand As String, dtmStartTime Long) cExecStep50_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) _ Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As Call InstanceId, dtmStartTime) Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) cExecStep50.Index, InstanceId, Status) Private Sub End Sub cExecStep49_ProcessComplete(cStepRecord End Sub As cStep, _ dtmEndTime As Currency, lngInstanceId Private Sub cExecStep50_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ HP TPC-H FULL DISCLOSURE REPORT 363 © 2005 Hewlett-Packard Company. All rights reserved. dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As Call TimeStartUpdateForStep(cStepRecord, As Long) Currency, lngInstanceId As Long) InstanceId, dtmStartTime)

Call Call TimeUpdateForProcess(cStepRecord, End Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) Private Sub cExecStep54_ProcessComplete(cStepRecord As End Sub End Sub cStep, _ dtmEndTime As Currency, lngInstanceId As Private Sub Private Sub Long, lElapsed As Long) cExecStep51_ProcessComplete(cStepRecor cExecStep52_StepComplete(cStepRecord As d As cStep, _ cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) ElapsedTime:=lElapsed)

Call Call StepTerminated(cStepRecord, End Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep52.Index, InstanceId, lngInstanceId, EndTime:=dtmEndTime, Status) Private Sub ElapsedTime:=lElapsed) cExecStep54_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub Private Sub cExecStep52_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cExecStep51_ProcessStart(cStepRecord As _ lngInstanceId, StartTime:=dtmStartTime, cStep, _ dtmStartTime As Currency, InstanceId As Command:=strCommand) strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) End Sub Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) Private Sub TimeUpdateForProcess(cStepRecord, cExecStep54_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, End Sub _ Command:=strCommand) dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) End Sub cExecStep53_ProcessComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, Private Sub dtmEndTime As Currency, lngInstanceId cExecStep54.Index, InstanceId, Status) cExecStep51_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ End Sub dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep54_StepStart(cStepRecord ElapsedTime:=lElapsed) As cStep, _ Call StepTerminated(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep51.Index, End Sub Long) InstanceId, Status) Private Sub Call TimeStartUpdateForStep(cStepRecord, End Sub cExecStep53_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cStep, _ Private Sub strCommand As String, dtmStartTime As End Sub cExecStep51_StepStart(cStepRecord As Currency, lngInstanceId As Long) cStep, _ Private Sub dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cExecStep55_ProcessComplete(cStepRecord As As Long) lngInstanceId, StartTime:=dtmStartTime, cStep, _ Command:=strCommand) dtmEndTime As Currency, lngInstanceId As Call Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, End Sub cExecStep53_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cStep, _ Private Sub dtmEndTime As Currency, InstanceId As End Sub cExecStep52_ProcessComplete(cStepRecor Long, Status As InstanceStatus) d As cStep, _ Private Sub dtmEndTime As Currency, Call StepTerminated(cStepRecord, cExecStep55_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep53.Index, InstanceId, strCommand As String, dtmStartTime As Status) Currency, lngInstanceId As Long) Call TimeUpdateForProcess(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Private Sub Command:=strCommand) cExecStep53_StepStart(cStepRecord As cStep, End Sub _ End Sub dtmStartTime As Currency, InstanceId As Private Sub Long) Private Sub cExecStep52_ProcessStart(cStepRecord As cExecStep55_StepComplete(cStepRecord As cStep, cStep, _ _ HP TPC-H FULL DISCLOSURE REPORT 364 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, As Long, Status As InstanceStatus) As Long, lElapsed As Long) cExecStep58.Index, InstanceId, Status)

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, End Sub dtmEndTime, cExecStep55.Index, lngInstanceId, EndTime:=dtmEndTime, InstanceId, Status) ElapsedTime:=lElapsed) Private Sub cExecStep58_StepStart(cStepRecord As cStep, _ End Sub End Sub dtmStartTime As Currency, InstanceId As Long) Private Sub Private Sub cExecStep55_StepStart(cStepRecord As cExecStep57_ProcessStart(cStepRecord As Call TimeStartUpdateForStep(cStepRecord, cStep, _ cStep, _ InstanceId, dtmStartTime) dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) End Sub

Call Call TimeUpdateForProcess(cStepRecord, Private Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, cExecStep59_ProcessComplete(cStepRecord As InstanceId, dtmStartTime) Command:=strCommand) cStep, _ dtmEndTime As Currency, lngInstanceId As End Sub End Sub Long, lElapsed As Long)

Private Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep56_ProcessComplete(cStepRecor cExecStep57_StepComplete(cStepRecord As lngInstanceId, EndTime:=dtmEndTime, d As cStep, _ cStep, _ ElapsedTime:=lElapsed) dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub

Call Call StepTerminated(cStepRecord, Private Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep57.Index, InstanceId, cExecStep59_ProcessStart(cStepRecord As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Status) strCommand As String, dtmStartTime As ElapsedTime:=lElapsed) Currency, lngInstanceId As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep57_StepStart(cStepRecord As cStep, Command:=strCommand) cExecStep56_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As End Sub strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep59_StepComplete(cStepRecord As cStep, Call InstanceId, dtmStartTime) _ TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, InstanceId As lngInstanceId, StartTime:=dtmStartTime, End Sub Long, Status As InstanceStatus) Command:=strCommand) Private Sub Call StepTerminated(cStepRecord, dtmEndTime, End Sub cExecStep58_ProcessComplete(cStepRecord cExecStep59.Index, InstanceId, Status) As cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId End Sub cExecStep56_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ Private Sub cExecStep59_StepStart(cStepRecord dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As cStep, _ As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, dtmStartTime As Currency, InstanceId As ElapsedTime:=lElapsed) Long) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep56.Index, End Sub Call TimeStartUpdateForStep(cStepRecord, InstanceId, Status) InstanceId, dtmStartTime) Private Sub End Sub cExecStep58_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As Private Sub cExecStep56_StepStart(cStepRecord As Currency, lngInstanceId As Long) cExecStep60_ProcessComplete(cStepRecord As cStep, _ cStep, _ dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, lngInstanceId As As Long) lngInstanceId, StartTime:=dtmStartTime, Long, lElapsed As Long) Command:=strCommand) Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, InstanceId, dtmStartTime) ElapsedTime:=lElapsed) Private Sub End Sub cExecStep58_StepComplete(cStepRecord As End Sub cStep, _ Private Sub dtmEndTime As Currency, InstanceId As Private Sub cExecStep57_ProcessComplete(cStepRecor Long, Status As InstanceStatus) cExecStep60_ProcessStart(cStepRecord As cStep, _ d As cStep, _ strCommand As String, dtmStartTime As Currency, lngInstanceId As Long) HP TPC-H FULL DISCLOSURE REPORT 365 © 2005 Hewlett-Packard Company. All rights reserved. End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep63_StepComplete(cStepRecord As cStep, Command:=strCommand) End Sub _ dtmEndTime As Currency, InstanceId As End Sub Private Sub Long, Status As InstanceStatus) cExecStep62_ProcessComplete(cStepRecord Private Sub As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, cExecStep60_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId cExecStep63.Index, InstanceId, Status) As cStep, _ As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep63_StepStart(cStepRecord Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) As cStep, _ dtmEndTime, cExecStep60.Index, dtmStartTime As Currency, InstanceId As InstanceId, Status) End Sub Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep62_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep60_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep64_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub Private Sub lngInstanceId, EndTime:=dtmEndTime, cExecStep62_StepComplete(cStepRecord As ElapsedTime:=lElapsed) Private Sub cStep, _ cExecStep61_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As End Sub d As cStep, _ Long, Status As InstanceStatus) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, cExecStep64_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep62.Index, InstanceId, strCommand As String, dtmStartTime As Call Status) Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep62_StepStart(cStepRecord As cStep, _ End Sub Private Sub dtmStartTime As Currency, InstanceId As cExecStep61_ProcessStart(cStepRecord As Long) Private Sub cStep, _ cExecStep64_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, _ As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep64.Index, InstanceId, Status) Command:=strCommand) cExecStep63_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub cExecStep64_StepStart(cStepRecord Private Sub As cStep, _ cExecStep61_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Long) dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) As Long, Status As InstanceStatus) Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep61.Index, Private Sub End Sub InstanceId, Status) cExecStep63_ProcessStart(cStepRecord As cStep, _ Private Sub End Sub strCommand As String, dtmStartTime As cExecStep65_ProcessComplete(cStepRecord As Currency, lngInstanceId As Long) cStep, _ Private Sub dtmEndTime As Currency, lngInstanceId As cExecStep61_StepStart(cStepRecord As Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) cStep, _ lngInstanceId, StartTime:=dtmStartTime, dtmStartTime As Currency, InstanceId Command:=strCommand) As Long) HP TPC-H FULL DISCLOSURE REPORT 366 © 2005 Hewlett-Packard Company. All rights reserved. Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep66.Index, InstanceId, Private Sub ElapsedTime:=lElapsed) Status) cExecStep68_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As End Sub End Sub Currency, lngInstanceId As Long)

Private Sub Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep65_ProcessStart(cStepRecord As cExecStep66_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cStep, _ _ Command:=strCommand) strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As As Currency, lngInstanceId As Long) Long) End Sub

Call Call TimeStartUpdateForStep(cStepRecord, Private Sub TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) cExecStep68_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, _ Command:=strCommand) End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) End Sub Private Sub cExecStep67_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, Private Sub As cStep, _ cExecStep68.Index, InstanceId, Status) cExecStep65_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId As cStep, _ As Long, lElapsed As Long) End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep68_StepStart(cStepRecord lngInstanceId, EndTime:=dtmEndTime, As cStep, _ Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep65.Index, Long) InstanceId, Status) End Sub Call TimeStartUpdateForStep(cStepRecord, End Sub Private Sub InstanceId, dtmStartTime) cExecStep67_ProcessStart(cStepRecord As Private Sub cStep, _ End Sub cExecStep65_StepStart(cStepRecord As strCommand As String, dtmStartTime As cStep, _ Currency, lngInstanceId As Long) Private Sub dtmStartTime As Currency, InstanceId cExecStep69_ProcessComplete(cStepRecord As As Long) Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Call Command:=strCommand) Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Private Sub ElapsedTime:=lElapsed) cExecStep67_StepComplete(cStepRecord As Private Sub cStep, _ End Sub cExecStep66_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As d As cStep, _ Long, Status As InstanceStatus) Private Sub dtmEndTime As Currency, cExecStep69_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As dtmEndTime, cExecStep67.Index, InstanceId, Currency, lngInstanceId As Long) Call Status) TimeUpdateForProcess(cStepRecord, Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Command:=strCommand) Private Sub End Sub cExecStep67_StepStart(cStepRecord As cStep, End Sub _ Private Sub dtmStartTime As Currency, InstanceId As Private Sub cExecStep66_ProcessStart(cStepRecord As Long) cExecStep69_StepComplete(cStepRecord As cStep, cStep, _ _ strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) Long, Status As InstanceStatus)

Call End Sub Call StepTerminated(cStepRecord, dtmEndTime, TimeUpdateForProcess(cStepRecord, cExecStep69.Index, InstanceId, Status) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) cExecStep68_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub cExecStep69_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ Private Sub dtmStartTime As Currency, InstanceId As cExecStep66_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, Long) As cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, As Long, Status As InstanceStatus) InstanceId, dtmStartTime) HP TPC-H FULL DISCLOSURE REPORT 367 © 2005 Hewlett-Packard Company. All rights reserved. lngInstanceId, StartTime:=dtmStartTime, Private Sub End Sub Command:=strCommand) cExecStep73_ProcessComplete(cStepRecord As cStep, _ Private Sub End Sub dtmEndTime As Currency, lngInstanceId As cExecStep70_ProcessComplete(cStepRecor Long, lElapsed As Long) d As cStep, _ Private Sub dtmEndTime As Currency, cExecStep71_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, lngInstanceId As Long, lElapsed As Long) cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime, cExecStep71.Index, InstanceId, Private Sub Status) cExecStep73_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub cExecStep70_ProcessStart(cStepRecord As Private Sub Call TimeUpdateForProcess(cStepRecord, cStep, _ cExecStep71_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime _ Command:=strCommand) As Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId As Long) End Sub Call TimeUpdateForProcess(cStepRecord, Call TimeStartUpdateForStep(cStepRecord, Private Sub lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) cExecStep73_StepComplete(cStepRecord As cStep, Command:=strCommand) _ End Sub dtmEndTime As Currency, InstanceId As End Sub Long, Status As InstanceStatus) Private Sub Private Sub cExecStep72_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, cExecStep70_StepComplete(cStepRecord As cStep, _ cExecStep73.Index, InstanceId, Status) As cStep, _ dtmEndTime As Currency, lngInstanceId dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep73_StepStart(cStepRecord Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ dtmEndTime, cExecStep70.Index, ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As InstanceId, Status) Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) Private Sub cExecStep72_ProcessStart(cStepRecord As cExecStep70_StepStart(cStepRecord As cStep, _ End Sub cStep, _ strCommand As String, dtmStartTime As dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) Private Sub As Long) cExecStep74_ProcessComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ Call lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Command:=strCommand) Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) Private Sub cExecStep72_StepComplete(cStepRecord As cExecStep71_ProcessComplete(cStepRecor cStep, _ End Sub d As cStep, _ dtmEndTime As Currency, InstanceId As dtmEndTime As Currency, Long, Status As InstanceStatus) Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep74_ProcessStart(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As Call dtmEndTime, cExecStep72.Index, InstanceId, Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, Status) lngInstanceId, EndTime:=dtmEndTime, Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) End Sub lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) End Sub Private Sub cExecStep72_StepStart(cStepRecord As cStep, End Sub Private Sub _ cExecStep71_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As Private Sub cStep, _ Long) cExecStep74_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime _ As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As InstanceId, dtmStartTime) Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, End Sub Call StepTerminated(cStepRecord, dtmEndTime, cExecStep74.Index, InstanceId, Status) HP TPC-H FULL DISCLOSURE REPORT 368 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cExecStep77_StepStart(cStepRecord End Sub End Sub As cStep, _ dtmStartTime As Currency, InstanceId As Private Sub Private Sub Long) cExecStep74_StepStart(cStepRecord As cExecStep76_ProcessStart(cStepRecord As cStep, _ cStep, _ Call TimeStartUpdateForStep(cStepRecord, dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As InstanceId, dtmStartTime) As Long) Currency, lngInstanceId As Long) End Sub Call Call TimeUpdateForProcess(cStepRecord, TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Private Sub InstanceId, dtmStartTime) Command:=strCommand) cExecStep78_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub Private Sub cExecStep75_ProcessComplete(cStepRecor cExecStep76_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, d As cStep, _ cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) End Sub Call Call StepTerminated(cStepRecord, TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep76.Index, InstanceId, Private Sub lngInstanceId, EndTime:=dtmEndTime, Status) cExecStep78_ProcessStart(cStepRecord As cStep, _ ElapsedTime:=lElapsed) strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) End Sub Private Sub Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep76_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, cExecStep75_ProcessStart(cStepRecord As _ Command:=strCommand) cStep, _ dtmStartTime As Currency, InstanceId As strCommand As String, dtmStartTime Long) End Sub As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Private Sub Call InstanceId, dtmStartTime) cExecStep78_StepComplete(cStepRecord As cStep, TimeUpdateForProcess(cStepRecord, _ lngInstanceId, StartTime:=dtmStartTime, End Sub dtmEndTime As Currency, InstanceId As Command:=strCommand) Long, Status As InstanceStatus) Private Sub End Sub cExecStep77_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ cExecStep78.Index, InstanceId, Status) Private Sub dtmEndTime As Currency, lngInstanceId cExecStep75_StepComplete(cStepRecord As Long, lElapsed As Long) End Sub As cStep, _ dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep78_StepStart(cStepRecord As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, As cStep, _ ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Call StepTerminated(cStepRecord, Long) dtmEndTime, cExecStep75.Index, End Sub InstanceId, Status) Call TimeStartUpdateForStep(cStepRecord, Private Sub InstanceId, dtmStartTime) End Sub cExecStep77_ProcessStart(cStepRecord As cStep, _ End Sub Private Sub strCommand As String, dtmStartTime As cExecStep75_StepStart(cStepRecord As Currency, lngInstanceId As Long) Private Sub cStep, _ cExecStep79_ProcessComplete(cStepRecord As dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cStep, _ As Long) lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As Command:=strCommand) Long, lElapsed As Long) Call TimeStartUpdateForStep(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, EndTime:=dtmEndTime, Private Sub ElapsedTime:=lElapsed) End Sub cExecStep77_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep76_ProcessComplete(cStepRecor Long, Status As InstanceStatus) Private Sub d As cStep, _ cExecStep79_ProcessStart(cStepRecord As cStep, _ dtmEndTime As Currency, Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep77.Index, InstanceId, Currency, lngInstanceId As Long) Status) Call Call TimeUpdateForProcess(cStepRecord, TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, lngInstanceId, EndTime:=dtmEndTime, Command:=strCommand) ElapsedTime:=lElapsed) HP TPC-H FULL DISCLOSURE REPORT 369 © 2005 Hewlett-Packard Company. All rights reserved. End Sub dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) Private Sub cExecStep81_ProcessComplete(cStepRecord cExecStep79_StepComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ dtmEndTime As Currency, lngInstanceId cExecStep82.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) As Long, Status As InstanceStatus) End Sub Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep82_StepStart(cStepRecord dtmEndTime, cExecStep79.Index, ElapsedTime:=lElapsed) As cStep, _ InstanceId, Status) dtmStartTime As Currency, InstanceId As End Sub Long) End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub cExecStep81_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cExecStep79_StepStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As End Sub dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) As Long) Private Sub Call TimeUpdateForProcess(cStepRecord, cExecStep83_ProcessComplete(cStepRecord As Call lngInstanceId, StartTime:=dtmStartTime, cStep, _ TimeStartUpdateForStep(cStepRecord, Command:=strCommand) dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Long, lElapsed As Long) End Sub End Sub Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep81_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cExecStep80_ProcessComplete(cStepRecor cStep, _ d As cStep, _ dtmEndTime As Currency, InstanceId As End Sub dtmEndTime As Currency, Long, Status As InstanceStatus) lngInstanceId As Long, lElapsed As Long) Private Sub Call StepTerminated(cStepRecord, cExecStep83_ProcessStart(cStepRecord As cStep, _ Call dtmEndTime, cExecStep81.Index, InstanceId, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, Status) Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Private Sub Command:=strCommand) cExecStep81_StepStart(cStepRecord As cStep, Private Sub _ End Sub cExecStep80_ProcessStart(cStepRecord As dtmStartTime As Currency, InstanceId As cStep, _ Long) Private Sub strCommand As String, dtmStartTime cExecStep83_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, _ InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Call Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) Private Sub cExecStep83.Index, InstanceId, Status) cExecStep82_ProcessComplete(cStepRecord End Sub As cStep, _ End Sub dtmEndTime As Currency, lngInstanceId Private Sub As Long, lElapsed As Long) Private Sub cExecStep83_StepStart(cStepRecord cExecStep80_StepComplete(cStepRecord As cStep, _ As cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime As Currency, InstanceId lngInstanceId, EndTime:=dtmEndTime, Long) As Long, Status As InstanceStatus) ElapsedTime:=lElapsed) Call TimeStartUpdateForStep(cStepRecord, Call StepTerminated(cStepRecord, End Sub InstanceId, dtmStartTime) dtmEndTime, cExecStep80.Index, InstanceId, Status) Private Sub End Sub cExecStep82_ProcessStart(cStepRecord As End Sub cStep, _ Private Sub strCommand As String, dtmStartTime As cExecStep84_ProcessComplete(cStepRecord As Private Sub Currency, lngInstanceId As Long) cStep, _ cExecStep80_StepStart(cStepRecord As dtmEndTime As Currency, lngInstanceId As cStep, _ Call TimeUpdateForProcess(cStepRecord, Long, lElapsed As Long) dtmStartTime As Currency, InstanceId lngInstanceId, StartTime:=dtmStartTime, As Long) Command:=strCommand) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Call End Sub ElapsedTime:=lElapsed) TimeStartUpdateForStep(cStepRecord, InstanceId, dtmStartTime) Private Sub End Sub cExecStep82_StepComplete(cStepRecord As End Sub cStep, _ HP TPC-H FULL DISCLOSURE REPORT 370 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub Private Sub cExecStep84_ProcessStart(cStepRecord As cExecStep85_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cStep, _ _ lngInstanceId, StartTime:=dtmStartTime, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Command:=strCommand) As Currency, lngInstanceId As Long) Long) End Sub Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) Private Sub lngInstanceId, StartTime:=dtmStartTime, cExecStep87_StepComplete(cStepRecord As cStep, Command:=strCommand) End Sub _ dtmEndTime As Currency, InstanceId As End Sub Private Sub Long, Status As InstanceStatus) cExecStep86_ProcessComplete(cStepRecord Private Sub As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, cExecStep84_StepComplete(cStepRecord dtmEndTime As Currency, lngInstanceId cExecStep87.Index, InstanceId, Status) As cStep, _ As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId End Sub As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep87_StepStart(cStepRecord Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) As cStep, _ dtmEndTime, cExecStep84.Index, dtmStartTime As Currency, InstanceId As InstanceId, Status) End Sub Long)

End Sub Private Sub Call TimeStartUpdateForStep(cStepRecord, cExecStep86_ProcessStart(cStepRecord As InstanceId, dtmStartTime) Private Sub cStep, _ cExecStep84_StepStart(cStepRecord As strCommand As String, dtmStartTime As End Sub cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId Private Sub As Long) Call TimeUpdateForProcess(cStepRecord, cExecStep88_ProcessComplete(cStepRecord As lngInstanceId, StartTime:=dtmStartTime, cStep, _ Call Command:=strCommand) dtmEndTime As Currency, lngInstanceId As TimeStartUpdateForStep(cStepRecord, Long, lElapsed As Long) InstanceId, dtmStartTime) End Sub Call TimeUpdateForProcess(cStepRecord, End Sub Private Sub lngInstanceId, EndTime:=dtmEndTime, cExecStep86_StepComplete(cStepRecord As ElapsedTime:=lElapsed) Private Sub cStep, _ cExecStep85_ProcessComplete(cStepRecor dtmEndTime As Currency, InstanceId As End Sub d As cStep, _ Long, Status As InstanceStatus) dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, cExecStep88_ProcessStart(cStepRecord As cStep, _ dtmEndTime, cExecStep86.Index, InstanceId, strCommand As String, dtmStartTime As Call Status) Currency, lngInstanceId As Long) TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call TimeUpdateForProcess(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep86_StepStart(cStepRecord As cStep, _ End Sub Private Sub dtmStartTime As Currency, InstanceId As cExecStep85_ProcessStart(cStepRecord As Long) Private Sub cStep, _ cExecStep88_StepComplete(cStepRecord As cStep, strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, _ As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call End Sub TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, Private Sub cExecStep88.Index, InstanceId, Status) Command:=strCommand) cExecStep87_ProcessComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub cExecStep88_StepStart(cStepRecord Private Sub As cStep, _ cExecStep85_StepComplete(cStepRecord Call TimeUpdateForProcess(cStepRecord, dtmStartTime As Currency, InstanceId As As cStep, _ lngInstanceId, EndTime:=dtmEndTime, Long) dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) As Long, Status As InstanceStatus) Call TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep85.Index, Private Sub End Sub InstanceId, Status) cExecStep87_ProcessStart(cStepRecord As cStep, _ Private Sub End Sub strCommand As String, dtmStartTime As cExecStep89_ProcessComplete(cStepRecord As Currency, lngInstanceId As Long) cStep, _ HP TPC-H FULL DISCLOSURE REPORT 371 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, Private Sub lngInstanceId As Long, lElapsed As Long) cExecStep90_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, cStep, _ lngInstanceId, EndTime:=dtmEndTime, Call dtmEndTime As Currency, InstanceId As ElapsedTime:=lElapsed) TimeUpdateForProcess(cStepRecord, Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) Call StepTerminated(cStepRecord, dtmEndTime, cExecStep90.Index, InstanceId, Private Sub End Sub Status) cExecStep92_ProcessStart(cStepRecord As cStep, _ strCommand As String, dtmStartTime As Private Sub End Sub Currency, lngInstanceId As Long) cExecStep89_ProcessStart(cStepRecord As cStep, _ Private Sub Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime cExecStep90_StepStart(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) _ Command:=strCommand) dtmStartTime As Currency, InstanceId As Call Long) End Sub TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Call TimeStartUpdateForStep(cStepRecord, Private Sub Command:=strCommand) InstanceId, dtmStartTime) cExecStep92_StepComplete(cStepRecord As cStep, _ End Sub End Sub dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Private Sub Private Sub cExecStep89_StepComplete(cStepRecord cExecStep91_ProcessComplete(cStepRecord Call StepTerminated(cStepRecord, dtmEndTime, As cStep, _ As cStep, _ cExecStep92.Index, InstanceId, Status) dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId As Long, Status As InstanceStatus) As Long, lElapsed As Long) End Sub

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, Private Sub cExecStep92_StepStart(cStepRecord dtmEndTime, cExecStep89.Index, lngInstanceId, EndTime:=dtmEndTime, As cStep, _ InstanceId, Status) ElapsedTime:=lElapsed) dtmStartTime As Currency, InstanceId As Long) End Sub End Sub Call TimeStartUpdateForStep(cStepRecord, Private Sub Private Sub InstanceId, dtmStartTime) cExecStep89_StepStart(cStepRecord As cExecStep91_ProcessStart(cStepRecord As cStep, _ cStep, _ End Sub dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As As Long) Currency, lngInstanceId As Long) Private Sub cExecStep93_ProcessComplete(cStepRecord As Call Call TimeUpdateForProcess(cStepRecord, cStep, _ TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, dtmEndTime As Currency, lngInstanceId As InstanceId, dtmStartTime) Command:=strCommand) Long, lElapsed As Long)

End Sub End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, Private Sub Private Sub ElapsedTime:=lElapsed) cExecStep90_ProcessComplete(cStepRecor cExecStep91_StepComplete(cStepRecord As d As cStep, _ cStep, _ End Sub dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) Private Sub cExecStep93_ProcessStart(cStepRecord As cStep, _ Call Call StepTerminated(cStepRecord, strCommand As String, dtmStartTime As TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep91.Index, InstanceId, Currency, lngInstanceId As Long) lngInstanceId, EndTime:=dtmEndTime, Status) ElapsedTime:=lElapsed) Call TimeUpdateForProcess(cStepRecord, End Sub lngInstanceId, StartTime:=dtmStartTime, End Sub Command:=strCommand) Private Sub Private Sub cExecStep91_StepStart(cStepRecord As cStep, End Sub cExecStep90_ProcessStart(cStepRecord As _ cStep, _ dtmStartTime As Currency, InstanceId As Private Sub strCommand As String, dtmStartTime Long) cExecStep93_StepComplete(cStepRecord As cStep, As Currency, lngInstanceId As Long) _ Call TimeStartUpdateForStep(cStepRecord, dtmEndTime As Currency, InstanceId As Call InstanceId, dtmStartTime) Long, Status As InstanceStatus) TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, End Sub Call StepTerminated(cStepRecord, dtmEndTime, Command:=strCommand) cExecStep93.Index, InstanceId, Status) Private Sub End Sub cExecStep92_ProcessComplete(cStepRecord End Sub As cStep, _ dtmEndTime As Currency, lngInstanceId Private Sub cExecStep93_StepStart(cStepRecord As Long, lElapsed As Long) As cStep, _ HP TPC-H FULL DISCLOSURE REPORT 372 © 2005 Hewlett-Packard Company. All rights reserved. dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As Call TimeStartUpdateForStep(cStepRecord, As Long) Currency, lngInstanceId As Long) InstanceId, dtmStartTime)

Call Call TimeUpdateForProcess(cStepRecord, End Sub TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) Private Sub cExecStep97_ProcessComplete(cStepRecord As End Sub End Sub cStep, _ dtmEndTime As Currency, lngInstanceId As Private Sub Private Sub Long, lElapsed As Long) cExecStep94_ProcessComplete(cStepRecor cExecStep95_StepComplete(cStepRecord As d As cStep, _ cStep, _ Call TimeUpdateForProcess(cStepRecord, dtmEndTime As Currency, dtmEndTime As Currency, InstanceId As lngInstanceId, EndTime:=dtmEndTime, lngInstanceId As Long, lElapsed As Long) Long, Status As InstanceStatus) ElapsedTime:=lElapsed)

Call Call StepTerminated(cStepRecord, End Sub TimeUpdateForProcess(cStepRecord, dtmEndTime, cExecStep95.Index, InstanceId, lngInstanceId, EndTime:=dtmEndTime, Status) Private Sub ElapsedTime:=lElapsed) cExecStep97_ProcessStart(cStepRecord As cStep, _ End Sub strCommand As String, dtmStartTime As End Sub Currency, lngInstanceId As Long) Private Sub Private Sub cExecStep95_StepStart(cStepRecord As cStep, Call TimeUpdateForProcess(cStepRecord, cExecStep94_ProcessStart(cStepRecord As _ lngInstanceId, StartTime:=dtmStartTime, cStep, _ dtmStartTime As Currency, InstanceId As Command:=strCommand) strCommand As String, dtmStartTime Long) As Currency, lngInstanceId As Long) End Sub Call TimeStartUpdateForStep(cStepRecord, Call InstanceId, dtmStartTime) Private Sub TimeUpdateForProcess(cStepRecord, cExecStep97_StepComplete(cStepRecord As cStep, lngInstanceId, StartTime:=dtmStartTime, End Sub _ Command:=strCommand) dtmEndTime As Currency, InstanceId As Private Sub Long, Status As InstanceStatus) End Sub cExecStep96_ProcessComplete(cStepRecord As cStep, _ Call StepTerminated(cStepRecord, dtmEndTime, Private Sub dtmEndTime As Currency, lngInstanceId cExecStep97.Index, InstanceId, Status) cExecStep94_StepComplete(cStepRecord As Long, lElapsed As Long) As cStep, _ End Sub dtmEndTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, As Long, Status As InstanceStatus) lngInstanceId, EndTime:=dtmEndTime, Private Sub cExecStep97_StepStart(cStepRecord ElapsedTime:=lElapsed) As cStep, _ Call StepTerminated(cStepRecord, dtmStartTime As Currency, InstanceId As dtmEndTime, cExecStep94.Index, End Sub Long) InstanceId, Status) Private Sub Call TimeStartUpdateForStep(cStepRecord, End Sub cExecStep96_ProcessStart(cStepRecord As InstanceId, dtmStartTime) cStep, _ Private Sub strCommand As String, dtmStartTime As End Sub cExecStep94_StepStart(cStepRecord As Currency, lngInstanceId As Long) cStep, _ Private Sub dtmStartTime As Currency, InstanceId Call TimeUpdateForProcess(cStepRecord, cExecStep98_ProcessComplete(cStepRecord As As Long) lngInstanceId, StartTime:=dtmStartTime, cStep, _ Command:=strCommand) dtmEndTime As Currency, lngInstanceId As Call Long, lElapsed As Long) TimeStartUpdateForStep(cStepRecord, End Sub InstanceId, dtmStartTime) Call TimeUpdateForProcess(cStepRecord, Private Sub lngInstanceId, EndTime:=dtmEndTime, End Sub cExecStep96_StepComplete(cStepRecord As ElapsedTime:=lElapsed) cStep, _ Private Sub dtmEndTime As Currency, InstanceId As End Sub cExecStep95_ProcessComplete(cStepRecor Long, Status As InstanceStatus) d As cStep, _ Private Sub dtmEndTime As Currency, Call StepTerminated(cStepRecord, cExecStep98_ProcessStart(cStepRecord As cStep, _ lngInstanceId As Long, lElapsed As Long) dtmEndTime, cExecStep96.Index, InstanceId, strCommand As String, dtmStartTime As Status) Currency, lngInstanceId As Long) Call TimeUpdateForProcess(cStepRecord, End Sub Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, lngInstanceId, StartTime:=dtmStartTime, ElapsedTime:=lElapsed) Private Sub Command:=strCommand) cExecStep96_StepStart(cStepRecord As cStep, End Sub _ End Sub dtmStartTime As Currency, InstanceId As Private Sub Long) Private Sub cExecStep95_ProcessStart(cStepRecord As cExecStep98_StepComplete(cStepRecord As cStep, cStep, _ _ HP TPC-H FULL DISCLOSURE REPORT 373 © 2005 Hewlett-Packard Company. All rights reserved. dtmEndTime As Currency, InstanceId dtmEndTime As Currency, lngInstanceId dtmEndTime As Currency, InstanceId As As Long, Status As InstanceStatus) As Long, lElapsed As Long) Long, Status As InstanceStatus)

Call StepTerminated(cStepRecord, Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, dtmEndTime, dtmEndTime, cExecStep98.Index, lngInstanceId, EndTime:=dtmEndTime, cExecStep3.Index, _ InstanceId, Status) ElapsedTime:=lElapsed) InstanceId, Status)

End Sub End Sub End Sub

Private Sub Private Sub Private Sub cExecStep3_StepStart(cStepRecord As cExecStep98_StepStart(cStepRecord As cExecStep2_ProcessStart(cStepRecord As cStep, _ cStep, _ cStep, _ dtmStartTime As Currency, InstanceId As dtmStartTime As Currency, InstanceId strCommand As String, dtmStartTime As Long) As Long) Currency, lngInstanceId As Long) Call TimeStartUpdateForStep(cStepRecord, Call Call TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) TimeStartUpdateForStep(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, InstanceId, dtmStartTime) Command:=strCommand) End Sub

End Sub End Sub Private Sub Private Sub cExecStep4_ProcessComplete(cStepRecord As cExecStep99_ProcessComplete(cStepRecor Private Sub cStep, _ d As cStep, _ cExecStep2_StepComplete(cStepRecord As dtmEndTime As Currency, lngInstanceId As dtmEndTime As Currency, cStep, _ Long, lElapsed As Long) lngInstanceId As Long, lElapsed As Long) dtmEndTime As Currency, InstanceId As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, Call lngInstanceId, EndTime:=dtmEndTime, TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) lngInstanceId, EndTime:=dtmEndTime, dtmEndTime, cExecStep2.Index, _ ElapsedTime:=lElapsed) InstanceId, Status) End Sub

End Sub End Sub Private Sub cExecStep4_ProcessStart(cStepRecord As cStep, _ Private Sub Private Sub strCommand As String, dtmStartTime As cExecStep99_ProcessStart(cStepRecord As cExecStep2_StepStart(cStepRecord As cStep, Currency, lngInstanceId As Long) cStep, _ _ strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As Call TimeUpdateForProcess(cStepRecord, As Currency, lngInstanceId As Long) Long) lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) Call Call TimeStartUpdateForStep(cStepRecord, TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) End Sub lngInstanceId, StartTime:=dtmStartTime, Command:=strCommand) End Sub Private Sub cExecStep4_StepComplete(cStepRecord As cStep, End Sub _ Private Sub dtmEndTime As Currency, InstanceId As Private Sub cExecStep3_ProcessComplete(cStepRecord As Long, Status As InstanceStatus) cExecStep99_StepComplete(cStepRecord cStep, _ As cStep, _ dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, dtmEndTime As Currency, InstanceId As Long, lElapsed As Long) cExecStep4.Index, _ As Long, Status As InstanceStatus) InstanceId, Status) Call TimeUpdateForProcess(cStepRecord, Call StepTerminated(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub dtmEndTime, cExecStep99.Index, ElapsedTime:=lElapsed) InstanceId, Status) End Sub Private Sub cExecStep4_StepStart(cStepRecord As End Sub cStep, _ Private Sub dtmStartTime As Currency, InstanceId As Private Sub cExecStep3_ProcessStart(cStepRecord As Long) cExecStep99_StepStart(cStepRecord As cStep, _ cStep, _ strCommand As String, dtmStartTime As Call TimeStartUpdateForStep(cStepRecord, dtmStartTime As Currency, InstanceId Currency, lngInstanceId As Long) InstanceId, dtmStartTime) As Long) Call TimeUpdateForProcess(cStepRecord, End Sub Call lngInstanceId, StartTime:=dtmStartTime, TimeStartUpdateForStep(cStepRecord, Command:=strCommand) Private Sub InstanceId, dtmStartTime) cExecStep5_ProcessComplete(cStepRecord As End Sub cStep, _ End Sub dtmEndTime As Currency, lngInstanceId As Long, lElapsed As Long) Private Sub Private Sub cExecStep2_ProcessComplete(cStepRecord cExecStep3_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, As cStep, _ cStep, _ lngInstanceId, EndTime:=dtmEndTime, ElapsedTime:=lElapsed) HP TPC-H FULL DISCLOSURE REPORT 374 © 2005 Hewlett-Packard Company. All rights reserved. Private Sub cExecStep8_ProcessStart(cStepRecord End Sub End Sub As cStep, _ strCommand As String, dtmStartTime As Private Sub Private Sub Currency, lngInstanceId As Long) cExecStep5_ProcessStart(cStepRecord As cExecStep6_StepStart(cStepRecord As cStep, cStep, _ _ Call TimeUpdateForProcess(cStepRecord, strCommand As String, dtmStartTime dtmStartTime As Currency, InstanceId As lngInstanceId, StartTime:=dtmStartTime, As Currency, lngInstanceId As Long) Long) Command:=strCommand)

Call Call TimeStartUpdateForStep(cStepRecord, End Sub TimeUpdateForProcess(cStepRecord, InstanceId, dtmStartTime) lngInstanceId, StartTime:=dtmStartTime, Private Sub Command:=strCommand) End Sub cExecStep8_StepComplete(cStepRecord As cStep, _ End Sub Private Sub dtmEndTime As Currency, InstanceId As cExecStep7_ProcessComplete(cStepRecord As Long, Status As InstanceStatus) Private Sub cStep, _ cExecStep5_StepComplete(cStepRecord As dtmEndTime As Currency, lngInstanceId Call StepTerminated(cStepRecord, dtmEndTime, cStep, _ As Long, lElapsed As Long) cExecStep8.Index, _ dtmEndTime As Currency, InstanceId InstanceId, Status) As Long, Status As InstanceStatus) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, EndTime:=dtmEndTime, End Sub Call StepTerminated(cStepRecord, ElapsedTime:=lElapsed) dtmEndTime, cExecStep5.Index, _ Private Sub cExecStep8_StepStart(cStepRecord As InstanceId, Status) End Sub cStep, _ dtmStartTime As Currency, InstanceId As End Sub Private Sub Long) cExecStep7_ProcessStart(cStepRecord As Private Sub cStep, _ Call TimeStartUpdateForStep(cStepRecord, cExecStep5_StepStart(cStepRecord As strCommand As String, dtmStartTime As InstanceId, dtmStartTime) cStep, _ Currency, lngInstanceId As Long) dtmStartTime As Currency, InstanceId End Sub As Long) Call TimeUpdateForProcess(cStepRecord, lngInstanceId, StartTime:=dtmStartTime, Private Sub Class_Initialize() Call Command:=strCommand) TimeStartUpdateForStep(cStepRecord, Dim lngCount As Long InstanceId, dtmStartTime) End Sub Dim lngTemp As Long

End Sub Private Sub On Error GoTo InitializeErr cExecStep7_StepComplete(cStepRecord As Private Sub cStep, _ Set mcFreeSteps = New cVectorLng cExecStep6_ProcessComplete(cStepRecord dtmEndTime As Currency, InstanceId As ' Initialize the array of free objects with all As cStep, _ Long, Status As InstanceStatus) elements dtmEndTime As Currency, ' for now lngInstanceId As Long, lElapsed As Long) Call StepTerminated(cStepRecord, For lngCount = 0 To dtmEndTime, cExecStep7.Index, _ glngNumConcurrentProcesses - 1 Step 1 Call InstanceId, Status) mcFreeSteps.Add lngCount TimeUpdateForProcess(cStepRecord, Next lngCount lngInstanceId, EndTime:=dtmEndTime, End Sub ElapsedTime:=lElapsed) ' Initialize a byte array with the number of free Private Sub processes. It will End Sub cExecStep7_StepStart(cStepRecord As cStep, ' be used later to determine if any step is running _ ' Each element in the array can represent 8 steps, Private Sub dtmStartTime As Currency, InstanceId As 1 for each bit cExecStep6_ProcessStart(cStepRecord As Long) ReDim mbarrFree(glngNumConcurrentProcesses cStep, _ \ gintBitsPerByte) strCommand As String, dtmStartTime Call TimeStartUpdateForStep(cStepRecord, As Currency, lngInstanceId As Long) InstanceId, dtmStartTime) ' Initialize each element in the byte array w/ all 1's Call End Sub ' (upto glngNumConcurrentProcesses) TimeUpdateForProcess(cStepRecord, For lngCount = LBound(mbarrFree) To lngInstanceId, StartTime:=dtmStartTime, Private Sub UBound(mbarrFree) Step 1 Command:=strCommand) cExecStep8_ProcessComplete(cStepRecord As lngTemp = IIf( _ cStep, _ glngNumConcurrentProcesses - End Sub dtmEndTime As Currency, lngInstanceId (gintBitsPerByte * lngCount) > gintBitsPerByte, _ As Long, lElapsed As Long) gintBitsPerByte, _ Private Sub glngNumConcurrentProcesses - cExecStep6_StepComplete(cStepRecord As Call TimeUpdateForProcess(cStepRecord, (gintBitsPerByte * lngCount)) cStep, _ lngInstanceId, EndTime:=dtmEndTime, dtmEndTime As Currency, InstanceId ElapsedTime:=lElapsed) mbarrFree(lngCount) = (2 ^ lngTemp) - 1 As Long, Status As InstanceStatus) Next lngCount End Sub Call StepTerminated(cStepRecord, Set mcInstances = New cInstances dtmEndTime, cExecStep6.Index, _ Set mcFailures = New cFailedSteps InstanceId, Status) Set mcNavSteps = New cStepTree HP TPC-H FULL DISCLOSURE REPORT 375 © 2005 Hewlett-Packard Company. All rights reserved. Set mcTermSteps = New cTermSteps mstrSource = mstrModuleName & "Type" Option Explicit ' Initialize the Abort flag to False ' These constants have been defined in the mblnAbort = False ' Used to indicate the source module name enumeration, mblnAsk = False when errors ' Type, which is exposed ' are raised by this class Select Case vdata Exit Sub Private Const mstrModuleName As String = Case gintFrom, gintTo, gintStep, gintValue "c RunItDetails." mintType = vdata InitializeErr: Private mstrSource As String ' Log the error code raised by Visual Case Else Basic Private mstrIteratorName As String On Error GoTo 0 Call LogErrors(Errors) Private mintType As ValueType Err.Raise vbObjectError + errTypeInvalid, _ On Error GoTo 0 Private mlngSequence As Long mstrSource, Err.Raise vbObjectError + Private mlngFrom As Long LoadResString(errTypeInvalid) errInitializeFailed, mstrModuleName & Private mlngTo As Long End Select "Initialize", _ Private mlngStep As Long LoadResString(errInitializeFailed) Private mstrValue As String Exit Property

End Sub Public Property Get RangeTo() As Long TypeErr: Private Sub Class_Terminate() LogErrors Errors RangeTo = mlngTo mstrSource = mstrModuleName & "Type" On Error GoTo Class_TerminateErr On Error GoTo 0 End Property Err.Raise vbObjectError + errTypeInvalid, _ mcFreeSteps.Clear Public Property Let RangeTo(ByVal vdata As mstrSource, LoadResString(errTypeInvalid) Set mcFreeSteps = Nothing Long) ReDim mbarrFree(0) End Property mlngTo = vdata Private Sub IsList() mcInstances.Clear Set mcInstances = Nothing End Property If mintType <> gintValue Then On Error GoTo 0 Set mcFailures = Nothing Public Property Get RangeFrom() As Long Err.Raise vbObjectError + errInvalidProperty, Set mcNavSteps = Nothing mstrSource, _ Set mcTermSteps = Nothing RangeFrom = mlngFrom LoadResString(errInvalidProperty) End If Exit Sub End Property Public Property Get Sequence() As Long End Sub Class_TerminateErr: Private Sub IsRange() Call LogErrors(Errors) Sequence = mlngSequence If mintType = gintValue Then End Sub End Property On Error GoTo 0 Err.Raise vbObjectError + errInvalidProperty, Private Sub Public Property Get RangeStep() As Long mstrSource, _ mcTermSteps_TermStepExists(cStepDetails LoadResString(errInvalidProperty) As cTermStep) RangeStep = mlngStep End If

Call End Property End Sub RunNextStep(cStepDetails.TimeComplete, Public Property Let RangeStep(vdata As Long) cStepDetails.Index, _ Public Property Get Value() As String cStepDetails.InstanceId, mlngStep = vdata cStepDetails.ExecutionStatus) Value = mstrValue End Property End Sub End Property Public Property Let RangeFrom(ByVal vdata Public Property Let Value(vdata As String) VERSION 1.0 CLASS As Long) BEGIN mstrValue = vdata MultiUse = -1 'True mlngFrom = vdata END End Property Attribute VB_Name = "cRunItDetails" End Property Attribute VB_GlobalNameSpace = False Public Property Let Sequence(ByVal vdata As Attribute VB_Creatable = True Long) Public Property Get IteratorName() As String Attribute VB_PredeclaredId = False Attribute VB_Exposed = False mlngSequence = vdata IteratorName = mstrIteratorName ' FILE: cRunItDetails.cls ' Microsoft TPC-H Kit Ver. 1.00 End Property End Property ' Copyright Microsoft, 1999 Public Property Let IteratorName(ByVal vdata As ' All Rights Reserved Public Property Get IteratorType() As String) ' ValueType ' mstrIteratorName = vdata ' PURPOSE: This module encapsulates IteratorType = mintType the properties of iterator values End Property ' that are used by the step being End Property executed at runtime. Public Property Let IteratorType(ByVal vdata VERSION 1.0 CLASS ' Contact: Reshma Tharamal As ValueType) BEGIN ([email protected]) MultiUse = -1 'True ' On Error GoTo TypeErr END HP TPC-H FULL DISCLOSURE REPORT 376 © 2005 Hewlett-Packard Company. All rights reserved. Attribute VB_Name = "cRunItNode" Currency, strWspLog As String, lRunId As Public CreateInputFiles As Boolean Attribute VB_GlobalNameSpace = False Long) Private msOutputDir As String Attribute VB_Creatable = True WspLog = strWspLog Attribute VB_PredeclaredId = False End Sub ' Object that will execute the step Attribute VB_Exposed = False Private WithEvents mcExecObj As ' An iterator class containing the properties EXECUTEDLLLib.Execute that are used VERSION 1.0 CLASS Attribute mcExecObj.VB_VarHelpID = -1 ' by the stpe being executed. BEGIN ' These iterators might actually come from MultiUse = -1 'True ' Holds the step that is currently being executed steps that are at END (constraint or ' a higher level than the step actually being Attribute VB_Name = "cRunStep" ' worker step) executed (viz. Attribute VB_GlobalNameSpace = False Private mcExecStep As cStep ' direct ascendants of the step at any level). Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Private Const msCompareExe As String = Option Explicit Attribute VB_Exposed = False "\diff.exe" ' FILE: cRunStep.cls Public IteratorName As String ' Microsoft TPC-H Kit Ver. 1.00 Private Enum NextNodeType Public Value As String ' Copyright Microsoft, 1999 mintWspPreConstraint = 1 Public StepId As Long ' All Rights Reserved mintPreConstraint ' mintStep VERSION 1.0 CLASS ' mintWspPostConstraint BEGIN ' PURPOSE: This class executes the step mintPostConstraint MultiUse = -1 'True that is assigned to the End Enum END ' ExecuteStep property. It executes the Attribute VB_Name = "cRunOnly" pre-execution constraints ' Public events to notify the calling function of the Attribute VB_GlobalNameSpace = False ' in sequence and then the step itself. ' start and end time for each step Attribute VB_Creatable = True At the end it executes Public Event StepStart(cStepRecord As cStep, _ Attribute VB_PredeclaredId = False ' the post-execution constraints. Since dtmStartTime As Currency, InstanceId As Attribute VB_Exposed = False these steps should always Long) Option Explicit ' be executed in sequence, each step is Public Event StepComplete(cStepRecord As cStep, only fired on the _ Public Event Done() ' completion of the previous step. dtmEndTime As Currency, InstanceId As Private WithEvents mcRunWsp As ' Contact: Reshma Tharamal Long, Status As InstanceStatus) cRunWorkspace ([email protected]) Public Event ProcessStart(cStepRecord As cStep, _ Attribute mcRunWsp.VB_VarHelpID = -1 ' strCommand As String, dtmStartTime As Option Explicit Currency, _ Public WspName As String InstanceId As Long) Public WorkspaceId As Long ' Used to indicate the source module name Public Event ProcessComplete(cStepRecord As Public WspLog As String when errors cStep, _ ' are raised by this class dtmStartTime As Currency, InstanceId As Public Sub RunWsp() Private Const mstrModuleName As String = Long, lElapsed As Long) "c RunStep." On Error GoTo RunWspErr Private mstrSource As String Private Function AppendDiffErrors(sDiffFile As String) Set mcRunWsp = New cRunWorkspace ' Local variable(s) to hold property value(s) ' The file containing the errors generated by the Set mcRunWsp.LoadDb = dbsAttTool Private mcStep As cStep diff utility is passed in mcRunWsp.WorkspaceId = WorkspaceId Private mcGlobals As cArrSteps ' These errors are appended to the error file for mcRunWsp.CreateInputFiles = True Private mcvntWspPreCons As Variant the step mcRunWsp.RunWorkspace Private mcvntWspPostCons As Variant Private mcvntPreCons As Variant Dim sTemp As String Exit Sub Private mcvntPostCons As Variant Dim InputFile As Integer Private mcIterators As cRunColIt RunWspErr: Private mlngInstanceId As Long ' Identifier for If Not StringEmpty(sDiffFile) Then ' Log the VB error code the current instance LogErrors Errors Private mlngIndex As Long ' Index value for InputFile = FreeFile the current instance Open sDiffFile For Input Access Read As End Sub Private mstrCommand As String ' The InputFile command string Private Sub Private msRunStepDtl As String ' Step text/file Do While Not EOF(InputFile) ' Loop mcRunWsp_RunComplete(dtmEndTime As name that will go into the run_step_details until end of file. Currency) table Line Input #InputFile, sTemp ' Read line Private mblnAbort As Boolean ' Set to True into variable. MsgBox "Completed executing when the user aborts the run mcVBErr.LogMessage sTemp workspace: " & gstrSQ & WspName & Private msOutputFile As String Loop gstrSQ & " at " & _ Private msErrorFile As String JulianDateToString(dtmEndTime) & Private miStatus As InstanceStatus Close InputFile "." & vbCrLf & vbCrLf & _ Private mcVBErr As cVBErrorsSM End If "The log file for the run is: " & Public WspParameters As cArrParameters gstrSQ & WspLog & gstrSQ & "." Public WspConnections As cConnections End Function RaiseEvent Done Public WspConnDtls As cConnDtls Private Sub CreateStepTextFile() End Sub Private WithEvents mcTermProcess As ' Creates a file containing the step text being cTermProcess executed Private Sub Attribute mcTermProcess.VB_VarHelpID = -1 On Error GoTo CreateStepTextFileErr mcRunWsp_RunStart(dtmStartTime As Public RunId As Long HP TPC-H FULL DISCLOSURE REPORT 377 © 2005 Hewlett-Packard Company. All rights reserved. Dim sInputFile As String GetOutputFile = msOutputDir & sFile & sIt InitializeExecStatus = mcExecObj.StepStatus Exit Function If mcExecStep.ExecutionMechanism = End Function gintExecuteShell Then GetOutputFileErr: Private Function CompareOutput(sCompareFile As sInputFile = String, sOutputFile As String) As Boolean GetOutputFile(gsCmdFileSuffix) ' Does not make sense to log error to the Else error file yet. Write to the project Dim sCmpOutput As String sInputFile = ' log and return the step label as default Dim sDiffOutput As String GetOutputFile(gsSqlFileSuffix) GetOutputFile = mcExecStep.StepLabel & End If gsExtSeparator & strFileExt On Error GoTo CompareOutputErr

' Generate a file containing the step text End Function ' Create temporary files to store the file compare being executed output and If Not ' the errors generated by the compare function StringEmpty(mcExecStep.StepTextFile) Or Private Sub HandleExecutionError() sCmpOutput = CreateTempFile() mcExecStep.ExecutionMechanism = sDiffOutput = CreateTempFile() gintExecuteShell Then On Error GoTo HandleExecutionError FileCopy mstrCommand, sInputFile ' Run the compare utility and redirect it's output Else ' Log the error code raised by Visual Basic and errors Call miStatus = gintFailed SyncShell ("cmd /c " & _ WriteCommandToFile(mstrCommand, mcVBErr.LogVBErrors GetShortName(App.Path & sInputFile) Call msCompareExe) & gstrBlank & _ End If mcVBErr.WriteError(errExecuteStepFailed, _ sCompareFile & gstrBlank & sOutputFile & OptArgs:="Continuation criteria for the _ Exit Sub step is: "& " > " & sCmpOutput & " 2> " & gsContCriteria(mcStep.ContinuationCriteria)) sDiffOutput) CreateStepTextFileErr: HandleExecutionError: If FileLen(sDiffOutput) > 0 Then mcVBErr.LogVBErrors ' The compare generated errors - append error ' Logging failed - return msgs to the error file End Sub Call AppendDiffErrors(sDiffOutput) Private Function GetOutputFile(strFileExt End Sub CompareOutput = False As String) As String Else ' This function generates the output file Public Property Get Index() As Long CompareOutput = (FileLen(sCmpOutput) = 0) name for the step currently being executed End If ' The value of the built-in parameter Index = mlngIndex 'DefaultDir' is appended with the run If Not CompareOutput Then identifier End Property mcVBErr.WriteError errDiffFailed ' for the file location Public Property Let Index(ByVal vdata As End If ' The step label is used for the file name Long) and a combination of all iterator values ' Delete the temporary files used to store the ' for the step is used to make the output mlngIndex = vdata output of the compare and files unique for each instance ' the errors generated by the compare Dim sFile As String End Property Kill sDiffOutput Dim sIt As String Private Function InitializeExecStatus() As Kill sCmpOutput Dim lIt As Long InstanceStatus Dim sCompareFile As String Exit Function On Error GoTo GetOutputFileErr On Error GoTo InitializeExecStatusErr CompareOutputErr: sFile = mcVBErr.LogVBErrors SubstituteParametersIfPossible(mcExecStep InitializeExecStatus = CompareOutput = False .StepLabel) mcExecObj.StepStatus End Function sFile = TranslateStepLabel(sFile) If InitializeExecStatus = gintComplete Then Public Property Get InstanceId() As Long If Not If mcExecStep Is mcStep Then StringEmpty(mcExecStep.FailureDetails) Then InstanceId = mlngInstanceId ' Use iterators that have been defined ' Compare output to determine whether for the worker or any of it's managers the step failed End Property ' to make the error/log file unique for sCompareFile = Public Property Let InstanceId(ByVal vdata As this instance GetShortName(SubstituteParameters( _ Long) For lIt = mcIterators.Count - 1 To 0 mcExecStep.FailureDetails, Step -1 mcExecStep.WorkspaceId, mcIterators, _ mlngInstanceId = vdata sIt = sIt & gsExtSeparator & WspParameters)) mcIterators(lIt).Value InitializeExecStatus = End Property Next lIt IIf(CompareOutput(sCompareFile, End If msOutputFile), gintComplete, gintFailed) Private Function ExecuteConstraint(vntConstraints sIt = sIt & strFileExt End If As Variant, _ End If ByRef intLoopIndex As Integer) As Boolean ' Ensure that the length of the complete path does not exceed 255 characters Exit Function ' Returns True if there is a constraint in the If Len(msOutputDir) + Len(sFile) + passed in Len(sIt) > MAX_PATH Then InitializeExecStatusErr: ' array that remains to be executed sFile = Mid(sFile, 1, MAX_PATH - mcVBErr.LogVBErrors Len(sIt) - Len(msOutputDir)) ' Call LogErrors(Errors) If IsArray(vntConstraints) And Not End If IsEmpty(vntConstraints) Then HP TPC-H FULL DISCLOSURE REPORT 378 © 2005 Hewlett-Packard Company. All rights reserved. ExecuteConstraint = (LBound(vntConstraints) <= intLoopIndex) If intNextStepType <> mintStep Then ' If this procedure is called after a step has And (intLoopIndex <= ' Check if there is a constraint to be completed, UBound(vntConstraints)) executed ' we would have to check if we created any Else If temporary files ExecuteConstraint = False ExecuteConstraint(vntStepConstraints, ' while executing that step End If intIndex) Then If Not mcExecStep Is Nothing Then ' Get the corresponding step record to If Not StringEmpty(mcExecStep.StepTextFile) End Function be executed Or mcExecStep.ExecutionMechanism = Private Function NextStep() As cStep ' Query the global step record for the gintExecuteShell Then current ' Remove the temporary file that we created ' Determines which is the next step to be ' constraint while executed - it could Set cConsRec = ' running this command ' be either a pre-execution step, the vntStepConstraints(intIndex) Kill mstrCommand worker step itself End If ' or a post-execution step Set cNextStepRec = mcGlobals.QueryStep(cConsRec.GlobalStepId Call StepCompleted Dim cConsRec As cConstraint ) Dim cNextStepRec As cStep intIndex = intIndex + 1 ' The VB errors class stores a reference to the Dim vntStepConstraints As Variant Else Execute class since it uses If intNextStepType = ' a method of the class to write errors to the ' Static variable to remember exactly mintPostConstraint Then error log. Hence, where we are in the ' No more stuff to be executed for ' release all references to the Execute object ' processing the step before destroying it. Static intIndex As Integer ' Raise a Done event Set mcVBErr.ErrorFile = Nothing Static intNextStepType As Set cNextStepRec = Nothing Set mcExecObj = Nothing NextNodeType ' Set the next step type to an ' Delete empty output and error files (generated On Error GoTo NextStepErr invalid value by shell commands) intNextStepType = -1 ' (Can be done only after cleaning up If mblnAbort = True Then Else cExecObj) ' The user has aborted the run - do not Call NextType(intNextStepType, Call DeleteEmptyOutputFiles run any more intIndex) Else ' processes for the step End If ' First time through - initialize the location of Set NextStep = Nothing End If output files Exit Function Else msOutputDir = End If ' Increment the step type so we look at GetDefaultDir(mcStep.WorkspaceId, the post- WspParameters) If intNextStepType = 0 Then ' execution steps the next time through msOutputDir = msOutputDir & ' First time through this function - set Call NextType(intNextStepType, gstrFileSeparator & Trim(Str(RunId)) & the Index and intIndex) gstrFileSeparator ' node type to initial values End If ' Dummy file since the function expects a file intNextStepType = name mintWspPreConstraint Loop Until (Not cNextStepRec Is Nothing) MakePathValid (msOutputDir & "a.txt") intIndex = 0 Or _ End If RaiseEvent StepStart(mcStep, intNextStepType = -1 Determine64BitTime(), mlngInstanceId) ' Call a procedure to determine the next step to be End If Set NextStep = cNextStepRec executed ' - could be a constraint or the step itself Do Exit Function ' Initialize a module-level variable to the step Select Case intNextStepType being Case mintWspPreConstraint NextStepErr: ' executed vntStepConstraints = ' Log the error code raised by Visual Basic Set mcExecStep = NextStep mcvntWspPreCons Call LogErrors(Errors) If mcExecStep Is Nothing Then On Error GoTo 0 RaiseEvent StepComplete(mcStep, Case mintPreConstraint mstrSource = mstrModuleName & Determine64BitTime(), mlngInstanceId, miStatus) vntStepConstraints = "NextStep" ' No more stuff to execute mcvntPreCons Err.Raise vbObjectError + Exit Sub errNextStepFailed, mstrSource, _ End If Case mintStep LoadResString(errNextStepFailed) ' CONS: Dim sStartDir As String If mcStep.StepType = End Function gintWorkerStep Then Public Sub Execute() Set mcExecObj = New Set cNextStepRec = mcStep ' This procedure is the method that executes EXECUTEDLLLib.Execute End If the step that ' is assigned to the ExecuteStep property. It ' The VB errors class uses the WriteError method Case mintWspPostConstraint call a procedure of the Execute class to write vntStepConstraints = ' to determine the next step to be executed. ' all VB errors to the error file for the step (this mcvntWspPostCons ' Then it initializes all the properties of the prevents a clash when the cExecuteSM object ' VB errors and Execution errors have to be Case mintPostConstraint ' and calls it's run method to execute it. written to the same log). Hence, store vntStepConstraints = Dim cConn As cConnection ' a reference to the Execute object in mcVBErr mcvntPostCons Dim cRunConnDtl As cConnDtl msErrorFile = GetOutputFile(gsErrorFileSuffix) mcExecObj.ErrorFile = msErrorFile End Select On Error GoTo ExecuteErr HP TPC-H FULL DISCLOSURE REPORT 379 © 2005 Hewlett-Packard Company. All rights reserved. Call DeleteFile(msErrorFile, End If BuildCommandString = bCheckIfEmpty:=False) SQLFixup(msRunStepDtl) Set mcVBErr.ErrorFile = mcExecObj Exit Sub End If End If If mcExecStep.ExecutionMechanism = ExecuteErr: gintExecuteShell Then Call HandleExecutionError If CreateInputFiles Then sStartDir = Call CreateStepTextFile Trim$(GetShortName(SubstituteParameters( ' We can assume that if we are in this End If _ function, a StepStart event has been triggered mcExecStep.StartDir, already. Exit Function mcExecStep.WorkspaceId, mcIterators, RaiseEvent StepComplete(mcStep, WspParameters:=WspParameters))) Determine64BitTime(), mlngInstanceId, BuildCommandStringErr: ' Dummy connection object miStatus) ' Log the error code raised by the Execute Set cConn = New cConnection procedure Set cRunConnDtl = New cConnDtl End Sub ' Call LogErrors(Errors) Else Private Function BuildCommandString() As mcVBErr.LogVBErrors ' Find the connection string value and String substitute parameter values in it ' Process text to be executed - either from the On Error GoTo 0 Set cRunConnDtl = text mstrSource = mstrModuleName & "Execute" WspConnDtls.GetConnectionDtl(mcExecSt ' field or read it from a file. Err.Raise vbObjectError + errExecuteStepFailed, ep.WorkspaceId, mcExecStep.StartDir) ' This function will always return the mstrSource, _ Set cConn = command text for ODBC commands LoadResString(errExecuteStepFailed) & WspConnections.GetConnection(mcExecSte ' and a file name for Shell commands mstrCommand p.WorkspaceId, Dim sFile As String cRunConnDtl.ConnectionString) Dim sCommand As String End Function sStartDir = Dim sTemp As String Public Sub Abort() Trim$(SubstituteParameters(cConn.Connect ionValue, _ On Error GoTo BuildCommandStringErr On Error GoTo AbortErr mcExecStep.WorkspaceId, mcIterators, If Not ' Setting the Abort flag to True will ensure that WspParameters:=WspParameters)) StringEmpty(mcExecStep.StepTextFile) Then we End If ' Substitute parameter values and ' don't execute any more processes for this step environment variables mblnAbort = True msOutputFile = ' in the filename GetOutputFile(gsOutputFileSuffix) msRunStepDtl = If Not mcExecObj Is Nothing Then Call DeleteFile(msOutputFile, SubstituteParameters(mcExecStep.StepTextFil mcExecObj.Abort bCheckIfEmpty:=False) e, _ Else mcExecObj.OutputFile = msOutputFile mcExecStep.WorkspaceId, ' We are not in the middle of execution yet ' mcExecObj.LogFile = mcIterators, WspParameters:=WspParameters) End If GetShortName(SubstituteParameters( _ ' mcExecStep.LogFile, sFile = GetShortName(msRunStepDtl) Exit Sub mcExecStep.WorkspaceId, mcIterators, WspParameters:=WspParameters)) mstrCommand = AbortErr: If mcExecStep.ExecutionMechanism = SubstituteParametersInText(sFile, Call LogErrors(Errors) gintExecuteODBC And _ mcExecStep.WorkspaceId) On Error GoTo 0 cRunConnDtl.ConnType = Err.Raise vbObjectError + errProgramError, _ ConnTypeDynamic Then If mcExecStep.ExecutionMechanism = mstrModuleName & "Abort", _ Call gintExecuteODBC Then LoadResString(errProgramError) mcExecObj.DoExecute(BuildCommandStri ' Read the contents of the file and pass ng(), sStartDir, it to ODBC End Sub mcExecStep.ExecutionMechanism, _ BuildCommandString = Private Sub NextType(ByRef StepType As cConn.NoCountDisplay, ReadCommandFromFile(mstrCommand) NextNodeType, _ cConn.NoExecute, cConn.ParseQueryOnly, Else ByRef Position As Integer) cConn.QuotedIdentifiers, _ BuildCommandString = mstrCommand cConn.AnsiNulls, End If StepType = StepType + 1 cConn.ShowQueryPlan, Else Position = 0 cConn.ShowStatsTime, ' Substitute parameter values and cConn.ShowStatsIO, _ environment variables End Sub cConn.RowCount, ' in the step text Private Sub StepCompleted() cConn.QueryTimeOut, gstrEmptyString) msRunStepDtl = Else SubstituteParameters(mcExecStep.StepText, _ On Error GoTo StepCompletedErr Call mcExecStep.WorkspaceId, mcExecObj.DoExecute(BuildCommandStri mcIterators, WspParameters:=WspParameters) If Not mcExecStep Is Nothing Then ng(), sStartDir, mstrCommand = msRunStepDtl If mcExecStep Is mcStep Then mcExecStep.ExecutionMechanism, _ miStatus = InitializeExecStatus cConn.NoCountDisplay, If mcExecStep.ExecutionMechanism = If miStatus = gintFailed Then cConn.NoExecute, cConn.ParseQueryOnly, gintExecuteShell Then ' Create input files if the step failed cConn.QuotedIdentifiers, _ ' Write the command to a temp file execution and one hasn't been created already cConn.AnsiNulls, (enables us to execute multiple If Not CreateInputFiles Then cConn.ShowQueryPlan, ' commands via the command CreateStepTextFile cConn.ShowStatsTime, interpreter) Call cConn.ShowStatsIO, _ mstrCommand = mcVBErr.WriteError(errExecuteStepFailed, _ cConn.RowCount, WriteCommandToFile(msRunStepDtl) OptArgs:="Continuation criteria for cConn.QueryTimeOut, BuildCommandString = mstrCommand the step is: " & mcExecStep.StartDir) Else gsContCriteria(mcStep.ContinuationCriteria)) HP TPC-H FULL DISCLOSURE REPORT 380 © 2005 Hewlett-Packard Company. All rights reserved. End If End If ReadCommandFromFileErr: If mcExecStep.ExecutionMechanism = End If gintExecuteODBC Then strOutput = ' Log the error code raised by Visual Basic SQLFixup(strOutput) Exit Sub Call LogErrors(Errors) mstrSource = mstrModuleName & Print #OutputFile, strOutput StepCompletedErr: "ReadCommandFromFile" BugMessage strOutput ' Log the error code raised by Visual On Error GoTo 0 Loop Basic Err.Raise vbObjectError + miStatus = gintFailed errSubValuesFailed, _ End If mcVBErr.LogVBErrors gstrSource, _ Call LoadResString(errSubValuesFailed) Close InputFile mcVBErr.WriteError(errExecuteStepFailed, Close OutputFile _ End Function OptArgs:="Continuation criteria for Private Function SubstituteParametersInText = strTempFile the step is: " & SubstituteParametersIfPossible(strLabel As gsContCriteria(mcStep.ContinuationCriteria String) Exit Function )) On Error GoTo SubstituteParametersInTextErr: End Sub SubstituteParametersIfPossibleErr Private Sub DeleteEmptyOutputFiles() ' Log the error code raised by Visual Basic SubstituteParametersIfPossible = ' Call LogErrors(Errors) On Error GoTo SubstituteParameters(strLabel, _ mcVBErr.LogVBErrors DeleteEmptyOutputFilesErr mcExecStep.WorkspaceId, mcIterators, mstrSource = mstrModuleName & WspParameters:=WspParameters) "SubstituteParametersInText" ' Delete empty output and error files Exit Function On Error GoTo 0 If Not mcExecStep Is Nothing Then Err.Raise vbObjectError + errSubValuesFailed, _ Call DeleteFile(msErrorFile, SubstituteParametersIfPossibleErr: gstrSource, _ bCheckIfEmpty:=True) SubstituteParametersIfPossible = strLabel LoadResString(errSubValuesFailed) Call DeleteFile(msOutputFile, bCheckIfEmpty:=True) End Function End Function End If Private Function SubstituteParametersInText(strFileName As Private Function WriteCommandToFile(sCommand Exit Sub String, _ As String, Optional sFile As String = lngWorkspace As Long) As String gstrEmptyString) As String DeleteEmptyOutputFilesErr: ' Not a critical error - continue ' Reads each line in the passed in file, ' Writes the command text to a temporary file substitutes parameter ' Returns the name of the temporary file End Sub ' values in the line and writes out the Private Function modified line to a Dim OutputFile As Integer ReadCommandFromFile(strFileName As ' temporary file that we create. The String) As String temporary file will be On Error GoTo WriteCommandToFileErr ' removed once the step completes ' Returns the contents of the passed in file execution. If StringEmpty(sFile) Then ' Returns the name of the newly created sFile = CreateTempFile() Dim sCommand As String temporary file. End If Dim sTemp As String Dim InputFile As Integer Dim strTempFile As String OutputFile = FreeFile Dim strTemp As String Open sFile For Output Access Write As On Error GoTo Dim strOutput As String OutputFile ReadCommandFromFileErr Dim InputFile As Integer Dim OutputFile As Integer Print #OutputFile, sCommand If Not StringEmpty(strFileName) Then On Error GoTo Close OutputFile InputFile = FreeFile SubstituteParametersInTextErr Open strFileName For Input Access WriteCommandToFile = sFile Read As InputFile strTempFile = CreateTempFile() Exit Function Line Input #InputFile, sCommand ' If Not StringEmpty(strFileName) Then Read line into variable. WriteCommandToFileErr: InputFile = FreeFile Do While Not EOF(InputFile) ' Loop Open strFileName For Input Access Read ' Log the error code raised by Visual Basic until end of file. As InputFile Call LogErrors(Errors) Line Input #InputFile, sTemp ' Read mstrSource = mstrModuleName & line into variable. OutputFile = FreeFile "WriteCommandToFile" sCommand = sCommand & vbCrLf Open strTempFile For Output Access On Error GoTo 0 & sTemp Write As OutputFile Err.Raise vbObjectError + errSubValuesFailed, _ Loop gstrSource, _ Do While Not EOF(InputFile) ' Loop until LoadResString(errSubValuesFailed) Close InputFile end of file. End If Line Input #InputFile, strTemp ' Read End Function line into variable. ReadCommandFromFile = sCommand strOutput = SubstituteParameters(strTemp, lngWorkspace, Public Property Get WspPreCons() As Variant Exit Function mcIterators, WspParameters:=WspParameters) WspPreCons = mcvntWspPreCons HP TPC-H FULL DISCLOSURE REPORT 381 © 2005 Hewlett-Packard Company. All rights reserved. End Property ' Public Property Let WspPreCons(ByVal Exit Sub Option Explicit vdata As Variant) mcvntWspPreCons = vdata Class_TerminateErr: ' Used to indicate the source module name when End Property Call LogErrors(Errors) errors ' are raised by this module Public Property Get WspPostCons() As End Sub Private Const mstrModuleName As String = Variant "c RunWorkspace." WspPostCons = mcvntWspPostCons Private Sub mcExecObj_Start(ByVal Private mstrSource As String End Property StartTime As Currency) Public Property Let WspPostCons(ByVal ' Raise an event indicating that the step has Private mcRunSteps As cArrSteps vdata As Variant) begun execution Private mcRunParams As cArrParameters mcvntWspPostCons = vdata RaiseEvent ProcessStart(mcExecStep, Private mcRunConstraints As cArrConstraints End Property msRunStepDtl, StartTime, mlngInstanceId) Private mcRunConnections As cConnections End Sub Private mcRunConnDtls As cConnDtls Public Property Get PreCons() As Variant Private mcvntWspPreCons As Variant PreCons = mcvntPreCons Private Sub mcExecObj_Complete(ByVal Private mcvntWspPostCons As Variant End Property EndTime As Currency, ByVal Elapsed As Private mdbsLoadDb As Database Public Property Let PreCons(ByVal vdata Long) Private mlngRunId As Long As Variant) Private mlngWorkspaceId As Long mcvntPreCons = vdata On Error GoTo mcExecObj_CompleteErr Private mField As cStringSM End Property Public CreateInputFiles As Boolean Debug.Print Elapsed Public Property Get PostCons() As Variant RaiseEvent ProcessComplete(mcExecStep, Private WithEvents mcRun As cRunInst PostCons = mcvntPostCons EndTime, mlngInstanceId, Elapsed) Attribute mcRun.VB_VarHelpID = -1 End Property mcTermProcess.ProcessTerminated Public Property Let PostCons(ByVal vdata Public Event RunStart(dtmStartTime As Currency, As Variant) Exit Sub strWspLog As String, lRunId As Long) mcvntPostCons = vdata Public Event RunComplete(dtmEndTime As End Property mcExecObj_CompleteErr: Currency) Call LogErrors(Errors) Public Event StepStart(cStepRecord As cStep, Public Property Set Globals(cRunSteps As dtmStartTime As Currency, lngInstanceId As Long, cArrSteps) End Sub _ sPath As String, sIts As String) Set mcGlobals = cRunSteps Private Sub Public Event StepComplete(cStepRecord As cStep, mcTermProcess_TermProcessExists() dtmEndTime As Currency, lngInstanceId As Long) End Property Public Event ProcessStart(cStepRecord As cStep, Public Property Set ExecuteStep(cRunStep On Error GoTo TermProcessExistsErr strCommand As String, _ As cStep) dtmStartTime As Currency, lngInstanceId As ' Call a procedure to execute the next step, if Long) Set mcStep = cRunStep any Public Event ProcessComplete(cStepRecord As Call Execute cStep, dtmEndTime As Currency, lngInstanceId As End Property Long) Public Property Get Globals() As cArrSteps Exit Sub Public Function InstancesForStep(lngStepId As Long, iStatus As InstanceStatus) As cInstances Set Globals = mcGlobals TermProcessExistsErr: ' Returns an array of all the instances for a step ' Log the error code raised by the Execute End Property procedure If mcRun Is Nothing Then Public Property Get ExecuteStep() As cStep Call LogErrors(Errors) Set InstancesForStep = Nothing Else Set ExecuteStep = mcStep End Sub Set InstancesForStep = VERSION 1.0 CLASS mcRun.InstancesForStep(lngStepId, iStatus) End Property BEGIN End If Public Property Set Iterators(vdata As MultiUse = -1 'True cRunColIt) END End Function Attribute VB_Name = "cRunWorkspace" Private Sub InsertRunDetail(cStepRecord As cStep, Set mcIterators = vdata Attribute VB_GlobalNameSpace = False _ Attribute VB_Creatable = True strCommand As String, dtmStartTime As End Property Attribute VB_PredeclaredId = False Currency, _ Private Sub Class_Initialize() Attribute VB_Exposed = False lngInstanceId As Long, lParentInstanceId As ' FILE: cRunWorkspace.cls Long, sItValue As String) ' Initialize the Abort flag to False ' Microsoft TPC-H Kit Ver. 1.00 ' Inserts a new run detail record into the database mblnAbort = False ' Copyright Microsoft, 1999 Set mcVBErr = New cVBErrorsSM ' All Rights Reserved Dim strInsert As String Set mcTermProcess = New cTermProcess ' Dim qy As QueryDef ' End Sub ' PURPOSE: This class loads all the On Error GoTo InsertRunDetailErr information necessary to mstrSource = mstrModuleName & Private Sub Class_Terminate() ' execute a workspace and calls "InsertRunDetail" cRunInst to execute the workspace. On Error GoTo Class_TerminateErr ' It also propagates Step start and strInsert = "insert into run_step_details " & _ complete and "( run_id, step_id, version_no, instance_id, Set mcExecObj = Nothing ' Run start and complete events. parent_instance_id, " & _ Set mcVBErr = Nothing ' Contact: Reshma Tharamal " command, start_time, iterator_value ) " & Set mcTermProcess = Nothing ([email protected]) _ HP TPC-H FULL DISCLOSURE REPORT 382 © 2005 Hewlett-Packard Company. All rights reserved. " values ( " " set end_time = [e_date], elapsed_time mstrSource, _ = [elapsed] " & _ LoadResString(errUpdateRunDataFailed) #If USE_JET Then " where run_id = [r_id] " & _ " and step_id = [s_id] " & _ End Function strInsert = strInsert & " [r_id], [s_id], " and version_no = [ver_no] " & _ Private Sub InsertRunParameters(dtmStartTime As [ver_no], [i_id], [p_i_id], " & _ " and instance_id = [i_id] " Currency) " [com], [s_date], [it_val] )" ' Inserts a new run header record into the database Set qy = mdbsLoadDb.CreateQueryDef( _ ' and returns the id for the run Set qy = mdbsLoadDb.CreateQueryDef( _ gstrEmptyString, strUpdate) gstrEmptyString, strInsert) Dim strInsert As String ' Call a procedure to assign the Querydef Dim qy As QueryDef ' Call a procedure to assign the Querydef parameters Dim cParamRec As cParameter parameters Call AssignParameters(qy, Dim lngIndex As Long Call AssignParameters(qy, EndTime:=dtmEndTime, _ StartTime:=dtmStartTime, _ StepId:=cStepRecord.StepId, _ On Error GoTo InsertRunParametersErr StepId:=cStepRecord.StepId, _ Version:=cStepRecord.VersionNo, _ Version:=cStepRecord.VersionNo, _ InstanceId:=lngInstanceId, strInsert = "insert into run_parameters " & _ InstanceId:=lngInstanceId, _ Elapsed:=lElapsed) "( run_id, parameter_name, parameter_value ) Command:=strCommand) " & _ qy.Execute dbFailOnError " values ( " & _ qy.Execute dbFailOnError qy.Close " [r_id], [p_name], [p_value] )" qy.Close Exit Sub Set qy = mdbsLoadDb.CreateQueryDef( _ #Else gstrEmptyString, strInsert) UpdateRunDetailErr: qy.Parameters("r_id").Value = mlngRunId strInsert = strInsert & Str(mlngRunId) _ LogErrors Errors & ", " & Str(cStepRecord.StepId) _ mstrSource = mstrModuleName & For lngIndex = 0 To & ", " & "UpdateRunDetail" mcRunParams.ParameterCount - 1 mField.MakeStringFieldValid(cStepRecord. On Error GoTo 0 Set cParamRec = mcRunParams(lngIndex) VersionNo) _ Err.Raise vbObjectError + & ", " & Str(lngInstanceId) _ errUpdateRunDataFailed, _ qy.Parameters("p_name").Value = & ", " & Str(lParentInstanceId) _ mstrSource, _ cParamRec.ParameterName & ", " & qy.Parameters("p_value").Value = mField.MakeStringFieldValid(strCommand) LoadResString(errUpdateRunDataFailed) cParamRec.ParameterValue _ qy.Execute dbFailOnError & ", " & Str(dtmStartTime) _ End Sub & ", " & Private Function Next lngIndex mField.MakeStringFieldValid(sItValue) InsertRunHeader(dtmStartTime As Currency) As Long qy.Close strInsert = strInsert & " ) " ' Inserts a new run header record into the database Exit Sub mdbsLoadDb.Execute strInsert, ' and returns the id for the run dbFailOnError InsertRunParametersErr: Dim strInsert As String LogErrors Errors #End If Dim qy As QueryDef mstrSource = mstrModuleName & "InsertRunParameters" Exit Sub On Error GoTo InsertRunHeaderErr On Error GoTo 0 Err.Raise vbObjectError + InsertRunDetailErr: strInsert = "insert into run_header " & _ errUpdateRunDataFailed, _ LogErrors Errors "( run_id, workspace_id, start_time ) " & mstrSource, _ mstrSource = mstrModuleName & _ LoadResString(errUpdateRunDataFailed) "InsertRunDetail" " values ( " & _ On Error GoTo 0 " [r_id], [w_id], [s_date] )" End Sub Err.Raise vbObjectError + Private Sub AssignParameters(qyExec As errUpdateRunDataFailed, _ Set qy = mdbsLoadDb.CreateQueryDef( _ DAO.QueryDef, _ mstrSource, _ gstrEmptyString, strInsert) Optional StartTime As Currency = 0, _ Optional EndTime As Currency = 0, _ LoadResString(errUpdateRunDataFailed) ' Call a procedure to execute the Querydef Optional StepId As Long = 0, _ object Optional Version As String = gstrEmptyString, End Sub Call AssignParameters(qy, _ Private Sub UpdateRunDetail(cStepRecord StartTime:=dtmStartTime) Optional InstanceId As Long = 0, _ As cStep, _ Optional ParentInstanceId As Long = 0, _ dtmEndTime As Currency, qy.Execute dbFailOnError Optional Command As String = lngInstanceId As Long, lElapsed As Long) qy.Close gstrEmptyString, _ ' Updates the run detail record in the Optional Elapsed As Long = 0, _ database InsertRunHeader = mlngRunId Optional ItValue As String = gstrEmptyString) Exit Function ' Assigns values to the parameters in the querydef Dim strUpdate As String object Dim qy As QueryDef InsertRunHeaderErr: LogErrors Errors Dim prmParam As DAO.Parameter On Error GoTo UpdateRunDetailErr mstrSource = mstrModuleName & "InsertRunHeader" On Error GoTo AssignParametersErr strUpdate = "update run_step_details " & On Error GoTo 0 mstrSource = mstrModuleName & _ Err.Raise vbObjectError + "AssignParameters" errUpdateRunDataFailed, _ HP TPC-H FULL DISCLOSURE REPORT 383 © 2005 Hewlett-Packard Company. All rights reserved. For Each prmParam In Private Sub RunStartProcessing(dtmStartTime ShowError errUpdateRunDataFailed qyExec.Parameters As Currency) Select Case prmParam.Name End Sub Case "[w_id]" On Error GoTo RunStartProcessingErr Private Sub prmParam.Value = ProcessCompleteProcessing(cStepRecord As cStep, mlngWorkspaceId ' Insert the run header into the database _ Call InsertRunHeader(dtmStartTime) dtmStartTime As Currency, lngInstanceId As Case "[r_id]" Long, lElapsed As Long) prmParam.Value = mlngRunId ' Insert the run parameters into the database Call InsertRunParameters(dtmStartTime) On Error GoTo ProcessCompleteProcessingErr Case "[s_id]" BugAssert StepId <> 0 Exit Sub ' Insert the run detail into the database prmParam.Value = StepId Call UpdateRunDetail(cStepRecord, RunStartProcessingErr: dtmStartTime, lngInstanceId, lElapsed) Case "[ver_no]" ' Log the error code raised by Visual Basic BugAssert Not Call LogErrors(Errors) Exit Sub StringEmpty(Version) mstrSource = mstrModuleName & prmParam.Value = Version "RunStartProcessing" ProcessCompleteProcessingErr: ShowError errUpdateRunDataFailed ' Log the error code raised by Visual Basic Case "[i_id]" WriteError errUpdateRunDataFailed, Call LogErrors(Errors) BugAssert InstanceId <> 0 mstrSource mstrSource = mstrModuleName & prmParam.Value = InstanceId "P rocessCompleteProcessing" End Sub ShowError errUpdateRunDataFailed Case "[p_i_id]" Private Sub prmParam.Value = ProcessStartProcessing(cStepRecord As cStep, End Sub ParentInstanceId _ Private Sub StepCompleteProcessing(cStepRecord strCommand As String, dtmStartTime As As cStep, _ Case "[com]" Currency, lngInstanceId As Long, _ dtmEndTime As Currency, lngInstanceId As BugAssert Not lParentInstanceId As Long, sItValue As Long, lElapsed As Long) StringEmpty(Command) String) prmParam.Value = Command On Error GoTo StepCompleteProcessingErr On Error GoTo ProcessStartProcessingErr Case "[s_date]" ' Since ProcessComplete events won't be BugAssert StartTime <> 0 ' Insert the run detail into the database triggered for manager steps prmParam.Value = StartTime Call InsertRunDetail(cStepRecord, If cStepRecord.StepType = gintManagerStep strCommand, dtmStartTime, lngInstanceId, _ Then Case "[e_date]" lParentInstanceId, sItValue) ' Update the run detail in the database BugAssert EndTime <> 0 Call UpdateRunDetail(cStepRecord, prmParam.Value = EndTime Exit Sub dtmEndTime, lngInstanceId, lElapsed) End If Case "[elapsed]" ProcessStartProcessingErr: prmParam.Value = Elapsed ' Log the error code raised by Visual Basic Exit Sub Call LogErrors(Errors) Case "[it_val]" mstrSource = mstrModuleName & StepCompleteProcessingErr: prmParam.Value = ItValue "P rocessStartProcessing" ' Log the error code raised by Visual Basic ShowError errUpdateRunDataFailed Call LogErrors(Errors) Case Else WriteError errUpdateRunDataFailed, ShowError errUpdateRunDataFailed ' Write the parameter name that is mstrSource faulty End Sub WriteError errInvalidParameter, End Sub Private Sub RunCompleteProcessing(dtmEndTime mstrSource, _ Private Sub StepStartProcessing(cStepRecord As Currency) prmParam.Name As cStep, dtmStartTime As Currency, _ On Error GoTo 0 lngInstanceId As Long, lParentInstanceId On Error GoTo RunCompleteProcessingErr Err.Raise errInvalidParameter, As Long, sItValue As String) mstrSource, _ ' Update the header record with the end time for On Error GoTo StepStartProcessingErr the run LoadResString(errInvalidParameter) Call UpdateRunHeader(dtmEndTime) End Select ' Since ProcessStart events won't be Next prmParam triggered for manager steps Exit Sub If cStepRecord.StepType = gintManagerStep Exit Sub Then RunCompleteProcessingErr: ' Insert the run detail into the database ' Log the error code raised by Visual Basic AssignParametersErr: Call InsertRunDetail(cStepRecord, Call LogErrors(Errors) cStepRecord.StepLabel, _ ShowError errUpdateRunDataFailed mstrSource = mstrModuleName & dtmStartTime, lngInstanceId, "AssignParameters" lParentInstanceId, sItValue) End Sub Call LogErrors(Errors) End If On Error GoTo 0 Private Sub UpdateRunHeader(ByVal dtmEndTime Err.Raise vbObjectError + Exit Sub As Currency) errAssignParametersFailed, _ ' Updates the run header record with the end date mstrSource, StepStartProcessingErr: LoadResString(errAssignParametersFailed) ' Log the error code raised by Visual Basic Dim strUpdate As String Call LogErrors(Errors) Dim qy As QueryDef End Sub mstrSource = mstrModuleName & "StepStartProcessing" On Error GoTo UpdateRunHeaderErr HP TPC-H FULL DISCLOSURE REPORT 384 © 2005 Hewlett-Packard Company. All rights reserved. Set mcRun.RunConnections = mcvntWspPreCons = strUpdate = "update run_header " & _ mcRunConnections mcRunConstraints.ConstraintsForWsp( _ " set end_time = [e_date] " & _ Set mcRun.RunConnDtls = mcRunConnDtls mlngWorkspaceId, _ " where run_id = [r_id] " gintPreStep, _ mcRun.WspId = mlngWorkspaceId blnSort:=True, _ Set qy = mdbsLoadDb.CreateQueryDef( _ mcRun.RootKey = blnGlobalConstraintsOnly:=True) gstrEmptyString, strUpdate) LabelStep(mlngWorkspaceId) mcvntWspPostCons = mcRun.RunId = mlngRunId mcRunConstraints.ConstraintsForWsp( _ ' Call a procedure to execute the Querydef mcRun.CreateInputFiles = CreateInputFiles mlngWorkspaceId, _ object gintPostStep, _ Call AssignParameters(qy, mcRun.Run blnSort:=True, _ EndTime:=dtmEndTime) blnGlobalConstraintsOnly:=True) Exit Sub qy.Execute dbFailOnError On Error Resume Next qy.Close RunWorkspaceErr: recWspSteps.Close ' Log the error code raised by Visual Basic qySteps.Close Exit Sub Call LogErrors(Errors) recWspParams.Close qyParams.Close UpdateRunHeaderErr: End Sub recWspConns.Close LogErrors Errors Public Property Get LoadDb() As Database qyConns.Close mstrSource = mstrModuleName & "UpdateRunHeader" Set LoadDb = mdbsLoadDb LoadRunData = True On Error GoTo 0 Err.Raise vbObjectError + End Property Exit Function errUpdateRunDataFailed, _ Public Property Set LoadDb(vdata As mstrSource, _ Database) LoadRunDataErr: ' Log the error code raised by Visual Basic LoadResString(errUpdateRunDataFailed) Set mdbsLoadDb = vdata Call LogErrors(Errors) ShowError errLoadRunDataFailed End Sub End Property LoadRunData = False Private Function LoadRunData() As Boolean Public Property Let WorkspaceId(ByVal End Function vdata As Long) ' Loads the step, parameter and constraint Public Sub StopRun() mlngWorkspaceId = vdata arrays End Property ' with all the data for the workspace. Returns On Error GoTo StopRunErr Public Property Get WorkspaceId() As Long False WorkspaceId = mlngWorkspaceId ' if a failure occurs If mcRun Is Nothing Then End Property ' We haven't been the run yet, so do nothing Public Sub RunWorkspace() Dim strWorkspaceName As String Else Dim recWspSteps As Recordset mcRun.StopRun Dim cRunSeq As cSequence Dim qySteps As DAO.QueryDef End If Dim recWspParams As Recordset On Error GoTo RunWorkspaceErr Dim qyParams As DAO.QueryDef Exit Sub Dim recWspConns As Recordset ' Call a procedure to load the module- Dim qyConns As DAO.QueryDef StopRunErr: level structures Dim recWspConnDtls As Recordset ' Log the error code raised by Visual Basic ' with all the step and parameter data for Dim qyConnDtls As DAO.QueryDef Call LogErrors(Errors) the run ' Errors would have been displayed by the called If LoadRunData = False Then On Error GoTo LoadRunDataErr process ' Error handled by the function already Exit Sub Set mcRunSteps.StepDB = mdbsLoadDb End Sub End If Set mcRunParams.ParamDatabase = Public Sub AbortRun() mdbsLoadDb ' Retrieve the next run identifier using the Set mcRunConstraints.ConstraintDB = On Error GoTo AbortRunErr sequence class mdbsLoadDb Set cRunSeq = New cSequence Set mcRunConnections.ConnDb = If mcRun Is Nothing Then Set cRunSeq.IdDatabase = dbsAttTool mdbsLoadDb ' We haven't been the run yet, so do nothing cRunSeq.IdentifierColumn = "run_id" Set mcRunConnDtls.ConnDb = Else mlngRunId = cRunSeq.Identifier mdbsLoadDb mcRun.Abort Set cRunSeq = Nothing End If ' Read all the step and parameter data for the Call workspace Exit Sub mcRunParams.InitBuiltInsForRun(mlngWor Call kspaceId, mlngRunId) ReadWorkspaceData(mlngWorkspaceId, AbortRunErr: mcRunSteps, _ ' Log the error code raised by Visual Basic Set mcRun.Constraints = mcRunParams, mcRunConstraints, Call LogErrors(Errors) mcRunConstraints mcRunConnections, mcRunConnDtls, _ ' Errors would have been displayed by the called mcRun.WspPreExecution = recWspSteps, qySteps, recWspParams, process mcvntWspPreCons qyParams, recWspConns, qyConns, _ mcRun.WspPostExecution = recWspConnDtls, qyConnDtls) End Sub mcvntWspPostCons ' Load all the pre- and post-execution Private Sub Class_Initialize() Set mcRun.Steps = mcRunSteps constraints that Set mcRun.Parameters = mcRunParams ' have been defined for the workspace ' Create instances of the step, parameter and constraint arrays HP TPC-H FULL DISCLOSURE REPORT 385 © 2005 Hewlett-Packard Company. All rights reserved. Set mcRunSteps = New cArrSteps Debug.Print "Run ended at: " & Private mrecIdentifiers As Recordset Set mcRunParams = New cArrParameters CStr(dtmEndTime) Private mdbsDatabase As Database Set mcRunConstraints = New Call RunCompleteProcessing(dtmEndTime) cArrConstraints Private Const mstrEmptyString = "" Set mcRunConnections = New RaiseEvent RunComplete(dtmEndTime) cConnections ' Used to indicate the source module name when Set mcRunConnDtls = New cConnDtls End Sub errors Set mcRun = New cRunInst Private Sub mcRun_RunStart(dtmStartTime ' are raised by this class Set mField = New cStringSM As Currency, strWspLog As String) Private mstrSource As String Private Const mstrModuleName As String = End Sub RaiseEvent RunStart(dtmStartTime, "c Sequence." Private Sub Class_Terminate() strWspLog, mlngRunId) Debug.Print "Run started at: " & Private Sub CreateIdRecord() On Error GoTo UnLoadRunDataErr CStr(dtmStartTime) ' Creates a record with all identifiers having an initial value of 1 ' Clears the step, parameter and constraint Call RunStartProcessing(dtmStartTime) arrays Dim sSql As String Set mcRunSteps = Nothing End Sub Dim pId As DAO.Parameter Set mcRunParams = Nothing Private Sub Dim qyId As DAO.QueryDef Set mcRunConstraints = Nothing mcRun_StepComplete(cStepRecord As cStep, Set mcRunConnections = Nothing _ sSql = "insert into att_identifiers (" & _ Set mcRunConnDtls = Nothing dtmEndTime As Currency, lngInstanceId " workspace_id, parameter_id, step_id, " & As Long, lElapsed As Long) _ Set mcRun = Nothing " constraint_id, run_id, connection_id " & _ Set mdbsLoadDb = Nothing RaiseEvent StepComplete(cStepRecord, ", " & FLD_ID_CONN_NAME & _ Set mField = Nothing dtmEndTime, lngInstanceId) " ) values ( " & _ ' BugMessage "Step: " & "[w_id], [p_id], [s_id], [c_id], [r_id], Exit Sub cStepRecord.StepLabel & " has completed!" [conn_id], [conn_dtl_id] )" Set qyId = UnLoadRunDataErr: Call StepCompleteProcessing(cStepRecord, mdbsDatabase.CreateQueryDef(gstrEmptyString, ' Log the error code raised by Visual dtmEndTime, lngInstanceId, lElapsed) sSql) Basic For Each pId In qyId.Parameters Call LogErrors(Errors) End Sub pId.Value = glMinId ' Not a critical error - continue Private Sub mcRun_StepStart(cStepRecord As Next pId Resume Next cStep, dtmStartTime As Currency, _ qyId.Execute dbFailOnError lngInstanceId As Long, lParentInstanceId qyId.Close End Sub As Long, sPath As String, sIts As String, sItValue As String) End Sub Private Sub Private Sub CreateIdRecordset() mcRun_ProcessComplete(cStepRecord As RaiseEvent StepStart(cStepRecord, cStep, _ dtmStartTime, lngInstanceId, sPath, sIts) Dim strSql As String dtmEndTime As Currency, 'bugmessage "Step: " & lngInstanceId As Long, lElapsed As Long) cStepRecord.StepLabel & " has started." ' Initialize the recordset with all identifiers strSql = "select * from att_identifiers" RaiseEvent Call StepStartProcessing(cStepRecord, Set mrecIdentifiers = ProcessComplete(cStepRecord, dtmStartTime, lngInstanceId, mdbsDatabase.OpenRecordset(strSql, dtmEndTime, lngInstanceId) lParentInstanceId, sItValue) dbOpenForwardOnly) Call ProcessCompleteProcessing(cStepRecord, End Sub If mrecIdentifiers.RecordCount = 0 Then dtmEndTime, lngInstanceId, lElapsed) CreateIdRecord VERSION 1.0 CLASS Set mrecIdentifiers = End Sub BEGIN mdbsDatabase.OpenRecordset(strSql, MultiUse = -1 'True dbOpenForwardOnly) Private Sub END End If mcRun_ProcessStart(cStepRecord As cStep, Attribute VB_Name = "cSequence" _ Attribute VB_GlobalNameSpace = False BugAssert mrecIdentifiers.RecordCount <> 0 strCommand As String, dtmStartTime Attribute VB_Creatable = True As Currency, lngInstanceId As Long, _ Attribute VB_PredeclaredId = False End Sub lParentInstanceId As Long, sItValue As Attribute VB_Exposed = False String) ' FILE: cSequence.cls Public Property Set IdDatabase(vdata As Database) ' Microsoft TPC-H Kit Ver. 1.00 RaiseEvent ProcessStart(cStepRecord, ' Copyright Microsoft, 1999 Set mdbsDatabase = vdata strCommand, dtmStartTime, lngInstanceId) ' All Rights Reserved Call ProcessStartProcessing(cStepRecord, ' End Property strCommand, dtmStartTime, lngInstanceId, ' _ ' PURPOSE: This class uses the Public Property Let IdentifierColumn(vdata As lParentInstanceId, sItValue) att_identifiers table to generate unique String) ' identifiers. End Sub ' Contact: Reshma Tharamal Dim intIndex As Integer ([email protected]) Private Sub ' On Error GoTo IdentifierColumnErr mcRun_RunComplete(dtmEndTime As Option Explicit Currency) ' Initialize the return value to an empty string Private mlngIdentifier As Long mstrIdentifierColumn = mstrEmptyString Private mstrIdentifierColumn As String Call CreateIdRecordset HP TPC-H FULL DISCLOSURE REPORT 386 © 2005 Hewlett-Packard Company. All rights reserved. End Sub For intIndex = 0 To Private Sub Class_Terminate() mrecIdentifiers.Fields.Count - 1 VERSION 1.0 CLASS BEGIN Set mcVector = Nothing If MultiUse = -1 'True LCase(Trim(mrecIdentifiers.Fields(intIndex END End Sub ).Name)) = _ Attribute VB_Name = "cStack" LCase(Trim(vdata)) Then Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True VERSION 1.0 CLASS ' Valid column name Attribute VB_PredeclaredId = False BEGIN mstrIdentifierColumn = vdata Attribute VB_Exposed = False MultiUse = -1 'True Exit Property ' FILE: cStack.cls END End If ' Microsoft TPC-H Kit Ver. 1.00 Attribute VB_Name = "cStep" ' Copyright Microsoft, 1999 Attribute VB_GlobalNameSpace = False Next intIndex ' All Rights Reserved Attribute VB_Creatable = True ' Attribute VB_PredeclaredId = False BugAssert True, "Invalid column name!" ' Attribute VB_Exposed = False ' PURPOSE: This class implements a stack Attribute VB_Ext_KEY = Exit Property of objects. "SavedWithClassBuilder" ,"Yes" ' Contact: Reshma Tharamal Attribute VB_Ext_KEY = "Top_Level" ,"Yes" IdentifierColumnErr: ([email protected]) ' FILE: cStep.cls LogErrors Errors ' ' Microsoft TPC-H Kit Ver. 1.00 mstrSource = mstrModuleName & Option Explicit ' Copyright Microsoft, 1999 "IdentifierColumn" ' All Rights Reserved On Error GoTo 0 ' Used to indicate the source module name ' Err.Raise vbObjectError + when errors ' errIdentifierColumnFailed, _ ' are raised by this class ' PURPOSE: Encapsulates the properties and mstrSource, _ Private Const mstrModuleName As String = methods of a step. "c Stack." ' Contains functions to insert, update and LoadResString(errIdentifierColumnFailed) Private mstrSource As String delete ' att_steps records from the database. End Property Private mcVector As cVector ' Contact: Reshma Tharamal Public Property Get Identifier() As Long Private mlngCount As Long ([email protected]) Dim strSql As String Public Property Get Item(ByVal Position As ' Long) As Object Option Explicit On Error GoTo GetIdentifierErr Attribute Item.VB_UserMemId = 0 ' Local variable(s) to hold property value(s) BugAssert mstrIdentifierColumn <> Set Item = mcVector(Position) Private mlngStepId As Long mstrEmptyString Private mstrVersionNo As String End Property Private mstrStepLabel As String ' Increment the identifier column by 1 Private mstrStepTextFile As String strSql = "update att_identifiers " & _ Public Sub Push(objToPush As Object) Private mstrStepText As String " set " & mstrIdentifierColumn & _ Private mstrStartDir As String " = " & mstrIdentifierColumn & " + 1" mcVector.Add objToPush Private mlngWorkspaceId As Integer mdbsDatabase.Execute strSql, Private mlngParentStepId As Integer dbFailOnError End Sub Private mstrParentVersionNo As String Public Sub Clear() Private mintSequenceNo As Integer ' Refresh the recordset with identifier Private mintStepLevel As Integer values mcVector.Clear Private mblnEnabledFlag As Boolean Call CreateIdRecordset Private mstrDegreeParallelism As String End Sub Private mintExecutionMechanism As Integer mlngIdentifier = Private mstrFailureDetails As String mrecIdentifiers.Fields(mstrIdentifierColumn Public Function Pop() As Object Private mintContinuationCriteria As Integer ).Value Private mblnGlobalFlag As Boolean If mcVector.Count > 0 Then Private mblnArchivedFlag As Boolean Identifier = mlngIdentifier Set Pop = Private mstrOutputFile As String mcVector.Delete(mcVector.Count - 1) 'Private mstrLogFile As String Exit Property Else Private mstrErrorFile As String Set Pop = Nothing Private mdbsDatabase As Database GetIdentifierErr: End If Private mintStepType As Integer LogErrors Errors Private mintOperation As Operation mstrSource = mstrModuleName & End Function Private mlngPosition As Long "Identifier" Public Function Count() As Long Private mstrIteratorName As String On Error GoTo 0 Private mcIterators As cNodeCollections Err.Raise vbObjectError + Count = mcVector.Count Private mbIsNewVersion As Boolean errGetIdentifierFailed, _ Private msOldVersion As String mstrSource, _ End Function ' The following constants are used throughout the LoadResString(errGetIdentifierFailed) project to Private Sub Class_Initialize() ' indicate the different options selected by the user End Property ' The options are presented to the user as control Private Sub Class_Terminate() Set mcVector = New cVector arrays of ' option buttons. These constants have to be in sync mrecIdentifiers.Close End Sub with the ' indexes of the option buttons. HP TPC-H FULL DISCLOSURE REPORT 387 © 2005 Hewlett-Packard Company. All rights reserved. ' All the control arrays have an lbound of 1. IsNewVersion = mbIsNewVersion Public Function Iterators() As Variant The value 0 is End Function ' Returns a variant containing all the iterators that ' used to indicate that the property being ' have been defined for the step represented by the Public Function OldVersionNo() As String ' control array is not valid for the step OldVersionNo = msOldVersion Dim cStepIterators() As cIterator ' Public enums are used since we cannot End Function Dim cTempIt As cIterator expose public constants Dim lngIndex As Long ' in class modules. gintNoOption is Public Sub SaveIterators() Dim lngItCount As Long applicable to all enums, ' This procedure checks if any changes have ' but declared in the Execution method been made On Error GoTo IteratorsErr enum, since we cannot ' to the iterators for the step. If so, it calls the ' declare it more than once. ' methods of the iterator class to commit the lngItCount = 0 changes For lngIndex = 0 To mcIterators.Count - 1 ' Is here as a comment Dim cItRec As cIterator ' Increase the array dimension and add the ' Has been defined in public.bas with the Dim lngIndex As Long constraint other object types ' to it 'Public Enum gintStepType On Error GoTo SaveIteratorsErr Set cTempIt = mcIterators(lngIndex) ' gintGlobalStep = 3 ' gintManagerStep For lngIndex = 0 To mcIterators.Count - 1 If cTempIt.IndOperation <> DeleteOp Then ' gintWorkerStep Set cItRec = mcIterators(lngIndex) ReDim Preserve cStepIterators(lngItCount) 'End Enum Set cStepIterators(lngItCount) = cTempIt Select Case cItRec.IndOperation lngItCount = lngItCount + 1 ' Execution Method options Case QueryOp End If Public Enum ExecutionMethod ' No changes were made to the gintNoOption = 0 queried Step. Next lngIndex gintExecuteODBC ' Do nothing gintExecuteShell If lngItCount = 0 Then End Enum Case InsertOp Iterators = Empty cItRec.Add mlngStepId, Else ' Failure criteria options mstrVersionNo Iterators = cStepIterators() Public Enum FailureCriteria cItRec.IndOperation = QueryOp End If gintFailureODBC = 1 gintFailureTextCompare Case UpdateOp Call QuickSort(Iterators) End Enum cItRec.Update mlngStepId, mstrVersionNo Exit Function ' Continuation criteria options cItRec.IndOperation = QueryOp ' Note: Update the initialization of IteratorsErr: gsContCriteria in Initialize() if the Case DeleteOp LogErrors Errors ' continuation criteria are modified cItRec.Delete mlngStepId, On Error GoTo 0 Public Enum ContinuationCriteria mstrVersionNo Err.Raise vbObjectError + errIteratorsFailed, _ gintOnFailureAbort = 1 ' Remove the record from the mstrModuleName & "Iterators", _ gintOnFailureContinue collection LoadResString(errIteratorsFailed) gintOnFailureCompleteSiblings mcIterators.Delete lngIndex gintOnFailureAbortSiblings End Function gintOnFailureSkipSiblings End Select Public Function IteratorCount() As Long gintOnFailureAsk Next lngIndex ' Returns a count of all the iterators for the step End Enum Exit Sub Dim lngItCount As Long ' The initial version # Dim lngIndex As Long Private Const mstrMinVersion As String = SaveIteratorsErr: Dim cTempIt As cIterator "0 .0" LogErrors Errors mstrSource = mstrModuleName & On Error GoTo IteratorsErr ' End of constants for option button control "SaveIterators" arrays On Error GoTo 0 lngItCount = 0 ' Used to indicate the source module name Err.Raise vbObjectError + errSaveFailed, _ For lngIndex = 0 To mcIterators.Count - 1 when errors mstrSource, _ ' are raised by this class LoadResString(errSaveFailed) If mcIterators(lngIndex).IndOperation <> Private mstrSource As String DeleteOp Then Private Const mstrModuleName As String = End Sub lngItCount = lngItCount + 1 "c Step." Public Property Get IndOperation() As End If Operation ' The cSequence class is used to generate Next lngIndex unique step identifiers IndOperation = mintOperation Private mStepSeq As cSequence IteratorCount = lngItCount End Property ' The StringSM class is used to carry out Public Property Let IndOperation(ByVal vdata Exit Function string operations As Operation) Private mFieldValue As cStringSM IteratorsErr: Private Sub NewVersion() BugAssert vdata = QueryOp Or vdata = LogErrors Errors InsertOp Or vdata = UpdateOp Or vdata = On Error GoTo 0 mbIsNewVersion = True DeleteOp, "Invalid operation" Err.Raise vbObjectError + errIteratorsFailed, _ msOldVersion = mstrVersionNo mintOperation = vdata mstrSource, _ LoadResString(errIteratorsFailed) End Sub End Property Public Function IsNewVersion() As Boolean End Function HP TPC-H FULL DISCLOSURE REPORT 388 © 2005 Hewlett-Packard Company. All rights reserved. Public Sub Validate() ' format where x is the parent component and Dim cItRec As cIterator ' Each distinct object will have a Validate y is the Dim cItClone As cIterator method which ' child component of the step. This function ' will check if the class properties are will increment On Error GoTo CloneErr valid. This method ' the y component of the step by 1 and reset ' will be used to check interdependant the x component If cCloneStep Is Nothing Then properties that ' to 0 Set cCloneStep = New cStep ' cannot be validated by the let End If procedures. On Error GoTo IncVersionXErr ' It should be called by the add and ' Copy all the step properties to the newly created modify methods of the class ' Store the old version number for the step step Call NewVersion ' Initialize the global flag first since subsequent ' Check if the step label has been specified ' validations might depend on it If StringEmpty(mstrStepLabel) Then mstrVersionNo = cCloneStep.GlobalFlag = mblnGlobalFlag ShowError errStepLabelMandatory Trim$(Str$(GetX(mstrVersionNo) + 1)) & ' cCloneStep.GlobalRunMethod = On Error GoTo 0 gstrVerSeparator & "0" mintGlobalRunMethod Err.Raise vbObjectError + IncVersionX = mstrVersionNo errValidateFailed, _ cCloneStep.StepType = mintStepType "Validate", Exit Function cCloneStep.StepId = mlngStepId LoadResString(errValidateFailed) cCloneStep.VersionNo = mstrVersionNo End If IncVersionXErr: cCloneStep.StepLabel = mstrStepLabel ' Log the error code raised by Visual Basic cCloneStep.StepTextFile = mstrStepTextFile If Not IsStringEmpty(mstrStepText) And Call LogErrors(Errors) cCloneStep.StepText = mstrStepText Not IsStringEmpty(mstrStepTextFile) Then gstrSource = mstrModuleName & cCloneStep.StartDir = mstrStartDir ShowError errStepTextOrFile "IncVersionX" cCloneStep.WorkspaceId = mlngWorkspaceId On Error GoTo 0 On Error GoTo 0 cCloneStep.ParentStepId = mlngParentStepId Err.Raise vbObjectError + Err.Raise vbObjectError + cCloneStep.ParentVersionNo = errStepTextOrFile, _ errIncVersionXFailed, _ mstrParentVersionNo "Validate", gstrSource, _ cCloneStep.StepLevel = mintStepLevel LoadResString(errStepTextOrFile) LoadResString(errIncVersionXFailed) cCloneStep.SequenceNo = mintSequenceNo End If cCloneStep.EnabledFlag = mblnEnabledFlag End Function cCloneStep.DegreeParallelism = End Sub mstrDegreeParallelism cCloneStep.ExecutionMechanism = Public Function IncVersionY() As String Private Function GetY(strVersion As String) mintExecutionMechanism ' The version number for a step is stored As Long cCloneStep.FailureDetails = mstrFailureDetails in the x.y ' The version number for a step is stored in cCloneStep.ContinuationCriteria = ' format where x is the parent component the x.y mintContinuationCriteria and y is the ' format where x is the parent component and cCloneStep.ArchivedFlag = mblnArchivedFlag ' child component of the step. This y is the cCloneStep.OutputFile = mstrOutputFile function will increment ' child component of the step. Given an ' cCloneStep.LogFile = mstrLogFile ' the y component of the step by 1 argument of type cCloneStep.ErrorFile = mstrErrorFile ' x.y, it returns y cCloneStep.IteratorName = mstrIteratorName On Error GoTo IncVersionYErr ' Truncate the fractional part to get the parent cCloneStep.IndOperation = mintOperation ' Store the old version number for the step component cCloneStep.Position = mlngPosition Call NewVersion ' of the version number (x.y) GetY = Val(Mid(strVersion, Set cCloneStep.NodeDB = mdbsDatabase mstrVersionNo = InStr(strVersion, gstrVerSeparator) + 1)) Trim$(Str$(GetX(mstrVersionNo))) & ' Clone all the iterators for the step gstrVerSeparator & _ End Function For lngIndex = 0 To mcIterators.Count - 1 Trim$(Str(GetY(mstrVersionNo) + Private Function GetX(strVersion As String) Set cItRec = mcIterators(lngIndex) 1)) As Long Set cItClone = cItRec.Clone IncVersionY = mstrVersionNo ' The version number for a step is stored in cCloneStep.LoadIterator cItClone the x.y Next lngIndex Exit Function ' format where x is the parent component and y is the ' And set the return value to the newly created IncVersionYErr: ' child component of the step. Given an step ' Log the error code raised by Visual argument of type Set Clone = cCloneStep Basic ' x.y, it returns x Call LogErrors(Errors) Exit Function gstrSource = mstrModuleName & ' Truncate the fractional part to get the parent "IncVersionY" component CloneErr: On Error GoTo 0 ' of the version number (x.y) LogErrors Errors Err.Raise vbObjectError + GetX = Val(Left(strVersion, mstrSource = mstrModuleName & "Clone" errIncVersionYFailed, _ InStr(strVersion, gstrVerSeparator) - 1)) On Error GoTo 0 gstrSource, _ Err.Raise vbObjectError + errCloneFailed, _ End Function mstrSource, LoadResString(errCloneFailed) LoadResString(errIncVersionYFailed) Public Function Clone(Optional cCloneStep As End Function End Function cStep) As cStep 'End Sub Public Function IncVersionX() As String ' ' The version number for a step is stored ' Creates a copy of a given step Public Property Let OutputFile(ByVal vdata As in the x.y String) Dim lngIndex As Long HP TPC-H FULL DISCLOSURE REPORT 389 © 2005 Hewlett-Packard Company. All rights reserved. mstrOutputFile = vdata ' This check must be made by the global step ' Inserts a step record into the database class. Only ' It first generates the insert statement using the End Property ' generic step validations will be carried out different by this ' step properties and then executes it Public Property Get OutputFile() As String ' class mblnEnabledFlag = vdata Dim strInsert As String OutputFile = mstrOutputFile Dim qy As DAO.QueryDef End Property End Property On Error GoTo InsertStepRecErr Public Property Let GlobalFlag(ByVal vdata 'Public Property Let LogFile(ByVal vdata As Boolean) ' First check if the database object is valid As String) Call CheckDB ' mblnGlobalFlag = vdata ' mstrLogFile = vdata ' Check if the step record is valid ' End Property Call Validate 'End Property Public Property Get EnabledFlag() As Boolean ' If IsNewVersion() Then 'Public Property Get LogFile() As String EnabledFlag = mblnEnabledFlag Call UpdOldVersionsArchFlg ' End If ' LogFile = mstrLogFile End Property ' ' Create a temporary querydef object 'End Property Public Property Let ArchivedFlag(ByVal vdata strInsert = "insert into att_steps " & _ As Boolean) "( workspace_id, step_id, version_no, " & _ Public Property Let ErrorFile(ByVal vdata " step_label, step_file_name, step_text, As String) mblnArchivedFlag = vdata start_directory, " & _ " parent_step_id, parent_version_no, mstrErrorFile = vdata End Property sequence_no, " & _ " enabled_flag, step_level, " & _ End Property Public Property Get ArchivedFlag() As " degree_parallelism, execution_mechanism, " Public Property Let IteratorName(ByVal Boolean & _ vdata As String) " failure_details, " & _ ArchivedFlag = mblnArchivedFlag " continuation_criteria, global_flag, " & _ mstrIteratorName = vdata " archived_flag, " & _ End Property " output_file_name, error_file_name, " & _ End Property " iterator_name ) values ( " Public Property Get GlobalFlag() As Boolean Public Property Get ErrorFile() As String ' log_file_name, GlobalFlag = mblnGlobalFlag ErrorFile = mstrErrorFile #If USE_JET Then End Property End Property strInsert = strInsert & " [w_id], [s_id], [ver_no], " Public Property Get IteratorName() As Public Sub Add() & _ String ' Inserts a step record into the database - it " [s_label], [s_file_name], [s_text], initializes [s_start_dir], " & _ IteratorName = mstrIteratorName ' the necessary properties for the step and " [p_step_id], [p_version_no], [seq_no], " & _ calls InsertStepRec " [enabled], [s_level], [deg_parallelism], " & _ End Property ' to do the database work " [exec_mechanism], [fail_dtls], " & _ " [cont_criteria], [global], [archived], " & _ Public Property Set NodeDB(vdata As On Error GoTo AddErr " [output_file], [error_file], " & _ Database) " [it_name] ) " ' A new record would have the deleted_flag Set mdbsDatabase = vdata turned off! ' [log_file], Set mcIterators.NodeDB = vdata mblnArchivedFlag = False Set qy = End Property Call InsertStepRec mdbsDatabase.CreateQueryDef(gstrEmptyString, Public Property Get NodeDB() As Database strInsert) ' If a new version of a step has been created, Set NodeDB = mdbsDatabase reset the old version info, since ' Call a procedure to execute the Querydef object ' it's already been saved to the db Call AssignParameters(qy) End Property If IsNewVersion() Then mbIsNewVersion = False qy.Execute dbFailOnError Private Function IsStringEmpty(strToCheck msOldVersion = gstrEmptyString qy.Close As String) As Boolean End If #Else

IsStringEmpty = (strToCheck = Exit Sub strInsert = strInsert & Str(mlngWorkspaceId) gstrEmptyString) & ", " & Str(mlngStepId) & _ AddErr: ", " & End Function LogErrors Errors mFieldValue.MakeStringFieldValid(mstrVersionNo On Error GoTo 0 ) Public Property Let EnabledFlag(ByVal Err.Raise vbObjectError + vdata As Boolean) errAddStepFailed, _ ' For fields that may be null, call a function to mstrModuleName & "Add", determine ' The enabled flag must be False for all LoadResString(errAddStepFailed) ' the string to be appended to the insert statement global steps. End Sub strInsert = strInsert & ", " & Private Sub InsertStepRec() mFieldValue.MakeStringFieldValid(mstrStepLabel) HP TPC-H FULL DISCLOSURE REPORT 390 © 2005 Hewlett-Packard Company. All rights reserved. strInsert = strInsert & ", " & mstrSource = mstrModuleName & End Sub mFieldValue.MakeStringFieldValid(mstrSte "UpdOldVersionsArchFlg" Public Sub UpdateIteratorVersion() pTextFile) ' Updates the iterator record in the database strInsert = strInsert & ", " & #If USE_JET Then mFieldValue.MakeStringFieldValid(mstrSte Dim lngIndex As Long pText) sUpdate = "update att_steps " & _ Dim cTempIt As cIterator strInsert = strInsert & ", " & " set archived_flag = True " mFieldValue.MakeStringFieldValid(mstrSta On Error GoTo UpdateIteratorVersionErr rtDir) ' Append the Where clause sUpdate = sUpdate & " where step_id = For lngIndex = 0 To mcIterators.Count - 1 strInsert = strInsert & ", " & [s_id] " & _ ' Increase the array dimension and add the Str(mlngParentStepId) & _ " and version_no <> [ver_no]" constraint ", " & ' to it mFieldValue.MakeStringFieldValid(mstrPar Set qy = Set cTempIt = mcIterators(lngIndex) entVersionNo) & _ mdbsDatabase.CreateQueryDef(gstrEmptyStri ", " & Str(mintSequenceNo) & _ ng, sUpdate) If cTempIt.IndOperation <> DeleteOp Then ", " & Str(mblnEnabledFlag) & ", " & ' Set the operation to indicate an insert Str(mintStepLevel) ' Call a procedure to execute the Querydef cTempIt.IndOperation = InsertOp object End If strInsert = strInsert & ", " & Call AssignParameters(qy) mFieldValue.MakeStringFieldValid(mstrDe qy.Execute dbFailOnError Next lngIndex greeParallelism) strInsert = strInsert & ", " & If qy.RecordsAffected = 0 Then Exit Sub Str(mintExecutionMechanism) On Error GoTo 0 Err.Raise vbObjectError + UpdateIteratorVersionErr: strInsert = strInsert & ", " & errModifyStepFailed, _ mstrSource = mstrModuleName & mFieldValue.MakeStringFieldValid(mstrFai mstrSource, "UpdateIteratorVersion" lureDetails) & _ LoadResString(errModifyStepFailed) LogErrors Errors ", " & Str(mintContinuationCriteria) & End If On Error GoTo 0 _ Err.Raise vbObjectError + errUpdateFailed, _ ", " & Str(mblnGlobalFlag) & _ qy.Close mstrSource, ", " & Str(mblnArchivedFlag) LoadResString(errUpdateFailed) #Else strInsert = strInsert & ", " & End Sub mFieldValue.MakeStringFieldValid(mstrOu sUpdate = "update att_steps " & _ Public Sub AddIterator(cItRecord As cIterator) tputFile) " set archived_flag = True " ' Adds the iterator record to the collection of ' strInsert = strInsert & ", " & iterators mFieldValue.MakeStringFieldValid(mstrLo sUpdate = sUpdate & " where step_id = " & ' for the step gFile) Str(mlngStepId) & _ strInsert = strInsert & ", " & " and version_no <> " & Call mcIterators.Add(cItRecord) mFieldValue.MakeStringFieldValid(mstrErr mFieldValue.MakeStringFieldValid(mstrVersi orFile) onNo) End Sub strInsert = strInsert & ", " & Public Sub AddAllIterators() mFieldValue.MakeStringFieldValid(mstrIter BugMessage sUpdate ' Sets the indicator variable for all iterators to atorName) mdbsDatabase.Execute sUpdate, insert dbFailOnError strInsert = strInsert & " ) " #End If Dim lngIndex As Long

BugMessage strInsert Exit Sub For lngIndex = 0 To mcIterators.Count - 1 mdbsDatabase.Execute strInsert, mcIterators(lngIndex).Validate dbFailOnError UpdOldVersionsArchFlgErr: mcIterators(lngIndex).IndOperation = InsertOp mstrSource = mstrModuleName & Next lngIndex #End If "UpdOldVersionsArchFlg" LogErrors Errors End Sub Exit Sub On Error GoTo 0 Err.Raise vbObjectError + Public Sub LoadIterator(cItRecord As cIterator) InsertStepRecErr: errModifyStepFailed, _ ' Adds the iterator record to the collection of mstrSource = mstrModuleName & mstrSource, iterators "InsertStepRec" LoadResString(errModifyStepFailed) ' for the step LogErrors Errors End Sub On Error GoTo 0 Public Sub InsertIterator(cItRecord As Call mcIterators.Load(cItRecord) Err.Raise vbObjectError + cIterator) errInsertStepFailed, _ ' Inserts the iterator record into the database End Sub mstrSource, Public Sub UnloadIterators() LoadResString(errInsertStepFailed) Call cItRecord.Add(mlngStepId, ' Unloads all iterator records for the step End Sub mstrVersionNo) Private Sub UpdOldVersionsArchFlg() Dim lngIndex As Long ' Updates the archived flag on all old End Sub version for the step to True Public Sub UpdateIterator(cItRecord As For lngIndex = mcIterators.Count - 1 To 0 Step - cIterator) 1 Dim sUpdate As String ' Updates the iterator record in the database ' Calls the collection method to unload the Dim qy As DAO.QueryDef node Call cItRecord.Update(mlngStepId, ' from the array On Error GoTo mstrVersionNo) mcIterators.Unload lngIndex UpdOldVersionsArchFlgErr Next lngIndex HP TPC-H FULL DISCLOSURE REPORT 391 © 2005 Hewlett-Packard Company. All rights reserved. Case "[seq_no]" End Sub prmParam.Value = mintSequenceNo On Error GoTo ModifyErr Public Sub ModifyIterator(cItRecord As Case "[enabled]" mstrSource = mstrModuleName & "Modify" cIterator) prmParam.Value = mblnEnabledFlag ' Modifies the iterator record in the Case "[s_level]" ' Check if the database object is valid collection prmParam.Value = mintStepLevel Call CheckDB Case "[deg_parallelism]" Call mcIterators.Modify(cItRecord) prmParam.Value = ' Check if the step record is valid mstrDegreeParallelism Call Validate End Sub Case "[exec_mechanism]" Public Sub DeleteIterator(cItRecord As prmParam.Value = ' The step_id and version_no will never be cIterator) mintExecutionMechanism updated - ' Deletes the iterator record from the Case "[fail_dtls]" ' whenever a step is modified a copy of the old database prmParam.Value = step will mstrFailureDetails ' be created with an incremented version_no Call cItRecord.Delete(mlngStepId, Case "[cont_criteria]" mstrVersionNo) prmParam.Value = #If USE_JET Then mintContinuationCriteria End Sub Case "[global]" strUpdate = "update att_steps " & _ Public Sub RemoveIterator(cItRecord As prmParam.Value = mblnGlobalFlag " set step_label = [s_label] " & _ cIterator) Case "[archived]" " , step_file_name = [s_file_name] " & _ ' Marks the iterator record in the prmParam.Value = " , step_text = [s_text] " & _ collection to mblnArchivedFlag " , start_directory = [s_start_dir] " & _ ' indicate a delete Case "[output_file]" " , workspace_id = [w_id] " & _ prmParam.Value = mstrOutputFile " , parent_step_id = [p_step_id] " & _ Call ' Case "[log_file]" " , parent_version_no = [p_version_no] " & _ mcIterators.Delete(cItRecord.Position) ' prmParam.Value = mstrLogFile " , sequence_no = [seq_no] " & _ Case "[error_file]" " , step_level = [s_level] " & _ End Sub prmParam.Value = mstrErrorFile " , enabled_flag = [enabled] " & _ Case "[it_name]" " , degree_parallelism = [deg_parallelism] " & prmParam.Value = mstrIteratorName _ Private Sub AssignParameters(qyExec As Case Else " , execution_mechanism = [exec_mechanism] DAO.QueryDef) ' Write the parameter name that is " & _ ' Assigns values to the parameters in the faulty " , failure_details = [fail_dtls] " & _ querydef object WriteError errInvalidParameter, " , continuation_criteria = [cont_criteria] " & _ ' The parameter names are cryptic to make mstrSource, _ " , global_flag = [global] " & _ them different prmParam.Name " , archived_flag = [archived] " & _ ' from the actual field names. When the On Error GoTo 0 " , output_file_name = [output_file] " & _ parameter names Err.Raise errInvalidParameter, " , error_file_name = [error_file] " & _ ' are the same as the field names, mstrSource, _ " , iterator_name = [it_name] " parameters in the ' where clause do not get created. LoadResString(errInvalidParameter) ' ", log_file_name = [log_file] " & _ End Select Dim prmParam As DAO.Parameter Next prmParam ' Append the Where clause strUpdate = strUpdate & " where step_id = [s_id] On Error GoTo AssignParametersErr If qyExec.Parameters("s_id") = 0 Or " & _ mstrSource = mstrModuleName & StringEmpty(qyExec.Parameters("ver_no")) " and version_no = [ver_no]" "AssignParameters" Then WriteError errInvalidParameter, Set qy = For Each prmParam In mstrSource mdbsDatabase.CreateQueryDef(gstrEmptyString, qyExec.Parameters On Error GoTo 0 strUpdate) Select Case prmParam.Name Err.Raise errInvalidParameter, Case "[w_id]" mstrSource, ' Call a procedure to execute the Querydef object prmParam.Value = LoadResString(errInvalidParameter) Call AssignParameters(qy) mlngWorkspaceId End If qy.Execute dbFailOnError Case "[s_id]" prmParam.Value = mlngStepId Exit Sub If qy.RecordsAffected = 0 Then Case "[ver_no]" On Error GoTo 0 prmParam.Value = AssignParametersErr: Err.Raise vbObjectError + mstrVersionNo errModifyStepFailed, _ Case "[s_label]" mstrSource = mstrModuleName & mstrSource, prmParam.Value = mstrStepLabel "AssignParameters" LoadResString(errModifyStepFailed) Case "[s_file_name]" Call LogErrors(Errors) End If prmParam.Value = On Error GoTo 0 mstrStepTextFile Err.Raise vbObjectError + qy.Close Case "[s_text]" errAssignParametersFailed, _ prmParam.Value = mstrStepText mstrSource, #Else Case "[s_start_dir]" LoadResString(errAssignParametersFailed) prmParam.Value = mstrStartDir strUpdate = "update att_steps " & _ Case "[p_step_id]" End Sub " set step_label = " prmParam.Value = mlngParentStepId Public Sub Modify() ' For fields that may be null, call a function to Case "[p_version_no]" determine prmParam.Value = Dim strUpdate As String ' the string to be appended to the update statement mstrParentVersionNo Dim qy As QueryDef HP TPC-H FULL DISCLOSURE REPORT 392 © 2005 Hewlett-Packard Company. All rights reserved. strUpdate = strUpdate & On Error GoTo 0 ' class mFieldValue.MakeStringFieldValid(mstrSte Err.Raise vbObjectError + mstrDegreeParallelism = vdata pLabel) errModifyStepFailed, _ mstrSource, End Property strUpdate = strUpdate & " , LoadResString(errModifyStepFailed) step_file_name = " & End Sub Public Property Let ExecutionMechanism(ByVal mFieldValue.MakeStringFieldValid(mstrSte Private Sub CheckDB() vdata As ExecutionMethod) pTextFile) ' Check if the database object has been strUpdate = strUpdate & " , step_text = " initialized BugAssert vdata = gintExecuteODBC Or vdata = & gintExecuteShell Or vdata = gintNoOption, _ mFieldValue.MakeStringFieldValid(mstrSte If mdbsDatabase Is Nothing Then "Execution mechanism invalid" pText) ShowError errInvalidDB mintExecutionMechanism = vdata strUpdate = strUpdate & ", On Error GoTo 0 start_directory = " & Err.Raise vbObjectError + errInvalidDB, End Property mFieldValue.MakeStringFieldValid(mstrSta _ rtDir) mstrModuleName, Public Property Let FailureDetails(ByVal vdata As LoadResString(errInvalidDB) String) strUpdate = strUpdate & " , workspace_id End If = " & Str(mlngWorkspaceId) & _ mstrFailureDetails = vdata " , parent_step_id = " & End Sub Str(mlngParentStepId) & _ End Property " , parent_version_no = " & Public Sub Delete() Public Property Let SequenceNo(ByVal vdata As mFieldValue.MakeStringFieldValid(mstrPar Integer) entVersionNo) & _ Dim strDelete As String mintSequenceNo = vdata " , sequence_no = " & Dim qy As DAO.QueryDef End Property Str(mintSequenceNo) & _ " , step_level = " & Str(mintStepLevel) On Error GoTo DeleteErr Public Property Let Position(ByVal vdata As Long) & _ mlngPosition = vdata " , enabled_flag = " & Call CheckDB End Property Str(mblnEnabledFlag) & _ " , degree_parallelism = " & strDelete = "delete from att_steps " & _ Public Property Let ParentStepId(ByVal vdata As mFieldValue.MakeStringFieldValid(mstrDe " where step_id = [s_id] " & _ Long) greeParallelism) & _ " and version_no = [ver_no] " mlngParentStepId = vdata " , execution_mechanism = " & ' mdbsDatabase.Execute strDelete, End Property Str(mintExecutionMechanism) & _ dbFailOnError " , failure_details = " & Set qy = Public Property Get SequenceNo() As Integer mFieldValue.MakeStringFieldValid(mstrFai mdbsDatabase.CreateQueryDef(gstrEmptyStri lureDetails) & _ ng, strDelete) SequenceNo = mintSequenceNo " , continuation_criteria = " & Str(mintContinuationCriteria) & _ Call AssignParameters(qy) End Property " , global_flag = " & qy.Execute dbFailOnError Str(mblnGlobalFlag) & _ Public Property Get StepLevel() As Integer " , archived_flag = " & qy.Close StepLevel = mintStepLevel Str(mblnArchivedFlag) & _ End Property " , output_file_name = " & Exit Sub mFieldValue.MakeStringFieldValid(mstrOu Public Property Get ParentVersionNo() As String tputFile) & _ DeleteErr: ParentVersionNo = mstrParentVersionNo " , error_file_name = "& LogErrors Errors End Property mFieldValue.MakeStringFieldValid(mstrErr On Error GoTo 0 orFile) & _ Err.Raise vbObjectError + Public Property Let ParentVersionNo(ByVal vdata " , iterator_name = " & errDeleteStepFailed, _ As String) mFieldValue.MakeStringFieldValid(mstrIter mstrModuleName & "Delete", mstrParentVersionNo = vdata atorName) LoadResString(errDeleteStepFailed) End Property End Sub ' " , log_file_name = " & Public Property Get DegreeParallelism() As Public Property Get ParentStepId() As Long mFieldValue.MakeStringFieldValid(mstrLo String ParentStepId = mlngParentStepId gFile) & _ End Property DegreeParallelism = mstrDegreeParallelism strUpdate = strUpdate & " where step_id Public Property Let WorkspaceId(ByVal vdata As = " & Str(mlngStepId) & _ End Property Long) " and version_no = " & Public Property Get Position() As Long mlngWorkspaceId = vdata mFieldValue.MakeStringFieldValid(mstrVe End Property rsionNo) Position = mlngPosition Public Property Let VersionNo(ByVal vdata As BugMessage strUpdate End Property String) mdbsDatabase.Execute strUpdate, ' The version number of a step is stored in the x.y dbFailOnError Public Property Let DegreeParallelism(ByVal format where #End If vdata As String) ' x represents a change to the step as a result of modifications Exit Sub ' The degree of parallelism must be zero for ' to any of the step properties all global steps ' y represents a change to the step as a result of ModifyErr: ' This check must be made by the global step modifications LogErrors Errors class. Only ' to the sub-steps associated with it. Hence the y- mstrSource = mstrModuleName & ' generic step validations will be carried out component "Modify" by this HP TPC-H FULL DISCLOSURE REPORT 393 © 2005 Hewlett-Packard Company. All rights reserved. ' of the version will be incremented when mstrSource = mstrModuleName & ' The step level must be zero for all global steps a sub-step is added, "StepType" ' This check must be made in the global step class ' modified or deleted On Error GoTo 0 mintStepLevel = vdata ' x will be referred to throughout this code Err.Raise vbObjectError + as the parent errLetStepTypeFailed, _ End Property ' component of the version and y will be mstrSource, _ Public Property Get StepText() As String referred to as the LoadResString(errLetStepTypeFailed) StepText = mstrStepText ' child component of the version End Property ' The version information for a step is End Property maintained by the Public Property Let StepTextFile(ByVal vdata As ' calling function Public Property Get WorkspaceId() As Long String) WorkspaceId = mlngWorkspaceId ' Has to be null for manager steps mstrVersionNo = vdata End Property ' The check will have to be made by the user interface and End Property Public Property Get ContinuationCriteria() As ' by the manager step class ContinuationCriteria mstrStepTextFile = vdata Public Property Get StepType() As End Property gintStepType ContinuationCriteria = mintContinuationCriteria Public Property Get StepTextFile() As String On Error GoTo StepTypeErr StepTextFile = mstrStepTextFile End Property End Property If mintStepType = 0 Then ' The step type variable has not been Public Property Let Public Property Let StepLabel(ByVal vdata As initialized - ContinuationCriteria(ByVal vdata As String) If mblnGlobalFlag Then ContinuationCriteria) ' Cannot be null for manager steps mintStepType = gintGlobalStep ' But this check cannot be made here since we do ElseIf IsStringEmpty(mstrStepText) ' The Continuation criteria must be null for not know And _ all global steps ' at this point if the step being created is a IsStringEmpty(mstrStepTextFile) ' and non-null for all manager and worker manager Then steps ' or a worker step mintStepType = gintManagerStep ' These checks will have to be made by the ' The check will have to be made by the user Else corresponding interface and mintStepType = gintWorkerStep ' classes - only generic step validations will ' by the manager step class End If be made mstrStepLabel = vdata End If ' by this class End Property BugAssert vdata = StepType = mintStepType gintOnFailureAbortSiblings Or vdata = Public Property Get StepLabel() As String gintOnFailureCompleteSiblings _ StepLabel = mstrStepLabel Exit Property Or vdata = End Property gintOnFailureSkipSiblings Or vdata = StepTypeErr: gintOnFailureAbort _ Public Property Let StartDir(ByVal vdata As LogErrors Errors Or vdata = gintOnFailureContinue String) mstrSource = mstrModuleName & Or vdata = gintOnFailureAsk _ mstrStartDir = vdata "StepType" Or vdata = gintNoOption, _ End Property On Error GoTo 0 "Invalid continuation criteria" Err.Raise vbObjectError + mintContinuationCriteria = vdata Public Property Get StartDir() As String errGetStepTypeFailed, _ StartDir = mstrStartDir mstrSource, _ End Property End Property Public Property Get ExecutionMechanism() As LoadResString(errGetStepTypeFailed) ExecutionMethod Public Property Get VersionNo() As String ' The version number of a step is stored in the x.y End Property ExecutionMechanism = format where mintExecutionMechanism ' x represents a change to the step as a result of Public Property Let StepType(vdata As modifications gintStepType) End Property ' to any of the step properties ' y represents a change to the step as a result of On Error GoTo StepTypeErr modifications Public Property Get FailureDetails() As String ' to the sub-steps associated with it. Hence the y- Select Case vdata component Case gintGlobalStep, gintManagerStep, FailureDetails = mstrFailureDetails ' of the version will be incremented when a sub- gintWorkerStep step is added, mintStepType = vdata End Property ' modified or deleted ' x will be referred to throughout this code as the Case Else Public Property Let StepText(ByVal vdata As parent On Error GoTo 0 String) ' component of the version and y will be referred Err.Raise vbObjectError + ' Has to be null for manager steps to as the errStepTypeInvalid, _ ' The check will have to be made by the user ' child component of the version mstrModuleName & interface or ' The version information for a step is maintained "StepType", ' by the manager step class by the LoadResString(errStepTypeInvalid) mstrStepText = vdata ' calling function End Select End Property Exit Property Public Property Let StepLevel(ByVal vdata As VersionNo = mstrVersionNo Integer) StepTypeErr: End Property LogErrors Errors HP TPC-H FULL DISCLOSURE REPORT 394 © 2005 Hewlett-Packard Company. All rights reserved. Public Property Get StepId() As Long Attribute VB_PredeclaredId = False Dim lTemp As Long Attribute VB_Exposed = False Dim cChildStep As cStep StepId = mlngStepId ' FILE: cStepTree.cls ' Microsoft TPC-H Kit Ver. 1.00 Set NextStep = Nothing End Property ' Copyright Microsoft, 1999 StepId = GetStepId(StepKey, StepId) Public Property Get NextStepId() As Long ' All Rights Reserved Set cChildStep = StepRecords.QueryStep(StepId) ' Dim lngNextId As Long ' For lTemp = 0 To StepRecords.StepCount - 1 ' PURPOSE: Implements step navigation If StepRecords(lTemp).StepType <> On Error GoTo NextStepIdErr functions such as determining gintGlobalStep And _ ' the child of a step and so on. StepRecords(lTemp).ParentStepId = ' First check if the database object is valid ' Contact: Reshma Tharamal cChildStep.ParentStepId And _ Call CheckDB ([email protected]) StepRecords(lTemp).SequenceNo = ' cChildStep.SequenceNo + 1 Then ' Retrieve the next identifier using the Option Explicit Set NextStep = StepRecords(lTemp) sequence class Exit For Set mStepSeq = New cSequence ' Used to indicate the source module name End If Set mStepSeq.IdDatabase = when errors Next lTemp mdbsDatabase ' are raised by this class mStepSeq.IdentifierColumn = "step_id" Private Const mstrModuleName As String = End Property lngNextId = mStepSeq.Identifier "c StepTree." Private Function GetStepId(Optional ByVal Set mStepSeq = Nothing Private mstrSource As String StepKey As String, _ Optional ByVal StepId As Long = 0) As Long NextStepId = lngNextId Public StepRecords As cArrSteps If StepId = 0 Then Exit Property Public Property Get HasChild(Optional ByVal If StringEmpty(StepKey) Then StepKey As String, _ Err.Raise vbObjectError + NextStepIdErr: Optional ByVal StepId As Long = 0) As errMandatoryParameterMissing, _ LogErrors Errors Boolean mstrModuleName & "GetStepId", mstrSource = mstrModuleName & LoadResString(errMandatoryParameterMissing) "NextStepId" Dim lTemp As Long Else On Error GoTo 0 GetStepId = IIf(IsLabel(StepKey), 0, Err.Raise vbObjectError + HasChild = False MakeIdentifierValid(StepKey)) errStepIdGetFailed, _ StepId = GetStepId(StepKey, StepId) End If mstrSource, Else LoadResString(errStepIdGetFailed) For lTemp = 0 To StepRecords.StepCount - GetStepId = StepId 1 End If End Property If StepRecords(lTemp).StepType <> End Function Public Property Let StepId(ByVal vdata As gintGlobalStep And VERSION 1.0 CLASS Long) StepRecords(lTemp).ParentStepId = StepId BEGIN Then MultiUse = -1 'True mlngStepId = vdata HasChild = True END Exit For Attribute VB_Name = "cStringSM" End Property End If Attribute VB_GlobalNameSpace = False Next lTemp Attribute VB_Creatable = True Private Sub Class_Initialize() Attribute VB_PredeclaredId = False End Property Attribute VB_Exposed = False ' Initialize the operation indicator variable Public Property Get ChildStep(Optional ByVal ' FILE: cStringSM.cls to Query StepKey As String, _ ' Microsoft TPC-H Kit Ver. 1.00 ' It will be modified later by the collection Optional ByVal StepId As Long = 0) As ' Copyright Microsoft, 1999 class when cStep ' All Rights Reserved ' inserts, updates or deletes are performed ' mintOperation = QueryOp Dim lTemp As Long ' mbIsNewVersion = False ' PURPOSE: This module contains common msOldVersion = gstrEmptyString Set ChildStep = Nothing procedures that can be used StepId = GetStepId(StepKey, StepId) ' to manipulate strings Set mFieldValue = New cStringSM ' It is called StringSM, since String is a Set mcIterators = New cNodeCollections For lTemp = 0 To StepRecords.StepCount - Visual Basic keyword 1 ' Contact: Reshma Tharamal End Sub If StepRecords(lTemp).StepType <> ([email protected]) gintGlobalStep And ' Private Sub Class_Terminate() StepRecords(lTemp).ParentStepId = StepId Option Explicit And _ Set mFieldValue = Nothing StepRecords(lTemp).SequenceNo = ' Used to indicate the source module name when Set mcIterators = Nothing gintMinSequenceNo Then errors Set ChildStep = StepRecords(lTemp) ' are raised by this class End Sub Exit For Private mstrSource As String End If Private Const mstrModuleName As String = Next lTemp "c StringSM." VERSION 1.0 CLASS BEGIN End Property Private mstrText As String MultiUse = -1 'True Public Property Get NextStep(Optional ByVal END StepKey As String, _ Private Const mstrNullValue = "null" Attribute VB_Name = "cStepTree" Optional ByVal StepId As Long = 0) As Private Const mstrSQ = "'" Attribute VB_GlobalNameSpace = False cStep Private Const mstrEnvVarSeparator = "%" Attribute VB_Creatable = True Public Function InsertEnvVariables( _ HP TPC-H FULL DISCLOSURE REPORT 395 © 2005 Hewlett-Packard Company. All rights reserved. Optional ByVal strComString As On Error GoTo MakeStringFieldValidErr ' Replaces all occurrences of ReplaceString in String) As String MainString with ReplaceWith ' This function replaces all environment If IsStringEmpty(strField) Then variables in strTemp = mstrText Dim intPos As Integer ' the passed in string with their values - Else Dim strTemp As String they are strTemp = strField ' enclosed by "%" End If On Error GoTo ReplaceSubStringErr

Dim intPos As Integer ' It checks whether the text is empty strTemp = MainString Dim intEndPos As Integer ' If so, it returns the string, "null" Dim strEnvVariable As String If IsStringEmpty(strTemp) Then intPos = InStr(strTemp, ReplaceString) Dim strValue As String MakeStringFieldValid = mstrNullValue Do While intPos <> 0 Dim strCommand As String Else strTemp = Left(strTemp, intPos - 1) & ' Single-quotes have to be replaced by two ReplaceWith & _ On Error GoTo InsertEnvVariablesErr single-quotes, Mid(strTemp, intPos + mstrSource = mstrModuleName & ' since a single-quote is the identifier Len(ReplaceString)) "InsertEnvVariables" delimiter intPos = InStr(intPos + Len(ReplaceString) + ' character - call a procedure to do the 1, strTemp, ReplaceString) ' Initialize the return value of the function replace Loop to the strTemp = ReplaceSubString(strTemp, ReplaceSubString = strTemp ' passed in command mstrSQ, mstrSQ & mstrSQ) If IsStringEmpty(strComString) Then Exit Function strCommand = mstrText ' Replace pipe characters with the Else corresponding chr function ReplaceSubStringErr: strCommand = strComString strTemp = ReplaceSubString(strTemp, "|", Call LogErrors(Errors) End If "' & Chr(124) & '") mstrSource = mstrModuleName & "ReplaceSubString" intPos = InStr(strCommand, ' Enclose the string in single quotes On Error GoTo 0 mstrEnvVarSeparator) MakeStringFieldValid = mstrSQ & Err.Raise vbObjectError + errParseStringFailed, Do While intPos <> 0 strTemp & mstrSQ _ ' Extract the environment variable from mstrSource, _ the passed End If LoadResString(errParseStringFailed) ' in string intEndPos = InStr(intPos + 1, Exit Function End Function strCommand, mstrEnvVarSeparator) strEnvVariable = Mid(strCommand, MakeStringFieldValidErr: Public Property Get Text() As String intPos + 1, intEndPos - intPos - 1) mstrSource = mstrModuleName & Attribute Text.VB_UserMemId = 0 "MakeStringFieldValid" Text = mstrText ' Get the value of the variable and call a LogErrors Errors End Property function On Error GoTo 0 ' to replace the variable with it's value Err.Raise vbObjectError + Public Property Let Text(ByVal vdata As String) strValue = Environ$(strEnvVariable) errMakeFieldValidFailed, _ mstrText = vdata strCommand = mstrSource, End Property ReplaceSubString(strCommand, _ LoadResString(errMakeFieldValidFailed) mstrEnvVarSeparator & VERSION 1.0 CLASS strEnvVariable & mstrEnvVarSeparator, _ End Function BEGIN strValue) Public Function MakeDateFieldValid( _ MultiUse = -1 'True Optional dtmField As Date = gdtmEmpty) END intPos = InStr(strCommand, As String Attribute VB_Name = "cSubStep" mstrEnvVarSeparator) ' Returns a string that can be appended to Attribute VB_GlobalNameSpace = False Loop any insert Attribute VB_Creatable = True ' or modify (sql) statement Attribute VB_PredeclaredId = False InsertEnvVariables = strCommand Attribute VB_Exposed = False Exit Function ' Enclose the date in single quotes ' FILE: cSubStep.cls MakeDateFieldValid = mstrSQ & dtmField ' Microsoft TPC-H Kit Ver. 1.00 InsertEnvVariablesErr: & mstrSQ ' Copyright Microsoft, 1999 ' Log the error code raised by Visual ' All Rights Reserved Basic End Function ' Call LogErrors(Errors) ' ' Return an empty string Private Function IsStringEmpty(strToCheck ' PURPOSE: This module encapsulates the InsertEnvVariables = gstrEmptyString As String) As Boolean properties of sub-steps ' that are used during the execution of a End Function If strToCheck = gstrEmptyString Then workspace. Public Function MakeStringFieldValid( _ IsStringEmpty = True ' Contact: Reshma Tharamal Optional strField As String = Else ([email protected]) gstrEmptyString) As String IsStringEmpty = False ' ' Returns a string that can be appended to End If Option Explicit any insert ' or modify (sql) statement End Function ' Used to indicate the source module name when ' If an argument is not passed to this Public Function ReplaceSubString(ByVal errors function, the MainString As String, _ ' are raised by this class ' default text property is used ByVal ReplaceString As String, _ Private Const mstrModuleName As String = ByVal ReplaceWith As String) As String "c SubStep" Dim strTemp As String Private mlngStepId As Long HP TPC-H FULL DISCLOSURE REPORT 396 © 2005 Hewlett-Packard Company. All rights reserved. Private mintRunning As Integer ' Number of On Error GoTo NextIterationErr If running tasks vntIterators(LBound(vntIterators)).IteratorType = _ Private mintComplete As Integer ' Number vnt Iterators = cStepRec.Iterators gintValue Then of completed tasks mcLastIterator.IteratorType = gintValue ' The last iterator for this sub-step If Not mcLastIterator Is Nothing Then ' Since the sequence numbers begin at 0 Private mcLastIterator As cRunItDetails ' The run node contains the iterator details mcLastIterator.Sequence = ' Get the next value for the iterator gintMinIteratorSequence - 1 Public Function NewIteration(cStepRec As If mcLastIterator.IteratorType = gintValue Else cStep) As cIterator Then mcLastIterator.IteratorType = gintFrom ' Calls a procedure to determine the next ' Find the next iterator that appears in Call InitializeItRange(vntIterators, iterator value the list of cPendingStep.WorkspaceId, _ ' for the passed in step - returns the value ' iterator values ColParameters) to be used Set cItRec = End If ' in the iteration. NextInSequence(vntIterators, Else ' It updates the instance node with the new mcLastIterator.Sequence) Set mcLastIterator = Nothing iteration Else End If ' for the step. lngValue = CLng(Trim$(mcLastIterator.Value)) Exit Sub Dim cItRec As cIterator ' Determine whether the new iterator value falls in the InitializeItErr: On Error GoTo NewIterationErr ' range between From and To ' Log the error code raised by Visual Basic If (mcLastIterator.RangeStep > 0 And _ Call LogErrors(Errors) ' Call a function that will populate an (mcLastIterator.RangeFrom <= On Error GoTo 0 iterator record mcLastIterator.RangeTo) And _ Err.Raise vbObjectError + errIterateFailed, ' with the iterator values (mcLastIterator.RangeStep + mstrModuleName, _ Set cItRec = NextIteration(cStepRec) lngValue) <= mcLastIterator.RangeTo) Or _ LoadResString(errIterateFailed) (mcLastIterator.RangeStep < 0 ' Initialize the run node with the new And _ End Sub iterator (mcLastIterator.RangeFrom >= ' values mcLastIterator.RangeTo) And _ Private Sub InitializeItRange(vntIterators As If Not mcLastIterator Is Nothing Then (mcLastIterator.RangeStep + Variant, ByVal lWorkspace As Long, _ If cItRec Is Nothing Then lngValue) >= mcLastIterator.RangeTo) Then ColParameters As cArrParameters) mcLastIterator.Value = Set cItRec = New cIterator gstrEmptyString cItRec.Value = ' Initializes the LastIteration structure for range Else Trim$(CStr(mcLastIterator.RangeStep + iterators from the mcLastIterator.Value = cItRec.Value lngValue)) ' passed in variant containing the iterator records Else ' And if the iterator is a list of values, Set cItRec = Nothing Dim lngIndex As Long then update End If Dim cItRec As cIterator ' the sequence number as well End If If mcLastIterator.IteratorType = Else On Error GoTo InitializeItRangeErr gintValue Then Set cItRec = Nothing mcLastIterator.Sequence = End If If IsArray(vntIterators) And Not cItRec.SequenceNo IsEmpty(vntIterators) Then End If Set NextIteration = cItRec End If Exit Function ' Check if the iterator range has been End If completely initialized NextIterationErr: RangeComplete (vntIterators) Set NewIteration = cItRec ' Log the error code raised by Visual Basic Set cItRec = Nothing Call LogErrors(Errors) ' Initialize the Run node with the values for the On Error GoTo 0 From, Exit Function Err.Raise vbObjectError + errIterateFailed, ' To and Step boundaries mstrModuleName, _ For lngIndex = LBound(vntIterators) To NewIterationErr: LoadResString(errIterateFailed) UBound(vntIterators) ' Log the error code raised by Visual Set cItRec = vntIterators(lngIndex) Basic End Function Select Case cItRec.IteratorType Call LogErrors(Errors) Public Sub InitializeIt(cPendingStep As cStep, Case gintFrom On Error GoTo 0 _ mcLastIterator.RangeFrom = Err.Raise vbObjectError + ColParameters As cArrParameters, _ SubstituteParameters(cItRec.Value, lWorkspace, errIterateFailed, mstrModuleName, _ Optional vntIterators As Variant) WspParameters:=ColParameters) LoadResString(errIterateFailed) Case gintTo ' Initializes the LastIteration structure with mcLastIterator.RangeTo = End Function the iterator details for the SubstituteParameters(cItRec.Value, lWorkspace, Public Function NextIteration(cStepRec As ' passed in step WspParameters:=ColParameters) cStep) As cIterator Case gintStep On Error GoTo InitializeItErr mcLastIterator.RangeStep = ' Retrieves the next iterator value for the SubstituteParameters(cItRec.Value, lWorkspace, passed in step - If IsMissing(vntIterators) Then WspParameters:=ColParameters) ' returns an iterator record with the new vntIterators = cPendingStep.Iterators Case Else iterator values End If On Error GoTo 0 Err.Raise vbObjectError + Dim cItRec As cIterator If IsArray(vntIterators) And Not errTypeInvalid, mstrModuleName, _ Dim vntIterators As Variant IsEmpty(vntIterators) Then LoadResString(errTypeInvalid) Dim lngValue As String mcLastIterator.IteratorName = End Select cPendingStep.IteratorName Next lngIndex HP TPC-H FULL DISCLOSURE REPORT 397 © 2005 Hewlett-Packard Company. All rights reserved. End Property End Sub mcLastIterator.Value = Public Property Set LastIterator(vdata As Trim$(CStr(mcLastIterator.RangeFrom - cRunItDetails) mcLastIterator.RangeStep)) Public Sub Clear() End If Set mcLastIterator = vdata mcSubSteps.Clear Exit Sub End Property End Sub InitializeItRangeErr: Public Property Get TasksRunning() As ' Log the error code raised by Visual Integer Basic Public Function Count() As Long Call LogErrors(Errors) TasksRunning = mintRunning On Error GoTo 0 Count = mcSubSteps.Count Err.Raise vbObjectError + End Property errIterateFailed, mstrModuleName, _ End Function LoadResString(errIterateFailed) Public Property Let TasksRunning(ByVal vdata As Integer) End Sub Public Function Delete(ByVal lngDelete As Long) Private Function mintRunning = vdata As cSubStep NextInSequence(vntIterators As Variant, _ lngOldSequence As Long) As cIterator End Property Set Delete = mcSubSteps.Delete(lngDelete)

Dim lngIndex As Long Public Property Get TasksComplete() As End Function Dim cItRec As cIterator Integer

On Error GoTo NextInSequenceErr TasksComplete = mintComplete Public Property Get Item(ByVal Position As Long) As cSubStep If IsArray(vntIterators) And Not End Property Attribute Item.VB_UserMemId = 0 IsEmpty(vntIterators) Then Public Property Let TasksComplete(ByVal For lngIndex = LBound(vntIterators) vdata As Integer) Set Item = mcSubSteps.Item(Position) To UBound(vntIterators) Set cItRec = vntIterators(lngIndex) mintComplete = vdata End Property If cItRec.IteratorType <> gintValue Then End Property Private Sub Class_Initialize() On Error GoTo 0 Public Property Get StepId() As Long Err.Raise vbObjectError + Set mcSubSteps = New cVector errTypeInvalid, mstrModuleName, _ StepId = mlngStepId End Sub LoadResString(errTypeInvalid) End Property End If Public Property Let StepId(ByVal vdata As Private Sub Class_Terminate() If cItRec.SequenceNo = Long) lngOldSequence + 1 Then Set mcSubSteps = Nothing Exit For mlngStepId = vdata End If End Sub End Property Next lngIndex VERSION 1.0 CLASS BEGIN VERSION 1.0 CLASS If cItRec.SequenceNo <> MultiUse = -1 'True BEGIN lngOldSequence + 1 Then END MultiUse = -1 'True Set cItRec = Nothing Attribute VB_Name = "cSubSteps" END End If Attribute VB_GlobalNameSpace = False Attribute VB_Name = "cTermProcess" Else Attribute VB_Creatable = True Attribute VB_GlobalNameSpace = False Set cItRec = Nothing Attribute VB_PredeclaredId = False Attribute VB_Creatable = True End If Attribute VB_Exposed = False Attribute VB_PredeclaredId = False ' FILE: cSubSteps.cls Attribute VB_Exposed = False Set NextInSequence = cItRec ' Microsoft TPC-H Kit Ver. 1.00 ' FILE: cTermProcess.cls ' Copyright Microsoft, 1999 ' Microsoft TPC-H Kit Ver. 1.00 Exit Function ' All Rights Reserved ' Copyright Microsoft, 1999 ' ' All Rights Reserved NextInSequenceErr: ' ' ' Log the error code raised by Visual ' PURPOSE: This module provides a type- ' Basic safe wrapper around cVector to ' PURPOSE: This module raises an event if a Call LogErrors(Errors) ' implement a collection of cSubStep completed step exists. On Error GoTo 0 objects. ' Contact: Reshma Tharamal Err.Raise vbObjectError + ' Contact: Reshma Tharamal ([email protected]) errIterateFailed, mstrModuleName, _ ([email protected]) ' LoadResString(errIterateFailed) ' Option Explicit Option Explicit End Function Private WithEvents moTimer As cTimerSM Private mcSubSteps As cVector Attribute moTimer.VB_VarHelpID = -1 Public Property Get LastIterator() As Private bTermProcessExists As Boolean cRunItDetails Public Sub Add(ByVal objItem As cSubStep) Public Event TermProcessExists()

Set LastIterator = mcLastIterator mcSubSteps.Add objItem Public Sub ProcessTerminated()

HP TPC-H FULL DISCLOSURE REPORT 398 © 2005 Hewlett-Packard Company. All rights reserved. bTermProcessExists = True Attribute VB_Exposed = False moTimer.Enabled = True ' FILE: cTermSteps.cls Private Sub moTimer_Timer() ' Microsoft TPC-H Kit Ver. 1.00 End Sub ' Copyright Microsoft, 1999 On Error GoTo moTimer_TimerErr ' All Rights Reserved Private Sub Class_Initialize() ' If mcTermSteps.Count > 0 Then ' ' Since items are appended to the end of the bTermProcessExists = False ' PURPOSE: This module provides a type- array safe wrapper around cVector to RaiseEvent TermStepExists(mcTermSteps(0)) Set moTimer = New cTimerSM ' implement a collection of cTermStep Else moTimer.Enabled = False objects. Raises an moTimer.Enabled = False ' event if a step that has completed End If End Sub execution exists. Exit Sub ' Contact: Reshma Tharamal Private Sub Class_Terminate() ([email protected]) moTimer_TimerErr: ' LogErrors Errors Set moTimer = Nothing Option Explicit End Sub End Sub Private mcTermSteps As cVector VERSION 1.0 CLASS Private WithEvents moTimer As cTimerSM BEGIN Private Sub moTimer_Timer() Attribute moTimer.VB_VarHelpID = -1 MultiUse = -1 'True Public Event TermStepExists(cStepDetails As END On Error GoTo moTimer_TimerErr cTermStep) Attribute VB_Name = "cTimerSM" Attribute VB_GlobalNameSpace = False If bTermProcessExists Then Public Sub Add(ByVal citem As cTermStep) Attribute VB_Creatable = True RaiseEvent TermProcessExists Attribute VB_PredeclaredId = False End If Call mcTermSteps.Add(citem) Attribute VB_Exposed = False moTimer.Enabled = True ' FILE: cTimer.cls moTimer.Enabled = False ' Microsoft TPC-H Kit Ver. 1.00 bTermProcessExists = False End Sub ' Copyright Microsoft, 1999 ' All Rights Reserved Exit Sub Public Sub Clear() ' ' moTimer_TimerErr: mcTermSteps.Clear ' PURPOSE: This module implements a timer. LogErrors Errors ' Contact: Reshma Tharamal End Sub ([email protected]) End Sub ' Public Function Delete() VERSION 1.0 CLASS Option Explicit BEGIN Call mcTermSteps.Delete(0) MultiUse = -1 'True ' Disable the timer if there are no more Public Event Timer() END pending events Attribute VB_Name = "cTermStep" If mcTermSteps.Count = 0 Then Private Const mnDefaultInterval As Long = 1 Attribute VB_GlobalNameSpace = False moTimer.Enabled = False Attribute VB_Creatable = True Private mnTimerID As Long Attribute VB_PredeclaredId = False End Function Private mnInterval As Long Attribute VB_Exposed = False Private mfEnabled As Boolean ' FILE: cTermStep.cls Public Property Get Item(ByVal Position As ' Microsoft TPC-H Kit Ver. 1.00 Long) As cTermStep Public Property Get Interval() As Long ' Copyright Microsoft, 1999 Interval = mnInterval ' All Rights Reserved Set Item = mcTermSteps(Position) End Property ' Public Property Let Interval(Value As Long) ' End Property If mnInterval <> Value Then ' PURPOSE: This module encapsulates mnInterval = Value the properties of steps that Public Function Count() As Long If mfEnabled Then ' have completed execution such as SetInterval mnInterval, mnTimerID status and time of completion. Count = mcTermSteps.Count End If ' Contact: Reshma Tharamal End If ([email protected]) End Function End Property ' Option Explicit Private Sub Class_Initialize() Public Property Get Enabled() As Boolean Enabled = mfEnabled Public TimeComplete As Currency Set mcTermSteps = New cVector End Property Public Index As Long Public Property Let Enabled(Value As Boolean) Public InstanceId As Long Set moTimer = New cTimerSM If mfEnabled <> Value Then Public ExecutionStatus As InstanceStatus moTimer.Enabled = False If Value Then mnTimerID = StartTimer(mnInterval) VERSION 1.0 CLASS End Sub If mnTimerID <> 0 Then BEGIN mfEnabled = True MultiUse = -1 'True Private Sub Class_Terminate() 'Storing Me in the global would add a END reference to Me, which Attribute VB_Name = "cTermSteps" Set mcTermSteps = Nothing ' would prevent Me from being released, Attribute VB_GlobalNameSpace = False Set moTimer = Nothing which in turn would Attribute VB_Creatable = True ' prevent my Class_Terminate code from Attribute VB_PredeclaredId = False End Sub running. To prevent HP TPC-H FULL DISCLOSURE REPORT 399 © 2005 Hewlett-Packard Company. All rights reserved. ' this, I store a "soft reference" - sError = "StepMaster Error:" & ErrorCode Dim strErr As String the collection holds a & vbCrLf & LoadResString(ErrorCode) & ' pointer to me without vbCrLf strErr = InitErrorString incrementing my reference count. gcTimerObjects.Add ObjPtr(Me), If Not StringEmpty(ErrorSource) Then If Not StringEmpty(strErr) Then Str$(mnTimerID) sError = sError & "(Source: " & ' Display the error message End If ErrorSource & ")" & vbCrLf MsgBox strErr Else End If End If StopTimer mnTimerID sError = sError & OptArgs mfEnabled = False Err.Clear gcTimerObjects.Remove Call LogMessage(sError) Str$(mnTimerID) End Sub End If End Sub Public Sub LogMessage(strMsg As String) End If Private Function InitErrorString() As String End Property ' Initializes a string with all the properties of On Error GoTo LogMessageErr the Private Sub Class_Initialize() ' Err object ' Write an error using the WriteError method of If gcTimerObjects Is Nothing Then Set the Execute object. gcTimerObjects = New Collection Dim strError As String If Not mcExecObjRef Is Nothing Then mnInterval = mnDefaultInterval Dim errCode As Long mcExecObjRef.WriteError strMsg End Sub Else If Err.Number = 0 Then WriteMessage strMsg Private Sub Class_Terminate() InitErrorString = gstrEmptyString End If Enabled = False Else End Sub With Err Exit Sub If Err.Number > vbObjectError And Friend Sub Tick() Err.Number < (vbObjectError + 65536) Then LogMessageErr: RaiseEvent Timer errCode = .Number - vbObjectError Call LogErrors(Errors) End Sub Else ' Since write to the error file for the step has VERSION 1.0 CLASS errCode = .Number failed, write to the project log BEGIN End If Call WriteMessage(strMsg) MultiUse = -1 'True strError = "Error #: "& errCode & END vbCrLf End Sub Attribute VB_Name = "cVBErrorsSM" strError = strError & "Description: " & Public Property Set ErrorFile(vdata As Attribute VB_GlobalNameSpace = False .Description & vbCrLf EXECUTEDLLLib.Execute) Attribute VB_Creatable = True strError = strError & "Source: "& Attribute VB_PredeclaredId = False Err.Source & vbCrLf Set mcExecObjRef = vdata Attribute VB_Exposed = False End With Attribute VB_Ext_KEY = End Property "SavedWithClassBuilder" ,"Yes" Debug.Print strError Private Sub Class_Terminate() Attribute VB_Ext_KEY = "Top_Level" InitErrorString = strError ,"Yes" End If Set mcExecObjRef = Nothing ' FILE: cVBErrors.cls ' Microsoft TPC-H Kit Ver. 1.00 End Function End Sub ' Copyright Microsoft, 1999 Public Sub LogVBErrors() VERSION 1.0 CLASS ' All Rights Reserved BEGIN ' Dim strErr As String MultiUse = -1 'True ' END ' PURPOSE: This module encapsulates strErr = InitErrorString Attribute VB_Name = "cVector" the handling of Visual Basic errors. Attribute VB_GlobalNameSpace = False ' This module does not do any error On Error GoTo LogVBErrorsErr Attribute VB_Creatable = True handling - any error handler Attribute VB_PredeclaredId = False ' will erase the errors object! If Not StringEmpty(strErr) Then Attribute VB_Exposed = False ' Contact: Reshma Tharamal ' Write an error using the WriteError ' FILE: cVector.cls ([email protected]) method of the Execute object. ' Microsoft TPC-H Kit Ver. 1.00 ' If Not mcExecObjRef Is Nothing Then ' Copyright Microsoft, 1999 Option Explicit mcExecObjRef.WriteError strErr ' All Rights Reserved Else ' ' The Execute class exposes a method, WriteMessage strErr ' WriteError through which we can write to End If ' PURPOSE: This class implements an array of the End If objects. ' error log that is currently being used by the ' Contact: Reshma Tharamal Execute object. Store a reference to Err.Clear ([email protected]) ' Execute object locally. ' Private mcExecObjRef As Exit Sub Option Explicit EXECUTEDLLLib.Execute Public Sub WriteError(ByVal ErrorCode As LogVBErrorsErr: ' Used to indicate the source module name when errErrorConstants, _ Call LogErrors(Errors) errors Optional ByVal ErrorSource As String ' Since write to the error file for the step has ' are raised by this class = gstrEmptyString, _ failed, write to the project log Private mstrSource As String Optional ByVal OptArgs As String = Call WriteMessage(strErr) Private Const mstrModuleName As String = gstrEmptyString) "c Vector." End Sub Dim sError As String Public Sub DisplayErrors() ' Array counter Private mlngCount As Long HP TPC-H FULL DISCLOSURE REPORT 400 © 2005 Hewlett-Packard Company. All rights reserved. Private mcarrItems() As Object mstrSource = mstrModuleName & "Delete" On Error GoTo 0 If Position >= 0 And Position < mlngCount - 1 Public Sub Add(ByVal objItem As Object) Err.Raise vbObjectError + Then ' Adds the passed in Object variable to the errDeleteArrayElementFailed, _ Set cTemp = mcarrItems(Position) array mstrSource, _ Set mcarrItems(Position) = On Error GoTo AddErr LoadResString(errDeleteArrayElementFailed) mcarrItems(Position + 1) Set mcarrItems(Position + 1) = cTemp ReDim Preserve mcarrItems(mlngCount) End Function End If Public Property Get Item(ByVal Position As ' Set the newly added element in the array Long) As Object End Sub to the Attribute Item.VB_UserMemId = 0 ' passed in variable Public Function Count() As Long Set mcarrItems(mlngCount) = objItem ' Returns the element at the passed in mlngCount = mlngCount + 1 position in the array Count = mlngCount If Position >= 0 And Position < mlngCount Exit Sub Then End Function Set Item = mcarrItems(Position) AddErr: Else LogErrors Errors On Error GoTo 0 Private Sub Class_Initialize() gstrSource = mstrModuleName & "Add" Err.Raise vbObjectError + On Error GoTo 0 errItemDoesNotExist, mstrSource, _ mlngCount = 0 Err.Raise vbObjectError + LoadResString(errItemDoesNotExist) errLoadInArrayFailed, _ End If End Sub mstrSource, _ End Property LoadResString(errLoadInArrayFailed) Public Property Set Item(ByVal Position As Private Sub Class_Terminate() Long, _ End Sub ByVal Value As Object) Call Clear Public Sub Clear() ' Returns the element at the passed in End Sub ' Clear the array position in the array ReDim mcarrItems(0) If Position >= 0 Then VERSION 1.0 CLASS mlngCount = 0 ' If the passed in position is outside the BEGIN array MultiUse = -1 'True End Sub ' bounds, then resize the array END If Position >= mlngCount Then Attribute VB_Name = "cVectorLng" Public Function Delete(ByVal lngDelete As ReDim Preserve mcarrItems(Position) Attribute VB_GlobalNameSpace = False Long) As Object mlngCount = Position + 1 Attribute VB_Creatable = True End If Attribute VB_PredeclaredId = False Dim lngIndex As Long Attribute VB_Exposed = False ' Set the newly added element in the array ' FILE: cVectorLng.cls On Error GoTo DeleteErr to the ' Microsoft TPC-H Kit Ver. 1.00 ' passed in variable ' Copyright Microsoft, 1999 If lngDelete < (mlngCount - 1) Then Set mcarrItems(Position) = Value ' All Rights Reserved Else ' ' We want to maintain the order of all On Error GoTo 0 ' items in the Err.Raise vbObjectError + ' PURPOSE: This class implements an array of ' array - so move all remaining errItemDoesNotExist, mstrSource, _ longs. elements in the array LoadResString(errItemDoesNotExist) ' Contact: Reshma Tharamal ' up by 1 End If ([email protected]) For lngIndex = lngDelete To ' mlngCount - 2 End Property Option Explicit MoveDown lngIndex Public Sub MoveUp(ByVal Position As Long) Next lngIndex ' Moves the element at the passed in position ' Used to indicate the source module name when up by 1 errors End If ' are raised by this class Dim cTemp As Object Private mstrSource As String ' Return the deleted node Private Const mstrModuleName As String = Set Delete = mcarrItems(mlngCount - 1) If Position > 0 And Position < mlngCount "c VectorLng." Then ' Delete the last Node from the array Set cTemp = mcarrItems(Position) ' Array counter mlngCount = mlngCount - 1 Private mlngCount As Long If mlngCount > 0 Then Set mcarrItems(Position) = Private mcarrItems() As Long ReDim Preserve mcarrItems(0 To mcarrItems(Position - 1) mlngCount - 1) Set mcarrItems(Position - 1) = cTemp Public Sub Add(ByVal lngItem As Long) Else End If ' Adds the passed in long variable to the array ReDim mcarrItems(0) End If End Sub On Error GoTo AddErr Public Sub MoveDown(ByVal Position As Exit Function Long) ReDim Preserve mcarrItems(mlngCount) ' Moves the element at the passed in position DeleteErr: down by 1 ' Set the newly added element in the array to the LogErrors Errors ' passed in variable Dim cTemp As Object mcarrItems(mlngCount) = lngItem HP TPC-H FULL DISCLOSURE REPORT 401 © 2005 Hewlett-Packard Company. All rights reserved. mlngCount = mlngCount + 1 LogErrors Errors mstrSource = mstrModuleName & "Delete" ' Set the newly added element in the array to Exit Sub On Error GoTo 0 the Err.Raise vbObjectError + ' passed in variable AddErr: errDeleteArrayElementFailed, _ mcarrItems(Position) = Value LogErrors Errors mstrSource, _ Else gstrSource = mstrModuleName & "Add" On Error GoTo 0 On Error GoTo 0 LoadResString(errDeleteArrayElementFailed) Err.Raise vbObjectError + Err.Raise vbObjectError + errItemDoesNotExist, mstrSource, _ errLoadInArrayFailed, _ End Sub LoadResString(errItemDoesNotExist) mstrSource, _ Public Function Find(ByVal Item As Long) As End If Long LoadResString(errLoadInArrayFailed) End Property ' Returns the position at which the passed in Public Sub MoveUp(ByVal Position As Long) End Sub value occurs ' Moves the element at the passed in position up Public Sub Clear() ' in the array by 1

' Clear the array Dim lngIndex As Long Dim lngTemp As Long ReDim mcarrItems(0) On Error GoTo FindErr If Position > 0 And Position < mlngCount Then End Sub lngTemp = mcarrItems(Position) ' Find the element in the array to be deleted Public Sub Delete(Optional ByVal Position For lngIndex = 0 To mlngCount - 1 mcarrItems(Position) = mcarrItems(Position - As Long = -1, _ 1) Optional ByVal Item As Long = -1) If mcarrItems(lngIndex) = Item Then mcarrItems(Position - 1) = lngTemp ' The user can opt to delete either a Find = lngIndex End If specific item in Exit Function ' the list or the item at a specified position. End If End Sub If no Public Sub MoveDown(ByVal Position As Long) ' parameters are passed in, we delete the Next lngIndex ' Moves the element at the passed in position element at down by 1 ' position 0! Find = -1 Dim lngTemp As Long Dim lngDelete As Long Exit Function Dim lngIndex As Long If Position >= 0 And Position < mlngCount - 1 FindErr: Then On Error GoTo DeleteErr LogErrors Errors lngTemp = mcarrItems(Position) mstrSource = mstrModuleName & "Find" If Position = -1 Then On Error GoTo 0 mcarrItems(Position) = mcarrItems(Position + ' Since we can never store an element at Err.Raise vbObjectError + 1) position -1, errItemNotFound, mstrSource, _ mcarrItems(Position + 1) = lngTemp ' we can be sure that the user is trying LoadResString(errItemNotFound) End If to delete ' a given item End Function End Sub lngDelete = Find(Item) Public Property Get Item(ByVal Position As Else Long) As Long Public Function Count() As Long lngDelete = Position Attribute Item.VB_UserMemId = 0 End If Count = mlngCount ' Returns the element at the passed in If lngDelete < (mlngCount - 1) Then position in the array End Function If Position >= 0 And Position < mlngCount ' We want to maintain the order of all Then items in the Item = mcarrItems(Position) Private Sub Class_Initialize() ' array - so move all remaining Else elements in the array On Error GoTo 0 mlngCount = 0 ' up by 1 Err.Raise vbObjectError + For lngIndex = lngDelete To errItemDoesNotExist, mstrSource, _ End Sub mlngCount - 2 LoadResString(errItemDoesNotExist) MoveDown lngIndex End If Next lngIndex Private Sub Class_Terminate() End Property End If Public Property Let Item(ByVal Position As Call Clear Long, _ ' Delete the last Node from the array ByVal Value As Long) End Sub mlngCount = mlngCount - 1 If mlngCount > 0 Then ' Returns the element at the passed in VERSION 1.0 CLASS ReDim Preserve mcarrItems(0 To position in the array BEGIN mlngCount - 1) If Position >= 0 Then MultiUse = -1 'True Else ' If the passed in position is outside the END ReDim mcarrItems(0) array Attribute VB_Name = "cVectorStr" End If ' bounds, then resize the array Attribute VB_GlobalNameSpace = False If Position >= mlngCount Then Attribute VB_Creatable = True Exit Sub ReDim Preserve mcarrItems(Position) Attribute VB_PredeclaredId = False mlngCount = Position + 1 Attribute VB_Exposed = False DeleteErr: End If ' FILE: cVectorStr.cls HP TPC-H FULL DISCLOSURE REPORT 402 © 2005 Hewlett-Packard Company. All rights reserved. ' Microsoft TPC-H Kit Ver. 1.00 If Position = -1 Then mstrSource = mstrModuleName & "Find" ' Copyright Microsoft, 1999 ' Since we can never store an element at On Error GoTo 0 ' All Rights Reserved position -1, Err.Raise vbObjectError + errItemNotFound, ' ' we can be sure that the user is trying to mstrSource, _ ' delete LoadResString(errItemNotFound) ' PURPOSE: This class implements an ' a given item array of strings. lngDelete = Find(Item) End Function ' Contact: Reshma Tharamal Else Public Property Get Item(ByVal Position As Long) ([email protected]) lngDelete = Position As String ' End If Attribute Item.VB_UserMemId = 0 Option Explicit If lngDelete < (mlngCount - 1) Then ' Returns the element at the passed in position in ' Used to indicate the source module name the array when errors ' We want to maintain the order of all If Position >= 0 And Position < mlngCount Then ' are raised by this class items in the Item = mcarrItems(Position) Private mstrSource As String ' array - so move all remaining elements in Else Private Const mstrModuleName As String = the array On Error GoTo 0 "c VectorStr." ' up by 1 Err.Raise vbObjectError + For lngIndex = lngDelete To mlngCount - errItemDoesNotExist, mstrSource, _ ' Array counter 2 LoadResString(errItemDoesNotExist) Private mlngCount As Long MoveDown lngIndex End If Private mcarrItems() As String Next lngIndex End Property Public Sub Add(ByVal strItem As String) End If Public Property Let Item(ByVal Position As Long, ' Adds the passed in string variable to the _ array ' Delete the last Node from the array ByVal Value As String) mlngCount = mlngCount - 1 On Error GoTo AddErr If mlngCount > 0 Then ' Returns the element at the passed in position in ReDim Preserve mcarrItems(0 To the array ReDim Preserve mcarrItems(mlngCount) mlngCount - 1) If Position >= 0 Then Else ' If the passed in position is outside the array ' Set the newly added element in the array ReDim mcarrItems(0) ' bounds, then resize the array to the End If If Position >= mlngCount Then ' passed in variable ReDim Preserve mcarrItems(Position) mcarrItems(mlngCount) = strItem Exit Sub mlngCount = Position + 1 mlngCount = mlngCount + 1 End If DeleteErr: Exit Sub Call LogErrors(Errors) ' Set the newly added element in the array to mstrSource = mstrModuleName & "Delete" the AddErr: On Error GoTo 0 ' passed in variable Call LogErrors(Errors) Err.Raise vbObjectError + mcarrItems(Position) = Value gstrSource = mstrModuleName & "Add" errDeleteArrayElementFailed, _ Else On Error GoTo 0 mstrSource, _ On Error GoTo 0 Err.Raise vbObjectError + Err.Raise vbObjectError + errLoadInArrayFailed, _ LoadResString(errDeleteArrayElementFailed) errItemDoesNotExist, mstrSource, _ mstrSource, _ LoadResString(errItemDoesNotExist) End Sub End If LoadResString(errLoadInArrayFailed) Public Function Find(ByVal Item As String) As Long End Property End Sub Public Sub MoveUp(ByVal Position As Long) Public Sub Clear() ' Returns the position at which the passed in ' Moves the element at the passed in position up value occurs by 1 ' Clear the array ' in the array ReDim mcarrItems(0) Dim strTemp As String Dim lngIndex As Long End Sub If Position > 0 And Position < mlngCount Then On Error GoTo FindErr strTemp = mcarrItems(Position) Public Sub Delete(Optional ByVal Position mstrSource = mstrModuleName & "Find" As Long = -1, _ mcarrItems(Position) = mcarrItems(Position - Optional ByVal Item As String = -1) ' Find the element in the array to be deleted 1) ' The user can opt to delete either a For lngIndex = 0 To mlngCount - 1 mcarrItems(Position - 1) = strTemp specific item in End If ' the list or the item at a specified position. If mcarrItems(lngIndex) = Item Then If no Find = lngIndex End Sub ' parameters are passed in, we delete the Exit Function Public Sub MoveDown(ByVal Position As Long) element at End If ' Moves the element at the passed in position ' position 0! down by 1 Next lngIndex Dim lngDelete As Long Dim strTemp As String Dim lngIndex As Long Find = -1 If Position >= 0 And Position < mlngCount - 1 On Error GoTo DeleteErr Exit Function Then mstrSource = mstrModuleName & strTemp = mcarrItems(Position) "Delete" FindErr: Call LogErrors(Errors) HP TPC-H FULL DISCLOSURE REPORT 403 © 2005 Hewlett-Packard Company. All rights reserved. mcarrItems(Position) = End Property End Property mcarrItems(Position + 1) Private Property Let cStep_IteratorName(ByVal mcarrItems(Position + 1) = strTemp Private Property Get cStep_StartDir() As RHS As String) End If String mcStep.IteratorName = RHS End Sub cStep_StartDir = mcStep.StartDir End Property Public Function Count() As Long End Property Private Sub cStep_LoadIterator(cItRecord As Count = mlngCount Private Property Set cStep_NodeDB(RHS As cIterator) DAO.Database) End Function Call mcStep.LoadIterator(cItRecord) Set mcStep.NodeDB = RHS End Sub Private Sub Class_Initialize() End Property Private Sub cStep_DeleteIterator(cItRecord As cIterator) mlngCount = 0 Private Property Get cStep_NodeDB() As DAO.Database Call mcStep.DeleteIterator(cItRecord) End Sub Private Sub Class_Terminate() Set cStep_NodeDB = mcStep.NodeDB End Sub

Call Clear End Property Private Sub cStep_InsertIterator(cItRecord As cIterator) End Sub Private Function cStep_IncVersionY() As String Call mcStep.InsertIterator(cItRecord)

VERSION 1.0 CLASS cStep_IncVersionY = mcStep.IncVersionY End Sub BEGIN Private Function cStep_Iterators() As Variant MultiUse = -1 'True End Function END Private Function cStep_IsNewVersion() As cStep_Iterators = mcStep.Iterators Attribute VB_Name = "cWorker" Boolean Attribute VB_GlobalNameSpace = False cStep_IsNewVersion = End Function Attribute VB_Creatable = True mcStep.IsNewVersion Private Sub cStep_ModifyIterator(cItRecord As Attribute VB_PredeclaredId = False End Function cIterator) Attribute VB_Exposed = False Private Function cStep_OldVersionNo() As ' FILE: cWorker.cls String Call mcStep.ModifyIterator(cItRecord) ' Microsoft TPC-H Kit Ver. 1.00 cStep_OldVersionNo = ' Copyright Microsoft, 1999 mcStep.OldVersionNo End Sub ' All Rights Reserved End Function Private Sub cStep_RemoveIterator(cItRecord As ' cIterator) ' Private Function cStep_IncVersionX() As ' PURPOSE: Encapsulates the properties String Call mcStep.RemoveIterator(cItRecord) and methods of a worker step. ' Implements the cStep class - cStep_IncVersionX = mcStep.IncVersionX End Sub carries out initializations Private Sub cStep_UpdateIterator(cItRecord As ' and validations that are specific to End Function cIterator) worker steps. Private Sub cStep_UpdateIteratorVersion() ' Contact: Reshma Tharamal Call mcStep.UpdateIterator(cItRecord) ([email protected]) Call mcStep.UpdateIteratorVersion ' End Sub Option Explicit End Sub Private Sub cStep_AddIterator(cItRecord As cIterator) Implements cStep Private Function cStep_IteratorCount() As Long Call mcStep.AddIterator(cItRecord) ' Object variable to keep the step reference in cStep_IteratorCount = mcStep.IteratorCount End Sub Private mcStep As cStep End Function Private Property Let cStep_Position(ByVal RHS As ' Used to indicate the source module name Long) when errors Private Sub cStep_UnloadIterators() ' are raised by this class mcStep.Position = RHS Private mstrSource As String Call mcStep.UnloadIterators Private Const mstrModuleName As String = End Property "c Worker." End Sub Private Sub cStep_AddAllIterators() Private Property Get cStep_Position() As Long Private Sub cStep_SaveIterators() Call mcStep.AddAllIterators cStep_Position = mcStep.Position Call mcStep.SaveIterators End Sub End Property End Sub Private Property Let cStep_StartDir(ByVal Private Property Get cStep_IteratorName() As Private Function cStep_Clone(Optional cCloneStep RHS As String) String As cStep) As cStep

mcStep.StartDir = RHS cStep_IteratorName = mcStep.IteratorName Dim cNewWorker As cWorker

HP TPC-H FULL DISCLOSURE REPORT 404 © 2005 Hewlett-Packard Company. All rights reserved. Set cNewWorker = New cWorker End Property Set cStep_Clone = 'Private Property Let cStep_LogFile(ByVal Private Property Let mcStep.Clone(cNewWorker) RHS As String) cStep_ContinuationCriteria(ByVal RHS As ' ContinuationCriteria) End Function ' mcStep.LogFile = RHS ' ' The Continuation criteria must be non-null for Private Sub StepTextOrFileEntered() 'End Property all worker steps. ' Checks if either the step text or the name ' ' Check if the Continuation Criteria is valid of the file containing 'Private Property Get cStep_LogFile() As Select Case RHS ' the text has been entered String Case gintOnFailureAbortSiblings, ' If both of them are null or both of them ' gintOnFailureCompleteSiblings, _ are not null, ' cStep_LogFile = mcStep.LogFile gintOnFailureSkipSiblings, ' the worker step is invalid and an error is ' gintOnFailureAbort, _ raised 'End Property gintOnFailureContinue, If StringEmpty(mcStep.StepText) And gintOnFailureAsk StringEmpty(mcStep.StepTextFile) Then Private Property Let mcStep.ContinuationCriteria = RHS ShowError errStepTextAndFileNull cStep_ArchivedFlag(ByVal RHS As Boolean) On Error GoTo 0 Case Else Err.Raise vbObjectError + mcStep.ArchivedFlag = RHS On Error GoTo 0 errStepTextAndFileNull, _ Err.Raise vbObjectError + mstrSource, End Property errContCriteriaInvalid, _ LoadResString(errStepTextAndFileNull) mstrModuleName, End If Private Property Get cStep_ArchivedFlag() As LoadResString(errContCriteriaInvalid) Boolean End Select End Sub cStep_ArchivedFlag = mcStep.ArchivedFlag End Property Private Property Get cStep_IndOperation() As Operation End Property Private Property Let cStep_DegreeParallelism(ByVal RHS As String) cStep_IndOperation = Private Sub Class_Initialize() mcStep.IndOperation mcStep.DegreeParallelism = RHS ' Create the object End Property Set mcStep = New cStep End Property

Private Property Let ' Initialize the object with valid values for a Private Property Get cStep_DegreeParallelism() As cStep_IndOperation(ByVal RHS As Worker step String Operation) ' The global flag should be the first field to be initialized cStep_DegreeParallelism = mcStep.IndOperation = RHS ' since subsequent validations might try to mcStep.DegreeParallelism check if the End Property ' step being created is global End Property mcStep.GlobalFlag = False Private Property Get cStep_NextStepId() As ' mcStep.GlobalRunMethod = gintNoOption Private Sub cStep_Delete() Long mcStep.StepType = gintWorkerStep mcStep.Delete cStep_NextStepId = mcStep.NextStepId End Sub Private Sub Class_Terminate() End Sub End Property ' Remove the step object Private Property Get cStep_EnabledFlag() As Private Property Let Set mcStep = Nothing Boolean cStep_OutputFile(ByVal RHS As String) End Sub cStep_EnabledFlag = mcStep.EnabledFlag mcStep.OutputFile = RHS Private Sub cStep_Add() End Property End Property ' Call a private procedure to see if the step text has been Private Property Let cStep_EnabledFlag(ByVal Private Property Get cStep_OutputFile() As ' entered - since a worker step actually RHS As Boolean) String executes a step, entry ' of the text is mandatory mcStep.EnabledFlag = RHS cStep_OutputFile = mcStep.OutputFile Call StepTextOrFileEntered End Property End Property ' Call the Add method of the step class to carry out the insert Private Property Let Private Property Let cStep_ErrorFile(ByVal mcStep.Add cStep_ExecutionMechanism(ByVal RHS As RHS As String) ExecutionMethod) End Sub mcStep.ErrorFile = RHS On Error GoTo ExecutionMechanismErr Private Property Get mstrSource = mstrModuleName & End Property cStep_ContinuationCriteria() As "c Step_ExecutionMechanism" ContinuationCriteria Private Property Get cStep_ErrorFile() As Select Case RHS String cStep_ContinuationCriteria = Case gintExecuteShell, gintExecuteODBC mcStep.ContinuationCriteria mcStep.ExecutionMechanism = RHS cStep_ErrorFile = mcStep.ErrorFile End Property Case Else HP TPC-H FULL DISCLOSURE REPORT 405 © 2005 Hewlett-Packard Company. All rights reserved. On Error GoTo 0 ' Call the Modify method of the step class to Err.Raise vbObjectError + carry out the update End Property errExecutionMechanismInvalid, _ mcStep.Modify mstrSource, LoadResString(errExecutionMechanismInva End Sub Private Property Let cStep_StepLevel(ByVal RHS lid) As Integer) End Select Private Property Let cStep_ParentStepId(ByVal RHS As Long) mcStep.StepLevel = RHS Exit Property mcStep.ParentStepId = RHS End Property ExecutionMechanismErr: LogErrors Errors End Property Private Property Get cStep_StepLevel() As Integer mstrSource = mstrModuleName & "c Step_ExecutionMechanism" Private Property Get cStep_ParentStepId() As cStep_StepLevel = mcStep.StepLevel On Error GoTo 0 Long Err.Raise vbObjectError + End Property errExecutionMechanismLetFailed, _ cStep_ParentStepId = mcStep.ParentStepId mstrSource, Private Property Let cStep_StepText(ByVal RHS LoadResString(errExecutionMechanismLet End Property As String) Failed) Private Property Let mcStep.StepText = RHS End Property cStep_ParentVersionNo(ByVal RHS As String) End Property Private Property Get cStep_ExecutionMechanism() As mcStep.ParentVersionNo = RHS Private Property Get cStep_StepText() As String ExecutionMethod End Property cStep_StepText = mcStep.StepText cStep_ExecutionMechanism = mcStep.ExecutionMechanism Private Property Get cStep_ParentVersionNo() End Property As String End Property Private Property Let cStep_StepTextFile(ByVal cStep_ParentVersionNo = RHS As String) Private Property Let mcStep.ParentVersionNo cStep_FailureDetails(ByVal RHS As String) mcStep.StepTextFile = RHS End Property mcStep.FailureDetails = RHS End Property Private Property Let End Property cStep_SequenceNo(ByVal RHS As Integer) Private Property Get cStep_StepTextFile() As String Private Property Get cStep_FailureDetails() mcStep.SequenceNo = RHS As String cStep_StepTextFile = mcStep.StepTextFile End Property cStep_FailureDetails = End Property mcStep.FailureDetails Private Property Get cStep_SequenceNo() As Integer Private Property Let cStep_StepType(RHS As End Property gintStepType) cStep_SequenceNo = mcStep.SequenceNo Private Property Get cStep_GlobalFlag() As mcStep.StepType = gintWorkerStep Boolean End Property End Property cStep_GlobalFlag = mcStep.GlobalFlag Private Property Let cStep_StepId(ByVal RHS As Long) Private Property Get cStep_StepType() As End Property gintStepType mcStep.StepId = RHS Private Property Let cStep_StepType = mcStep.StepType cStep_GlobalFlag(ByVal RHS As Boolean) End Property End Property ' Set the global flag to false - this flag is Private Property Get cStep_StepId() As Long initialized when Private Sub cStep_Validate() ' an instance of the class is created. Just cStep_StepId = mcStep.StepId ' The validate routines for each of the steps will making sure that ' carry out the specific validations for the type ' nobody changes the value inadvertently End Property and mcStep.GlobalFlag = False ' call the generic validation routine

End Property Private Property Let cStep_StepLabel(ByVal On Error GoTo cStep_ValidateErr Private Sub cStep_Modify() RHS As String) ' Validations specific to worker steps ' Call a private procedure to see if the step mcStep.StepLabel = RHS text has been ' Check if the step text or a file name has been ' entered - since a worker step actually End Property ' specified executes a step, entry Call StepTextOrFileEntered ' of the text is mandatory Private Property Get cStep_StepLabel() As Call StepTextOrFileEntered String mcStep.Validate

cStep_StepLabel = mcStep.StepLabel Exit Sub HP TPC-H FULL DISCLOSURE REPORT 406 © 2005 Hewlett-Packard Company. All rights reserved. Private mstrSource As String Dim qy As DAO.QueryDef cStep_ValidateErr: Private Const mstrModuleName As String = LogErrors Errors "c Workspace." On Error GoTo WorkspaceNameDuplicateErr mstrSource = mstrModuleName & mstrSource = mstrModuleName & "c Step_Validate" ' The cSequence class is used to generate "WorkspaceNameDuplicate" On Error GoTo 0 unique workspace identifiers Err.Raise vbObjectError + Private mWorkspaceSeq As cSequence ' Create a recordset to retrieve the count of errValidateFailed, _ records mstrSource, _ ' The StringSM class is used to carry out string ' having the same workspace name LoadResString(errValidateFailed) operations strSql = " Select count(*) as workspace_count " End Sub Private mFieldValue As cStringSM & _ " from att_workspaces " & _ Private Property Let Public Function Clone() As cWorkspace " where workspace_name = [w_name] " & _ cStep_VersionNo(ByVal RHS As String) " and workspace_id <> [w_id] " ' Creates a copy of a given workspace Set qy = mcStep.VersionNo = RHS mdbsStepMaster.CreateQueryDef(gstrEmptyString, Dim cCloneWsp As cWorkspace strSql) End Property On Error GoTo CloneErr ' Call a procedure to assign the parameter values Private Property Get cStep_VersionNo() As Call AssignParameters(qy) String Set cCloneWsp = New cWorkspace Set rstWorkspace = cStep_VersionNo = mcStep.VersionNo ' Copy all the workspace properties to the qy.OpenRecordset(dbOpenForwardOnly) newly End Property ' created workspace ' mFieldValue.MakeStringFieldValid cCloneWsp.WorkspaceId = (mstrWorkspaceName) & _ Private Property Let mlngWorkspaceId ' " and workspace_id <> " & _ cStep_WorkspaceId(ByVal RHS As Long) cCloneWsp.WorkspaceName = ' Str(mlngWorkspaceId) mstrWorkspaceName ' mcStep.WorkspaceId = RHS cCloneWsp.ArchivedFlag = ' Set rstWorkspace = mblnArchivedFlag mdbsStepMaster.OpenRecordset( _ End Property ' strSQL, dbOpenForwardOnly) ' And set the return value to the newly Private Property Get cStep_WorkspaceId() created workspace If rstWorkspace![workspace_count] > 0 Then As Long Set Clone = cCloneWsp rstWorkspace.Close qy.Close cStep_WorkspaceId = Exit Function ShowError errDuplicateWorkspaceName mcStep.WorkspaceId On Error GoTo 0 CloneErr: Err.Raise vbObjectError + End Property LogErrors Errors errDuplicateWorkspaceName, _ VERSION 1.0 CLASS mstrSource = mstrModuleName & "Clone" mstrSource, BEGIN On Error GoTo 0 LoadResString(errDuplicateWorkspaceName) MultiUse = -1 'True Err.Raise vbObjectError + errCloneFailed, _ End If END mstrSource, rstWorkspace.Close Attribute VB_Name = "cWorkspace" LoadResString(errCloneFailed) qy.Close Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True End Function Exit Sub Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Public Property Let ArchivedFlag(ByVal vdata WorkspaceNameDuplicateErr: ' FILE: cWorkspace.cls As Boolean) Call LogErrors(Errors) ' Microsoft TPC-H Kit Ver. 1.00 mstrSource = mstrModuleName & ' Copyright Microsoft, 1999 mblnArchivedFlag = vdata "WorkspaceNameDuplicate" ' All Rights Reserved On Error GoTo 0 ' End Property Err.Raise vbObjectError + ' errWorkspaceNameDuplicateFailed, _ ' PURPOSE: Encapsulates the properties Public Property Get ArchivedFlag() As mstrSource, and methods of a workspace. Boolean LoadResString(errWorkspaceNameDuplicateFailed ' Contains functions to insert, ) update and delete ArchivedFlag = mblnArchivedFlag ' att_workspaces records from the End Sub database. End Property Public Property Let WorkspaceName(vdata As ' Contact: Reshma Tharamal String) ([email protected]) Public Property Set WorkDatabase(vdata As ' Database) On Error GoTo WorkspaceNameErr Option Explicit mstrSource = mstrModuleName & Set mdbsStepMaster = vdata "WorkspaceName" ' Local variable(s) to hold property value(s) Private mlngWorkspaceId As Long End Property If vdata = gstrEmptyString Then Private mstrWorkspaceName As String Private mblnArchivedFlag As Boolean Private Sub WorkspaceNameDuplicate() On Error GoTo 0 Private mdbsStepMaster As Database ' Check if the workspace name already exists ' Propogate this error back to the caller in the workspace Err.Raise vbObjectError + ' Used to indicate the source module name errWorkspaceNameMandatory, _ when errors Dim rstWorkspace As Recordset mstrSource, ' are raised by this class Dim strSql As String LoadResString(errWorkspaceNameMandatory) HP TPC-H FULL DISCLOSURE REPORT 407 © 2005 Hewlett-Packard Company. All rights reserved. Else mblnArchivedFlag = False mstrWorkspaceName = vdata Case "[archived]" End If ' Create a temporary querydef object prmParam.Value = mblnArchivedFlag Exit Property strInsert = "insert into att_workspaces " & _ "( workspace_id, workspace_name, " & Case Else WorkspaceNameErr: _ ' Write the parameter name that is faulty LogErrors Errors " archived_flag ) " & _ WriteError errInvalidParameter, mstrSource = mstrModuleName & " values ( [w_id], [w_name], [archived] mstrSource, _ "WorkspaceName" ) " prmParam.Name On Error GoTo 0 Set qy = On Error GoTo 0 Err.Raise vbObjectError + mdbsStepMaster.CreateQueryDef(gstrEmptySt Err.Raise errInvalidParameter, errWorkspaceNameSetFailed, _ ring, strInsert) mstrSource, _ mstrSource, LoadResString(errInvalidParameter) LoadResString(errWorkspaceNameSetFaile ' Call a procedure to assign the parameter End Select d) values Next prmParam Call AssignParameters(qy) End Property Exit Sub qy.Execute dbFailOnError Public Property Let WorkspaceId(vdata As qy.Close AssignParametersErr: Long) ' strInsert = "insert into att_workspaces " & _ mstrSource = mstrModuleName & On Error GoTo WorkspaceIdErr ' "( workspace_id, workspace_name, " "AssignParameters" mstrSource = mstrModuleName & & _ Call LogErrors(Errors) "WorkspaceId" ' " archived_flag ) " & _ On Error GoTo 0 ' " values ( " & _ Err.Raise vbObjectError + If (vdata > 0) Then ' Str(mlngWorkspaceId) & _ errAssignParametersFailed, _ mlngWorkspaceId = vdata ' ", " & mstrSource, Else mFieldValue.MakeStringFieldValid(mstrWork LoadResString(errAssignParametersFailed) ' Propogate this error back to the caller spaceName) & _ On Error GoTo 0 ' ", " & Str(mblnArchivedFlag) & _ End Sub Err.Raise vbObjectError + ' " ) " Public Sub DeleteWorkspace() errWorkspaceIdInvalid, _ ' mdbsStepMaster.Execute strInsert, mstrSource, dbFailOnError Dim strDelete As String LoadResString(errWorkspaceIdInvalid) ' Dim qy As DAO.QueryDef End If Exit Sub On Error GoTo DeleteWorkspaceErr Exit Property AddWorkspaceErr: strDelete = "delete from att_workspaces " & _ WorkspaceIdErr: Call LogErrors(Errors) " where workspace_id = [w_id]" LogErrors Errors mstrSource = mstrModuleName & Set qy = mstrSource = mstrModuleName & "AddWorkspace" mdbsStepMaster.CreateQueryDef(gstrEmptyString, "WorkspaceId" On Error GoTo 0 strDelete) On Error GoTo 0 Err.Raise vbObjectError + Err.Raise vbObjectError + errWorkspaceInsertFailed, _ ' Call a procedure to assign the parameter values errWorkspaceIdSetFailed, _ mstrSource, Call AssignParameters(qy) mstrSource, LoadResString(errWorkspaceInsertFailed) LoadResString(errWorkspaceIdSetFailed) qy.Execute dbFailOnError End Sub qy.Close End Property Private Sub AssignParameters(qyExec As DAO.QueryDef) ' mdbsStepMaster.Execute strDelete, Public Sub AddWorkspace() ' Assigns values to the parameters in the dbFailOnError querydef object ' " where workspace_id = " & _ Dim strInsert As String ' The parameter names are cryptic to make ' Str(mlngWorkspaceId) Dim qy As DAO.QueryDef them different ' from the field names. When the parameter Exit Sub On Error GoTo AddWorkspaceErr names are ' the same as the field names, parameters in DeleteWorkspaceErr: ' Retrieve the next identifier using the the where Call LogErrors(Errors) sequence class ' clause do not get created. mstrSource = mstrModuleName & Set mWorkspaceSeq = New cSequence "DeleteWorkspace" Set mWorkspaceSeq.IdDatabase = Dim prmParam As DAO.Parameter On Error GoTo 0 mdbsStepMaster Err.Raise vbObjectError + mWorkspaceSeq.IdentifierColumn = On Error GoTo AssignParametersErr errWorkspaceDeleteFailed, _ FLD_ID_WORKSPACE mstrSource = mstrModuleName & mstrSource, mlngWorkspaceId = "AssignParameters" LoadResString(errWorkspaceDeleteFailed) mWorkspaceSeq.Identifier End Sub Set mWorkspaceSeq = Nothing For Each prmParam In qyExec.Parameters Select Case prmParam.Name Public Sub ModifyWorkspace() ' Call procedure to raise an error if the Case "[w_id]" Workspace name prmParam.Value = Dim strUpdate As String ' already exists in the db mlngWorkspaceId Dim qy As DAO.QueryDef Call WorkspaceNameDuplicate Case "[w_name]" On Error GoTo ModifyWorkspaceErr ' A new record will have the prmParam.Value = archived_flag turned off mstrWorkspaceName HP TPC-H FULL DISCLOSURE REPORT 408 © 2005 Hewlett-Packard Company. All rights reserved. ' Call procedure to raise an error if the Set mdbsStepMaster = Nothing Public Const DEF_QUERY_TIME_OUT As Workspace name Set mFieldValue = Nothing Long = 0 ' already exists in the db Public Const DEF_SERVER_LANGUAGE Call WorkspaceNameDuplicate End Sub As String = "(Default)" Attribute VB_Name = "DatabaseSM" Public Const strUpdate = "update att_workspaces " & _ ' FILE: DatabaseSM.bas DEF_CHARACTER_TRANSLATION As " set workspace_name = [w_name] " & ' Microsoft TPC-H Kit Ver. 1.00 Boolean = True _ ' Copyright Microsoft, 1999 Public Const DEF_REGIONAL_SETTINGS ", archived_flag = [archived] " & _ ' All Rights Reserved As Boolean = False " where workspace_id = [w_id] " ' Set qy = ' Public Const PARAM_DEFAULT_DIR As mdbsStepMaster.CreateQueryDef(gstrEmpt ' PURPOSE: Contains all the database String = "DEFAULT_DIR" yString, strUpdate) initialization/cleanup Public Const PARAM_DEFAULT_DIR_DESC ' procedures for the project. Also As String = "Default destination directory " & _ ' Call a procedure to assign the parameter contains upgrade "f or all output and error files. If it is values ' database upgrade functions. blank, the StepMaster installation directory will be Call AssignParameters(qy) ' Contact: Reshma Tharamal used." ([email protected]) qy.Execute dbFailOnError ' Public Const PARAM_RUN_ID As qy.Close ' This module is called DatabaseSM, since String = "RUN_ID" Database is a standard Public Const PARAM_RUN_ID_DESC As ' strUpdate = "update att_workspaces " & ' Visual Basic object and we want to avoid any String = "The run identifier for a run. " & _ _ confusion with it. "Any modifications will be overwritten ' " set workspace_name = " & _ before each run." ' Option Explicit mFieldValue.MakeStringFieldValid(mstrW Public Const PARAM_OUTPUT_DIR As orkspaceName) & _ Public wrkJet As Workspace String = "OUTPUT_DIR" ' ", archived_flag = " & _ Public dbsAttTool As Database Public Const PARAM_OUTPUT_DIR_DESC ' Str(mblnArchivedFlag) & _ Public gblnDbOpen As Boolean As String = "The output directory for a run. " & _ ' " where workspace_id = " & _ Public gRunEngine As rdoEngine "Any modifications will be overwritten ' Str(mlngWorkspaceId) before each run." ' ' Used to indicate the source module name ' mdbsStepMaster.Execute strUpdate, when errors Public Const dbFailOnError ' are raised by this module CONNECTION_STRINGS_TO_NAME_SUFFIX ' Private Const mstrModuleName As String = As String = "_NAME" Exit Sub "DatabaseSM." Public Const gsDefDBFileExt As String = Private Const TBL_RUN_STEP_HDR As String = ModifyWorkspaceErr: ".stp" "r un_header" Private Const msDefDBFile As String = Private Const TBL_RUN_STEP_DTLS As String = Call LogErrors(Errors) "\SMData" & gsDefDBFileExt "r un_step_details" mstrSource = mstrModuleName & Public Const TBL_CONNECTION_DTLS As "ModifyWorkspace" Private Const merrFileNotFound As Integer = String = "connection_dtls" On Error GoTo 0 3024 Public Const TBL_CONNECTION_STRINGS As Err.Raise vbObjectError + Private Const merrDaoTableMissing As String = "workspace_connections" errWorkspaceUpdateFailed, _ Integer = 3078 Public Const TBL_STEPS As String = "att_steps" mstrSource, LoadResString(errWorkspaceUpdateFailed) Private Const Public Const FLD_ID_CONN_NAME As String = STEPMASTER_SETTINGS_VAL_NAME_D "c onnection_name_id" End Sub BFILE As String = "WorkspaceFile" Public Const FLD_ID_WORKSPACE As String = Public Property Get WorkspaceName() As "workspace_id" String Public Const DEF_NO_COUNT_DISPLAY Public Const FLD_ID_STEP As String = "step_id" As Boolean = False Public Const FLD_ID_PARAMETER As String = WorkspaceName = mstrWorkspaceName Public Const DEF_NO_EXECUTE "parameter_id" As Boolean = False End Property Public Const DEF_PARSE_QUERY_ONLY Public Const As Boolean = False FLD_CONN_DTL_CONNECTION_NAME As Public Property Get WorkspaceId() As Long Public Const String = "connection_name" DEF_ANSI_QUOTED_IDENTIFIERS As Public Const WorkspaceId = mlngWorkspaceId Boolean = False FLD_CONN_DTL_CONNECTION_STRING As Public Const DEF_ANSI_NULLS As String = "connection_string_name" End Property Boolean = True Public Const Public Const DEF_SHOW_QUERY_PLAN FLD_CONN_DTL_CONNECTION_TYPE As Private Sub Class_Initialize() As Boolean = False String = "connection_type" Public Const DEF_SHOW_STATS_TIME ' Each function will append it's own name As Boolean = False Public Const to this Public Const DEF_SHOW_STATS_IO FLD_CONN_STR_CONNECTION_NAME As ' variable As Boolean = False String = "connection_name" mstrSource = "cWorkspace." Public Const DEF_PARSE_ODBC_MSG_PREFIXES As Public Const FLD_STEPS_EXEC_MECHANISM Set mFieldValue = New cStringSM Boolean = True As String = "execution_mechanism" Public Const DEF_ROW_COUNT Public Const FLD_STEPS_EXEC_DTL As String End Sub As Long = 0 = "start_directory" Public Const Public Const FLD_STEPS_VERSION_NO As Private Sub Class_Terminate() DEF_TSQL_BATCH_SEPARATOR As String = "version_no" String = "GO" HP TPC-H FULL DISCLOSURE REPORT 409 © 2005 Hewlett-Packard Company. All rights reserved. Public Const DATA_TYPE_CURRENCY ElseIf sVerTo = gsVersion242 And sVerFrom = As String = "CURRENCY" cTempStr.MakeStringFieldValid(sParamName gsVersion24 Then Public Const DATA_TYPE_LONG As ) & ", " & _ NoDbChanges = True String = "Long" ElseIf sVerTo = gsVersion253 And sVerFrom = Public Const DATA_TYPE_INTEGER As cTempStr.MakeStringFieldValid(sParamValue gsVersion251 Then String = "INTEGER" ) & ", " & _ NoDbChanges = True Public Const DATA_TYPE_TEXT255 As ElseIf sVerTo = gsVersion255 And sVerFrom = String = "Text(255)" cTempStr.MakeStringFieldValid(sParamDesc) gsVersion251 Then & ", " & _ NoDbChanges = True Private Sub InsertBuiltInParameter(dbFile CStr(gintParameterBuiltIn) & _ Else As Database, sParamName As String, _ " ) " NoDbChanges = False sParamValue As String, sParamDesc End If End If As String) dbFile.Execute sBuf, dbFailOnError rParam.Close End Function Dim sBuf As String Dim cTempStr As New cStringSM rTemp.MoveNext Public Function SMOpenDatabase(Optional Dim lId As Long Wend strDbName As String = gstrEmptyString) As Dim rTemp As DAO.Recordset End If Boolean Dim rParam As DAO.Recordset rTemp.Close Dim sVersion As String Dim cTempSeq As cSequence Dim bOpeningDb As Boolean ' This flag is used End Sub to check if OpenDatabase failed ' Create the passed in built-in parameter, Public Sub InitRunEngine() for each workspace in the db On Error GoTo OpenDatabaseErr Set cTempSeq = New cSequence Set gRunEngine = New rdoEngine Set cTempSeq.IdDatabase = dbFile gRunEngine.rdoDefaultCursorDriver = bOpeningDb = False cTempSeq.IdentifierColumn = rdUseServer SMOpenDatabase = False FLD_ID_PARAMETER End Sub ' Create Microsoft Jet Workspace object. sBuf = "select * from att_workspaces " If Not gblnDbOpen Then Set rTemp = dbFile.OpenRecordset(sBuf, Public Function DefaultDBFile() As String Set wrkJet = dbOpenSnapshot) DefaultDBFile = GetSetting(App.Title, CreateWorkspace("att_tool_workspace_setup", If rTemp.RecordCount <> 0 Then "Settings", "admin", gstrEmptyString, dbUseJet) rTemp.MoveFirst STEPMASTER_SETTINGS_VAL_NAME_D End If BFILE, App.Path & msDefDBFile) While Not rTemp.EOF End Function ' Prompt the user for the database file if it is not sBuf = "select * from passed in workspace_parameters " & _ Public Sub CloseDatabase() If StringEmpty(strDbName) Then " where workspace_id = " & strDbName = BrowseDBFile Str(rTemp!workspace_id) & _ Dim dbsInstance As Database If StringEmpty(strDbName) Then " and parameter_name = " & Dim recInstance As Recordset Exit Function cTempStr.MakeStringFieldValid(sParamNa End If me) On Error GoTo CloseDatabaseErr End If Set rParam = dbFile.OpenRecordset(sBuf, ' Close all open recordsets and databases in Do dbOpenSnapshot) the workspace If gblnDbOpen Then If rParam.RecordCount <> 0 Then For Each dbsInstance In wrkJet.Databases #If Not RUN_ONLY Then rParam.MoveFirst CloseOpenWorkspaces ' Since the parameter already For Each recInstance In #End If exists, change it to a built-in type dbsAttTool.Recordsets Set wrkJet = sBuf = "update recInstance.Close CreateWorkspace("att_tool_workspace_setup", workspace_parameters " & _ Next recInstance "admin", gstrEmptyString, dbUseJet) " set parameter_type = " & dbsInstance.Close End If CStr(gintParameterBuiltIn) & _ ", description = " & Next dbsInstance ' Toggle the bOpeningDb flag around the cTempStr.MakeStringFieldValid(sParamDe OpenDatabase method - the value sc) & _ Set dbsAttTool = Nothing ' of this flag will be checked by the error " where workspace_id = " & handler to determine if it is Str(rTemp!workspace_id) & _ gblnDbOpen = False ' the OpenDatabase that failed. " and parameter_id = " & wrkJet.Close BugMessage "DB File: " & strDbName Str(rParam!parameter_id) Else Exit Sub bOpeningDb = True ' Else, insert a parameter record ' Open the database for exclusive use lId = cTempSeq.Identifier CloseDatabaseErr: Set dbsAttTool = sBuf = "insert into wrkJet.OpenDatabase(strDbName, Options:=True) workspace_parameters " & _ Call LogErrors(Errors) bOpeningDb = False "( workspace_id, Resume Next parameter_id, " & _ If dbsAttTool Is Nothing Then " parameter_name, End Sub ' If the file is not present in the directory, parameter_value, " & _ display " description, parameter_type Private Function NoDbChanges(sVerTo As ' an error and ask the user to enter a new ) "& _ String, sVerFrom As String) As Boolean path " values ( " & _ Call ShowError(errOpenDbFailed, Str(rTemp!workspace_id) & If sVerTo = gsVersion242 And sVerFrom = OptArgs:=strDbName) ", " & Str(lId) & ", " & _ gsVersion241 Then NoDbChanges = True strDbName = BrowseDBFile HP TPC-H FULL DISCLOSURE REPORT 410 © 2005 Hewlett-Packard Company. All rights reserved. Else Dim qyTemp As DAO.QueryDef Err.Raise vbObjectError + errModifyStepFailed, sVersion = DBVersion(dbsAttTool) Dim sBuf As String mstrModuleName, _ LoadResString(errModifyStepFailed) ' Make sure the application and db On Error GoTo version numbers match UpdateContinuationCriteriaErr End Sub If sVersion = gsVersion Then Call InitializeData(strDbName) sBuf = "Since this version of the executable Private Sub UpdateDbDtls(dbFile As Database, gblnDbOpen = True incorporates failure processing, " & _ sNewVersion As String) SMOpenDatabase = True "the upgrade will update the On Failure Else field for each of the steps " & _ Dim sSql As String If UpgradeDb(wrkJet, dbsAttTool, "t o 'Continue' to be compatible with the Dim cTemp As New cStringSM gsVersion, sVersion) Then existing behaviour. " & _ Call InitializeData(strDbName) "P roceed?" On Error GoTo UpdateDbDtlsErr gblnDbOpen = True If Not Confirm(Buttons:=vbYesNo, SMOpenDatabase = True strMessage:=sBuf, strTitle:="Upgrade sSql = "update db_details "& _ Else database") Then " set db_version = " & dbsAttTool.Close Exit Sub cTemp.MakeStringFieldValid(sNewVersion) Set dbsAttTool = Nothing End If dbFile.Execute sSql, dbFailOnError ShowError ' Create a recordset object to retrieve all errVersionMismatch, _ steps for Exit Sub OptArgs:=" Please install ' the given workspace Version '" & gsVersion & "' of the sBuf = " update att_steps a " & _ UpdateDbDtlsErr: workspace definition file." " set continuation_criteria = " & Call LogErrors(Errors) strDbName = BrowseDBFile CStr(gintOnFailureContinue) & _ Err.Raise vbObjectError + errUpgradeFailed, End If " where archived_flag = [archived] " mstrModuleName, _ End If LoadResString(errUpgradeFailed) End If ' Find the highest X-component of the Loop While gblnDbOpen = False And version number End Sub Not StringEmpty(strDbName) sBuf = sBuf & " AND cint( mid( version_no, 1, instr( version_no, " & gstrDQ & Private Sub Upgrade10to21(UpgradeWsp As Exit Function gstrVerSeparator & gstrDQ & " ) - 1 ) ) = "& DAO.Workspace, dbFile As Database, sVersion As _ String) OpenDatabaseErr: " ( select max( cint( mid( version_no, 1, Call DisplayErrors(Errors) instr( version_no, " & gstrDQ & Dim sSql As String gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ ' If the OpenDatabase failed, continue " from att_steps AS d " & _ On Error GoTo Upgrade10to21Err If bOpeningDb Then " WHERE a.step_id = d.step_id ) " Resume Next Call UpdateDbDtls(dbFile, sVersion) End If ' Find the highest Y-component of the version number for the highest X-component Call UpdateContinuationCriteria(dbFile) Call ShowError(errOpenDbFailed, sBuf = sBuf & " AND cint( mid( OptArgs:=strDbName) version_no, instr( version_no, " & gstrDQ & Exit Sub gstrVerSeparator & gstrDQ & " ) + 1 ) ) = " & End Function _ Upgrade10to21Err: Private Sub InitializeData(sDb As String) " ( select max( cint( mid( version_no, UpgradeWsp.Rollback instr( version_no, " & gstrDQ & Call LogErrors(Errors) Set gcParameters = New cArrParameters gstrVerSeparator & gstrDQ & " ) + 1 ) ) ) " & Err.Raise vbObjectError + errUpgradeFailed, Set gcParameters.ParamDatabase = _ mstrModuleName, _ dbsAttTool " from att_steps AS b " & _ LoadResString(errUpgradeFailed) " Where a.step_id = b.step_id " & _ Set gcSteps = New cArrSteps " AND cint( mid( version_no, 1, instr( End Sub Set gcSteps.StepDB = dbsAttTool version_no, " & gstrDQ & gstrVerSeparator & Private Sub Upgrade21to23(UpgradeWsp As gstrDQ & " ) - 1 ) ) = "& _ DAO.Workspace, dbFile As Database, sVersion As Set gcConstraints = New cArrConstraints " ( select max( cint( mid( version_no, 1, String) Set gcConstraints.ConstraintDB = instr( version_no, " & gstrDQ & dbsAttTool gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ Dim sBuf As String " from att_steps AS c " & _ Dim cTempStr As New cStringSM Set gcConnections = New cConnections " WHERE a.step_id = c.step_id ) ) " Set gcConnections.ConnDb = dbsAttTool On Error GoTo Upgrade21to23Err ' Create a temporary Querydef object Set gcConnDtls = New cConnDtls Set qyTemp = ' Add a parameter type field and a description Set gcConnDtls.ConnDb = dbsAttTool dbFile.CreateQueryDef(gstrEmptyString, field to the parameter table sBuf) sBuf = "alter table workspace_parameters " & _ ' Disable the error handler since this is not qyTemp.Parameters("archived").Value = " add column description TEXT(255) " a critical step False dbFile.Execute sBuf, dbFailOnError On Error GoTo 0 SaveSetting App.Title, "Settings", qyTemp.Execute dbFailOnError sBuf = "alter table workspace_parameters " & _ STEPMASTER_SETTINGS_VAL_NAME qyTemp.Close " add column parameter_type INTEGER " _DBFILE, sDb dbFile.Execute sBuf, dbFailOnError End Sub Exit Sub Private Sub ' Initialize the parameter type on all parameters to UpdateContinuationCriteria(dbFile As UpdateContinuationCriteriaErr: indicate generic parameters DAO.Database) Call LogErrors(Errors) sBuf = "update workspace_parameters " & _

HP TPC-H FULL DISCLOSURE REPORT 411 © 2005 Hewlett-Packard Company. All rights reserved. " set parameter_type = " & Str(DEF_ANSI_QUOTED_IDENTIFIERS) CStr(gintParameterGeneric) Upgrade21to23Err: & ", " & Str(DEF_ANSI_NULLS) & ", " & _ dbFile.Execute sBuf, dbFailOnError UpgradeWsp.Rollback Str(DEF_SHOW_QUERY_PLAN) & ", " & Call LogErrors(Errors) Str(DEF_SHOW_STATS_TIME) & ", " & _ sBuf = "Release 2.3 onwards, connection Err.Raise vbObjectError + Str(DEF_SHOW_STATS_IO) & ", " & string parameters will be " & _ errUpgradeFailed, mstrModuleName, _ Str(DEF_PARSE_ODBC_MSG_PREFIXES) & ", "displayed in a separate node. After LoadResString(errUpgradeFailed) " & _ this upgrade, all connection " & _ Str(DEF_ROW_COUNT) & ", " & "s tring parameters will appear under End Sub cTempStr.MakeStringFieldValid(DEF_TSQL_BAT the Globals/Connection Strings " & _ Private Sub Upgrade23to24(UpgradeWsp As CH_SEPARATOR) & ", " & _ "node in the workspace. " DAO.Workspace, dbFile As Database, Str(DEF_QUERY_TIME_OUT) & ", " & Call MsgBox(sBuf, vbOKOnly + sVersion As String) cTempStr.MakeStringFieldValid(DEF_SERVER_L vbApplicationModal, "Upgrade database") ANGUAGE) & ", " & _ Dim sBuf As String Str(DEF_CHARACTER_TRANSLATION) ' Update the parameter type on all Dim lId As Long & ", " & Str(DEF_REGIONAL_SETTINGS) & _ parameters that look like db connection Dim rTemp As DAO.Recordset " ) " strings Dim cTempStr As New cStringSM dbFile.Execute sBuf, dbFailOnError sBuf = "update workspace_parameters " & _ On Error GoTo Upgrade23to24Err lId = lId + 1 " set parameter_type = " & rTemp.MoveNext CStr(gintParameterConnect) & _ ' Add a new table for connection properties Wend " where UCase(parameter_value) sBuf = CreateConnectionsTableScript() End If like '*DRIVER*' " & _ ' TODO: Not sure of column sizes for row rTemp.Close " or UCase(parameter_value) like count, tsql_batch_separator and '*DSN*'" server_language ' Add an identifier column for the connection_id dbFile.Execute sBuf, dbFailOnError dbFile.Execute sBuf, dbFailOnError field sBuf = "alter table att_identifiers " & _ ' Add an elapsed time field to the ' Move all connection parameters from the " add column connection_id long " run_step_details table - this field is parameter table to the connections tables dbFile.Execute sBuf, dbFailOnError ' needed to store the elapsed time in ' Insert default values for the newly added milliseconds. connection properties ' Initialize the value of the connection identifier, sBuf = "alter table run_step_details " & _ sBuf = "select * from workspace_parameters initialized above " add column elapsed_time LONG " " & _ sBuf = "update att_identifiers " & _ dbFile.Execute sBuf, dbFailOnError "where parameter_type = " & " set connection_id = " & Str(lId) CStr(gintParameterConnect) dbFile.Execute sBuf, dbFailOnError ' The failure_details field has some data Set rTemp = dbFile.OpenRecordset(sBuf, for the case when an ODBC failure dbOpenSnapshot) ' Delete all connection strings from the parameter ' threshold was specified. Since that's no lId = 1 table longer relevant, update the failure_details If rTemp.RecordCount <> 0 Then sBuf = "delete from workspace_parameters " & _ ' field for records with failure_criteria = rTemp.MoveFirst "where parameter_type = " & gintFailureODBC to empty. CStr(gintParameterConnect) ' failure_criteria = gintFailureODBC = 1 While Not rTemp.EOF dbFile.Execute sBuf, dbFailOnError sBuf = "update att_steps " & _ sBuf = "insert into " set failure_details = " & workspace_connections " & _ ' Create the built-in parameter, default directory, cTempStr.MakeStringFieldValid(gstrEmpty "( workspace_id, connection_id, " & _ for each workspace in the db String) & _ "c onnection_name, connection_value, Call InsertBuiltInParameter(dbFile, " where failure_criteria = '1'" " & _ PARAM_DEFAULT_DIR, gstrEmptyString, dbFile.Execute sBuf, dbFailOnError "description, no_count_display, " & _ PARAM_DEFAULT_DIR_DESC) "no_execute, parse_query_only, " & _ Call UpdateDbDtls(dbFile, sVersion) "ANSI_quoted_identifiers, Call UpdateDbDtls(dbFile, sVersion) ANSI_nulls, " & _ UpgradeWsp.CommitTrans "s how_query_plan, show_stats_time, " Exit Sub & _ On Error GoTo DropColumnErr "s how_stats_io, Upgrade23to24Err: parse_odbc_msg_prefixes, " & _ UpgradeWsp.Rollback UpgradeWsp.BeginTrans "row_count, tsql_batch_separator, " & Call LogErrors(Errors) _ Err.Raise vbObjectError + errUpgradeFailed, ' This ddl cannot be in the same "query_time_out, server_language, " & mstrModuleName, _ transaction as the failure_details update _ LoadResString(errUpgradeFailed) ' But we can do this in a separate "c haracter_translation, transaction since we do not expect this regional_settings ) " & _ End Sub ' statement to fail - AND, it doesn't matter " values ( " & _ Private Sub Upgrade243to25(UpgradeWsp As if this transaction fails Str(rTemp!workspace_id) & ", " & DAO.Workspace, dbFile As Database, sVersion As ' Drop the failure_criteria column from Str(lId) & ", " & _ String) the att_steps table cTempStr.MakeStringFieldValid("" & sBuf = "alter table att_steps " & _ rTemp!parameter_name) & ", " & _ Dim sBuf As String " drop column failure_criteria " cTempStr.MakeStringFieldValid("" & Dim qy As DAO.QueryDef dbFile.Execute sBuf, dbFailOnError rTemp!parameter_value) & ", " & _ Dim rTemp As DAO.Recordset cTempStr.MakeStringFieldValid("" & Dim lId As Long Exit Sub rTemp!Description) & ", " & _ Dim cTempStr As New cStringSM Str(DEF_NO_COUNT_DISPLAY) & DropColumnErr: ", " & _ On Error GoTo Upgrade243to25Err Call LogErrors(Errors) Str(DEF_NO_EXECUTE) & ", " & ShowError errDeleteColumnFailed Str(DEF_PARSE_QUERY_ONLY) & ", " & _ sBuf = "Release " & gsVersion25 & " onwards, Exit Sub new 'Connections' must be created for all " & _ HP TPC-H FULL DISCLOSURE REPORT 412 © 2005 Hewlett-Packard Company. All rights reserved. "c onnection strings. " & vbCrLf & If rTemp.RecordCount <> 0 Then vbCrLf & _ rTemp.MoveFirst qy.Execute dbFailOnError "Connections will appear under the End If Globals/Connections " & _ While Not rTemp.EOF End If "node in the workspace. " & vbCrLf qy.Parameters("w_id").Value = rTemp.MoveNext & _ rTemp.Fields(FLD_ID_WORKSPACE) Wend "A list of all 'Connections' (instead qy.Parameters("c_id").Value = lId End If of 'Connection Strings') " & _ qy.Parameters("c_name").Value = "i n the workspace will be displayed rTemp.Fields(FLD_CONN_STR_CONNECTI qy.Close in the 'Connections' field for " & _ ON_NAME) & rTemp.Close "ODBC steps on the Step definition CONNECTION_STRINGS_TO_NAME_SUF screen. " & vbCrLf & vbCrLf & _ FIX Exit Sub "Each Connection can be marked as qy.Parameters("c_str").Value = static or dynamic. " & vbCrLf & _ rTemp.Fields(FLD_CONN_STR_CONNECTI Upgrade243to25Err: "Dynamic connections will be ON_NAME) UpgradeWsp.Rollback created when a step starts execution and " & qy.Parameters("c_type").Value = Call LogErrors(Errors) _ ConnTypeDynamic Err.Raise vbObjectError + errUpgradeFailed, "c losed once the step completes. " & mstrModuleName, _ vbCrLf & _ qy.Execute dbFailOnError LoadResString(errUpgradeFailed) "Static connections will be kept open till the run completes." & vbCrLf & vbCrLf lId = lId + 1 End Sub & _ rTemp.MoveNext Private Sub Upgrade25to251(UpgradeWsp As "Currently dynamic 'Connections' Wend DAO.Workspace, dbFile As Database, sVersion As have been created for all existing End If String) 'Connection Strings' " & _ qy.Close "with the suffix "& rTemp.Close On Error GoTo Upgrade25to251Err CONNECTION_STRINGS_TO_NAME_S UFFIX ' Initialize the value of the ' Create the built-in parameters, run_id and Call MsgBox(sBuf, vbOKOnly + connection_name_id output_dir, for each workspace in the db vbApplicationModal, "Upgrade database") sBuf = "update att_identifiers " & _ Call InsertBuiltInParameter(dbFile, " set " & FLD_ID_CONN_NAME & " PARAM_RUN_ID, gstrEmptyString, ' Add a new table for the connection name = " & Str(lId) PARAM_RUN_ID_DESC) entity dbFile.Execute sBuf, dbFailOnError Call InsertBuiltInParameter(dbFile, ' This table has been added in order to PARAM_OUTPUT_DIR, gstrEmptyString, satisfy the TPC-H requirement that ' Update the start_directory field in att_steps PARAM_OUTPUT_DIR_DESC) ' all the queries in a stream need to be to point to the newly executed on a single connection. ' created connections Call UpdateDbDtls(dbFile, sVersion) sBuf = Call ReadStepsInWorkspace(rTemp, qy, CreateConnectionDtlsTableScript() glInvalidId, dbLoad:=dbFile, _ Exit Sub dbFile.Execute sBuf, dbFailOnError bSelectArchivedRecords:=False) Upgrade25to251Err: ' Add an identifier column for the sBuf = "update " & TBL_STEPS & _ UpgradeWsp.Rollback connection_name_id field " set " & FLD_STEPS_EXEC_DTL & " = Call LogErrors(Errors) sBuf = "alter table att_identifiers " & _ [c_name] " & _ Err.Raise vbObjectError + errUpgradeFailed, " add column " & " where " & FLD_ID_STEP & " = [s_id] " mstrModuleName, _ FLD_ID_CONN_NAME & " long " & _ LoadResString(errUpgradeFailed) dbFile.Execute sBuf, dbFailOnError " and " & FLD_STEPS_VERSION_NO & " = [ver_no] " End Sub Call UpdateDbDtls(dbFile, sVersion) Set qy = dbFile.CreateQueryDef("", sBuf) Private Sub Upgrade242to243(UpgradeWsp As ' insert connection_dtl records for each of If rTemp.RecordCount <> 0 Then DAO.Workspace, dbFile As Database, sVersion As the connection strings rTemp.MoveFirst String) sBuf = "select * from "& TBL_CONNECTION_STRINGS While Not rTemp.EOF Dim sBuf As String Set rTemp = dbFile.OpenRecordset(sBuf, If Dim cTempStr As New cStringSM dbOpenSnapshot) rTemp.Fields(FLD_STEPS_EXEC_MECHAN Dim iResponse As Integer ISM).Value = gintExecuteODBC Then sBuf = "insert into " & If Not (StringEmpty("" & On Error GoTo DeleteHistoryErr TBL_CONNECTION_DTLS & _ rTemp.Fields(FLD_STEPS_EXEC_DTL))) "( " & FLD_ID_WORKSPACE & _ Then Call DeleteRunHistory(dbFile) ", " & FLD_ID_CONN_NAME & _ sBuf = ", " & rTemp.Fields(FLD_STEPS_EXEC_DTL) On Error GoTo Upgrade242to243Err FLD_CONN_DTL_CONNECTION_NAM ' Strip the enclosing "%" E & _ characters UpgradeWsp.CommitTrans ", " & sBuf = Mid(sBuf, 2, Len(sBuf) - FLD_CONN_DTL_CONNECTION_STRI 2) & UpgradeWsp.BeginTrans NG & _ CONNECTION_STRINGS_TO_NAME_SUF ", " & FIX ' Add a parameter type field and a description FLD_CONN_DTL_CONNECTION_TYPE field to the parameter table & " ) " & _ qy.Parameters("c_name").Value = sBuf = "alter table run_step_details " & _ " values ( [w_id], [c_id], [c_name], sBuf " add column parent_instance_id LONG " [c_str], [c_type] ) " qy.Parameters("s_id").Value = Set qy = dbFile.CreateQueryDef("", sBuf) rTemp.Fields(FLD_ID_STEP) dbFile.Execute sBuf, dbFailOnError qy.Parameters("ver_no").Value = lId = glMinId rTemp.Fields(FLD_STEPS_VERSION_NO) sBuf = "alter table run_step_details " & _ HP TPC-H FULL DISCLOSURE REPORT 413 © 2005 Hewlett-Packard Company. All rights reserved. " add column iterator_value qdf.SQL = "ALTER TABLE [" & TblName Select Case sVerFrom TEXT(255) " & "] DROP COLUMN [" & FieldName & "]" Case gsVersion25 qdf.Execute Call Upgrade25to251(UpgradeWsp, dbFile, dbFile.Execute sBuf, dbFailOnError gsVersion251) ' Rename the temporary field to the old Call AlterFieldType(dbFile, field's name. Case gsVersion243 TBL_RUN_STEP_DTLS, "start_time", dbFile.TableDefs("[" & TblName & Call Upgrade243to25(UpgradeWsp, dbFile, DATA_TYPE_CURRENCY) "]").Fields("AlterTempField").Name = gsVersion25) Call AlterFieldType(dbFile, FieldName Call Upgrade25to251(UpgradeWsp, dbFile, TBL_RUN_STEP_DTLS, "end_time", dbFile.TableDefs.Refresh gsVersion251) DATA_TYPE_CURRENCY) Call AlterFieldType(dbFile, ' Clean up. Case gsVersion24, gsVersion241, TBL_RUN_STEP_HDR, "start_time", End Sub gsVersion242 DATA_TYPE_CURRENCY) Private Sub Upgrade01to21(UpgradeWsp As sMsg = "After this upgrade, the run history Call AlterFieldType(dbFile, DAO.Workspace, dbFile As DAO.Database, for previous runs will no longer be available. " & _ TBL_RUN_STEP_HDR, "end_time", sVersion As String) "Continue?" DATA_TYPE_CURRENCY) Dim sSql As String If Not Confirm(Buttons:=vbYesNo, strMessage:=sMsg, strTitle:="Upgrade database") Call UpdateDbDtls(dbFile, sVersion) On Error GoTo Upgrade01to21Err Then UpgradeWsp.CommitTrans Exit Sub sSql = "Create table db_details (" & _ Exit Function "db_version Text(50) "& _ End If DeleteHistoryErr: ") ;" Call Upgrade242to243(UpgradeWsp, ' This is not a critical error - continue with dbFile, gsVersion243) upgrade dbFile.Execute sSql, dbFailOnError Call Upgrade243to25(UpgradeWsp, dbFile, Call LogErrors(Errors) gsVersion25) Resume Next sSql = "insert into db_details " & _ Call Upgrade25to251(UpgradeWsp, dbFile, "( db_version ) values ( '" & sVersion gsVersion251) Upgrade242to243Err: & "' ) " UpgradeWsp.Rollback Case gsVersion23 Call LogErrors(Errors) dbFile.Execute sSql, dbFailOnError Call Upgrade23to24(UpgradeWsp, dbFile, Err.Raise vbObjectError + gsVersion24) errUpgradeFailed, mstrModuleName, _ Call UpdateContinuationCriteria(dbFile) Call Upgrade242to243(UpgradeWsp, LoadResString(errUpgradeFailed) dbFile, gsVersion242) Exit Sub Call Upgrade243to25(UpgradeWsp, dbFile, End Sub gsVersion25) '*********************************** Upgrade01to21Err: Call Upgrade25to251(UpgradeWsp, dbFile, ****************************** Call LogErrors(Errors) gsVersion251) ' The AlterFieldType Sub procedure requires UpgradeWsp.Rollback three string Err.Raise vbObjectError + Case gsVersion21 ' parameters. The first string specifies the errUpgradeFailed, mstrModuleName, _ Call Upgrade21to23(UpgradeWsp, dbFile, name of the table LoadResString(errUpgradeFailed) gsVersion23) ' containing the field to be changed. The Call Upgrade23to24(UpgradeWsp, dbFile, second string specifies End Sub gsVersion24) ' the name of the field to be changed. The Private Function UpgradeDb(UpgradeWsp As Call Upgrade242to243(UpgradeWsp, third string specifies DAO.Workspace, dbFile As Database, _ dbFile, gsVersion242) ' the new data type for the field. sVerTo As String, sVerFrom As String) Call Upgrade243to25(UpgradeWsp, dbFile, '*********************************** As Boolean gsVersion25) ****************************** Call Upgrade25to251(UpgradeWsp, dbFile, Dim sMsg As String gsVersion251) Private Sub AlterFieldType(dbFile As Database, TblName As String, FieldName On Error GoTo UpgradeDbErr Case gsVersion10 As String, _ Call Upgrade10to21(UpgradeWsp, dbFile, NewDataType As String) UpgradeDb = False gsVersion21) Dim qdf As DAO.QueryDef If Not ValidUpgrade(sVerTo, sVerFrom) Call Upgrade21to23(UpgradeWsp, dbFile, Dim sSql As String Then Exit Function gsVersion23) Call Upgrade23to24(UpgradeWsp, dbFile, ' Add a temporary field to the table. If NoDbChanges(sVerTo, sVerFrom) Then gsVersion24) sSql = "ALTER TABLE [" & TblName & UpgradeDb = True Call Upgrade242to243(UpgradeWsp, _ Exit Function dbFile, gsVersion242) "] ADD COLUMN AlterTempField End If Call Upgrade243to25(UpgradeWsp, dbFile, " & NewDataType gsVersion25) Set qdf = dbFile.CreateQueryDef("", sMsg = "The database needs to be upgraded Call Upgrade25to251(UpgradeWsp, dbFile, sSql) from Version " & sVerFrom & _ gsVersion251) qdf.Execute " to Version " & sVerTo & "." & vbCrLf & _ Case gsVersion01 ' Copy the data from old field into the new "P roceed?" Call Upgrade01to21(UpgradeWsp, dbFile, field. If Not Confirm(Buttons:=vbYesNo, gsVersion21) qdf.SQL = "UPDATE DISTINCTROW strMessage:=sMsg, strTitle:="Upgrade Call Upgrade21to23(UpgradeWsp, dbFile, [" & TblName & "] SET AlterTempField = database") Then gsVersion23) [" & FieldName & "]" Exit Function Call Upgrade23to24(UpgradeWsp, dbFile, qdf.Execute End If gsVersion24) Call Upgrade242to243(UpgradeWsp, ' Delete the old field. UpgradeWsp.BeginTrans dbFile, gsVersion242)

HP TPC-H FULL DISCLOSURE REPORT 414 © 2005 Hewlett-Packard Company. All rights reserved. Call Upgrade243to25(UpgradeWsp, ElseIf sVerTo = gsVersion And sVerFrom = dbFile, gsVersion25) gsVersion10 Then Dim intResponse As Integer Call Upgrade25to251(UpgradeWsp, ValidUpgrade = True Dim intButtonStyle As Integer dbFile, gsVersion251) ElseIf sVerTo = gsVersion And sVerFrom = gsVersion01 Then On Error GoTo ConfirmErr End Select ValidUpgrade = True Else Confirm = False UpgradeWsp.CommitTrans ValidUpgrade = False End If ' If the buttons style hasn't been specified, set the UpgradeDb = True ' default style to display OK and Cancel buttons Exit Function End Function If Buttons = -1 Then intButtonStyle = vbOKCancel UpgradeDbErr: Attribute VB_Name = "DebugSM" Else Call LogErrors(Errors) ' FILE: DebugSM.bas intButtonStyle = Buttons ShowError errUpgradeFailed ' Microsoft TPC-H Kit Ver. 1.00 End If ' Copyright Microsoft, 1999 End Function ' All Rights Reserved ' Find the message string for the passed in code Private Function DBVersion(TestDb As ' If StringEmpty(strMessage) Then Database) As String ' strMessage = ' Retrieves the database version ' PURPOSE: Contains all the functions that Trim$(LoadResString(lngMessageCode)) Dim rVersion As Recordset carry out error/debug End If ' processing for the project. On Error GoTo DBVersionErr ' Contact: Reshma Tharamal If StringEmpty(strTitle) Then ([email protected]) strTitle = Set rVersion = ' Trim$(LoadResString(lngTitleCode)) TestDb.OpenRecordset("Select db_version ' Most of the functions in this module that End If from db_details ", _ manipulate the dbOpenForwardOnly) ' error object do not have an On Error GoTo If Not StringEmpty(TitleParameter) Then statement - this strTitle = strTitle & Chr$(vbKeySpace) & _ BugAssert rVersion.RecordCount <> 0 ' is because it will clear the passed in error gstrSQ & TitleParameter & gstrSQ DBVersion = rVersion!db_version object - let End If ' the calling functions handle the errors raised rVersion.Close by this ' Display the confirmation message with the Exit Function ' module, if any Cancel button Option Explicit ' set to the default - assume that we are DBVersionErr: confirming If Err.Number = merrDaoTableMissing ' Used to indicate the source module name ' potentially dangerous operations! Then when errors intResponse = MsgBox(strMessage, _ DBVersion = gsVersion01 ' are raised by this module intButtonStyle + vbQuestion + Else Private Const mstrModuleName As String = vbApplicationModal, _ LogErrors Errors "DebugSM." strTitle) Err.Raise vbObjectError + errUpgradeFailed, mstrModuleName, _ Private mcLogFile As cFileSM ' Translate the user response into a True/False LoadResString(errUpgradeFailed) Private mcErrorFile As cFileSM return code End If If intButtonStyle = vbOKCancel Then Private Const If intResponse = vbOK Then End Function FORMAT_MESSAGE_FROM_SYSTEM = Confirm = True &H1000 Else Private Function ValidUpgrade(sVerTo As Private Const Confirm = False String, sVerFrom As String) As Boolean FORMAT_MESSAGE_IGNORE_INSERTS = End If &H200 Else If sVerTo = gsVersion And sVerFrom = Private Const pNull = 0 If intResponse = vbYes Then gsVersion251 Then Confirm = True ValidUpgrade = True Declare Function FormatMessage Lib Else ElseIf sVerTo = gsVersion And "kernel32" Alias "FormatMessageA" (ByVal Confirm = False sVerFrom = gsVersion25 Then dwFlags As Long, lpSource As Any, ByVal End If ValidUpgrade = True dwMessageId As Long, ByVal dwLanguageId End If ElseIf sVerTo = gsVersion And As Long, ByVal lpbuffer As String, ByVal sVerFrom = gsVersion243 Then nSize As Long, Arguments As Long) As Long Exit Function ValidUpgrade = True Public Function Confirm(Optional ElseIf sVerTo = gsVersion And lngMessageCode As conConfirmMsgCodes, _ ConfirmErr: sVerFrom = gsVersion242 Then Optional lngTitleCode As ' Log the error code raised by Visual Basic ValidUpgrade = True conConfirmMsgTitleCodes, _ Call LogErrors(Errors) ElseIf sVerTo = gsVersion And Optional TitleParameter As String, _ On Error GoTo 0 sVerFrom = gsVersion241 Then Optional ByVal Buttons As Integer = -1, _ gstrSource = mstrModuleName & "Confirm" ValidUpgrade = True Optional strMessage As String = Err.Raise vbObjectError + errConfirmFailed, _ ElseIf sVerTo = gsVersion And gstrEmptyString, _ gstrSource, _ sVerFrom = gsVersion24 Then Optional strTitle As String = LoadResString(errConfirmFailed) ValidUpgrade = True gstrEmptyString) _ ElseIf sVerTo = gsVersion And As Boolean End Function sVerFrom = gsVersion23 Then ' Displays a confirmation message Public Sub LogSystemError() ValidUpgrade = True corresponding to the Dim eErrCode As Long ElseIf sVerTo = gsVersion And ' passed in message code. Returns True if the sVerFrom = gsVersion21 Then user says eErrCode = GetLastError() ValidUpgrade = True ' Ok and False otherwise If eErrCode <> 0 Then HP TPC-H FULL DISCLOSURE REPORT 415 © 2005 Hewlett-Packard Company. All rights reserved. WriteToFile "System Error: " & Public Sub ShowError(ByVal ErrorCode As eErrCode & vbCrLf & ApiError(eErrCode), End Function errErrorConstants, _ _ Optional ByVal ErrorSource As String = blnError:=True Private Sub WriteToFile(sMsg As String, gstrEmptyString, _ End If Optional ByVal blnError As Boolean) Optional ByVal OptArgs As String = gstrEmptyString, _ End Sub ' Calls procedures to write the passed in Optional ByVal DoWriteError As Boolean = Public Function ApiError(ByVal e As Long) message to the log - True) As String ' The blnError flag is used to indicate that the message If DoWriteError Then Dim s As String ' should be logged to the error file - by ' Call a procedure to write the error to a log file Dim c As Long default the log Call WriteError(ErrorCode, ErrorSource, ' file is used OptArgs) s = String(256, 0) End If c = Dim mcFileObj As cFileSM FormatMessage(FORMAT_MESSAGE_FR Dim strFileName As String ' Re-initialize the values of the Error object OM_SYSTEM Or _ Dim strFileHdr As String before ' displaying the error to the user FORMAT_MESSAGE_IGNORE_INSERT On Error GoTo WriteToFileErr Call InitErrObject(ErrorCode, ErrorSource, S, _ OptArgs) pNull, e, 0&, s, Len(s), ByVal pNull) If blnError Then If c Then ApiError = e & ": " & Left$(s, If mcErrorFile Is Nothing Then Call DisplayErrors(Errors) c) Set mcErrorFile = New cFileSM End If Err.Clear End Function Set mcFileObj = mcErrorFile Else End Sub ' Output flags determine output destination If mcLogFile Is Nothing Then Public Sub WriteError(ByVal ErrorCode As of BugAsserts and messages Set mcLogFile = New cFileSM errErrorConstants, _ #Const afLogfile = 1 End If Optional ByVal ErrorSource As String = #Const afMsgBox = 2 Set mcFileObj = mcLogFile gstrEmptyString, _ #Const afDebugWin = 4 End If Optional ByVal OptArgs As String = #Const afAppLog = 8 gstrEmptyString) If StringEmpty(mcFileObj.FileName) Then ' Display appropriate error message, and If blnError Then ' Initialize the values of the Error object before then stop strFileName = gstrProjectPath & "\" & ' calling the log function ' program. These errors should NOT be App.EXEName & ".ERR" Call InitErrObject(ErrorCode, ErrorSource, possible in strFileHdr = "Stepmaster Errors" OptArgs) ' shipping product. Else Sub BugAssert(ByVal fExpression As strFileName = gstrProjectPath & "\" & Call LogErrors(Errors) Boolean, _ App.EXEName & ".DBG" Optional sExpression As String) strFileHdr = "Stepmaster Log" Err.Clear #If afDebug Then End If If fExpression Then Exit Sub End Sub BugMessage "BugAssert failed: " & mcFileObj.FileName = strFileName Private Sub InitErrObject(ByVal ErrorCode As sExpression mcFileObj.WriteLine strFileHdr errErrorConstants, _ Stop mcFileObj.WriteLine "Log start time : " Optional ByVal ErrorSource As String = #End If & Now gstrEmptyString, _ End Sub End If Optional ByVal OptArgs As String = gstrEmptyString) Sub BugMessage(sMsg As String) mcFileObj.WriteLine sMsg Dim lngError As Long #If afDebug And afLogfile Then Exit Sub ' Since we are writing log messages, the lngError = IIf(ErrorCode > vbObjectError And error flag is turned off WriteToFileErr: ErrorCode < vbObjectError + 65535, _ Call WriteToFile(sMsg, False) ' Display the error code raised by Visual ErrorCode - vbObjectError, ErrorCode) #End If Basic Err.Number = lngError + vbObjectError #If afDebug And afMsgBox Then Call DisplayErrors(Errors) Err.Description = LoadResString(lngError) & MsgBox sMsg ' An error message would've been displayed OptArgs #End If by the called Err.Source = App.EXEName & ErrorSource #If afDebug And afDebugWin Then ' procedures Debug.Print sMsg End Sub #End If End Sub Public Sub ShowMessage(ByVal MessageCode As #If afDebug And afAppLog Then Public Sub WriteMessage(sMsg As String) errErrorConstants, _ App.LogEvent sMsg Optional ByVal OptArgs As String) #End If Call WriteToFile(sMsg, True) Dim strMessage As String End Sub End Sub Public Function ProjectLogFile() As String On Error GoTo ShowMessageErr Sub BugTerm() ProjectLogFile = mcLogFile.FileName #If afDebug And afLogfile Then strMessage = LoadResString(MessageCode) & ' Close log file OptArgs End Function mcLogFile.CloseFile Public Function ProjectErrorFile() As String #End If ' Write the error to a log file End Sub BugMessage strMessage ProjectErrorFile = mcErrorFile.FileName HP TPC-H FULL DISCLOSURE REPORT 416 © 2005 Hewlett-Packard Company. All rights reserved. MsgBox strMessage, vbOKOnly Public Sub LogErrors(myErrCollection As ShowError errUnableToWriteError, Errors) DoWriteError:=False Exit Sub Dim cColErrors As cVectorStr Dim strError As String End Sub ShowMessageErr: Dim errLoop As Error Attribute VB_Name = "FileCommon" ' Log the error and exit Dim errCode As Long ' FILE: FileCommon.bas Call DisplayErrors(Errors) Dim lngIndex As Long ' Microsoft TPC-H Kit Ver. 1.00 ' Copyright Microsoft, 1999 End Sub Set cColErrors = New cVectorStr ' All Rights Reserved Public Sub ShowMessageStr(sMessage As ' String) ' Enumerate Errors collection and display ' properties of ' PURPOSE: This module contains common ' Write the error to a log file ' each Error object. functionality to display BugMessage sMessage If Err.Number <> 0 Then ' the File Open dialog. If Err.Number > vbObjectError And ' Contact: Reshma Tharamal MsgBox sMessage, vbOKOnly Err.Number < (vbObjectError + 65536) Then ([email protected]) errCode = Err.Number - vbObjectError ' End Sub Else Option Explicit errCode = Err.Number Public Sub DisplayErrors(myErrCollection End If ' Used to indicate the source module name when As Errors) strError = "Error # " & Str(errCode) & " errors Dim strError As String was generated by " _ ' are raised by this module Dim errLoop As Error & Err.Source & vbCrLf & Private Const mstrModuleName As String = Dim errCode As Long Err.Description "FileCommon."

' Enumerate Errors collection and display cColErrors.Add strError Private Enum EOpenFile properties of End If OFN_OVERWRITEPROMPT = &H2 ' each Error object. OFN_HIDEREADONLY = &H4 If Err.Number <> 0 Then ' Log all database errors, if any OFN_FILEMUSTEXIST = &H1000 If Err.Number > vbObjectError And For Each errLoop In myErrCollection OFN_EXPLORER = &H80000 Err.Number < (vbObjectError + 65536) With errLoop End Enum Then If Err.Number > vbObjectError And errCode = Err.Number - Err.Number < (vbObjectError + 65536) Then ' The locations for the different output files are vbObjectError errCode = .Number - vbObjectError presented to Else Else ' the user in a list box. These constants are used errCode = Err.Number errCode = .Number while loading the End If End If ' data and while reading the data from the list box. strError = "Error # " & Str(errCode) & strError = "Error #"& errCode & ' These constants also represent the different file " was generated by " _ vbCrLf types that are & Err.Source & Chr(13) & strError = strError & " " & ' displayed to the user in File Open dialogs Err.Description .Description & vbCrLf Public Enum gFileTypes MsgBox strError, , "Error", strError = strError & _ gintOutputFile = 0 Err.HelpFile, Err.HelpContext " (Source: " & .Source & ")" & ' gintLogFile = 1 Else vbCrLf gintErrorFile For Each errLoop In myErrCollection End With gintStepTextFile With errLoop gintOutputCompareFile If Err.Number > vbObjectError cColErrors.Add strError gintDBFile And Err.Number < (vbObjectError + 65536) Next gintDBFileNew Then gintImportFile errCode = .Number - ' We can have a error handler now that we gintExportFile vbObjectError have stored all End Enum Else ' errors away safely! - having an error errCode = .Number handler before Public Const gsSqlFileSuffix = ".sql" End If ' enumerating all the errors would have Public Const gsCmdFileSuffix = ".cmd" strError = "Error #" & errCode & cleared the error vbCrLf ' collection Public Const gsOutputFileSuffix = ".out" strError = strError & " " & On Error GoTo LogErrorsErr Public Const gstrLogFileSuffix = ".log" .Description & vbCrLf gstrSource = mstrModuleName & Public Const gsErrorFileSuffix = ".err" strError = strError & _ "LogErrors" Public Function BrowseDBFile() As String " (Source: " & .Source & ")" ' Prompts the user for a database file with the & vbCrLf For lngIndex = 0 To cColErrors.Count - 1 workspace information ' strError = strError & _ strError = cColErrors(lngIndex) ' Call CallFileDialog to display the open file ' "P ress F1 to see topic " & Debug.Print strError dialog .HelpContext & vbCrLf Call WriteToFile(strError, True) BrowseDBFile = CallFileDialog(gintDBFile) ' strError = strError & _ Next lngIndex ' " in the file " & .HelpFile & End Function "." Set cColErrors = Nothing Public Function CallFileDialog(intFileType As End With Integer, _ Exit Sub Optional ByVal strDefaultFile As String = MsgBox strError gstrEmptyString) As String Next LogErrorsErr: ' This function initializes the values of the filter End If ' Display the error code raised by Visual property, Basic ' the dialog title and flags for the File Open dialog End Sub DisplayErrors Errors depending On Error GoTo 0 ' on the FileType passed in HP TPC-H FULL DISCLOSURE REPORT 417 © 2005 Hewlett-Packard Company. All rights reserved. ' It then calls ShowFileOpenDialog to set mstr_FILE_OUTPUT_FILTER & these properties and Case gintOutputCompareFile mstr_FILE_ALL_FILTER, _ ' display the File Open dialog to the user strFileName = ShowFileOpenDialog( _ s_DLG_TITLE_OPEN, _ mlng_FILE_OUTPUT_FLAGS, _ ' All the properties used by the File Open mstr_FILE_OUTPUT_COMPARE_FILTER strDefaultFile) dialog are defined & mstr_FILE_ALL_FILTER, _ ' as constants in this function and passed s_DLG_TITLE_OPEN, _ End Select to ShowFileOpenDialog CallFileDialog = strFileName ' as parameters. So if any of the dialog mlng_FILE_OUTPUT_COMPARE_FLAGS, properties need to be _ Exit Function ' modified, these constants are what need strDefaultFile) to be changed CallFileDialogErr: Const s_DLG_TITLE_OPEN = "Open" Case gintOutputFile CallFileDialog = gstrEmptyString Const s_DLG_TITLE_NEW = "New" strFileName = ShowFileOpenDialog( _ ' Log the error code raised by Visual Basic Const s_DLG_TITLE_IMPORT = mstr_FILE_OUTPUT_FILTER & Call LogErrors(Errors) "Import From" mstr_FILE_ALL_FILTER, _ gstrSource = mstrModuleName & Const s_DLG_TITLE_EXPORT = s_DLG_TITLE_OPEN, _ "CallFileDialog" "Export To" mlng_FILE_OUTPUT_FLAGS, _ Call ShowError(errBrowseFailed) strDefaultFile) Const mlng_FILE_STEP_TEXT_FLAGS End Function = OFN_EXPLORER Or ' Case gintLogFile OFN_FILEMUSTEXIST Or ' strFileName = ShowFileOpenDialog( _ VERSION 5.00 OFN_HIDEREADONLY ' mstr_FILE_LOG_FILTER & Begin VB.Form frmSplash Const mstr_FILE_ALL_FILTER, _ BorderStyle = 3 'Fixed Dialog mlng_FILE_OUTPUT_COMPARE_FLAG ' s_DLG_TITLE_OPEN, _ ClientHeight = 4710 S = mlng_FILE_STEP_TEXT_FLAGS ' mlng_FILE_LOG_FLAGS, _ ClientLeft = 45 Const mlng_FILE_DB_FLAGS = ' strDefaultFile) ClientTop = 45 mlng_FILE_STEP_TEXT_FLAGS ' ClientWidth = 7455 Const mlng_FILE_OUTPUT_FLAGS = Case gintErrorFile ControlBox = 0 'False OFN_EXPLORER Or strFileName = ShowFileOpenDialog( _ Icon = "frmSplash.frx":0000 OFN_HIDEREADONLY Or mstr_FILE_ERROR_FILTER & LinkTopic = "Form1" OFN_OVERWRITEPROMPT mstr_FILE_ALL_FILTER, _ LockControls = -1 'True Const mlng_FILE_LOG_FLAGS = s_DLG_TITLE_OPEN, _ MaxButton = 0 'False mlng_FILE_OUTPUT_FLAGS mlng_FILE_ERROR_FLAGS, _ MinButton = 0 'False Const mlng_FILE_ERROR_FLAGS = strDefaultFile) ScaleHeight = 4710 mlng_FILE_OUTPUT_FLAGS ScaleWidth = 7455 Const mlng_FILE_DB_NEW_FLAGS = Case gintDBFile ShowInTaskbar = 0 'False mlng_FILE_OUTPUT_FLAGS strFileName = ShowFileOpenDialog( _ StartUpPosition = 2 'CenterScreen mstr_FILE_DB_FILTER & Visible = 0 'False Const mstr_FILE_ALL_FILTER = "|All mstr_FILE_ALL_FILTER, _ Begin VB.Frame fraMainFrame Files (*.*)|*.*" s_DLG_TITLE_OPEN, _ Height = 4590 Const mstr_FILE_STEP_TEXT_FILTER mlng_FILE_DB_FLAGS, _ Left = 45 = "Query Files (*"& gsSqlFileSuffix & _ strDefaultFile) TabIndex = 0 ") |*"& gsSqlFileSuffix & Top = -15 "|Command Script Files (*" & Case gintDBFileNew Width = 7380 gsCmdFileSuffix & _ strFileName = ShowFileOpenDialog( _ Begin VB.PictureBox picLogo ") |*"& gsCmdFileSuffix mstr_FILE_DB_FILTER & Height = 2385 Const mstr_FILE_ALL_FILTER, _ Left = 510 mstr_FILE_OUTPUT_COMPARE_FILTE s_DLG_TITLE_NEW, _ Picture = "frmSplash.frx":0442 R = "Text Files (*.txt)|*.txt" mlng_FILE_DB_NEW_FLAGS, _ ScaleHeight = 2325 Const mstr_FILE_OUTPUT_FILTER = strDefaultFile) ScaleWidth = 1755 "Output Files (*.out)|*.out" TabIndex = 1 Const mstr_FILE_LOG_FILTER = "Log Case gintImportFile Top = 855 Files (*.log)|*.log" strFileName = ShowFileOpenDialog( _ Width = 1815 Const mstr_FILE_ERROR_FILTER = mstr_FILE_DB_FILTER & End "Error Files (*.err)|*.err" mstr_FILE_ALL_FILTER, _ Begin VB.Label lblReserved Const mstr_FILE_DB_FILTER = s_DLG_TITLE_IMPORT, _ AutoSize = -1 'True "Stepmaster Workspace Files (*" & mlng_FILE_DB_FLAGS, _ Caption = "All Rights Reserved." gsDefDBFileExt & ")|*" & gsDefDBFileExt strDefaultFile) Height = 195 Left = 5520 Dim strFileName As String Case gintExportFile TabIndex = 8 strFileName = ShowFileOpenDialog( _ Top = 4080 On Error GoTo CallFileDialogErr mstr_FILE_DB_FILTER & Width = 1440 mstr_FILE_ALL_FILTER, _ End Select Case intFileType s_DLG_TITLE_EXPORT, _ Begin VB.Label lblCopyright Case gintStepTextFile mlng_FILE_DB_FLAGS, _ AutoSize = -1 'True strFileName = strDefaultFile) Caption = "Copyright © 1998" ShowFileOpenDialog( _ BeginProperty Font Case Else Name = "Arial" mstr_FILE_STEP_TEXT_FILTER & BugAssert True, "Incorrect file type Size = 8.25 mstr_FILE_ALL_FILTER, _ passed in." Charset = 0 s_DLG_TITLE_OPEN, _ ' Default processing will be for the Weight = 400 output file Underline = 0 'False mlng_FILE_STEP_TEXT_FLAGS, _ strFileName = ShowFileOpenDialog( _ Italic = 0 'False strDefaultFile) Strikethrough = 0 'False HP TPC-H FULL DISCLOSURE REPORT 418 © 2005 Hewlett-Packard Company. All rights reserved. EndProperty Top = 2040 Top = 2040 Height = 210 Width = 1275 Width = 1095 Left = 5550 End End TabIndex = 7 Begin VB.Label lblWarning Begin VB.CommandButton cmdCancel Tag = "Copyright" AutoSize = -1 'True Cancel = -1 'True Top = 3850 Caption = "Do Not Redistribute" Caption = "Cancel" Width = 1380 BeginProperty Font Height = 375 WordWrap = -1 'True Name = "Arial" Left = 3360 End Size = 8.25 TabIndex = 3 Begin VB.Label lblCompany Charset = 0 Top = 2040 AutoSize = -1 'True Weight = 400 Width = 1095 Caption = "Microsoft Underline = 0 'False End Corporation" Italic = 0 'False Begin VB.ListBox lstWorkspaces BeginProperty Font Strikethrough = 0 'False Height = 1425 Name = "Arial" EndProperty ItemData = Size = 8.25 Height = 210 "f rmWorkspaceOpen.frx":0000 Charset = 0 Left = 480 Left = 240 Weight = 400 TabIndex = 2 List = "frmWorkspaceOpen.frx":0002 Underline = 0 'False Tag = "Warning" MultiSelect = 2 'Extended Italic = 0 'False Top = 3850 TabIndex = 1 Strikethrough = 0 'False Width = 1380 Top = 480 EndProperty End Width = 4215 Height = 210 End End Left = 5460 End Begin VB.Label lblWorkspaces TabIndex = 6 Attribute VB_Name = "frmSplash" AutoSize = -1 'True Tag = "Company" Attribute VB_GlobalNameSpace = False Caption = "Workspace" Top = 3640 Attribute VB_Creatable = False Height = 195 Width = 1560 Attribute VB_PredeclaredId = True Left = 240 End Attribute VB_Exposed = False TabIndex = 0 Begin VB.Label lblRestrictions ' FILE: frmSplash.frm Top = 120 AutoSize = -1 'True ' Microsoft TPC-H Kit Ver. 1.00 Width = 825 Caption = "See License ' Copyright Microsoft, 1999 End Agreement for Restrictions" ' All Rights Reserved End Height = 195 ' Attribute VB_Name = "frmWorkspaceOpen" Left = 460 ' Attribute VB_GlobalNameSpace = False TabIndex = 5 ' PURPOSE: Splash screen for StepMaster Attribute VB_Creatable = False Top = 4080 ' Contact: Reshma Tharamal Attribute VB_PredeclaredId = True Width = 2790 ([email protected]) Attribute VB_Exposed = False End ' ' FILE: frmWorkspaceOpen.frm Begin VB.Label lblProductName Option Explicit ' Microsoft TPC-H Kit Ver. 1.00 AutoSize = -1 'True ' Copyright Microsoft, 1999 Caption = "StepMaster" ' All Rights Reserved BeginProperty Font Private Sub Form_Load() ' Name = "Arial" ' lblVersion.Caption = "Version " & ' Size = 32.25 App.Major & "." & App.Minor & "." & ' PURPOSE: Used to display a list of all Charset = 0 App.Revision workspaces in a Weight = 700 lblProductName.Caption = App.Title ' workspace definition file for Open, Import, Underline = 0 'False lblVersion.Caption = GetVersionString Export Italic = 0 'False ' and Run (in SMRunOnly) workspace Strikethrough = 0 'False End Sub ' Contact: Reshma Tharamal EndProperty ([email protected]) Height = 765 ' Left = 2670 Option Explicit TabIndex = 4 VERSION 5.00 #If RUN_ONLY Then Tag = "Product" Begin VB.Form frmWorkspaceOpen Private WithEvents cRunOnlyInst As cRunOnly Top = 1200 BorderStyle = 3 'Fixed Dialog Attribute cRunOnlyInst.VB_VarHelpID = -1 Width = 3495 Caption = "Open Workspace" End ClientHeight = 2550 Private Sub cRunOnlyInst_Done() Begin VB.Label lblVersion ClientLeft = 45 ShowFree Alignment = 1 'Right Justify ClientTop = 330 End Sub AutoSize = -1 'True ClientWidth = 4695 Caption = "Version 2.4" LinkTopic = "Form1" Private Sub Run() BeginProperty Font LockControls = -1 'True Dim iIndex As Integer Name = "Arial" MaxButton = 0 'False Size = 12 MinButton = 0 'False Set cRunOnlyInst = New cRunOnly Charset = 0 ScaleHeight = 2550 Weight = 700 ScaleWidth = 4695 For iIndex = 0 To Me.lstWorkspaces.ListCount - Underline = 0 'False ShowInTaskbar = 0 'False 1 Italic = 0 'False StartUpPosition = 1 'CenterOwner If Me.lstWorkspaces.Selected(iIndex) Then Strikethrough = 0 'False Begin VB.CommandButton cmdOK ShowBusy EndProperty Caption = "OK" cRunOnlyInst.WorkspaceId = Height = 285 Default = -1 'True Me.lstWorkspaces.ItemData(Me.lstWorkspaces.List Left = 4800 Height = 375 Index) TabIndex = 3 Left = 2160 Tag = "Version" TabIndex = 2 HP TPC-H FULL DISCLOSURE REPORT 419 © 2005 Hewlett-Packard Company. All rights reserved. cRunOnlyInst.WspName = Dim bShift As Byte Set qyIt = Me.lstWorkspaces.List(Me.lstWorkspaces.L Dim lngIndex As Long dbsAttTool.CreateQueryDef(gstrEmptyString, sSql) istIndex) rstStepsInWsp.MoveFirst cRunOnlyInst.RunWsp ' Set the three lowest order bits to 1 End If bReset = 7 While Not rstStepsInWsp.EOF Next iIndex BugAssert IsArray(vntIterators) And Not qyIt.Parameters("s_id").Value = End Sub IsEmpty(vntIterators), _ rstStepsInWsp!step_id "Iterators not specified!" qyIt.Parameters("ver_no").Value = #End If rstStepsInWsp!version_no For lngIndex = LBound(vntIterators) To _ Private Sub cmdCancel_Click() UBound(vntIterators) Set recIterators = bShift = 1 qyIt.OpenRecordset(dbOpenSnapshot) Unload Me bShift = bShift * (2 ^ (vntIterators(lngIndex).IteratorType - 1)) Call LoadIteratorsArray(cStepsCol, End Sub recIterators) bReset = bReset Xor bShift recIterators.Close Private Sub cmdOK_Click() Next lngIndex rstStepsInWsp.MoveNext #If RUN_ONLY Then ' Assert that all the elements are present Wend Call Run BugAssert bReset = 0, "Range not #Else completely specified!" qyIt.Close Call WorkspaceOpenOk #End If End Sub BugMessage "Query step at a time Read + load Public Sub LoadIteratorsForWsp(cStepsCol As took: " & CStr(DateDiff("s", dtStart, Now)) End Sub cArrSteps, _ ByVal lngWorkspaceId As Long, #End If rstStepsInWsp As Recordset) Private Sub lstWorkspaces_DblClick() ' Initializes the step records in with all the Exit Sub iterator ' A double click on the workspaces list ' values for each step LoadIteratorsForWspErr: box is considered LogErrors Errors ' equivalent to selecting an item in the list Dim recIterators As Recordset gstrSource = mstrModuleName & and then selecting "LoadIteratorsForWsp" ' the OK command On Error GoTo LoadIteratorsForWspErr On Error GoTo 0 Call cmdOK_Click Err.Raise vbObjectError + #If QUERY_ALL Then errLoadRsInArrayFailed, _ End Sub Dim dtStart As Date gstrSource, _ LoadResString(errLoadRsInArrayFailed) Attribute VB_Name = "IteratorCommon" dtStart = Now ' FILE: IteratorCommon.bas Set recIterators = End Sub ' Microsoft TPC-H Kit Ver. 1.00 ReadWspIterators(lngWorkspaceId) Private Function ReadWspIterators(ByVal ' Copyright Microsoft, 1999 lngWorkspaceId As Long) As Recordset ' All Rights Reserved Call LoadIteratorsArray(cStepsCol, ' recIterators) ' This function will return a recordset that is ' populated ' PURPOSE: Contains functionality recIterators.Close ' with the iterators for all the steps in a given common across StepMaster and workspace ' SMRunOnly, pertaining to iterators BugMessage "QueryAll Read + load took: " ' Specifically, functions to read & CStr(DateDiff("s", dtStart, Now)) Dim recIterators As Recordset iterators records Dim qyIt As DAO.QueryDef ' in the workspace, load them in an #Else Dim strSql As String array and so on. Dim dtStart As Date ' Contact: Reshma Tharamal Dim qyIt As DAO.QueryDef On Error GoTo ReadWspIteratorsErr ([email protected]) Dim sSql As String gstrSource = mstrModuleName & ' "ReadWspIterators" Option Explicit dtStart = Now If rstStepsInWsp.RecordCount = 0 Then strSql = "Select i.step_id, i.version_no, " & _ ' Used to indicate the source module name Exit Sub " i.type, i.iterator_value, " & _ when errors End If " i.sequence_no " & _ ' are raised by this module " from iterator_values i, att_steps a " & _ Private Const mstrModuleName As String = ' This method has the advantage that if the " where i.step_id = a.step_id " & _ "IteratorCommon." steps are queried right, everything else follows " and i.version_no = a.version_no " & _ sSql = "Select step_id, version_no, type, " and a.workspace_id = [w_id] " & _ Public Const gintMinIteratorSequence As iterator_value, " & _ " and a.archived_flag = [archived] " Integer = 0 " sequence_no " & _ " from iterator_values " & _ ' Find the highest X-component of the version Public Sub RangeComplete(vntIterators As " where step_id = [s_id] " & _ number Variant) " and version_no = [ver_no] " strSql = strSql & " AND cint( mid( a.version_no, ' This is a debug procedure 1, instr( a.version_no, " & gstrDQ & ' Checks if the from, to and step values ' Order the iterators by sequence within a gstrVerSeparator & gstrDQ & " ) - 1 ) ) = "& _ are present in step " ( select max( cint( mid( version_no, 1, instr( ' the array sSql = sSql & " order by sequence_no " version_no, " & gstrDQ & gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) "& _ Dim bReset As Byte " from att_steps AS d " & _ HP TPC-H FULL DISCLOSURE REPORT 420 © 2005 Hewlett-Packard Company. All rights reserved. " WHERE a.step_id = d.step_id ) " End If conStopRun conSaveConnect ' Find the highest Y-component of the recIterators.MoveFirst conSaveDB version number for the highest X- While Not recIterators.EOF End Enum component Set cNewIt = New cIterator strSql = strSql & " AND cint( mid( ' A public enum containing the titles for all the a.version_no, instr( a.version_no, " & lngStepId = confirmation gstrDQ & gstrVerSeparator & gstrDQ & " ) CLng(ErrorOnNullField(recIterators, ' messages that will be used by the project - each of + 1 ) ) = "& _ "s tep_id")) the codes " ( select max( cint( mid( version_no, If Not cStepRec Is Nothing Then ' has the prefix, cont - most confirmation message instr( version_no, " & gstrDQ & If cStepRec.StepId <> lngStepId Then codes will gstrVerSeparator & gstrDQ & " ) + 1 ) ) ) " Set cStepRec = ' have a corresponding title code in here & _ cStepsCol.QueryStep(lngStepId) Public Enum conConfirmMsgTitleCodes " from att_steps AS b " & _ End If contWspDelete = 3000 " Where a.step_id = b.step_id " & _ Else contSave " AND cint( mid( version_no, 1, instr( Set cStepRec = contStopRun version_no, " & gstrDQ & gstrVerSeparator cStepsCol.QueryStep(lngStepId) contSaveConnect & gstrDQ & " ) - 1 ) ) = "& _ End If contSaveDB " ( select max( cint( mid( version_no, 1, End Enum instr( version_no, " & gstrDQ & ' Initialize iterator values gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " cNewIt.IteratorType = Attribute VB_Name = "OpenFiles" & _ CInt(ErrorOnNullField(recIterators, "type")) ' FILE: OpenFiles.bas " from att_steps AS c "& _ cNewIt.Value = ' Microsoft TPC-H Kit Ver. 1.00 " WHERE a.step_id = c.step_id ) ) " CStr(ErrorOnNullField(recIterators, ' Copyright Microsoft, 1999 "i terator_value")) ' All Rights Reserved cNewIt.SequenceNo = ' ' Order the iterators by sequence within a CInt(ErrorOnNullField(recIterators, ' step "s equence_no")) ' PURPOSE: This module holds a list of all files strSql = strSql & " order by i.step_id, that have been i.sequence_no " ' Add this record to the array of iterators ' opened by the project. This module is cStepRec.LoadIterator cNewIt needed since there Set qyIt = ' is no way to share static data between dbsAttTool.CreateQueryDef(gstrEmptyStrin Set cNewIt = Nothing different instances g, strSql) recIterators.MoveNext ' of a class. qyIt.Parameters("w_id").Value = Wend ' Many procedure in this module do not do lngWorkspaceId any error handling - qyIt.Parameters("archived").Value = Exit Sub ' this is 'coz it is also used by procedures False that log error LoadIteratorsArrayErr: ' messages and any error handler will erase Set recIterators = LogErrors Errors the collection qyIt.OpenRecordset(dbOpenSnapshot) gstrSource = mstrModuleName & ' of errors! "LoadIteratorsArray" qyIt.Close On Error GoTo 0 ' Contact: Reshma Tharamal Set ReadWspIterators = recIterators Err.Raise vbObjectError + ([email protected]) errLoadRsInArrayFailed, _ ' Exit Function gstrSource, _ Option Explicit

ReadWspIteratorsErr: LoadResString(errLoadRsInArrayFailed) ' Log the error code raised by Visual ' Used to indicate the source module name when Basic End Sub errors Call LogErrors(Errors) ' are raised by this class On Error GoTo 0 Private Const mstrModuleName As String = Err.Raise vbObjectError + Attribute VB_Name = "MsgConfirm" ".OpenFiles." errReadDataFailed, _ ' FILE: MsgConfirm.bas gstrSource, ' Microsoft TPC-H Kit Ver. 1.00 Private mOpenFiles As cNodeCollections LoadResString(errReadDataFailed) ' Copyright Microsoft, 1999 ' All Rights Reserved Private Const mstrTempDir As String = "\Temp\" End Function ' Private Sub LoadIteratorsArray(cStepsCol ' ' The maximum number of temporary files that we As cArrSteps, _ ' PURPOSE: Contains constants for can create in a recIterators As Recordset) confirmation messages that ' session ' Initializes the step records with the ' will be displayed by StepMaster Private Const mlngMaxFileIndex As Long = iterators for ' Contact: Reshma Tharamal 999999 ' the step ([email protected]) Private Const mstrFileIndexFormat As String = ' "0 00000" Dim cNewIt As cIterator Option Explicit Private Const mstrTempFilePrefix As String = Dim cStepRec As cStep "SM" Dim lngStepId As Long ' A public enum containing the codes for all the Private Const mstrTempFileSuffix As String = confirmation ".cmd" On Error GoTo LoadIteratorsArrayErr ' messages that will be used by the project - gstrSource = mstrModuleName & each of the codes Private Const merrFileNotFound As Long = 76 "LoadIteratorsArray" ' has the prefix, con Private Function GetFileHandle(strFileName) As Public Enum conConfirmMsgCodes cFileInfo If recIterators.RecordCount = 0 Then conWspDelete = 2000 Exit Sub conSave Dim lngIndex As Long HP TPC-H FULL DISCLOSURE REPORT 421 © 2005 Hewlett-Packard Company. All rights reserved. Dim blnFileOpen As Boolean If intPos > 0 Then End Function If Not mOpenFiles Is Nothing Then strFileDir = Left$(strTempFile, intPos - 1) Public Function OpenFileSM(strFileName As If StringEmpty(Dir$(strFileDir, String) As Integer blnFileOpen = False vbDirectory)) Then Dim intHFile As Integer For lngIndex = 0 To mOpenFiles.Count ' Loop through the entire path starting Dim NewFileInfo As cFileInfo - 1 at the root If mOpenFiles(lngIndex).FileName ' since Mkdir can create only one level On Error GoTo OpenFileSMErr = strFileName Then of sub-directory gstrSource = mstrModuleName & "OpenFileSM" blnFileOpen = True ' at a time Exit For intStart = InStr(strFileDir, If StringEmpty(strFileName) Then End If gstrFileSeparator) On Error GoTo 0 Next lngIndex Err.Raise vbObjectError + errInvalidFile, Do While strTempDir <> strFileDir gstrSource, _ If blnFileOpen Then LoadResString(errInvalidFile) Set GetFileHandle = If intStart > 0 Then End If mOpenFiles(lngIndex) strTempDir = Left$(strFileDir, Else intStart - 1) If mOpenFiles Is Nothing Then Set GetFileHandle = Nothing Else Set mOpenFiles = New cNodeCollections End If strTempDir = strFileDir End If Else End If Set GetFileHandle = Nothing Set NewFileInfo = GetFileHandle(strFileName) End If If StringEmpty(Dir$(strTempDir, vbDirectory)) Then If NewFileInfo Is Nothing Then End Function ' If the specified directory doesn't ' The file has not been opened yet exist, try to Private Function GetTempFileDir() As ' create it. ' If the filename has not been initialized, do not String MkDir strTempDir ' attempt to open it Else strFileName = MakePathValid(strFileName) Dim strTempFileDir As String ' The directory exists - go to it's sub-directory If strFileName <> gstrEmptyString Then On Error GoTo GetTempFileDirErr End If intHFile = FreeFile intStart = InStr(intStart + 1, Open strFileName For Output Shared As strTempFileDir = gstrProjectPath & strFileDir, gstrFileSeparator) intHFile mstrTempDir Loop Set NewFileInfo = New cFileInfo If StringEmpty(Dir$(strTempFileDir, ' Sanity check NewFileInfo.FileHandle = intHFile vbDirectory)) Then If StringEmpty(Dir$(strFileDir, NewFileInfo.FileName = strFileName MkDir strTempFileDir vbDirectory)) Then mOpenFiles.Load NewFileInfo End If ' We were unable to create the file Else directory ' Either the directory was invalid or s'thing GetTempFileDir = strTempFileDir ShowError errCreateDirectoryFailed, failed gstrSource, _ ' Display the error to the user instead of Exit Function strFileDir, DoWriteError:=False trying MakePathValid = gstrEmptyString ' to log to the file GetTempFileDirErr: Else ShowError errInvalidFile, gstrSource, ' Log the error code raised by Visual MakePathValid = strTempFile strFileName, _ Basic End If DoWriteError:=False Call LogErrors(Errors) Else intHFile = 0 gstrSource = mstrModuleName & ' The specified directory exists - we End If "GetTempFileDir" should be able Else On Error GoTo 0 ' to create the output file in it intHFile = NewFileInfo.FileHandle Err.Raise vbObjectError + MakePathValid = strTempFile End If errProgramError, gstrSource, _ End If LoadResString(errProgramError) Else OpenFileSM = intHFile ' The user has only specified a filename - End Function VB will try Exit Function Public Function ' to create it in the current directory MakePathValid(strFileName As String) As MakePathValid = strTempFile OpenFileSMErr: String End If ' Log the error code raised by Visual Basic ' Checks if the passed in file path is valid Call LogErrors(Errors) Exit Function ' The Open command failed for some reason - Dim strFileDir As String write an error Dim strTempDir As String MakePathValidErr: ' and let the calling function handle the error Dim strTempFile As String ' Log the error code raised by Visual Basic ShowError errInvalidFile, gstrSource, Dim intPos As Integer Call LogErrors(Errors) strFileName, _ Dim intStart As Integer gstrSource = mstrModuleName & DoWriteError:=False "MakePathValid" OpenFileSM = 0 On Error GoTo MakePathValidErr ' Log the filename for debug gstrSource = mstrModuleName & Call WriteError(errInvalidFile, gstrSource, End Function "MakePathValid" strTempFile) Public Function CreateTempFile() As String On Error GoTo 0 strTempFile = strFileName Err.Raise vbObjectError + errProgramError, Dim strTempFileDir As String intPos = InstrR(strFileName, gstrSource, _ Dim strTempFileName As String gstrFileSeparator) LoadResString(errProgramError) HP TPC-H FULL DISCLOSURE REPORT 422 © 2005 Hewlett-Packard Company. All rights reserved. Static lngLastFileIndex As Long ' Remove the file info from the cNewParameter.ParameterValue = collection of open files CheckForNullField( _ On Error GoTo CreateTempFileErr mOpenFiles.Unload rstWorkSpaceParameters, FileToClose.Position "parameter_value") strTempFileDir = GetTempFileDir() End If cNewParameter.WorkspaceId = CStr( _ End If Do ErrorOnNullField(rstWorkSpaceParameters, If lngLastFileIndex = End Sub FLD_ID_WORKSPACE)) mlngMaxFileIndex Then Public Sub CloseOpenFiles() cNewParameter.ParameterType = CStr( _ On Error GoTo 0 Dim lIndex As Long Err.Raise vbObjectError + ErrorOnNullField(rstWorkSpaceParameters, errMaxTempFiles, gstrSource, _ If Not mOpenFiles Is Nothing Then "parameter_type")) For lIndex = mOpenFiles.Count - 1 To 0 cNewParameter.Description = LoadResString(errMaxTempFiles) CloseFileSM CheckForNullField( _ End If (mOpenFiles(lIndex).FileName) rstWorkSpaceParameters, "description") Next lIndex lngLastFileIndex = lngLastFileIndex + End If cParamCol.Load cNewParameter 1 strTempFileName = End Sub Set cNewParameter = Nothing mstrTempFilePrefix & _ rstWorkSpaceParameters.MoveNext Format$(lngLastFileIndex, Attribute VB_Name = "ParameterCommon" Wend mstrFileIndexFormat) & _ ' FILE: ParameterCommon.bas mstrTempFileSuffix ' Microsoft TPC-H Kit Ver. 1.00 Exit Sub ' Copyright Microsoft, 1999 If Not ' All Rights Reserved LoadRecordsetInParameterArrayErr: StringEmpty(Dir$(strTempFileDir & ' LogErrors Errors strTempFileName)) Then ' gstrSource = mstrModuleName & ' Remove any files left over from a ' PURPOSE: Contains functionality common "LoadRecordsetInParameterArray" previous run, across StepMaster and On Error GoTo 0 ' if they still exist ' SMRunOnly, pertaining to parameters Err.Raise vbObjectError + Kill strTempFileDir & ' Specifically, functions to load errLoadRsInArrayFailed, gstrSource, _ strTempFileName parameter records LoadResString(errLoadRsInArrayFailed) End If ' in an array. End Sub ' Contact: Reshma Tharamal Attribute VB_Name = "Public" ' Looping in case the file delete doesn't go ([email protected]) ' FILE: Public.bas through for ' ' Microsoft TPC-H Kit Ver. 1.00 ' some reason Option Explicit ' Copyright Microsoft, 1999 Loop While Not ' All Rights Reserved StringEmpty(Dir$(strTempFileDir & ' Used to indicate the source module name ' strTempFileName)) when errors ' ' are raised by this module ' PURPOSE: This module contains all the public CreateTempFile = Private Const mstrModuleName As String = constants for this project GetShortName(strTempFileDir) "P arameterCommon." ' Contact: Reshma Tharamal CreateTempFile = CreateTempFile & ([email protected]) strTempFileName Public Sub ' LoadRecordsetInParameterArray(rstWorkSpac Option Explicit Exit Function eParameters As Recordset, _ cParamCol As cArrParameters) Public Const gsVersion01 As String = "0.1" CreateTempFileErr: Public Const gsVersion10 As String = "1.0" ' Log the error code raised by Visual Dim cNewParameter As cParameter Public Const gsVersion21 As String = "2.1" Basic Public Const gsVersion23 As String = "2.3" Call LogErrors(Errors) On Error GoTo Public Const gsVersion24 As String = "2.4" gstrSource = gstrSource & LoadRecordsetInParameterArrayErr Public Const gsVersion241 As String = "2.4.1" "CreateTempFile" Public Const gsVersion242 As String = "2.4.2" On Error GoTo 0 If rstWorkSpaceParameters.RecordCount = Public Const gsVersion243 As String = "2.4.3" Err.Raise vbObjectError + 0 Then Public Const gsVersion25 As String = "2.5" errProgramError, gstrSource, _ Exit Sub Public Const gsVersion251 As String = "2.5.1" LoadResString(errProgramError) End If Public Const gsVersion253 As String = "2.5.3" Public Const gsVersion254 As String = "2.5.4" End Function rstWorkSpaceParameters.MoveFirst Public Const gsVersion255 As String = "2.5.5" Public Sub CloseFileSM(strFileName As While Not rstWorkSpaceParameters.EOF Public Const gsVersion As String = gsVersion255 String) Dim FileToClose As cFileInfo Set cNewParameter = New cParameter ' The same form is used for the creation of new nodes and If Not mOpenFiles Is Nothing Then ' Initialize parameter values ' updates to existing nodes (where each node can be cNewParameter.ParameterId = a parameter, ' Get the handle to the open file, if it rstWorkSpaceParameters.Fields(0) ' global step, etc.) A tag is set on each flag is used to exists indicate Set FileToClose = ' Call a procedure to raise an error if ' whether it is being called in the insert or update GetFileHandle(strFileName) mandatory fields are mode. The ' null. ' constants for these modes are defined below If Not FileToClose Is Nothing Then cNewParameter.ParameterName = CStr( _ Public Const gstrInsertMode = "Insert" Close FileToClose.FileHandle Public Const gstrUpdateMode = "Update" ErrorOnNullField(rstWorkSpaceParameters, Public Const gstrPropertiesMode = "View" "parameter_name")) HP TPC-H FULL DISCLOSURE REPORT 423 © 2005 Hewlett-Packard Company. All rights reserved. Public Const gstrEmptyString = "" Public Const gintDefinition = 0 ' step, workspace, etc. Public Const gstrSQ = "'" Public Const gintExecution = 1 Public Const glMinId As Long = 1 Public Const gstrDQ = """" Public Const gintMgrDefinition = 2 Public Const glInvalidId As Long = -1 Public Const gstrVerSeparator = "." Public Const gintPreExecutionSteps = 3 Public Const gstrBlank = " " Public Const gintPostExecutionSteps = 4 ' A parameter that has a special meaning to Public Const gintFileLocations = 5 Stepmaster ' Constants used to indicate type of node ' The system time will be substituted wherever it being processed ' These constants correspond to the index occurs ' The constants for the different objects values in the imagelist ' (typically as a part of the error, log ... file names correspond to the ' associated with the tree view control. The Public Const gstrTimeStamp As String = ' indexes in the menu control arrays (for imagelist contains "TIMESTAMP" both the main and popup ' the icons that will be displayed for each node. Public Const gstrEnvVarSeparator = "%" ' menus) that are used to create new objects. Public Enum TreeImages Public Const gstrFileSeparator = "\" That way we can gintImageWorkspaceClosed = 1 Public Const gstrUnderscore = "_" ' use the index passed in by the click event gintImageWorkspaceOpen to determine the gintImageLabelClosed ' Constants used by date and time formatting ' type of node being processed gintImageLabelOpen functions Public Const gintWorkspace = 1 gintImageManagerClosedDis Public Const gsTimeSeparator = ":" gintImageManagerClosedEn Public Const gsDateSeparator = "-" ' Decided to leave it here after some debate gintImageManagerOpenDis Public Const gsMsSeparator = "." over whether it gintImageManagerOpenEn Public Const gsDtFormat = "00" ' actually belongs in the cStep class gintImageWorkerDis Public Const gsYearFormat = "0000" definition gintImageWorkerEn Public Const gsTmFormat = "00" Public Enum gintStepType gintImageGlobalClosed Public Const gsMSecondFormat = "000" gintGlobalStep = 3 gintImageGlobalOpen gintManagerStep gintImageParameter ' Default nothing value for a date variable gintWorkerStep gintImageRun Public Const gdtmEmpty As Currency = 0 End Enum gintImagePending gintImageStop Public Const FMT_WSP_LOG_FILE As String = Public Const gintRunManager = 6 gintImageDisabled "yyyymmdd-hhnnss" Public Const gintRunWorker = 7 gintImageAborted gintImageFailed Public gsContCriteria() As String Public Enum gintParameterNodeType End Enum ' Note: Update the initialization of gintParameter = 8 gsExecutionStatus in Initialize() if the gintNodeParamConnection ' Public variable used to indicate the name of ' InstanceStatus values are modified - also the gintNodeParamExtension the function boundary checks gintNodeParamBuiltIn ' that raises an error Public gsExecutionStatus() As String End Enum Public gstrSource As String Public Const gsConnTypeStatic As String = ' Leave some constants free for newer types ' Public instances of the different collections "Static" of parameters (?) Public gcParameters As cArrParameters Public Const gsConnTypeDynamic As String = Public Const gintConnectionDtl = 15 Public gcSteps As cArrSteps "Dynamic" Public gcConstraints As cArrConstraints Public Enum gintLabelNodeType Public gcConnections As cConnections #If RUN_ONLY Then gintGlobalsLabel = 21 Public gcConnDtls As cConnDtls Public Const gsCaptionRunWsp As String = "Run gintParameterLabel Workspace" gintParamConnectionLabel ' Public constants for the index values of the #End If gintParamExtensionLabel different toolbar gintParamBuiltInLabel ' options. Will be used while dynamically ' Valid operations on a cNode object gintConnDtlLabel enabling/disabling Public Enum Operation gintGlobalStepLabel ' these options. QueryOp = 1 gintStepLabel Public Const tbNew = 1 InsertOp = 2 End Enum Public Const tbOpen = 2 UpdateOp = 3 Public Const tbSave = 3 DeleteOp = 4 Public Enum ConnectionType End Enum ConnTypeStatic = 1 Public Const tbCut = 5 ConnTypeDynamic Public Const tbCopy = 6 Attribute VB_Name = "RunCommon" End Enum Public Const tbPaste = 7 ' FILE: RunCommon.bas Public Const tbDelete = 8 ' Microsoft TPC-H Kit Ver. 1.00 Public Const giDefaultConnType As Integer ' Copyright Microsoft, 1999 = ConnTypeStatic Public Const tbProperties = 10 ' All Rights Reserved Public Const tbRun = 11 ' ' The constants defined below are used to Public Const tbStop = 12 ' identify the different ' PURPOSE: Contains common functions that are ' tabs. If any more step properties and ' The initial version # used during the execution thereby tabs are added Public Const gstrMinVersion As String = "0.0" ' of a workspace. ' to the tabbed dialog on the Step Properties Public Const gstrGlobalParallelism As String = ' Contact: Reshma Tharamal form, they should "0 " ([email protected]) ' be defined here and accessed in the code Public Const gintMinParallelism As Integer = ' only using these 1 Option Explicit ' pre-defined constants Public Const gintMaxParallelism As Integer = ' Note: These constants will mainly be used 100 ' Used to indicate the source module name when by the functions that errors ' initialize, customize and display the Step ' Constant for the minimum identifier, used for ' are raised by this class Properties form all identifier, viz. HP TPC-H FULL DISCLOSURE REPORT 424 © 2005 Hewlett-Packard Company. All rights reserved. Private Const mstrModuleName As String = ' Microsoft TPC-H Kit Ver. 1.00 intConsType As ConstraintType) As Variant ".RunCommon." ' Copyright Microsoft, 1999 ' Returns a variant containing all the constraint ' All Rights Reserved records in the order ' ' in which they should be executed Public Function ' GetInstanceItValue(cInstanceRec As ' PURPOSE: This module contains helper Dim vntTemp As Variant cInstance) As String procedures that are called by Dim lngOuter As Long ' cRunInst.cls Dim lngInner As Long ' Returns the iterator value for the ' Contact: Reshma Tharamal Dim cTempConstraint As cConstraint instance, if an ([email protected]) Dim cConstraints() As cConstraint ' iterator has been defined for it ' Dim lngConsCount As Long Dim cStepIt As cRunColIt Option Explicit Dim lngLbound As Long Dim cRunIterator As cRunItNode Dim lngUbound As Long ' Used to indicate the source module name Dim lngStep As Long On Error GoTo GetInstanceItValueErr when errors ' are raised by this class On Error GoTo OrderConstraintsErr ' Since we create a dummy instance for Private Const mstrModuleName As String = Disabled and Pending steps, "RunInstHelper." If intConsType = gintPreStep Then ' doesn't make sense to look at their ' Since we are travelling up and we need to iterators ' Should be equal to the number of steps execute the constraints If cInstanceRec.Status <> gintDisabled defined in cRunInst.cls ' for the top-level steps first, reverse the order And cInstanceRec.Status <> gintPending Public Const glngNumConcurrentProcesses As that they Then Long = 99 ' have been stored in the array Set cStepIt = cInstanceRec.Iterators Public Const gintBitsPerByte = 8 lngLbound = UBound(vntTempCons) Public Function AnyStepRunning(cFreeSteps lngUbound = LBound(vntTempCons) If Not As cVectorLng, arrFree() As Byte) As Boolean lngStep = -1 StringEmpty(cInstanceRec.Step.IteratorNam Else e) Then Dim lngIndex As Long lngLbound = LBound(vntTempCons) If cStepIt.Count > 0 Then Dim intPosInByte As Integer lngUbound = UBound(vntTempCons) Set cRunIterator = cStepIt(0) Dim lngTemp As Long lngStep = 1 BugAssert End If cRunIterator.IteratorName = ' Check if there are any running instances to cInstanceRec.Step.IteratorName, _ wait for lngConsCount = 0 "The first iterator in the If cFreeSteps.Count <> collection is the " & _ glngNumConcurrentProcesses Then For lngOuter = lngLbound To lngUbound Step "o ne that has been defined for lngStep the step." ' For every free step, reset the vntTemp = vntTempCons(lngOuter) If cRunIterator.IteratorName = corresponding element cInstanceRec.Step.IteratorName Then ' in the byte array to 0 If Not IsEmpty(vntTemp) Then GetInstanceItValue = For lngIndex = 0 To cFreeSteps.Count - 1 ' Each of the elements is an array cRunIterator.Value For lngInner = LBound(vntTemp) To Else lngTemp = cFreeSteps(lngIndex) \ UBound(vntTemp) Step 1 GetInstanceItValue = gintBitsPerByte If Not IsEmpty(vntTemp(lngInner)) Then gstrEmptyString intPosInByte = cFreeSteps(lngIndex) Set cTempConstraint = End If Mod gintBitsPerByte vntTemp(lngInner) Else GetInstanceItValue = arrFree(lngTemp) = arrFree(lngTemp) If Not cTempConstraint Is Nothing gstrEmptyString Xor 2 ^ intPosInByte Then End If Next lngIndex ReDim Preserve Else cConstraints(lngConsCount) GetInstanceItValue = AnyStepRunning = False Set cConstraints(lngConsCount) = gstrEmptyString cTempConstraint End If ' Check if we have a non-zero bit in the lngConsCount = lngConsCount + 1 Else byte array End If GetInstanceItValue = gstrEmptyString For lngIndex = LBound(arrFree) To End If End If UBound(arrFree) Step 1 Next lngInner If arrFree(lngIndex) <> 0 Then End If Exit Function ' We are waiting for a step to Next lngOuter complete GetInstanceItValueErr: AnyStepRunning = True ' Set the return value of the function to the array ' Log the error code raised by Visual Exit For of Basic End If ' constraints that has been built above Call LogErrors(Errors) Next lngIndex If lngConsCount = 0 Then On Error GoTo 0 OrderConstraints = Empty gstrSource = mstrModuleName & Else Else "GetInstanceItValue" AnyStepRunning = False OrderConstraints = cConstraints() Err.Raise vbObjectError + End If End If errProgramError, gstrSource, _ LoadResString(errProgramError) End Function Exit Function

End Function OrderConstraintsErr: Public Function ' Log the error code raised by Visual Basic OrderConstraints(vntTempCons() As Variant, Call LogErrors(Errors) Attribute VB_Name = "RunInstHelper" _ On Error GoTo 0 ' FILE: RunInstHelper.bas HP TPC-H FULL DISCLOSURE REPORT 425 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + MultiUse = -1 'True errUpgradeFailed errExecInstanceFailed, _ END errFindStepSequenceFailed mstrModuleName, Attribute VB_Name = "cArrConstraints" errFindParentStepIdFailed LoadResString(errExecInstanceFailed) Attribute VB_GlobalNameSpace = False errCircularReference = 1050 Attribute VB_Creatable = True errAddStepFailed End Function Attribute VB_PredeclaredId = False errModifyStepFailed Attribute VB_Name = "ShellSM" Attribute VB_Exposed = False errDeleteColumnFailed ' FILE: ShellSM.bas ' FILE:Attribute VB_Name = "SMErr" errFindPositionFailed ' Microsoft TPC-H Kit Ver. 1.00 ' FILE: SMErr.bas errDeleteStepFailed ' Copyright Microsoft, 1999 ' Microsoft TPC-H Kit Ver. 1.00 errRunExistsForStepFailed ' All Rights Reserved ' Copyright Microsoft, 1999 errCreateNewParentFailed ' ' All Rights Reserved errInsertNewStepVersionFailed ' ' errCreateNewStepFailed ' PURPOSE: This module contains a ' errDuplicateParameterName = 1060 function that creates a process and ' PURPOSE: This module contains error errCheckDupParameterNameFailed ' waits for it to complete. code for all the errors that are errConstraintTypeInvalid ' Contact: Reshma Tharamal ' raised by StepMaster. errConstraintTypeLetFailed ([email protected]) ' Contact: Reshma Tharamal errAddConstraintFailed ' ([email protected]) errWorkspaceIdMandatory Option Explicit ' errInvalidWorkspaceData Option Explicit errGetWorkspaceDetailsFailed Public Function SyncShell(CommandLine errNoWorkspaceLoaded As String, Optional Timeout As Long, _ ' A public enum containing the codes for all the errWorkspaceAlreadyOpen Optional WaitForInputIdle As Boolean) error errDuplicateWorkspaceName = 1070 As Boolean ' messages that will be displayed by the project errWorkspaceNameMandatory - each errWorkspaceNameSetFailed Dim proc As ' of the codes has the prefix, err errWorkspaceIdInvalid PROCESS_INFORMATION Public Enum errErrorConstants errWorkspaceIdSetFailed Dim Start As STARTUPINFO errParameterIdInvalid = 1000 errWorkspaceInsertFailed Dim ret As Long errParameterNameMandatory errWorkspaceDeleteFailed Dim nMilliseconds As Long errParameterInsertFailed errWorkspaceUpdateFailed errStepLabelOrTextOrFileRequired errInvalidFile BugMessage "Executing: " & errMandatoryNodeTextMissing errCheckWorkspaceOpenFailed CommandLine errParameterUpdateFailed errWriteFailed = 1080 If Timeout > 0 Then errDupConnDtlName errDeleteParameterRecordFailed nMilliseconds = Timeout errDummy14 errUnableToLogOutput Else errContCriteriaMandatory errDeleteDBRecordFailed nMilliseconds = INFINITE errContCriteriaNullForGlobal errRunExistsForWorkspaceFailed End If errContCriteriaInvalid = 1010 errClearHistoryFailed errParamSeparatorMissing errCreateDBFailed 'Initialize the STARTUPINFO structure: errStepTextOrTextFileMandatory errImportWspFailed Start.cb = Len(Start) errStepTextOrFile errStepModifyFailed Start.dwFlags = errEnabledFlagFalseForGlobal errStepDeleteFailed STARTF_USESHOWWINDOW errEnabledFlagLetFailed errDummy3 = 1090 Start.wShowWindow = errDegParallelismNullForGlobal errUnableToGetWorkspace SW_SHOWMINNOACTIVE errInvalidDegParallelism errInvalidNode errExecutionMechanismInvalid errUnableToRemoveSubtree 'Start the shelled application: errExecutionMechanismLetFailed errSetFileNameFailed CreateProcessA 0&, CommandLine, 0&, errStepLevelNull = 1020 errStepTypeInvalid 0&, 1&, _ errStepLevelZeroForGlobal errObjectMandatory NORMAL_PRIORITY_CLASS, 0&, errStepLevelLetFailed errBuiltInUpdateOnly 0&, Start, proc errRowCountNumeric errInvalidStep errConnNameInvalid errTypeOfStepFailed If WaitForInputIdle Then errTimeoutNumeric errGetParentKeyFailed = 1100 'Wait for the shelled application to errResetConnPropertiesFailed errLabelTextAndFileCheckFailed finish setting up its UI: errFailureThresholdNumeric errStepTextAndFileNull ret = InputIdle(proc.hProcess, errConnectionUpdateFailed errTextOrFileCheckFailed nMilliseconds) errGlobalRunMethodMandatory errParentStepManager Else errGlobalRunMethodNull = 1030 errDeleteSubStepsFailed 'Wait for the shelled application to errGlobalRunMethodInvalid errWorkspaceNameDuplicateFailed terminate: errGlobalRunMethodLetFailed errNewConstraintVersionFailed ret = errNoTrueOption errDeleteStepConstraintsFailed WaitForSingleObject(proc.hProcess, errGetOptionFailed errOldVersionMandatory nMilliseconds) errSetEnabled errLoadConstraintsInListFailed = 1110 End If errStepLabelTextAndFileNull errLoadGlobalStepsFailed errInvalidNodeType errDeleteConstraintFailed CloseHandle proc.hProcess errSetOptionFailed errUpdateConstraintFailed errQueryParameterFailed errConstraintIdInvalid 'Return True if the application finished. errParamNotFound = 1040 errConstraintIdSetFailed Otherwise it timed out or erred. errQueryStepFailed errGlobalStepIdInvalid SyncShell = (ret = WAIT_OBJECT_0) errStepNotFound errGlobalStepIdSetFailed End Function errReadFromScreenFailed errUpdateVersionFailed errCopyPropertiesToFormFailed errQueryAdjacentConsFailed VERSION 1.0 CLASS errMandatoryFieldNull errConstraintNotFound = 1120 BEGIN errUnableToCheckNull errQueryConstraintFailed HP TPC-H FULL DISCLOSURE REPORT 426 © 2005 Hewlett-Packard Company. All rights reserved. errSetDBBeforeLoad errDummy errDeleteArrayElementFailed errLoadDataFailed errUnableToPreviewFile errSaveWorkspaceFailed errLoadRsInArrayFailed errCopyWorkspaceFailed errInitializeFailed errConstraintsForStepFailed errCopyParameterFailed = 1200 errLoadInArrayFailed errPreConstraintsForStepFailed errGetStepTypeAndPositionFailed errSaveStepsInWspFailed errPostConstraintsForStepFailed errCopyStepFailed errCommitStepFailed errExecuteConstraintMethodFailed errMandatoryParameterMissing errStepIdGetFailed errIdOrKeyMandatory errDeleteWorkspaceRecordsFailed errUnloadFromArrayFailed errInListFailed = 1130 errCreateDirectoryFailed errValidateFailed = 1280 errUnableToWriteChanges errConfirmDeleteOrMoveFailed errTextEnteredFailed errQuickSortFailed errCreateWorkspaceFailed errStepLabelMandatory errCheckParentValidFailed errTypeOfObjectFailed errTextAndFileNullForManager errLogErrorFailed errCreateNodeFailed errFailureDetailsNullForMgr errCopyListFailed errCreateParameterFailed = 1210 errSetTabOrderFailed errConnected errInsertParameterFailed errSaveWspConstraintsFailed errVersionMismatch errCreateStepFailed errCommitConstraintFailed errStepNodeFailed errNoConstraintsCreated errUnloadStepConstraintsFailed errWorkspaceSelectedFailed errCopyFailed errUnableToModifyMenu errIdentifierSelectedFailed = 1140 errCloneFailed errConfirmFailed = 1290 errCheckForNullFieldFailed errCloneGlobalFailed errInitSubItemsFailed errInstanceInUse errCloneWorkerFailed errUpdateListNodeFailed errSetVisiblePropertyFailed errCloneManagerFailed errAddNodeFailed errExportWspFailed errLetStepTypeFailed errLoadListNodeFailed errMakeKeyValidFailed errUnableToCloseWorkspace = 1220 errAddListNodeFailed errDummy16 errUnableToModifyWorkspace errExecutionFailed errRunApplicationFailed errUnableToCreateWorkspace errSetListViewStyleFailed errStepLabelUnique errAddArrayElementFailed errSetCheckedFailed errDeleteSingleFile errUpdateSequenceFailed errGetCheckedFailed errMakeIdentifierValidFailed = 1150 errCannotCopySubSteps errUnableToProcessListViewDblClick = 1300 errTypeOfNodeFailed errSubStepsFailed errDefaultPosition errConstraintCommandFailed errModifyInArrayFailed errShellFailed errOpenDbFailed errUpdateParentVersionFailed errOpenFileFailed errInsertNewConstraintsFailed errGetNodeTextFailed errSetTBar97Failed errLoadPostExecutionStepsFailed errAddToArrayFailed = 1230 errConnectFailed errLoadPreExecutionStepsFailed errDeleteFromArrayFailed errApiFailed errCreateNewNodeFailed errQueryIndexFailed errRegEntryInvalid errDeleteNodeFailed errCreateNewConstraintVersionFailed errParseStringFailed errDisplayPopupFailed errGetRootNodeFailed errConstraintsForWspFailed errDisplayPropertiesFailed = 1160 errPopulateWspDetailsFailed errPostConstraintsForWspFailed = 1310 errUnableToCreateNewObject errLoadRsInTreeFailed errPreConstraintsForWspFailed errDiffFailed errAddNodeToTreeFailed errLoadWspPostExecStepsFailed errLoadWorkspaceFailed errMaxTempFiles errLoadWspPreExecStepsFailed errTerminateProcessFailed errMoveFailed errLoadConstraintsOnFormFailed errCompareFailed errRootNodeKeyInvalid = 1240 errQueryFailed errCreateConnectionFailed errNextNodeFailed errPasteNodeFailed errShowFormFailed errBranchWillMove errShowAllWorkspacesFailed errAbortFailed errMoveBranchInvalid errMakeFieldValidFailed errDeleteParameterFailed errCreateIdRecordsetFailed errInitializeTree errUpdateViewFailed = 1170 errIdentifierColumnFailed errRootNodeFailed = 1320 errParameterNewFailed errGetIdentifierFailed errDirectionInvalid errCopyNodeFailed errGetStepTypeFailed errUnableToDetListProperty errCutNodeFailed errUpdateConstraintSeqFailed errUnableToGetListData errCheckObjectValidFailed errDelParamsInWspFailed errItemNotFound errDeleteViewNodeFailed errDuplicateConnectionName = 1250 errItemDoesNotExist errMainFailed errOpenWorkspaceFailed errParamNameInvalid errNewStepFailed errShowWorkspaceNewFailed errGetParamValueFailed errProcessStepModifyFailed errShowWorkspaceModifyFailed errSubValuesFailed errCustomizeStepFormFailed errPopulateListFailed errStringOpFailed errInitializeStepFormFailed = 1180 errExploreNodeFailed errReadWorkspaceDataFailed = 1330 errInsertStepFailed errInitializeListNodeFailed errUpdateRunDataFailed errIncVersionYFailed errMakeListColumnsFailed errProgramError errIncVersionXFailed errRefreshViewFailed errUnableToOpenFile errShowCreateStepFormFailed errExploreFailed errLoadRunDataFailed errShowStepFormFailed errCollapseNodeFailed = 1260 errExecuteODBCCommandFailed errStepNewFailed errUnableToProcessListViewClick errRunWorkspaceFailed errUnableToApplyChanges errSetEnabledForStepFailed errExecuteStepFailed errUnableToCommitChanges errDisplayStepFormFailed errUnableToWriteError errGetStepNodeTextFailed errSetEnabledPropertyFailed errRunStepFailed errSelectGlobalRunMethodFailed = 1190 errInvalidDB errSaveChanges = 1340 errConnectionNameMandatory errDeleteConnectionFailed errDragDropFailed errUpdateStepFailed errInvalidOperation errInvalidParameter errBrowseFailed errLetOperationFailed errAssignParametersFailed errDummy4 errIdGetFailed errLoadLabelsInTreeFailed errDummy1 errCommitFailed = 1270 errInstrRFailed errDummy2 errSaveParametersInWspFailed errInsertIteratorFailed HP TPC-H FULL DISCLOSURE REPORT 427 © 2005 Hewlett-Packard Company. All rights reserved. errDeleteIteratorFailed ' Log the error code raised by Visual Basic If (intUBound - intLBound) = 1 Then errTypeInvalid Call LogErrors(Errors) If Compare(vntArray(intLBound), errLoadFailed On Error GoTo 0 vntArray(intUBound)) > 0 Then errDeleteFailed = 1350 Err.Raise vbObjectError + Call Swap(vntArray(intLBound), errModifyFailed errCompareFailed, _ vntArray(intUBound)) errIteratorsFailed gstrSource, _ End If errInsertFailed LoadResString(errCompareFailed) Exit Sub errUpdateFailed End If errDuplicateIterator End Function errSaveFailed ' Set the pivot point errReadDataFailed Private Sub Swap(ByRef vntToSwap1 As Set vntMid = vntArray(intUBound) errUnloadFailed Variant, _ i = intLBound errAddFailed ByRef vntToSwap2 As Variant) j = intUBound errExecuteBranchFailed = 1360 errRangeNumeric Dim vntTemp As Variant Do errRangeInvalid ' Move in from both sides towards pivot errNextStepFailed On Error GoTo SwapErr element errUpdateDisplayFailed Do While (i < j) And Compare(vntArray(i), errDateToStringFailed If IsObject(vntToSwap1) And vntMid) <= 0 errGetElapsedTimeFailed IsObject(vntToSwap2) Then i = i + 1 errMaxProcessesExceeded Set vntTemp = vntToSwap1 Loop errInvalidProperty Set vntToSwap1 = vntToSwap2 errInvalidChild Set vntToSwap2 = vntTemp Do While (j > i) And Compare(vntArray(j), errCreateInstanceFailed = 1370 Else vntMid) >= 0 errInvalidForWorker vntTemp = vntToSwap1 j = j - 1 errInstanceOpFailed vntToSwap1 = vntToSwap2 Loop errNavInstancesFailed vntToSwap2 = vntTemp errIterateFailed End If If i < j Then errExecInstanceFailed Call Swap(vntArray(i), vntArray(j)) errDupIterator Exit Sub End If End Enum Loop While i < j Attribute VB_Name = "SortSM" SwapErr: ' FILE: SortSM.bas ' Log the error code raised by Visual Basic ' Since i has been adjusted, swap element i with ' Microsoft TPC-H Kit Ver. 1.00 Call LogErrors(Errors) element, ' Copyright Microsoft, 1999 On Error GoTo 0 ' intUBound ' All Rights Reserved Err.Raise vbObjectError + Call Swap(vntArray(i), vntArray(intUBound)) ' errQuickSortFailed, mstrModuleName & ' "Swap", _ ' Recursively call sort array - pass smaller ' PURPOSE: This module contains an LoadResString(errQuickSortFailed) subdivision implementation of QuickSort. ' first to conserve stack space ' Contact: Reshma Tharamal End Sub If (i - intLBound) < (intUBound - 1) Then ([email protected]) ' Recursively sort with adjusted values for ' Public Sub QuickSort(vntArray As Variant, _ upper and Option Explicit Optional ByVal intLBound As Integer, _ ' lower bounds Optional ByVal intUBound As Integer) Call QuickSort(vntArray, intLBound, i - 1) ' Comment out for case-sensitive sorts ' Sorts a variant array using Quicksort Call QuickSort(vntArray, i + 1, intUBound) Option Compare Text Else Dim i As Integer Call QuickSort(vntArray, i + 1, intUBound) ' Used to indicate the source module name Dim j As Integer Call QuickSort(vntArray, intLBound, i - 1) when errors Dim vntMid As Variant End If ' are raised by this module Exit Sub Private Const mstrModuleName As String = On Error GoTo QuickSortErr "SortSM." QuickSortErr: If IsEmpty(vntArray) Or _ Call LogErrors(Errors) Private Function Compare(ByVal Not IsArray(vntArray) Then On Error GoTo 0 vntToCompare1 As Variant, _ Exit Sub Err.Raise vbObjectError + errQuickSortFailed, ByVal vntToCompare2 As Variant) As End If mstrModuleName & "QuickSort", _ Integer LoadResString(errQuickSortFailed) ' Set default boundary values for first time On Error GoTo CompareErr through End Sub If intLBound = 0 And intUBound = 0 Then Attribute VB_Name = "Startup" Compare = 0 intLBound = LBound(vntArray) ' FILE: Startup.bas intUBound = UBound(vntArray) ' Microsoft TPC-H Kit Ver. 1.00 If vntToCompare1.SequenceNo < End If ' Copyright Microsoft, 1999 vntToCompare2.SequenceNo Then ' All Rights Reserved Compare = -1 ' BugMessage "Sorting elements " & ' ElseIf vntToCompare1.SequenceNo > Str(intLBound) & " and " & Str(intUBound) ' vntToCompare2.SequenceNo Then ' PURPOSE: This module contains startup and Compare = 1 If intLBound > intUBound Then cleanup functions for the project. End If Exit Sub ' Contact: Reshma Tharamal End If ([email protected]) Exit Function ' ' Only two elements in this subdivision; Option Explicit CompareErr: exchange if they ' are out of order and end recursive calls Public Const LISTVIEW_BUTTON = 14 HP TPC-H FULL DISCLOSURE REPORT 428 © 2005 Hewlett-Packard Company. All rights reserved. ' Mousepointer should indicate busy If Mid(sDb, 1, 1) = gstrDQ Then Public gstrProjectPath As String Call ShowBusy If Len(sDb) > 1 Then sDb = Mid(sDb, 2) ' Used to indicate the source module name ' Display the Splash screen while we carry Else when errors out some initialization sDb = gstrEmptyString ' are raised by this module frmSplash.Show End If Private Const mstrModuleName As String = frmSplash.Refresh End If "Startup." End If gstrProjectPath = App.Path Private Sub Initialize() If Len(sDb) > 0 Then ' Open the database If Mid(sDb, Len(sDb), 1) = gstrDQ Then On Error GoTo InitializeErr If OpenDBFile() = False Then If Len(sDb) > 1 Then Unload frmSplash sDb = Mid(sDb, 1, Len(sDb) - 1) ReDim Exit Sub Else gsContCriteria(gintOnFailureAbort To End If sDb = gstrEmptyString gintOnFailureAsk) As String End If gsContCriteria(gintOnFailureAbort) = #If Not RUN_ONLY Then End If "Abort" Load frmMain End If gsContCriteria(gintOnFailureContinue) = #End If "Continue" ' Enable the Stop Run menu options only when a workspace is ' Open the database gsContCriteria(gintOnFailureCompleteSibli ' actually running OpenDBFile = SMOpenDatabase(sDb) ngs) = "Execute sibling steps and stop" Call EnableStop(False) Exit Function gsContCriteria(gintOnFailureAbortSiblings) ' Clear all application extension menu items = "Abort sibling steps and execute next Call ClearToolsMenu OpenDBFileErr: parent" #End If Call LogErrors(Errors) OpenDBFile = False gsContCriteria(gintOnFailureSkipSiblings) Call Initialize = "Skip sibling steps and execute next End Function parent" ' Mousepointer - ready to accept user input Public Sub Cleanup() gsContCriteria(gintOnFailureAsk) = Call ShowFree "As k" On Error GoTo CleanupErr ' Unload the Splash screen and display the ReDim gsExecutionStatus(gintDisabled main form ' Set the mousepointer to indicate Busy To gintAborted) As String Unload frmSplash Call ShowBusy gsExecutionStatus(gintDisabled) = "Disabled" #If RUN_ONLY Then #If Not RUN_ONLY Then gsExecutionStatus(gintPending) = frmWorkspaceOpen.Caption = ' Close all open workspaces - will also prompt for "P ending" gsCaptionRunWsp unsaved gsExecutionStatus(gintRunning) = ' changes "Running" Call ShowWorkspacesInDb(dbsAttTool) Call CloseOpenWorkspaces gsExecutionStatus(gintComplete) = #Else #End If "Complete" frmMain.Show gsExecutionStatus(gintFailed) = "Failed" #End If ' Close all open files gsExecutionStatus(gintAborted) = Call CloseOpenFiles "Stopped" Exit Sub ' Reset the mousepointer #If Not RUN_ONLY Then MainErr: Call ShowFree ' Call a procedure to change the style of ' Log the error code raised by Visual Basic the toolbar Call LogErrors(Errors) Exit Sub ' on the Step Properties form Call ShowFree Call Call ShowError(errMainFailed) CleanupErr: SetTBar97(frmSteps.tblConstraintCommand ' Log the error code raised by Visual Basic s) End Sub Call LogErrors(Errors) Private Function OpenDBFile() As Boolean Resume Next #End If Dim sDb As String End Sub Call InitRunEngine On Error GoTo OpenDBFileErr Attribute VB_Name = "StepCommon" ' FILE: StepCommon.bas Exit Sub #If RUN_ONLY Then ' Microsoft TPC-H Kit Ver. 1.00 ' Always use the registry setting for the ' Copyright Microsoft, 1999 InitializeErr: run_only mode ' All Rights Reserved ' Log the error code raised by Visual sDb = DefaultDBFile() ' Basic #Else ' Call LogErrors(Errors) ' Check if the user has specified the ' PURPOSE: Contains functionality common gstrSource = mstrModuleName & workspace defn. file to open on the command across StepMaster and "Initialize" line ' SMRunOnly, pertaining to steps Call ShowError(errInitializeFailed) ' Else, use the registry setting ' Specifically, functions to load iterators sDb = IIf(StringEmpty(Command), records End Sub DefaultDBFile(), Command) ' in an array, determine the type of step, etc. Sub Main() ' Contact: Reshma Tharamal If Len(sDb) > 0 Then ([email protected]) On Error GoTo MainErr ' Trim off the enclosing double-quotes if ' any Option Explicit HP TPC-H FULL DISCLOSURE REPORT 429 © 2005 Hewlett-Packard Company. All rights reserved. Public Function IsGlobal( _ ' Make the check whether a step is global first - ' Used to indicate the source module name Optional ByVal StepClass As cStep = both when errors Nothing, _ ' worker and global steps have the step text or file ' are raised by this module Optional ByVal StepRecord As Recordset name Private Const mstrModuleName As String = = Nothing, _ ' not null - but only the global step will have the "StepCommon." Optional ByVal StepKey As String = global gstrEmptyString, _ ' flag set ' Step property constants Optional ByVal StepId As Long = 0, _ If IsGlobal(StepClass, StepRecord, StepKey, Private Const mintMinFailureThreshold As Optional StepForm As Form = Nothing) StepId, StepForm) Then Integer = 1 As Boolean TypeOfStep = gintGlobalStep Public Const gintMinSequenceNo As ElseIf IsManager(StepClass, StepRecord, Integer = 1 ' This function contains all the possible StepKey, StepId, StepForm) Then Public Const gintMinLevel As Integer = 0 checks for whether TypeOfStep = gintManagerStep Public Function ' a step is global - The check that will be ElseIf IsWorker(StepClass, StepRecord, ValidateParallelism(sParallelism As String, made depends on StepKey, StepId, StepForm) Then lWorkspace As Long, _ ' the parameter passed in TypeOfStep = gintWorkerStep Optional ParamsInWsp As Else cArrParameters = Nothing) As String Dim cStepRecord As cStep On Error GoTo 0 ' Returns the degree of parallelism for the Err.Raise vbObjectError + errInvalidStep, _ step if the user input is valid If Not StepClass Is Nothing Then mstrModuleName & "TypeOfStep", _ Dim sTemp As String IsGlobal = StepClass.GlobalFlag LoadResString(errInvalidStep) Exit Function End If On Error GoTo ValidateParallelismErr End If gstrSource = mstrModuleName & Exit Function "ValidateParallelism" If Not StepRecord Is Nothing Then IsGlobal = StepRecord![global_flag] TypeOfStepErr: sTemp = Exit Function ' Log the error code raised by Visual Basic SubstituteParameters(Trim$(sParallelism), End If Call LogErrors(Errors) lWorkspace, On Error GoTo 0 WspParameters:=ParamsInWsp) If Not StringEmpty(StepKey) Then Err.Raise vbObjectError + errTypeOfStepFailed, IsGlobal = InStr(StepKey, _ If Not IsNumeric(sTemp) Then gstrGlobalStepPrefix) > 0 mstrModuleName & "TypeOfStep", _ ShowError errInvalidDegParallelism Exit Function LoadResString(errTypeOfStepFailed) On Error GoTo 0 End If Err.Raise vbObjectError + End Function errInvalidDegParallelism, gstrSource, _ If StepId <> 0 Then Set cStepRecord = Public Function IsStep(intNodeType As Integer) As LoadResString(errInvalidDegParallelism) gcSteps.QueryStep(StepId) Boolean Else IsGlobal = cStepRecord.GlobalFlag ' Returns true if the node type corresponds to a If (CInt(sTemp) < gintMinParallelism) Set cStepRecord = Nothing global, manager Or (CInt(sTemp) > gintMaxParallelism) Exit Function ' or worker step Then End If IsStep = (intNodeType = gintGlobalStep) Or ShowError errInvalidDegParallelism (intNodeType = gintManagerStep) Or _ On Error GoTo 0 If Not StepForm Is Nothing Then (intNodeType = gintWorkerStep) Err.Raise vbObjectError + IsGlobal = errInvalidDegParallelism, gstrSource, _ (StepForm.lblStepType.Caption = End Function Str(gintGlobalStep)) LoadResString(errInvalidDegParallelism) Exit Function Public Function IsManager(Optional ByVal Else End If StepClass As cStep = Nothing, _ ValidateParallelism = Optional ByVal StepRecord As Recordset = Trim$(sParallelism) ' Not a single object was passed in! - raise an Nothing, _ End If error Optional ByVal StepKey As String = End If On Error GoTo 0 gstrEmptyString, _ Err.Raise vbObjectError + Optional ByVal StepId As Long = 0, _ Exit Function errObjectMandatory, _ Optional StepForm As Form = Nothing) As mstrModuleName & "IsGlobal", _ Boolean ValidateParallelismErr: LoadResString(errObjectMandatory) ' Log the error code raised by Visual ' This function contains all the possible checks Basic End Function for whether gstrSource = mstrModuleName & Public Function TypeOfStep(Optional ByVal ' a step is a manager step - The check that will be "ValidateParallelism" StepClass As cStep = Nothing, _ made depends If Err.Number = vbObjectError + Optional ByVal StepRecord As Recordset ' on the parameter passed in errSubValuesFailed Then = Nothing, _ ShowError errInvalidDegParallelism Optional ByVal StepKey As String = Dim cStepRecord As cStep End If gstrEmptyString, _ Optional ByVal StepId As Long = 0, _ If Not StepClass Is Nothing Then Call LogErrors(Errors) Optional StepForm As Form = Nothing) IsManager = (StepClass.StepType = On Error GoTo 0 As Integer gintManagerStep) Err.Raise vbObjectError + ' Calls functions to determine the type of Exit Function errInvalidDegParallelism, gstrSource, _ step End If ' The check that will be made depends on the LoadResString(errInvalidDegParallelism) parameter passed in If Not StepRecord Is Nothing Then IsManager = (IsNull(StepRecord![step_text]) End Function On Error GoTo TypeOfStepErr And IsNull(StepRecord![step_file_name])) Exit Function HP TPC-H FULL DISCLOSURE REPORT 430 © 2005 Hewlett-Packard Company. All rights reserved. End If Set cStepRecord = cStepCol As cArrSteps) As Boolean gcSteps.QueryStep(StepId) If Not StringEmpty(StepKey) Then IsWorker = (cStepRecord.StepType = Dim cNewStep As cStep IsManager = (InStr(StepKey, gintWorkerStep) Dim cNewGlobal As cGlobalStep gstrManagerStepPrefix) > 0) Set cStepRecord = Nothing Dim cNewManager As cManager Exit Function Exit Function Dim cNewWorker As cWorker End If End If On Error GoTo LoadRecordsetInStepsArrayErr If StepId <> 0 Then If Not StepForm Is Nothing Then Set cStepRecord = IsWorker = If rstSteps.RecordCount = 0 Then gcSteps.QueryStep(StepId) (StepForm.lblStepType.Caption = Exit Function IsManager = (cStepRecord.StepType = Str(gintWorkerStep)) End If gintManagerStep) Exit Function Set cStepRecord = Nothing End If rstSteps.MoveFirst Exit Function While Not rstSteps.EOF End If ' Not a single object was passed in! - raise an ' For fields that should not be null, a procedure error is first If Not StepForm Is Nothing Then On Error GoTo 0 ' called to raise an error if the field is null IsManager = Err.Raise vbObjectError + (StepForm.lblStepType.Caption = errObjectMandatory, _ Set cNewStep = New cStep Str(gintManagerStep)) "Step.IsWorker", _ Exit Function LoadResString(errObjectMandatory) cNewStep.StepType = End If TypeOfStep(StepRecord:=rstSteps) End Function ' Not a single object was passed in! - raise Public Function GetStepNodeText(ByVal If cNewStep.StepType = gintGlobalStep Then an error cStepNode As cStep) As String Set cNewGlobal = New cGlobalStep On Error GoTo 0 Set cNewStep = cNewGlobal Err.Raise vbObjectError + On Error GoTo GetStepNodeTextErr ElseIf cNewStep.StepType = gintManagerStep errObjectMandatory, _ Then "Step.IsManager", _ ' Returns the string that will be displayed as Set cNewManager = New cManager LoadResString(errObjectMandatory) the text Set cNewStep = cNewManager ' in the tree view node to the user Else End Function If StringEmpty(cStepNode.StepLabel) Then Set cNewWorker = New cWorker Public Function IsWorker( _ Set cNewStep = cNewWorker Optional ByVal StepClass As cStep = If StringEmpty(cStepNode.StepTextFile) End If Nothing, _ Then Optional ByVal StepRecord As ' Initialize the global flag first, since Recordset = Nothing, _ If StringEmpty(cStepNode.StepText) subsequent Optional ByVal StepKey As String = Then ' validations might depend on whether the step gstrEmptyString, _ ' This should never happen is global Optional ByVal StepId As Long = 0, _ On Error GoTo 0 cNewStep.GlobalFlag = Optional StepForm As Form = Err.Raise vbObjectError + CBool(ErrorOnNullField(rstSteps, "global_flag")) Nothing) As Boolean errStepLabelTextAndFileNull, _ gstrSource, _ ' Initialize step values ' This function contains all the possible cNewStep.StepId = checks for whether LoadResString(errStepLabelTextAndFileNull) CLng(ErrorOnNullField(rstSteps, "step_id")) ' a step is a Worker step - The check that Else cNewStep.VersionNo = will be made depends GetStepNodeText = CStr(ErrorOnNullField(rstSteps, "version_no")) ' on the parameter passed in cStepNode.StepText End If cNewStep.StepLabel = Dim cStepRecord As cStep Else CheckForNullField(rstSteps, "step_label") GetStepNodeText = cNewStep.StepTextFile = If Not StepClass Is Nothing Then cStepNode.StepTextFile CheckForNullField(rstSteps, "step_file_name") IsWorker = (StepClass.StepType = End If cNewStep.StepText = gintWorkerStep) Else CheckForNullField(rstSteps, "step_text") Exit Function GetStepNodeText = cStepNode.StepLabel cNewStep.StartDir = End If End If CheckForNullField(rstSteps, "start_directory")

If Not StepRecord Is Nothing Then Exit Function cNewStep.WorkspaceId = IsWorker = (Not CLng(ErrorOnNullField(rstSteps, StepRecord![global_flag] And _ GetStepNodeTextErr: FLD_ID_WORKSPACE)) (Not ' Log the error code raised by Visual Basic cNewStep.ParentStepId = IsNull(StepRecord![step_text]) Or Not Call LogErrors(Errors) CLng(ErrorOnNullField(rstSteps, IsNull(StepRecord![step_file_name]))) On Error GoTo 0 "parent_step_id")) Exit Function Err.Raise vbObjectError + cNewStep.ParentVersionNo = End If errGetStepNodeTextFailed, _ CStr(ErrorOnNullField(rstSteps, gstrSource, _ "parent_version_no")) If Not StringEmpty(StepKey) Then IsWorker = InStr(StepKey, LoadResString(errGetStepNodeTextFailed) cNewStep.SequenceNo = gstrWorkerStepPrefix) > 0 CInt(ErrorOnNullField(rstSteps, "sequence_no")) Exit Function End Function cNewStep.StepLevel = End If CInt(ErrorOnNullField(rstSteps, "step_level")) Public Function cNewStep.EnabledFlag = If StepId <> 0 Then LoadRecordsetInStepsArray(rstSteps As CBool(ErrorOnNullField(rstSteps, "e nabled_flag")) Recordset, _ HP TPC-H FULL DISCLOSURE REPORT 431 © 2005 Hewlett-Packard Company. All rights reserved. ' Initialize the execution details for the As Long sDelete = "delete from run_header " step Private Declare Function KillTimer Lib dbFile.Execute sDelete, dbFailOnError cNewStep.DegreeParallelism = "user32" (ByVal hWnd As Long, _ CheckForNullField(rstSteps, ByVal nIDEvent As Long) As Long sDelete = "delete from run_step_details " "degree_parallelism") Private Declare Sub CopyMemory Lib dbFile.Execute sDelete, dbFailOnError cNewStep.ExecutionMechanism = "kernel32" Alias "RtlMoveMemory" ( _ CInt(ErrorOnNullField(rstSteps, pDest As Any, pSource As Any, ByVal sDelete = "delete from run_parameters " "e xecution_mechanism")) ByteLen As Long) dbFile.Execute sDelete, dbFailOnError cNewStep.FailureDetails = CheckForNullField(rstSteps, Public gcTimerObjects As Collection sDelete = "update att_identifiers " & _ "f ailure_details") " s et run_id = "& CStr(glMinId) cNewStep.ContinuationCriteria = Private Sub TimerProc(ByVal lHwnd As Long, dbFile.Execute sDelete, dbFailOnError CInt(ErrorOnNullField(rstSteps, ByVal lMsg As Long, _ "c ontinuation_criteria")) ByVal lTimerID As Long, ByVal lTime As Exit Sub Long) ' Initialize the output file locations for DeleteRunHistoryErr: the step Dim nPtr As Long LogErrors Errors cNewStep.OutputFile = Dim oTimerObject As cTimerSM Err.Raise vbObjectError + CheckForNullField(rstSteps, errDeleteDBRecordFailed, "DeleteRunHistory", _ "o utput_file_name") 'Create a Timer object from the pointer LoadResString(errDeleteDBRecordFailed) ' cNewStep.LogFile = nPtr = gcTimerObjects.Item(Str$(lTimerID)) CheckForNullField(rstSteps, CopyMemory oTimerObject, nPtr, 4 End Sub "l og_file_name") 'Call a method which will fire the Timer cNewStep.ErrorFile = event Public Function CreateConnectionsTableScript() As CheckForNullField(rstSteps, oTimerObject.Tick String "e rror_file_name") 'Get rid of the Timer object so that VB will ' Returns the table creation script for the not try to release it workspace_connections table ' Initialize the iterator name for the CopyMemory oTimerObject, 0&, 4 step, if any End Sub Call InitCreateSQLArray cNewStep.IteratorName = CreateConnectionsTableScript = CheckForNullField(rstSteps, Public Function StartTimer(lInterval As Long) sCreateTables(10) "i terator_name") As Long ReDim sCreateTables(0) StartTimer = SetTimer(0, 0, lInterval, ' Add this record to the array of steps AddressOf TimerProc) End Function cStepCol.Load cNewStep End Function Public Function CreateConnectionDtlsTableScript() As String Set cNewStep = Nothing Public Sub StopTimer(lTimerID As Long) ' Returns the table creation script for the rstSteps.MoveNext KillTimer 0, lTimerID connection_dtls table Wend End Sub Call InitCreateSQLArray Exit Function Public Sub SetInterval(lInterval As Long, CreateConnectionDtlsTableScript = lTimerID As Long) sCreateTables(11) LoadRecordsetInStepsArrayErr: SetTimer 0, lTimerID, lInterval, AddressOf ReDim sCreateTables(0) TimerProc LogErrors Errors End Sub End Function gstrSource = mstrModuleName & Attribute VB_Name = "ToolsCommon" "LoadRecordsetInStepsArray" ' FILE: ToolsCommon.bas Public Sub InitCreateSQLArray() On Error GoTo 0 ' Microsoft TPC-H Kit Ver. 1.00 Err.Raise vbObjectError + ' Copyright Microsoft, 1999 ReDim sCreateTables(0 To 11) errLoadRsInArrayFailed, gstrSource, _ ' All Rights Reserved ' sCreateTables(0) = "Create table att_identifiers (" & LoadResString(errLoadRsInArrayFailed) ' _ ' PURPOSE: Contains functions to remove "workspace_id Long, " & _ End Function run history and initialize "parameter_id Long, " & _ ' table creation scripts "s tep_id Long, " & _ ' Contact: Reshma Tharamal "c onstraint_id Long, " & _ Attribute VB_Name = "TimerSM" ([email protected]) "r un_id Long, " & _ ' FILE: TimerSM.bas ' "c onnection_id Long " & _ ' Microsoft TPC-H Kit Ver. 1.00 Option Explicit ", " & FLD_ID_CONN_NAME & gstrBlank ' Copyright Microsoft, 1999 & DATA_TYPE_LONG & _ ' All Rights Reserved Public sCreateTables() As String ") ;" ' ' Public Const gsExtSeparator As String = "." sCreateTables(1) = "Create table att_steps (step_id ' PURPOSE: This module contains Long, " & _ wrapper functions for Timer APIs. Public Sub DeleteRunHistory(dbFile As "version_no Text(255), " & _ ' Contact: Reshma Tharamal DAO.Database) "s tep_label Text(255), " & _ ([email protected]) ' Delete all run history records from the "s tep_file_name Text(255), " & _ ' database, viz. the records in "s tep_text Memo, "& _ ' run_header, run_step_details and "s tart_directory Text(255), " & _ Option Explicit run_parameters "workspace_id Long, " & _ "parent_step_id Long, " & _ Private Declare Function SetTimer Lib Dim sDelete As String "parent_version_no Text(255), " & _ "user32" (ByVal hWnd As Long, _ "s tep_level Long, " & _ ByVal nIDEvent As Long, ByVal uElapse On Error GoTo DeleteRunHistoryErr "s equence_no Integer, " & _ As Long, ByVal lpTimerFunc As Long) _ "e nabled_flag Bit, " & _ HP TPC-H FULL DISCLOSURE REPORT 432 © 2005 Hewlett-Packard Company. All rights reserved. "degree_parallelism Text(255), " "e nd_time Currency, " & _ FLD_ID_CONN_NAME & gstrBlank & & _ "e lapsed_time Long " & _ DATA_TYPE_LONG & ", " & _ "e xecution_mechanism Text(50), ") ;" FLD_CONN_DTL_CONNECTION_NAME " & _ & gstrBlank & DATA_TYPE_TEXT255 & ", " & _ "f ailure_details Text(255), " & sCreateTables(7) = "Create table _ step_constraints (" & _ FLD_CONN_DTL_CONNECTION_STRING & "c ontinuation_criteria Text(50), " & "c onstraint_id Long, " & _ gstrBlank & DATA_TYPE_TEXT255 & ", " & _ _ "s tep_id Long, " & _ FLD_CONN_DTL_CONNECTION_TYPE & "global_flag Long, " & _ "version_no Text(255), " & _ gstrBlank & DATA_TYPE_INTEGER & ", " & _ "archived_flag Bit, " & _ "c onstraint_type Integer, " & _ "CONSTRAINT pk_connection_name "o utput_file_name Text(255), " "global_step_id Long, " & _ PRIMARY KEY (" & FLD_ID_CONN_NAME & & _ "global_version_no Text(255), " & ") " & _ "e rror_file_name Text(255), " _ ") ;" & _ "s equence_no Integer " & _ "i terator_name Text(255), " & ") ;" End Sub _ Attribute VB_Name = "WindowsApiCommon" "CONSTRAINT pk_steps PRIMARY sCreateTables(8) = "Create table ' FILE: WindowsApiCommon.bas KEY (step_id, version_no) " & _ workspace_parameters (" & _ ' Microsoft TPC-H Kit Ver. 1.00 ") ;" "workspace_id Long, " & _ ' Copyright Microsoft, 1999 "parameter_id Long, " & _ ' All Rights Reserved ' "log_file_name Text(255), " "parameter_name Text(255), " & ' & _ _ ' "parameter_value Text(255), " & _ ' PURPOSE: This module contains functions that sCreateTables(2) = "Create table "description Text(255), " & _ are wrappers around the att_workspaces (" & _ "parameter_type Integer, " & _ ' Windows API and are used by both "workspace_id Long, " & _ "CONSTRAINT pk_parameters StepMaster and SMRunOnly. "workspace_name Text(255), " PRIMARY KEY (parameter_id) " & _ ' Contact: Reshma Tharamal & _ ") ;" ([email protected]) "archived_flag Bit, " & _ ' "CONSTRAINT pk_workspaces sCreateTables(9) = "Create table db_details (" Option Explicit PRIMARY KEY (workspace_id) " & _ & _ ") ;" "db_version Text(50) " & _ ' Used to indicate the source module name when ") ;" errors sCreateTables(3) = "Create table ' are raised by this module iterator_values (" & _ sCreateTables(10) = "Create table " & Private Const mstrModuleName As String = "s tep_id Long, " & _ TBL_CONNECTION_STRINGS & " (" & _ "WindowsApiCommon." "version_no Text(255), "& "workspace_id Long, " & _ _ "c onnection_id Long, " & _ Public Type PROCESS_INFORMATION "t ype Integer, "& _ "c onnection_name Text(255), " & hProcess As Long "i terator_value Text(255), " & _ hThread As Long _ "c onnection_value Text(255), " & _ dwProcessID As Long "s equence_no Integer " & _ "description Text(255), " & _ dwThreadID As Long ") ;" "no_count_display Bit, " & _ End Type "no_execute Bit, " & _ sCreateTables(4) = "Create table run_header "parse_query_only Bit, " & _ ' Used by GetShortName to return the short file (" & _ "ANSI_quoted_identifiers Bit, " & _ name for a given file "r un_id Long, " & _ "ANSI_nulls Bit, " & _ Private Declare Function GetShortPathName Lib "workspace_id Long, " & _ "s how_query_plan Bit, " & _ "kernel32" _ "s tart_time Currency, " & _ "s how_stats_time Bit, " & _ Alias "GetShortPathNameA" (ByVal "e nd_time Currency, " & _ "s how_stats_io Bit, " & _ lpszLongPath As String, _ "CONSTRAINT pk_run_header "parse_odbc_msg_prefixes Bit, " & _ ByVal lpszShortPath As String, ByVal PRIMARY KEY (run_id) " & _ "r ow_count long, " & _ cchBuffer As Long) As Long ") ;" "t sql_batch_separator Text(255), " & _ Public Declare Function GetExitCodeProcess Lib sCreateTables(5) = "Create table "query_time_out long, " & _ "kernel32" ( _ run_parameters (" & _ "s erver_language Text(255), " & _ ByVal hProcess As Long, lpExitCode As Long) "r un_id Long, " & _ "c haracter_translation Bit, " & _ As Long "parameter_name Text(255), " "r egional_settings Bit, " & _ Public Declare Function TerminateProcess Lib & _ "CONSTRAINT pk_connections "kernel32" ( _ "parameter_value Text(255) " PRIMARY KEY (connection_id) " & _ hProcess As Long, uExitCode As Long) As & _ ") ;" Long ") ;" Public Declare Function CloseHandle Lib ' This table has been added in order to satisfy "kernel32" ( _ sCreateTables(6) = "Create table the TPC-H requirement that ByVal hObject As Long) As Long run_step_details (" & _ ' all the queries in a stream need to be executed "r un_id Long, " & _ on a single connection. Public Const NORMAL_PRIORITY_CLASS "s tep_id Long, " & _ ' Specify a connection for each odbc step. If the As Long = &H20& "version_no Text(255), " & connection is of type, Public Const INFINITE As Long = -1& _ ' static, it should be kept open till the step "i nstance_id Long, " & _ execution is complete. Public Const STATUS_WAIT_0 As Long "parent_instance_id Long, " & _ sCreateTables(11) = "Create table " & = &H0 "c ommand Memo, " & _ TBL_CONNECTION_DTLS & " (" & _ Public Const STATUS_ABANDONED_WAIT_0 "i terator_value Text(255), " & FLD_ID_WORKSPACE & gstrBlank & As Long = &H80 _ DATA_TYPE_LONG & ", " & _ Public Const STATUS_USER_APC As "s tart_time Currency, " & _ Long = &HC0 HP TPC-H FULL DISCLOSURE REPORT 433 © 2005 Hewlett-Packard Company. All rights reserved. Public Const STATUS_TIMEOUT ByVal lpEnvironment As Long, ByVal wMonth As Integer As Long = &H102 lpCurrentDirectory As Long, _ wDayOfWeek As Integer Public Const STATUS_PENDING lpStartupInfo As STARTUPINFO, wDay As Integer As Long = &H103 lpProcessInformation As _ wHour As Integer PROCESS_INFORMATION) As Long wMinute As Integer Public Const WAIT_FAILED As wSecond As Integer Long = &HFFFFFFFF Public Declare Function GetLastError Lib wMilliseconds As Integer Public Const WAIT_OBJECT_0 As "kernel32" () As Long End Type Long = STATUS_WAIT_0 Public Const WAIT_TIMEOUT As Private Type OPENFILENAME Private Declare Function Get64BitTime Lib Long = STATUS_TIMEOUT lStructSize As Long "s mtime.dll" ( _ hwndOwner As Long ByVal lpInitTime As Any) As Currency Public Const WAIT_ABANDONED hInstance As Long As Long = lpstrFilter As String Public Function ShowMessageBox(hWnd As Long, STATUS_ABANDONED_WAIT_0 lpstrCustomFilter As String strText As String, _ Public Const WAIT_ABANDONED_0 nMaxCustFilter As Long strTitle As String, wType As Integer) As Long As Long = nFilterIndex As Long ' Using the Windows MessageBox Api since the STATUS_ABANDONED_WAIT_0 lpstrFile As String VB Msgbox function suppresses nMaxFile As Long ' all events Public Const WAIT_IO_COMPLETION lpstrFileTitle As String ShowMessageBox = MessageBox(hWnd, ByVal As Long = STATUS_USER_APC nMaxFileTitle As Long strText, ByVal strTitle, wType) Public Const STILL_ACTIVE As lpstrInitialDir As String Long = STATUS_PENDING lpstrTitle As String If ShowMessageBox = 0 Then Flags As Long LogSystemError Public Const nFileOffset As Integer Err.Raise vbObjectError + errConfirmFailed, PROCESS_QUERY_INFORMATION As nFileExtension As Integer App.EXEName, _ Long = &H400 lpstrDefExt As String LoadResString(errConfirmFailed) Public Const lCustData As Long End If STANDARD_RIGHTS_REQUIRED As lpfnHook As Long Long = &HF0000 lpTemplateName As Long End Function End Type Public Function ShowFileOpenDialog(ByVal '------strFilter As String, _ ------Private Declare Function GetOpenFileName ByVal strDialogTitle As String, ByVal 'Declarations for shelling: Lib "COMDLG32" _ lngFlags As Long, _ Alias "GetOpenFileNameA" (file As Optional ByVal strOldFile As String = Public Type STARTUPINFO OPENFILENAME) As Long gstrEmptyString) As String cb As Long ' Returns the file name selected by the user lpReserved As String Private Declare Function lstrlen Lib "kernel32" Dim strInitDir As String lpDesktop As String (lpsz As String) As Long Dim intPos As Integer lpTitle As String Dim opfile As OPENFILENAME dwX As Long Public Const MAX_PATH = 255 Dim sFile As String dwY As Long dwXSize As Long ' Used when creating a process On Error GoTo ShowFileOpenDialogErr dwYSize As Long Public Const SW_SHOWMINNOACTIVE = 7 dwXCountChars As Long Public Const STARTF_USESHOWWINDOW If Not StringEmpty(strOldFile) Then dwYCountChars As Long = &H1 intPos = InstrR(strOldFile, gstrFileSeparator) dwFillAttribute As Long If intPos > 0 Then dwFlags As Long Public Const MB_YESNOCANCEL = &H3& strInitDir = Left$(strOldFile, intPos - 1) wSho wWindow As Integer Public Const MB_ABORTRETRYIGNORE = End If cbReserved2 As Integer &H2& End If lpReserved2 As Long Public Const MB_OK = &H0& hStdInput As Long With opfile hStdOutput As Long Public Const MB_APPLMODAL = &H0& .lStructSize = Len(opfile) hStdError As Long .Flags = lngFlags End Type Public Const MB_ICONQUESTION = .lpstrInitialDir = strInitDir &H20& .lpstrTitle = strDialogTitle Public Declare Function Public Const MB_ICONEXCLAMATION = .lpstrFilter = MakeWindowsFilter(strFilter) WaitForSingleObject Lib "kernel32" ( _ &H30& sFile = strOldFile & String$(MAX_PATH - ByVal hProcess As Long, ByVal Len(strOldFile), 0) dwMilliseconds As Long) As Long Public Const IDABORT = 3 .lpstrFile = sFile Public Const IDRETRY = 4 .nMaxFile = MAX_PATH Public Declare Function InputIdle Lib Public Const IDIGNORE = 5 End With "user32" Alias "WaitForInputIdle" ( _ Public Const IDYES = 6 ByVal hProcess As Long, ByVal Public Const IDNO = 7 If GetOpenFileName(opfile) Then dwMilliseconds As Long) As Long Public Const IDCANCEL = 2 ShowFileOpenDialog = Left$(opfile.lpstrFile, InStr(opfile.lpstrFile, vbNullChar) - 1) Public Declare Function CreateProcessA Lib Private Declare Function MessageBox Lib Else "kernel32" ( _ "user32" Alias "MessageBoxA" ( _ ShowFileOpenDialog = strOldFile ByVal lpApplicationName As Long, ByVal hWnd As Long, ByVal lpText As End If ByVal lpCommandLine As String, _ String, _ ByVal lpProcessAttributes As Long, ByVal lpCaption As String, ByVal wType Exit Function ByVal lpThreadAttributes As Long, _ As Long) As Long ByVal bInheritHandles As Long, ByVal ShowFileOpenDialogErr: dwCreationFlags As Long, _ Private Type SYSTEMTIME Call LogErrors(Errors) wYear As Integer ' Reset the selection to the passed in file, if any HP TPC-H FULL DISCLOSURE REPORT 434 © 2005 Hewlett-Packard Company. All rights reserved. ShowFileOpenDialog = strOldFile End If ' either the workspace name or the workspace identifier End Function 'Set up buffer area for API function call ' in a variant. The calling function must convert return the Private Function sShortPathName = Space(MAX_PATH) ' return value to the appropriate type MakeWindowsFilter(sFilter As String) As iLen = Len(sShortPathName) String Dim rstWorkspace As Recordset 'Call the function Dim qyWsp As DAO.QueryDef Dim s As String, ch As String, iTemp As lRetVal = GetShortPathName(sLongFile, Dim strSql As String Integer sShortPathName, iLen) Dim cTempStr As cStringSM If lRetVal = 0 Then On Error GoTo MakeWindowsFilterErr Call LogSystemError On Error GoTo GetWorkspaceDetailsErr End If gstrSource = mstrModuleName & ' To make Windows-style filter, replace | "GetWorkspaceDetails" and : with nulls GetShortName = IIf(lRetVal = 0, sLongFile, For iTemp = 1 To Len(sFilter) Left(sShortPathName, lRetVal)) If WorkspaceId = 0 And _ ch = Mid$(sFilter, iTemp, 1) If Not StringEmpty(sFile) Then WorkspaceName = gstrEmptyString Then If ch = "|" Then GetShortName = GetShortName & sFile On Error GoTo 0 s = s & vbNullChar End If Err.Raise vbObjectError + Else errMandatoryParameterMissing, _ s = s & ch Exit Function gstrSource, _ End If Next iTemp GetShortNameErr: LoadResString(errMandatoryParameterMissing) Call LogErrors(Errors) End If ' Put double null at end gstrSource = mstrModuleName & s = s & vbNullChar & vbNullChar "GetShortName" Set cTempStr = New cStringSM MakeWindowsFilter = s On Error GoTo 0 Err.Raise vbObjectError + errApiFailed, If WorkspaceId = 0 Then Exit Function gstrSource, _ strSql = "Select workspace_id from LoadResString(errApiFailed) att_workspaces " & _ MakeWindowsFilterErr: " where workspace_name = [w_name] " Call LogErrors(Errors) End Function Set qyWsp = gstrSource = mstrModuleName & Public Function Determine64BitTime() As dbsAttTool.CreateQueryDef(gstrEmptyString, "MakeWindowsFilter" Currency strSql) On Error GoTo 0 qyWsp.Parameters("w_name").Value = Err.Raise vbObjectError + errApiFailed, Determine64BitTime = WorkspaceName gstrSource, _ Get64BitTime(ByVal 0&) Else LoadResString(errApiFailed) strSql = "Select workspace_name from End Function att_workspaces " & _ End Function " where workspace_id = [w_id] " Set qyWsp = Attribute VB_Name = "WorkspaceCommon" dbsAttTool.CreateQueryDef(gstrEmptyString, Public Function GetShortName(ByVal ' FILE: WorkspaceCommon.bas strSql) sLongFileName As String) As String ' Microsoft TPC-H Kit Ver. 1.00 qyWsp.Parameters("w_id").Value = ' Returns the short name for the passed in ' Copyright Microsoft, 1999 WorkspaceId file - will only work ' All Rights Reserved End If ' if the passed in path/file exists ' ' Set cTempStr = Nothing Dim lRetVal As Long, sShortPathName ' PURPOSE: Contains functionality common As String, iLen As Integer across StepMaster and Set rstWorkspace = Dim sLongFile As String ' SMRunOnly, pertaining to qyWsp.OpenRecordset(dbOpenForwardOnly) Dim sDir As String workspaces Dim sFile As String ' Specifically, functions to read If rstWorkspace.RecordCount <> 0 Then Dim intPos As Integer workspace records from GetWorkspaceDetails = ' the database and so on. rstWorkspace.Fields(0) On Error GoTo GetShortNameErr ' Contact: Reshma Tharamal Else ([email protected]) rstWorkspace.Close sFile = gstrEmptyString ' qyWsp.Close sLongFile = Option Explicit On Error GoTo 0 MakePathValid(sLongFileName) Err.Raise vbObjectError + If StringEmpty(Dir$(sLongFile, ' Used to indicate the source module name errInvalidWorkspaceData, _ vbNormal + vbDirectory)) Then when errors gstrSource, _ ' The passed in path is a file that does ' are raised by this module not exist - since Private Const mstrModuleName As String = LoadResString(errInvalidWorkspaceData) ' the GetShortPathName api does not "WorkspaceCommon." End If work on non-existent files ' on Win2K, use the directory as an rstWorkspace.Close argument to the api and Public Function GetWorkspaceDetails( _ qyWsp.Close ' then append the file Optional ByVal WorkspaceId As Long, _ Exit Function intPos = InstrR(sLongFile, Optional WorkspaceName As String = gstrFileSeparator) gstrEmptyString _ GetWorkspaceDetailsErr: sDir = Mid$(sLongFile, 1, intPos - 1) ) As Variant Call LogErrors(Errors) sFile = Right(sLongFile, ' Depending on the passed in parameter, it gstrSource = mstrModuleName & Len(sLongFile) - intPos + 1) returns "GetWorkspaceDetails" sLongFile = sDir On Error GoTo 0 HP TPC-H FULL DISCLOSURE REPORT 435 © 2005 Hewlett-Packard Company. All rights reserved. Err.Raise vbObjectError + " WHERE a.step_id = d.step_id ) " End Sub errGetWorkspaceDetailsFailed, _ Public Sub ReadWorkspaces(dbLoad As Database, gstrSource, _ ' Find the highest Y-component of the rstWsp As Recordset, _ version number for the highest X-component qyWsp As DAO.QueryDef, _ LoadResString(errGetWorkspaceDetailsFail strSql = strSql & " AND cint( mid( Optional ByVal bSelectArchivedRecords As ed) version_no, instr( version_no, " & gstrDQ & Boolean = False) gstrVerSeparator & gstrDQ & " ) + 1 ) ) = " & End Function _ ' This function will populate the passed in " ( select max( cint( mid( version_no, recordset with all workspace records Public Sub instr( version_no, " & gstrDQ & ReadStepsInWorkspace(rstStepsInWorkSpa gstrVerSeparator & gstrDQ & " ) + 1 ) ) ) " & Dim strSql As String ce As Recordset, _ _ qySteps As DAO.QueryDef, _ " from att_steps AS b " & _ On Error GoTo ReadWorkspacesErr Optional lngWorkspaceId As Long = " Where a.step_id = b.step_id "& _ glInvalidId, _ " AND cint( mid( version_no, 1, instr( ' Create a recordset object containing all the Optional dbLoad As DAO.Database = version_no, " & gstrDQ & gstrVerSeparator & workspaces Nothing, _ gstrDQ & " ) - 1 ) ) = "& _ ' (that haven't been archived) in the database Optional ByVal " ( select max( cint( mid( version_no, 1, strSql = " Select workspace_id, bSelectArchivedRecords As Boolean = instr( version_no, " & gstrDQ & workspace_name, archived_flag " & _ False) gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " & _ " from att_workspaces " " from att_steps AS c " & _ ' This function will populate the passed in " WHERE a.step_id = c.step_id ) ) " If Not bSelectArchivedRecords Then recordset with strSql = strSql & " where archived_flag = ' all the steps for a given workspace (if ' Append the order clause as follows [archived]" one is passed in, else all workspaces) ' First, separate all global/non-global steps End If ' Order the worker and manager steps by strSql = strSql & " order by workspace_name" Dim strSql As String step_level to ' ensure that the parent steps are populated Set qyWsp = On Error GoTo before dbLoad.CreateQueryDef(gstrEmptyString, strSql) ReadStepsInWorkspaceErr ' any sub-steps within it If Not bSelectArchivedRecords Then ' Further ordering by parent_step_id and qyWsp.Parameters("archived").Value = False ' Create a recordset object to retrieve all sequence_no End If steps for ' ensures that all the children within a parent ' the given workspace are Set rstWsp = strSql = "Select step_id, step_label, ' selected in the necessary order qyWsp.OpenRecordset(dbOpenForwardOnly) step_file_name, step_text, " & _ strSql = strSql & " order by global_flag, " start_directory, version_no, step_level, " & _ Exit Sub workspace_id, " & _ " parent_step_id, sequence_no " " parent_step_id, parent_version_no, " ReadWorkspacesErr: & _ If dbLoad Is Nothing Then Set dbLoad = " sequence_no, step_level, " & _ dbsAttTool LogErrors Errors " enabled_flag, degree_parallelism, " & gstrSource = mstrModuleName & _ ' Create a temporary Querydef object "ReadWorkspaces" " execution_mechanism, " & _ Set qySteps = On Error GoTo 0 " failure_details, continuation_criteria, dbLoad.CreateQueryDef(gstrEmptyString, Err.Raise vbObjectError + " & _ strSql) errReadWorkspaceDataFailed, _ " global_flag, archived_flag, " & _ gstrSource, _ " output_file_name, " & _ ' Initialize the parameter values " error_file_name, iterator_name " & _ If lngWorkspaceId <> glInvalidId Then LoadResString(errReadWorkspaceDataFailed) " from att_steps a " & _ qySteps.Parameters("w_id").Value = " where " lngWorkspaceId End Sub End If Public Sub ShowWorkspacesInDb(dbLoad As ' log_file_name, Database) If Not bSelectArchivedRecords Then If lngWorkspaceId <> glInvalidId Then qySteps.Parameters("archived").Value = Dim recWorkspaces As Recordset strSql = strSql & " workspace_id = False Dim qryAllWsp As QueryDef [w_id] AND " End If End If On Error GoTo ShowWorkspacesInDbErr Set rstStepsInWorkSpace = If Not bSelectArchivedRecords Then qySteps.OpenRecordset(dbOpenSnapshot) ' Set the mousepointer to indicate Busy strSql = strSql & " archived_flag = Call ShowBusy [archived] AND " Exit Sub End If Load frmWorkspaceOpen ReadStepsInWorkspaceErr: ' Find the highest X-component of the Call ReadWorkspaces(dbLoad, recWorkspaces, version number LogErrors Errors qryAllWsp) strSql = strSql & " cint( mid( version_no, gstrSource = mstrModuleName & 1, instr( version_no, " & gstrDQ & "ReadStepsInWorkspace" frmWorkspaceOpen.lstWorkspaces.Clear gstrVerSeparator & gstrDQ & " ) - 1 ) ) = " On Error GoTo 0 & _ Err.Raise vbObjectError + ' Load all the workspaces into the listbox " ( select max( cint( mid( version_no, 1, errReadWorkspaceDataFailed, _ If recWorkspaces.RecordCount <> 0 Then instr( version_no, " & gstrDQ & gstrSource, _ Do gstrVerSeparator & gstrDQ & " ) - 1 ) ) ) " ' Add the workspace name to the list and & _ LoadResString(errReadWorkspaceDataFailed) store " from att_steps AS d " & _ HP TPC-H FULL DISCLOSURE REPORT 436 © 2005 Hewlett-Packard Company. All rights reserved. ' the corresponding workspace id as End Sub the ItemData Set rstWorkSpaceParameters = Private Sub ReadConnectionDtls(lngWorkspaceId ' property of the item. qyWspParams.OpenRecordset(dbOpenSnapsh As Long, rstConns As Recordset, _ ' The workspace id will be used for ot) qyConns As DAO.QueryDef) all further ' processing of the workspace Exit Sub ' Will populate the recordset with all the connection_dtls records for frmWorkspaceOpen.lstWorkspaces.AddItem ReadWorkspaceParametersErr: ' a given workspace recWorkspaces![workspace_name] LogErrors Errors Dim strSql As String frmWorkspaceOpen.lstWorkspaces.ItemDat gstrSource = mstrModuleName & a(frmWorkspaceOpen.lstWorkspaces.NewIn "ReadWorkspaceParameters" On Error GoTo ReadWorkspaceParametersErr dex) = _ On Error GoTo 0 recWorkspaces![workspace_id] Err.Raise vbObjectError + strSql = "Select "& FLD_ID_CONN_NAME & recWorkspaces.MoveNext errReadWorkspaceDataFailed, _ ", " & _ gstrSource, _ Loop Until recWorkspaces.EOF FLD_CONN_DTL_CONNECTION_NAME & ", " End If LoadResString(errReadWorkspaceDataFailed) & _ recWorkspaces.Close qryAllWsp.Close End Sub FLD_CONN_DTL_CONNECTION_STRING & ", Private Sub ReadConnections(lngWorkspaceId " & _ ' Reset the mousepointer As Long, rstConns As Recordset, _ FLD_ID_WORKSPACE & ", " & _ ShowFree qyConns As DAO.QueryDef) FLD_CONN_DTL_CONNECTION_TYPE & _ #If RUN_ONLY Then ' Will populate the recordset with all the " from " & TBL_CONNECTION_DTLS & frmWorkspaceOpen.Show vbModal parameters for _ #Else ' a given workspace " where " & FLD_ID_WORKSPACE & " = frmWorkspaceOpen.Show vbModal, [w_id] " & _ frmMain Dim strSql As String " order by " & #End If FLD_CONN_DTL_CONNECTION_NAME On Error GoTo Exit Sub ReadWorkspaceParametersErr ' Create a temporary Querydef object and initialize ShowWorkspacesInDbErr: strSql = "Select connection_id, " & _ ' it's parameter values LogErrors Errors " connection_name, connection_value, Set qyConns = Call ShowFree workspace_id, description, " & _ dbsAttTool.CreateQueryDef(gstrEmptyString, Err.Raise vbObjectError + " no_count_display, no_execute, strSql) errProgramError, mstrModuleName & parse_query_only, ANSI_quoted_identifiers, " qyConns.Parameters("w_id").Value = "ShowWorkspacesInDb", _ & _ lngWorkspaceId LoadResString(errProgramError) " ANSI_nulls, show_query_plan, Set rstConns = show_stats_time, show_stats_io, " & _ qyConns.OpenRecordset(dbOpenSnapshot) End Sub " parse_odbc_msg_prefixes, Exit Sub Private Sub row_count, tsql_batch_separator, ReadWorkspaceParameters(lngWorkspaceId query_time_out, " & _ ReadWorkspaceParametersErr: As Long, _ " server_language, rstWorkSpaceParameters As Recordset, _ character_translation, regional_settings " & _ LogErrors Errors qyWspParams As DAO.QueryDef) " from workspace_connections " & _ On Error GoTo 0 " where workspace_id = [w_id] " & _ Err.Raise vbObjectError + ' Will populate the recordset with all the " order by connection_name, errReadWorkspaceDataFailed, _ parameters for connection_value " mstrModuleName & "ReadConnectionDtls", ' a given workspace LoadResString(errReadWorkspaceDataFailed) ' Create a temporary Querydef object and Dim strSql As String initialize End Sub ' it's parameter values On Error GoTo Set qyConns = Public Sub ReadWorkspaceData(lngWorkspaceId ReadWorkspaceParametersErr dbsAttTool.CreateQueryDef(gstrEmptyString, As Long, _ strSql) cStepsCol As cArrSteps, _ strSql = "Select parameter_id, qyConns.Parameters("w_id").Value = cParamsCol As cArrParameters, _ parameter_name, " & _ lngWorkspaceId cConsCol As cArrConstraints, _ " parameter_value, workspace_id, cConns As cConnections, _ parameter_type, description " & _ Set rstConns = cConnDetails As cConnDtls, _ " from workspace_parameters " & _ qyConns.OpenRecordset(dbOpenSnapshot) rstStepsInWsp As Recordset, _ " where workspace_id = [w_id] " & qyStepsInWsp As DAO.QueryDef, _ _ Exit Sub rstParamsInWsp As Recordset, _ " order by parameter_name, qyParamsInWsp As DAO.QueryDef, _ parameter_value " ReadWorkspaceParametersErr: rstConns As Recordset, _ qyConns As DAO.QueryDef, _ ' Create a temporary Querydef object and LogErrors Errors rstConnDtls As Recordset, _ initialize On Error GoTo 0 qyConnDtls As DAO.QueryDef) ' it's parameter values Err.Raise vbObjectError + ' Loads the passed in structures with all the data Set qyWspParams = errReadWorkspaceDataFailed, _ for dbsAttTool.CreateQueryDef(gstrEmptyStrin mstrModuleName & ' the workspace. It also initializes the recordsets g, strSql) "ReadConnections", ' with the step and parameter records for the qyWspParams.Parameters("w_id").Value LoadResString(errReadWorkspaceDataFailed) workspace. = lngWorkspaceId HP TPC-H FULL DISCLOSURE REPORT 437 © 2005 Hewlett-Packard Company. All rights reserved. On Error GoTo ReadWorkspaceDataErr ' Load all the workspace parameters in the ShowFree array Exit Sub ShowBusy LoadRecordsetInParameterArray rstParamsInWsp, cParamsCol ReadWorkspaceDataErr: Call ' Read and load connection strings ' Log the error code raised by Visual Basic ReadStepsInWorkspace(rstStepsInWsp, ReadConnections lngWorkspaceId, ShowFree qyStepsInWsp, lngWorkspaceId) rstConns, qyConns Call LogErrors(Errors) LoadRecordsetInConnectionArray rstConns, On Error GoTo 0 ' Load all the steps in the array cConns gstrSource = mstrModuleName & LoadRecordsetInStepsArray ' Read and load connection information "ReadWorkspaceData" rstStepsInWsp, cStepsCol ReadConnectionDtls lngWorkspaceId, Err.Raise vbObjectError + rstConnDtls, qyConnDtls errReadWorkspaceDataFailed, _ ' Initialize the steps with all the iterator LoadRSInConnDtlArray rstConnDtls, gstrSource, _ ' records for each step cConnDetails Call LoadIteratorsForWsp(cStepsCol, ' Finally, load the step constraints collection LoadResString(errReadWorkspaceDataFailed) lngWorkspaceId, rstStepsInWsp) class with ReadWorkspaceParameters ' all the constraints for the steps in the End Sub lngWorkspaceId, rstParamsInWsp, workspace qyParamsInWsp cConsCol.LoadConstraints lngWorkspaceId, rstStepsInWsp

HP TPC-H FULL DISCLOSURE REPORT 438 © 2005 Hewlett-Packard Company. All rights reserved. // FILE: LogWriter.cpp ///////////////////////////////////////////////////////////////////////////// // Microsoft TPC-H Kit Ver. 1.00 // DllUnregisterServer - Removes entries from the system // Copyright Microsoft, 1999 registry // All Rights Reserved // STDAPI DllUnregisterServer(void) // PURPOSE: Implementation of DLL Exports. { // Contact: Reshma Tharamal ([email protected]) return _Module.UnregisterServer(TRUE); // } // LogWriter.cpp : Implementation of DLL Exports.

// Note: Proxy/Stub Information /* this ALWAYS GENERATED file contains the definitions for // To build a separate proxy/stub DLL, the interfaces */ // run nmake -f LogWriterps.mk in the project directory.

#include "stdafx.h" /* File created by MIDL compiler version 5.01.0164 */ #include "resource.h" /* at Thu Sep 19 17:49:50 2002 #include */ #include "LogWriter.h" /* Compiler settings for C:\charles\Stepmaster\LogWriter\LogWriter.idl: #include "LogWriter_i.c" Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext #include "SMLog.h" error checks: allocation ref bounds_check enum stub_data */ CComModule _Module; //@@MIDL_FILE_HEADING( )

BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_SMLog, CSMLog) /* verify that the version is high enough to compile END_OBJECT_MAP() this file*/ #ifndef __REQUIRED_RPCNDR_H_VERSION__ ///////////////////////////////////////////////////////////////////////////// #define __REQUIRED_RPCNDR_H_VERSION__ 440 // DLL Entry Point #endif

extern "C" #include "rpc.h" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD #include "rpcndr.h" dwReason, LPVOID /*lpReserved*/) { #ifndef __RPCNDR_H_VERSION__ if (dwReason == DLL_PROCESS_ATTACH) #error this stub requires an updated version of { #endif // __RPCNDR_H_VERSION__ _Module.Init(ObjectMap, hInstance, &LIBID_LOGWRITERLib); #ifndef COM_NO_WINDOWS_H DisableThreadLibraryCalls(hInstance); #include "windows.h" } #include "ole2.h" else if (dwReason == DLL_PROCESS_DETACH) #endif /*COM_NO_WINDOWS_H*/ _Module.Term(); return TRUE; // ok #ifndef __LogWriter_h__ } #define __LogWriter_h__ ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE #ifdef __cplusplus extern "C"{ STDAPI DllCanUnloadNow(void) #endif { return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; /* Forward Declarations */ } #ifndef __ISMLog_FWD_DEFINED__ ///////////////////////////////////////////////////////////////////////////// #define __ISMLog_FWD_DEFINED__ // Returns a class factory to create an object of the requested type typedef interface ISMLog ISMLog; #endif /* __ISMLog_FWD_DEFINED__ */ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { #ifndef ___ISMLogEvents_FWD_DEFINED__ return _Module.GetClassObject(rclsid, riid, ppv); #define ___ISMLogEvents_FWD_DEFINED__ } typedef interface _ISMLogEvents _ISMLogEvents; ///////////////////////////////////////////////////////////////////////////// #endif /* ___ISMLogEvents_FWD_DEFINED__ */ // DllRegisterServer - Adds entries to the system registry

STDAPI DllRegisterServer(void) #ifndef __SMLog_FWD_DEFINED__ { #define __SMLog_FWD_DEFINED__ // registers object, typelib and all interfaces in typelib return _Module.RegisterServer(TRUE); }

HP TPC-H FULL DISCLOSURE REPORT 439 © 2005 Hewlett-Packard Company. All rights reserved. #ifdef __cplusplus typedef class SMLog SMLog; ULONG ( STDMETHODCALLTYPE __RPC_FAR #else *Release )( typedef struct SMLog SMLog; ISMLog __RPC_FAR * This); #endif /* __cplusplus */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR #endif /* __SMLog_FWD_DEFINED__ */ *GetTypeInfoCount )( ISMLog __RPC_FAR * This, /* header files for imported files */ /* [out] */ UINT __RPC_FAR *pctinfo); #include "oaidl.h" #include "ocidl.h" HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); ISMLog __RPC_FAR * This, void __RPC_USER MIDL_user_free( void __RPC_FAR * ); /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, #ifndef __ISMLog_INTERFACE_DEFINED__ /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR #define __ISMLog_INTERFACE_DEFINED__ *ppTInfo);

/* interface ISMLog */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR /* [unique][helpstring][dual][uuid][object] */ *GetIDsOfNames )( ISMLog __RPC_FAR * This, EXTERN_C const IID IID_ISMLog; /* [in] */ REFIID riid, /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, #if defined(__cplusplus) && !defined(CINTERFACE) /* [in] */ UINT cNames, /* [in] */ LCID lcid, MIDL_INTERFACE("5AC75DAD-1936-11D3-BC2D- /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); 00A0C90D2CA5") ISMLog : public IDispatch /* [local] */ HRESULT ( STDMETHODCALLTYPE { __RPC_FAR *Invoke )( public: ISMLog __RPC_FAR * This, virtual /* [helpstring][id][propput] */ HRESULT /* [in] */ DISPID dispIdMember, STDMETHODCALLTYPE put_FileHeader( /* [in] */ REFIID riid, /* [in] */ BSTR newVal) = 0; /* [in] */ LCID lcid, /* [in] */ WORD wFlags, virtual /* [helpstring][id] */ HRESULT /* [out][in] */ DISPPARAMS __RPC_FAR STDMETHODCALLTYPE WriteLine( *pDispParams, BSTR szMsg) = 0; /* [out] */ VARIANT __RPC_FAR *pVarResult, /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, virtual /* [helpstring][id] */ HRESULT /* [out] */ UINT __RPC_FAR *puArgErr); STDMETHODCALLTYPE WriteField( BSTR szMsg) = 0; /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_FileHeader )( virtual /* [helpstring][id][propput] */ HRESULT ISMLog __RPC_FAR * This, STDMETHODCALLTYPE put_FileName( /* [in] */ BSTR newVal); /* [in] */ BSTR newVal) = 0; /* [helpstring][id] */ HRESULT ( virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE __RPC_FAR *WriteLine )( STDMETHODCALLTYPE put_Append( ISMLog __RPC_FAR * This, /* [in] */ BOOL newVal) = 0; BSTR szMsg);

}; /* [helpstring][id] */ HRESULT ( #else /* C style interface */ STDMETHODCALLTYPE __RPC_FAR *WriteField )( ISMLog __RPC_FAR * This, typedef struct ISMLogVtbl BSTR szMsg); { BEGIN_INTERFACE /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_FileName )( HRESULT ( STDMETHODCALLTYPE __RPC_FAR ISMLog __RPC_FAR * This, *QueryInterface )( /* [in] */ BSTR newVal); ISMLog __RPC_FAR * This, /* [in] */ REFIID riid, /* [helpstring][id][propput] */ HRESULT ( /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR STDMETHODCALLTYPE __RPC_FAR *put_Append )( *ppvObject); ISMLog __RPC_FAR * This, /* [in] */ BOOL newVal); ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( END_INTERFACE ISMLog __RPC_FAR * This); } ISMLogVtbl;

HP TPC-H FULL DISCLOSURE REPORT 440 © 2005 Hewlett-Packard Company. All rights reserved. interface ISMLog void __RPC_STUB ISMLog_put_FileHeader_Stub( { IRpcStubBuffer *This, CONST_VTBL struct ISMLogVtbl __RPC_FAR *lpVtbl; IRpcChannelBuffer *_pRpcChannelBuffer, }; PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase);

#ifdef COBJMACROS /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ISMLog_WriteLine_Proxy( ISMLog __RPC_FAR * This, #define ISMLog_QueryInterface(This,riid,ppvObject) \ BSTR szMsg); (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define ISMLog_AddRef(This) \ void __RPC_STUB ISMLog_WriteLine_Stub( (This)->lpVtbl -> AddRef(This) IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, #define ISMLog_Release(This) \ PRPC_MESSAGE _pRpcMessage, (This)->lpVtbl -> Release(This) DWORD *_pdwStubPhase);

#define ISMLog_GetTypeInfoCount(This,pctinfo) \ (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ISMLog_WriteField_Proxy( #define ISMLog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) ISMLog __RPC_FAR * This, \ BSTR szMsg); (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)

#define void __RPC_STUB ISMLog_WriteField_Stub( ISMLog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgD IRpcStubBuffer *This, ispId) \ IRpcChannelBuffer *_pRpcChannelBuffer, (This)->lpVtbl -> PRPC_MESSAGE _pRpcMessage, GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) DWORD *_pdwStubPhase);

#define ISMLog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispPara /* [helpstring][id][propput] */ HRESULT ms,pVarResult,pExcepInfo,puArgErr) \ STDMETHODCALLTYPE ISMLog_put_FileName_Proxy( (This)->lpVtbl -> ISMLog __RPC_FAR * This, Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR /* [in] */ BSTR newVal); esult,pExcepInfo,puArgErr) void __RPC_STUB ISMLog_put_FileName_Stub( IRpcStubBuffer *This, #define ISMLog_put_FileHeader(This,newVal) \ IRpcChannelBuffer *_pRpcChannelBuffer, (This)->lpVtbl -> put_FileHeader(This,newVal) PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); #define ISMLog_WriteLine(This,szMsg) \ (This)->lpVtbl -> WriteLine(This,szMsg) /* [helpstring][id][propput] */ HRESULT #define ISMLog_WriteField(This,szMsg) \ STDMETHODCALLTYPE ISMLog_put_Append_Proxy( (This)->lpVtbl -> WriteField(This,szMsg) ISMLog __RPC_FAR * This, /* [in] */ BOOL newVal); #define ISMLog_put_FileName(This,newVal) \ (This)->lpVtbl -> put_FileName(This,newVal) void __RPC_STUB ISMLog_put_Append_Stub( IRpcStubBuffer *This, #define ISMLog_put_Append(This,newVal) \ IRpcChannelBuffer *_pRpcChannelBuffer, (This)->lpVtbl -> put_Append(This,newVal) PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); #endif /* COBJMACROS */ #endif /* __ISMLog_INTERFACE_DEFINED__ */

#endif /* C style interface */ #ifndef __LOGWRITERLib_LIBRARY_DEFINED__ #define __LOGWRITERLib_LIBRARY_DEFINED__ EXTERN_C const IID LIBID_LOGWRITERLib; /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ISMLog_put_FileHeader_Proxy( #ifndef ___ISMLogEvents_DISPINTERFACE_DEFINED__ ISMLog __RPC_FAR * This, #define ___ISMLogEvents_DISPINTERFACE_DEFINED__ /* [in] */ BSTR newVal);

HP TPC-H FULL DISCLOSURE REPORT 441 © 2005 Hewlett-Packard Company. All rights reserved. EXTERN_C const IID DIID__ISMLogEvents; END_INTERFACE } _ISMLogEventsVtbl; #if defined(__cplusplus) && !defined(CINTERFACE)

MIDL_INTERFACE("5AC75DB1-1936-11D3-BC2D- interface _ISMLogEvents 00A0C90D2CA5") { _ISMLogEvents : public IDispatch CONST_VTBL struct _ISMLogEventsVtbl __RPC_FAR { *lpVtbl; }; };

#else /* C style interface */

typedef struct _ISMLogEventsVtbl #ifdef COBJMACROS { BEGIN_INTERFACE #define _ISMLogEvents_QueryInterface(This,riid,ppvObject) HRESULT ( STDMETHODCALLTYPE __RPC_FAR \ *QueryInterface )( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) _ISMLogEvents __RPC_FAR * This, /* [in] */ REFIID riid, #define _ISMLogEvents_AddRef(This) \ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR (This)->lpVtbl -> AddRef(This) *ppvObject); #define _ISMLogEvents_Release(This) \ ULONG ( STDMETHODCALLTYPE __RPC_FAR (This)->lpVtbl -> Release(This) *AddRef )( _ISMLogEvents __RPC_FAR * This); #define _ISMLogEvents_GetTypeInfoCount(This,pctinfo) ULONG ( STDMETHODCALLTYPE __RPC_FAR \ *Release )( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) _ISMLogEvents __RPC_FAR * This); #define _ISMLogEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) HRESULT ( STDMETHODCALLTYPE __RPC_FAR \ *GetTypeInfoCount )( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) _ISMLogEvents __RPC_FAR * This, /* [out] */ UINT __RPC_FAR *pctinfo); #define _ISMLogEvents_GetIDsOfNames(This,riid,rgszNames,cNames,l HRESULT ( STDMETHODCALLTYPE __RPC_FAR cid,rgDispId) \ *GetTypeInfo )( (This)->lpVtbl -> _ISMLogEvents __RPC_FAR * This, GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, #define /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR _ISMLogEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pD *ppTInfo); ispParams,pVarResult,pExcepInfo,puArgErr) \ (This)->lpVtbl -> HRESULT ( STDMETHODCALLTYPE __RPC_FAR Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR *GetIDsOfNames )( esult,pExcepInfo,puArgErr) _ISMLogEvents __RPC_FAR * This, /* [in] */ REFIID riid, #endif /* COBJMACROS */ /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, #endif /* C style interface */ /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);

/* [local] */ HRESULT ( STDMETHODCALLTYPE #endif /* __RPC_FAR *Invoke )( ___ISMLogEvents_DISPINTERFACE_DEFINED__ */ _ISMLogEvents __RPC_FAR * This, /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, EXTERN_C const CLSID CLSID_SMLog; /* [in] */ LCID lcid, /* [in] */ WORD wFlags, #ifdef __cplusplus /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, class DECLSPEC_UUID("5AC75DB0-1936-11D3-BC2D- /* [out] */ VARIANT __RPC_FAR *pVarResult, 00A0C90D2CA5") /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, SMLog; /* [out] */ UINT __RPC_FAR *puArgErr); #endif #endif /* __LOGWRITERLib_LIBRARY_DEFINED__ */

/* Additional Prototypes for ALL interfaces */

HP TPC-H FULL DISCLOSURE REPORT 442 © 2005 Hewlett-Packard Company. All rights reserved. unsigned long __RPC_USER BSTR_UserSize(unsigned long ///////////////////////////////////////////////////////////////////////////// __RPC_FAR *, unsigned long , BSTR __RPC_FAR * ); // Used to determine whether the DLL can be unloaded by OLE unsigned char __RPC_FAR * __RPC_USER BSTR_UserMarshal(unsigned long __RPC_FAR *, STDAPI DllCanUnloadNow(void) unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); { unsigned char __RPC_FAR * __RPC_USER return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; BSTR_UserUnmarshal(unsigned long __RPC_FAR *, } unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); void __RPC_USER BSTR_UserFree( unsigned long ///////////////////////////////////////////////////////////////////////////// __RPC_FAR *, BSTR __RPC_FAR * ); // Returns a class factory to create an object of the requested type

/* end of Additional Prototypes */ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) #ifdef __cplusplus { } return _Module.GetClassObject(rclsid, riid, ppv); #endif }

#endif ///////////////////////////////////////////////////////////////////////////// // FILE: LogWriter.cpp // DllRegisterServer - Adds entries to the system registry // Microsoft TPC-H Kit Ver. 1.00 // Copyright Microsoft, 1999 STDAPI DllRegisterServer(void) // All Rights Reserved { // // registers object, typelib and all interfaces in typelib // return _Module.RegisterServer(TRUE); // PURPOSE: Implementation of DLL Exports. } // Contact: Reshma Tharamal ([email protected]) // ///////////////////////////////////////////////////////////////////////////// // LogWriter.cpp : Implementation of DLL Exports. // DllUnregisterServer - Removes entries from the system registry

// Note: Proxy/Stub Information STDAPI DllUnregisterServer(void) // To build a separate proxy/stub DLL, { // run nmake -f LogWriterps.mk in the project directory. return _Module.UnregisterServer(TRUE); } #include "stdafx.h" #include "resource.h" #include /* this ALWAYS GENERATED file contains the definitions for #include "LogWriter.h" the interfaces */

#include "LogWriter_i.c" #include "SMLog.h" /* File created by MIDL compiler version 5.01.0164 */ /* at Thu Sep 19 17:49:50 2002 */ CComModule _Module; /* Compiler settings for C:\charles\Stepmaster\LogWriter\LogWriter.idl: BEGIN_OBJECT_MAP(ObjectMap) Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext OBJECT_ENTRY(CLSID_SMLog, CSMLog) error checks: allocation ref bounds_check enum stub_data END_OBJECT_MAP() */ //@@MIDL_FILE_HEADING( ) ///////////////////////////////////////////////////////////////////////////// // DLL Entry Point /* verify that the version is high enough to compile extern "C" this file*/ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD #ifndef __REQUIRED_RPCNDR_H_VERSION__ dwReason, LPVOID /*lpReserved*/) #define __REQUIRED_RPCNDR_H_VERSION__ 440 { #endif if (dwReason == DLL_PROCESS_ATTACH) { #include "rpc.h" _Module.Init(ObjectMap, hInstance, #include "rpcndr.h" &LIBID_LOGWRITERLib); DisableThreadLibraryCalls(hInstance); #ifndef __RPCNDR_H_VERSION__ } #error this stub requires an updated version of else if (dwReason == DLL_PROCESS_DETACH) #endif // __RPCNDR_H_VERSION__ _Module.Term(); #ifndef COM_NO_WINDOWS_H return TRUE; // ok #include "windows.h" } #include "ole2.h" #endif /*COM_NO_WINDOWS_H*/

HP TPC-H FULL DISCLOSURE REPORT 443 © 2005 Hewlett-Packard Company. All rights reserved. #ifndef __LogWriter_h__ typedef struct ISMLogVtbl #define __LogWriter_h__ { BEGIN_INTERFACE #ifdef __cplusplus HRESULT ( STDMETHODCALLTYPE __RPC_FAR extern "C"{ *QueryInterface )( #endif ISMLog __RPC_FAR * This, /* [in] */ REFIID riid, /* Forward Declarations */ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); #ifndef __ISMLog_FWD_DEFINED__ ULONG ( STDMETHODCALLTYPE __RPC_FAR #define __ISMLog_FWD_DEFINED__ *AddRef )( typedef interface ISMLog ISMLog; ISMLog __RPC_FAR * This); #endif /* __ISMLog_FWD_DEFINED__ */ ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( #ifndef ___ISMLogEvents_FWD_DEFINED__ ISMLog __RPC_FAR * This); #define ___ISMLogEvents_FWD_DEFINED__ HRESULT ( STDMETHODCALLTYPE __RPC_FAR typedef interface _ISMLogEvents _ISMLogEvents; *GetTypeInfoCount )( #endif /* ___ISMLogEvents_FWD_DEFINED__ */ ISMLog __RPC_FAR * This, /* [out] */ UINT __RPC_FAR *pctinfo); HRESULT ( STDMETHODCALLTYPE __RPC_FAR #ifndef __SMLog_FWD_DEFINED__ *GetTypeInfo )( #define __SMLog_FWD_DEFINED__ ISMLog __RPC_FAR * This, /* [in] */ UINT iTInfo, #ifdef __cplusplus /* [in] */ LCID lcid, typedef class SMLog SMLog; /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR #else *ppTInfo); typedef struct SMLog SMLog; HRESULT ( STDMETHODCALLTYPE __RPC_FAR #endif /* __cplusplus */ *GetIDsOfNames )( #endif /* __SMLog_FWD_DEFINED__ */ ISMLog __RPC_FAR * This, /* [in] */ REFIID riid, /* header files for imported files */ /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, #include "oaidl.h" /* [in] */ UINT cNames, #include "ocidl.h" /* [in] */ LCID lcid, /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); /* [local] */ HRESULT ( STDMETHODCALLTYPE void __RPC_USER MIDL_user_free( void __RPC_FAR * ); __RPC_FAR *Invoke )( ISMLog __RPC_FAR * This, #ifndef __ISMLog_INTERFACE_DEFINED__ /* [in] */ DISPID dispIdMember, #define __ISMLog_INTERFACE_DEFINED__ /* [in] */ REFIID riid, /* interface ISMLog */ /* [in] */ LCID lcid, /* [unique][helpstring][dual][uuid][object] */ /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS __RPC_FAR EXTERN_C const IID IID_ISMLog; *pDispParams, /* [out] */ VARIANT __RPC_FAR *pVarResult, #if defined(__cplusplus) && !defined(CINTERFACE) /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* [out] */ UINT __RPC_FAR *puArgErr); MIDL_INTERFACE("5AC75DAD-1936-11D3-BC2D- /* [helpstring][id][propput] */ HRESULT ( 00A0C90D2CA5") STDMETHODCALLTYPE __RPC_FAR *put_FileHeader )( ISMLog : public IDispatch ISMLog __RPC_FAR * This, { /* [in] */ BSTR newVal); public: /* [helpstring][id] */ HRESULT ( virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE __RPC_FAR *WriteLine )( STDMETHODCALLTYPE put_FileHeader( ISMLog __RPC_FAR * This, /* [in] */ BSTR newVal) = 0; BSTR szMsg); virtual /* [helpstring][id] */ HRESULT /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE WriteLine( STDMETHODCALLTYPE __RPC_FAR *WriteField )( BSTR szMsg) = 0; ISMLog __RPC_FAR * This, virtual /* [helpstring][id] */ HRESULT BSTR szMsg); STDMETHODCALLTYPE WriteField( /* [helpstring][id][propput] */ HRESULT ( BSTR szMsg) = 0; STDMETHODCALLTYPE __RPC_FAR *put_FileName )( virtual /* [helpstring][id][propput] */ HRESULT ISMLog __RPC_FAR * This, STDMETHODCALLTYPE put_FileName( /* [in] */ BSTR newVal); /* [in] */ BSTR newVal) = 0; /* [helpstring][id][propput] */ HRESULT ( virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE __RPC_FAR *put_Append )( STDMETHODCALLTYPE put_Append( ISMLog __RPC_FAR * This, /* [in] */ BOOL newVal) = 0; /* [in] */ BOOL newVal); }; END_INTERFACE #else /* C style interface */ } ISMLogVtbl;

HP TPC-H FULL DISCLOSURE REPORT 444 © 2005 Hewlett-Packard Company. All rights reserved. void __RPC_STUB ISMLog_put_FileHeader_Stub( interface ISMLog IRpcStubBuffer *This, { IRpcChannelBuffer *_pRpcChannelBuffer, CONST_VTBL struct ISMLogVtbl __RPC_FAR *lpVtbl; PRPC_MESSAGE _pRpcMessage, }; DWORD *_pdwStubPhase);

/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ISMLog_WriteLine_Proxy( #ifdef COBJMACROS ISMLog __RPC_FAR * This, BSTR szMsg);

#define ISMLog_QueryInterface(This,riid,ppvObject) \ (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) void __RPC_STUB ISMLog_WriteLine_Stub( IRpcStubBuffer *This, #define ISMLog_AddRef(This) \ IRpcChannelBuffer *_pRpcChannelBuffer, (This)->lpVtbl -> AddRef(This) PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); #define ISMLog_Release(This) \ (This)->lpVtbl -> Release(This) /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ISMLog_WriteField_Proxy( #define ISMLog_GetTypeInfoCount(This,pctinfo) \ ISMLog __RPC_FAR * This, (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) BSTR szMsg);

#define ISMLog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ void __RPC_STUB ISMLog_WriteField_Stub( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, #define PRPC_MESSAGE _pRpcMessage, ISMLog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgD DWORD *_pdwStubPhase); ispId) \ (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ISMLog_put_FileName_Proxy( #define ISMLog __RPC_FAR * This, ISMLog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispPara /* [in] */ BSTR newVal); ms,pVarResult,pExcepInfo,puArgErr) \ (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR void __RPC_STUB ISMLog_put_FileName_Stub( esult,pExcepInfo,puArgErr) IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, #define ISMLog_put_FileHeader(This,newVal) \ DWORD *_pdwStubPhase); (This)->lpVtbl -> put_FileHeader(This,newVal)

#define ISMLog_WriteLine(This,szMsg) \ /* [helpstring][id][propput] */ HRESULT (This)->lpVtbl -> WriteLine(This,szMsg) STDMETHODCALLTYPE ISMLog_put_Append_Proxy( ISMLog __RPC_FAR * This, #define ISMLog_WriteField(This,szMsg) \ /* [in] */ BOOL newVal); (This)->lpVtbl -> WriteField(This,szMsg)

#define ISMLog_put_FileName(This,newVal) \ void __RPC_STUB ISMLog_put_Append_Stub( (This)->lpVtbl -> put_FileName(This,newVal) IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, #define ISMLog_put_Append(This,newVal) \ PRPC_MESSAGE _pRpcMessage, (This)->lpVtbl -> put_Append(This,newVal) DWORD *_pdwStubPhase);

#endif /* COBJMACROS */ #endif /* __ISMLog_INTERFACE_DEFINED__ */

#endif /* C style interface */

/* [helpstring][id][propput] */ HRESULT #ifndef __LOGWRITERLib_LIBRARY_DEFINED__ STDMETHODCALLTYPE ISMLog_put_FileHeader_Proxy( #define __LOGWRITERLib_LIBRARY_DEFINED__ ISMLog __RPC_FAR * This, /* [in] */ BSTR newVal);

HP TPC-H FULL DISCLOSURE REPORT 445 © 2005 Hewlett-Packard Company. All rights reserved. /* library LOGWRITERLib */ /* [helpstring][version][uuid] */ /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( _ISMLogEvents __RPC_FAR * This, EXTERN_C const IID LIBID_LOGWRITERLib; /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, #ifndef ___ISMLogEvents_DISPINTERFACE_DEFINED__ /* [in] */ LCID lcid, #define ___ISMLogEvents_DISPINTERFACE_DEFINED__ /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS __RPC_FAR /* dispinterface _ISMLogEvents */ *pDispParams, /* [helpstring][uuid] */ /* [out] */ VARIANT __RPC_FAR *pVarResult, /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* [out] */ UINT __RPC_FAR *puArgErr); EXTERN_C const IID DIID__ISMLogEvents; END_INTERFACE #if defined(__cplusplus) && !defined(CINTERFACE) } _ISMLogEventsVtbl;

MIDL_INTERFACE("5AC75DB1-1936-11D3-BC2D- interface _ISMLogEvents 00A0C90D2CA5") { _ISMLogEvents : public IDispatch CONST_VTBL struct _ISMLogEventsVtbl __RPC_FAR { *lpVtbl; }; };

#else /* C style interface */

typedef struct _ISMLogEventsVtbl #ifdef COBJMACROS { BEGIN_INTERFACE #define _ISMLogEvents_QueryInterface(This,riid,ppvObject) HRESULT ( STDMETHODCALLTYPE __RPC_FAR \ *QueryInterface )( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) _ISMLogEvents __RPC_FAR * This, /* [in] */ REFIID riid, #define _ISMLogEvents_AddRef(This) \ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR (This)->lpVtbl -> AddRef(This) *ppvObject); #define _ISMLogEvents_Release(This) \ ULONG ( STDMETHODCALLTYPE __RPC_FAR (This)->lpVtbl -> Release(This) *AddRef )( _ISMLogEvents __RPC_FAR * This); #define _ISMLogEvents_GetTypeInfoCount(This,pctinfo) ULONG ( STDMETHODCALLTYPE __RPC_FAR \ *Release )( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) _ISMLogEvents __RPC_FAR * This); #define _ISMLogEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) HRESULT ( STDMETHODCALLTYPE __RPC_FAR \ *GetTypeInfoCount )( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) _ISMLogEvents __RPC_FAR * This, /* [out] */ UINT __RPC_FAR *pctinfo); #define _ISMLogEvents_GetIDsOfNames(This,riid,rgszNames,cNames,l HRESULT ( STDMETHODCALLTYPE __RPC_FAR cid,rgDispId) \ *GetTypeInfo )( (This)->lpVtbl -> _ISMLogEvents __RPC_FAR * This, GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, #define /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR _ISMLogEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pD *ppTInfo); ispParams,pVarResult,pExcepInfo,puArgErr) \ (This)->lpVtbl -> HRESULT ( STDMETHODCALLTYPE __RPC_FAR Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR *GetIDsOfNames )( esult,pExcepInfo,puArgErr) _ISMLogEvents __RPC_FAR * This, /* [in] */ REFIID riid, #endif /* COBJMACROS */ /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, #endif /* C style interface */ /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);

#endif /* ___ISMLogEvents_DISPINTERFACE_DEFINED__ */

HP TPC-H FULL DISCLOSURE REPORT 446 © 2005 Hewlett-Packard Company. All rights reserved. EXTERN_C const CLSID CLSID_SMLog; // FILE: SMLog.cpp // Microsoft TPC-H Kit Ver. 1.00 #ifdef __cplusplus // Copyright Microsoft, 1999 class DECLSPEC_UUID("5AC75DB0-1936-11D3-BC2D- // All Rights Reserved 00A0C90D2CA5") // SMLog; // #endif // PURPOSE: Implementation of CSMLog #endif /* __LOGWRITERLib_LIBRARY_DEFINED__ */ // Contact: Reshma Tharamal ([email protected]) // unsigned long __RPC_USER BSTR_UserSize(unsigned long // SMLog.cpp : Implementation of CSMLog __RPC_FAR *, #include "stdafx.h" unsigned long , BSTR __RPC_FAR * ); #include unsigned char __RPC_FAR * __RPC_USER #include "LogWriter.h" BSTR_UserMarshal( unsigned long __RPC_FAR *, #include "SMLog.h" unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); unsigned char __RPC_FAR * __RPC_USER ///////////////////////////////////////////////////////////////////////////// BSTR_UserUnmarshal(unsigned long __RPC_FAR *, // CSMLog unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); void __RPC_USER BSTR_UserFree( unsigned long STDMETHODIMP __RPC_FAR *, BSTR __RPC_FAR * ); CSMLog::InterfaceSupportsErrorInfo(REFIID riid) { /* end of Additional Prototypes */ static const IID* arr[] = { #ifdef __cplusplus &IID_ISMLog } }; #endif for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) #endif { // FILE: LogWriter.cpp if (InlineIsEqualGUID(*arr[i],riid)) /// FILE: LogWriterCP.h return S_OK; // Microsoft TPC-H Kit Ver. 1.00 } // Copyright Microsoft, 1999 return S_FALSE; // All Rights Reserved } // PURPOSE: Connection point implementation // Contact: Reshma Tharamal ([email protected]) STDMETHODIMP CSMLog::WriteToFile(BSTR szMsg) #ifndef _LOGWRITERCP_H_ { #define _LOGWRITERCP_H_ // Writes the passed in string to the file _bstr_t szTempMsg(szMsg); template return(Write((PBYTE)(LPSTR)szTempMsg, class CProxy_ISMLogEvents : public IConnectionPointImpl } { //Warning this class may be recreated by the wizard. HRESULT CSMLog::Init() public: { }; char szDrive[256]; #endif char szDir[256]; // FILE: resource.h char szLogDir[256]; // Microsoft TPC-H Kit Ver. 1.00 HANDLE hLogThread; // Copyright Microsoft, 1999 DWORD dwThreadID; // All Rights Reserved _bstr_t szFile(m_szFile); // PURPOSE: Resource file DWORD lDisposition; // Contact: Reshma Tharamal ([email protected]) // //create transaction log directory //{{NO_DEPENDENCIES}} _splitpath((LPCTSTR)szFile, szDrive, szDir, NULL, NULL); // Microsoft Developer Studio generated include file. _makepath(szLogDir, szDrive, szDir, NULL, NULL); // Used by LogWriter.rc CreateDirectory(szLogDir, NULL); // iBufferSize = WRITE_BUFFER_SIZE; #define IDS_PROJNAME 100 iBytesFreeInBuffer = iBufferSize; #define IDR_SMLOG 101 // Next default values for new objects // use VirtualAlloc to get page aligned buffers // // for (int i=0;i

HP TPC-H FULL DISCLOSURE REPORT 447 © 2005 Hewlett-Packard Company. All rights reserved. iActiveBuffer = 0; HRESULT CSMLog::Write(BYTE *ptr, DWORD iSize) pCurrent = pBuffer[iActiveBuffer]; { int StartPos, Remainder; lDisposition = m_bAppend ? OPEN_ALWAYS : int dwErrorLocal = 0; CREATE_ALWAYS; m_hTxnFile = CreateFile((LPCTSTR)szFile, if (!m_bInitialized) GENERIC_WRITE, FILE_SHARE_READ, { NULL, lDisposition, HRESULT hr = Init(); FILE_ATTRIBUTE_NORMAL, NULL); m_bInitialized = TRUE; if ( m_hTxnFile == INVALID_HANDLE_VALUE ) return (RaiseSystemError()); if (FAILED(hr)) return hr; if (m_bAppend) } if ( SetFilePointer(m_hTxnFile, 0, NULL, FILE_END) == ERR_SET_FILE_POINTER ) if ( m_hTxnFile == INVALID_HANDLE_VALUE ) return (RaiseSystemError()); return S_OK;

hIoComplete = CreateEvent(NULL, TRUE, TRUE, if ( iBytesFreeInBuffer >= iSize ) NULL); { if ( hIoComplete == NULL) memcpy(pCurrent, ptr, iSize); return RaiseSystemError(); pCurrent += iSize; iBytesFreeInBuffer -= iSize; hLogFileIo = CreateEvent(NULL, FALSE, FALSE, } NULL); else if ( hLogFileIo == NULL) { return RaiseSystemError(); // We don't expect to ever have to wait here, but just in case... hLogThread = CreateThread( NULL, 0, WaitForSingleObject(hIoComplete, (LPTHREAD_START_ROUTINE)LogFileIO, this, 0, INFINITE); &dwThreadID ); if (hLogThread == NULL) // check for an error from the log writer return RaiseSystemError(); thread if (dwError != 0) if (m_szHeader != NULL) { WriteLine(m_szHeader); SetLastError(dwError); return RaiseSystemError(); return S_OK; } } assert( iSize <= iBufferSize ); void CSMLog::LogFileIO(void *ptr) memcpy(pCurrent, ptr, { iBytesFreeInBuffer); unsigned long BytesWritten; StartPos = iBytesFreeInBuffer; CSMLog *p=(CSMLog *)ptr; Remainder = iSize - iBytesFreeInBuffer;

while( TRUE ) // trigger an IO on the current buffer and { roll to the next buffer WaitForSingleObject(p->hLogFileIo, INFINITE); iIoBuffer = iActiveBuffer; if ( p->m_hTxnFile == iWriteSize = iBufferSize; INVALID_HANDLE_VALUE ) ResetEvent(hIoComplete); break; SetEvent( hLogFileIo ); // wake up IO writer // do synchronous (blocking) write to log file if ( !WriteFile(p->m_hTxnFile, p->pBuffer[p- iActiveBuffer = (iActiveBuffer+1) % >iIoBuffer],p->iWriteSize,&BytesWritten,NULL) ) MAX_NUM_BUFFERS; { pCurrent = pBuffer[iActiveBuffer]; // set error code in this thread, but don't throw an exception memcpy(pCurrent, ((BYTE // because no one will catch it. *)ptr+StartPos), Remainder); p->dwError = GetLastError(); pCurrent += Remainder; iBytesFreeInBuffer = iBufferSize - } Remainder; SetEvent(p->hIoComplete); } } return S_OK; SetEvent(p->hIoComplete); } }

HP TPC-H FULL DISCLOSURE REPORT 448 © 2005 Hewlett-Packard Company. All rights reserved. void CSMLog::CloseLogFile(void) // Wrapper function that raises an error if a Windows Api fails { STDMETHODIMP CSMLog::RaiseSystemError(void) { if ( m_hTxnFile != INVALID_HANDLE_VALUE ) char s[ERR_BUFFER_SIZE]; { long c; if ( iBytesFreeInBuffer < iBufferSize ) DWORD e; { WaitForSingleObject(hIoComplete, INFINITE); e = GetLastError(); ResetEvent(hIoComplete); c = sprintf(s, "Error code: %ld. ", e); // check for an error from the log writer thread c = if (dwError != 0) FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | { FORMAT_MESSAGE_IGNORE_INSERTS, SetLastError( dwError ); NULL, e, 0, s + c, sizeof(s) - c, NULL); goto exit_SpinLock; } return Error(s, 0, NULL, GUID_NULL); } //zero fill remainder of buffer ZeroMemory(pCurrent, iBytesFreeInBuffer); //DEL STDMETHODIMP CSMLog::get_FileName(BSTR *pVal) iIoBuffer = iActiveBuffer; //DEL { iWriteSize = iBufferSize - iBytesFreeInBuffer; //DEL *pVal = m_szFile; SetEvent(hLogFileIo); // wake up IO writer //DEL return S_OK; } //DEL }

WaitForSingleObject(hIoComplete, INFINITE); STDMETHODIMP CSMLog::put_FileName(BSTR newVal) // check for an error from the log writer thread if (dwError != 0) { goto exit_SpinLock; m_szFile = SysAllocString(newVal);

pCurrent = pBuffer[iActiveBuffer]; return S_OK; ZeroMemory(pCurrent, iBufferSize); } iIoBuffer = iActiveBuffer; //DEL STDMETHODIMP CSMLog::get_FileHeader(BSTR CloseHandle(m_hTxnFile); *pVal) m_hTxnFile = INVALID_HANDLE_VALUE; //DEL { //handle to open transaction log file //DEL *pVal = m_szHeader; //DEL return S_OK; // wake up IO writer one more time for it to terminate //DEL } ResetEvent(hIoComplete); SetEvent(hLogFileIo); // wake up IO writer STDMETHODIMP CSMLog::put_FileHeader(BSTR newVal) WaitForSingleObject(hIoComplete, { INFINITE); m_szHeader = SysAllocString(newVal); } return S_OK; } exit_SpinLock: STDMETHODIMP CSMLog::WriteLine(BSTR szMsg) if (dwError != 0) { { _bstr_t szTmp(szMsg); if (m_hTxnFile != INVALID_HANDLE_VALUE) szTmp += "\r"; { szTmp += "\n"; CloseHandle(m_hTxnFile); return(WriteToFile(szTmp)); m_hTxnFile = INVALID_HANDLE_VALUE; } } STDMETHODIMP CSMLog::WriteField(BSTR szMsg) SetLastError( dwError ); { // TODO: Don't know yet what to do with an error on the file return(WriteToFile(szMsg)); close, since this function is called by the desctructor (which does } not return a value) //throw new CSystemErr( CSystemErr::eWriteFile, //DEL STDMETHODIMP CSMLog::get_Append(BOOL *pVal) "CTxnLog::CloseTransactionLogFile" ); //DEL { } //DEL *pVal = m_bAppend; //DEL return S_OK; } //DEL }

HP TPC-H FULL DISCLOSURE REPORT 449 © 2005 Hewlett-Packard Company. All rights reserved. STDMETHODIMP CSMLog::put_Append(BOOL newVal) DWORD iBytesFreeInBuffer; // bytes available for use in buffer { DWORD iWriteSize; //bytes to write to file m_bAppend = newVal; BSTR m_szFile; //name of the file to write to return S_OK; BSTR m_szHeader; //header to be printed to the file (optional) } private: // FILE: SMExecute.h static void LogFileIO(void *p); // Microsoft TPC-H Kit Ver. 1.00 HRESULT Write(BYTE *ptr, DWORD iSize); // Copyright Microsoft, 1999 STDMETHODIMP WriteToFile(BSTR szMsg); // All Rights Reserved void CloseLogFile(void); // STDMETHODIMP RaiseSystemError(void); // PURPOSE: Declaration of the CSMLog }; // Contact: Reshma Tharamal ([email protected]) // #endif //__SMLOG_H_ // SMLog.h : Declaration of the CSMLog // FILE: stdafx.cpp // Microsoft TPC-H Kit Ver. 1.00 #ifndef __SMLOG_H_ // Copyright Microsoft, 1999 #define __SMLOG_H_ // All Rights Reserved #include "resource.h" // main symbols // PURPOSE: source file that includes just the standard #include "assert.h" includes #include "comdef.h" // Contact: Reshma Tharamal ([email protected]) #include "LogWriterCP.h" // stdafx.cpp : source file that includes just the standard includes #define WRITE_BUFFER_SIZE 8*1024 // stdafx.pch will be the pre-compiled header #define MAX_NUM_BUFFERS 2 // stdafx.obj will contain the pre-compiled type information #define ERR_BUFFER_SIZE 512 #define ERR_SET_FILE_POINTER 0xFFFFFFFF #include "stdafx.h" #ifdef _ATL_STATIC_REGISTRY ///////////////////////////////////////////////////////////////////////////// #include // CSMLog #include class ATL_NO_VTABLE CSMLog : #endif public CComObjectRootEx, #include public CComCoClass, // FILE: stdafx.h public ISupportErrorInfo, // Microsoft TPC-H Kit Ver. 1.00 public IConnectionPointContainerImpl, // Copyright Microsoft, 1999 public IDispatchImpl, // PURPOSE: include file for standard system include files, public CProxy_ISMLogEvents< CSMLog > // or project specific include files that are used frequently, { // but are changed infrequently public: // Contact: Reshma Tharamal ([email protected]) CSMLog() // { #if m_bAppend = FALSE; !defined(AFX_STDAFX_H__5AC75DA4_1936_11D3_BC2D_ m_bInitialized = FALSE; 00A0C90D2CA5__INCLUDED_) m_hTxnFile = INVALID_HANDLE_VALUE; #define hIoComplete = NULL; AFX_STDAFX_H__5AC75DA4_1936_11D3_BC2D_00A0C90 hLogFileIo = NULL; D2CA5__INCLUDED_ for (int i=0;i 1000 pCurrent = NULL; #pragma once m_szFile = NULL; #endif // _MSC_VER > 1000 m_szHeader = NULL; dwError = 0; #define STRICT } #ifndef _WIN32_WINNT private: #define _WIN32_WINNT 0x0400 BOOL m_bAppend; #endif BOOL m_bInitialized; #define _ATL_APARTMENT_THREADED HANDLE m_hTxnFile; //handle to log file HANDLE hIoComplete; //event to signify that there are no #include pending IOs //You may derive a class from CComModule and use it if you HANDLE hLogFileIo; //event to signal the IO thread to write the //want to override something, but do not change the name of inactive buffer //_Module extern CComModule _Module; BYTE *pBuffer[MAX_NUM_BUFFERS]; #include BYTE *pCurrent; //ptr to current buffer //{{AFX_INSERT_LOCATION}} int iActiveBuffer;//indicates which buffer is active: 0 or // Microsoft Visual C++ will insert additional declarations 1int iIoBuffer; //buffer for any pending IO operation immediately before the previous line. DWORD dwError; #endif // DWORD iBufferSize; //buffer allocated size !defined(AFX_STDAFX_H__5AC75DA4_1936_11D3_BC2D_ 00A0C90D2CA5__INCLUDED)

HP TPC-H FULL DISCLOSURE REPORT 450 © 2005 Hewlett-Packard Company. All rights reserved. // FILE: Execute.cpp STDMETHODIMP CExecute::put_OutputFile(BSTR newVal) // Microsoft TPC-H Kit Ver. 1.00 { // Copyright Microsoft, 1999 assert(m_pOutputFile); // All Rights Reserved m_OutputFile = newVal; // HRESULT hr = m_pOutputFile- // PURPOSE: Implementation of CExecute. >put_FileName(newVal); // Contact: Reshma Tharamal ([email protected]) if FAILED(hr) // { #include "stdafx.h" m_pOutputFile->Release(); m_pOutputFile = NULL; #include "ExecuteDll.h" } #include "SMExecute.h" return hr; #include "Execute.h" } //DEL STDMETHODIMP CExecute::put_LogFile(BSTR extern SQLHENV henv; newVal) //DEL { extern SM_Connection_Info *p_Connections; //DEL assert(m_pLogFile); // Pointer to open connections //DEL extern int iConnectionCount; // //DEL m_pLogFile->put_FileName(newVal); Number of open connections //DEL return S_OK; extern CRITICAL_SECTION hConnections; //DEL } // Critical section to serialize STDMETHODIMP CExecute::put_ErrorFile(BSTR newVal) // access to available connections { assert(m_pErrorFile); #ifdef _TPCH_AUDIT m_ErrorFile = newVal; extern FILE *pfLogFile; // Log file containing timestamps HRESULT hr = m_pErrorFile- extern CRITICAL_SECTION hLogFileWrite; >put_FileName(newVal); // Handle to critical section if FAILED(hr) #endif { m_pErrorFile->Release(); ///////////////////////////////////////////////////////////////////////////// m_pErrorFile = NULL; // CExecute } return hr; char * g_szOdbcOps[] = { } "SQLAllocHandle", STDMETHODIMP CExecute::DoExecute(BSTR szCommand, "SQLDriverConnect", BSTR szExecutionDtls, ExecutionType ExecMethod, \ "SQLExecDirect", BOOL bNoCount, BOOL bNoExecute, BOOL bParseOnly, "SQLSetStmtAttr", BOOL bQuotedIds, \ "SQLCancel", BOOL bAnsiNulls, BOOL bShowQP, BOOL bStatsTime, BOOL "SQLNumResultCols", bStatsIO, \ "SQLDescribeCol", long lRowCount, long lQueryTmout, BSTR szConnection) "SQLColAttribute", { "SQLFetch", HANDLE hThrd; "SQLGetData", DWORD tid; "SQLRowCount", "SQLMoreResults", _CrtSetReportFile(_CRT_WARN, "SQLBindCol" _CRTDBG_FILE_STDOUT); }; m_szCommand = szCommand; m_szExecDtls = szExecutionDtls; char * CExecError::m_szExecErrorDesc[] = { "Connection is already in use." m_ExecMthd = ExecMethod; }; if (m_ExecMthd == execODBC) STDMETHODIMP { CExecute::InterfaceSupportsErrorInfo(REFIID riid) m_bNoCount = bNoCount; { m_bNoExecute = bNoExecute; static const IID* arr[] = m_bParseOnly = bParseOnly; { m_bQuotedIds = bQuotedIds; &IID_IExecute m_bAnsiNulls = bAnsiNulls; }; m_bShowQP = bShowQP; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) m_bStatsTime = bStatsTime; { m_bStatsIO = bStatsIO; if (InlineIsEqualGUID(*arr[i],riid)) m_lRowCount = lRowCount; return S_OK; m_lQueryTmout = lQueryTmout; } m_szConnection = szConnection; return S_FALSE; } }

HP TPC-H FULL DISCLOSURE REPORT 451 © 2005 Hewlett-Packard Company. All rights reserved. if((hThrd = CreateThread( 0, 0, #ifdef _TPCH_AUDIT (LPTHREAD_START_ROUTINE)ExecutionThread, sprintf(szFmt, "Complete Step: '%%.%ds' at this, 0, &tid)) == NULL) '%d/%d/%d %d:%d:%d:%d'\n", return(RaiseSystemError()); MAXLOGCMDLEN, CloseHandle(hThrd); MyExecute->m_tEndTime.wMonth, MyExecute- return S_OK; >m_tEndTime.wDay, } MyExecute->m_tEndTime.wYear, MyExecute- >m_tEndTime.wHour, STDMETHODIMP CExecute::Abort() MyExecute->m_tEndTime.wMinute, MyExecute- { >m_tEndTime.wSecond, if (m_ExecMthd == execShell) MyExecute->m_tEndTime.wMilliseconds); return(AbortShell()); if (MyExecute->m_ExecMthd == execShell) else WriteFileToTpchLog((LPSTR)MyExecute- return(AbortODBC()); >m_szCommand, szFmt); } else void ExecutionThread(LPVOID lpParameter) { { sprintf(szBuffer, szFmt, (LPSTR)MyExecute- CExecute *MyExecute = (CExecute*)lpParameter; >m_szCommand); MyExecute->m_tElapsedTime = 0; WriteToTpchLog(szBuffer); GetLocalTime(&MyExecute->m_tStartTime); } MyExecute->PostMessage(WM_TASK_START, 0, #endif 0); MyExecute->PostMessage(WM_TASK_FINISH, 0, 0); #ifdef _TPCH_AUDIT char return; szBuffer[MAXLOGCMDBUF]; } char szFmt[MAXBUFLEN]; #ifdef _TPCH_AUDIT void WriteFileToTpchLog(LPSTR szFile, LPSTR szFmt) sprintf(szFmt, "Start Step: '%%.%ds' at '%d/%d/%d { %d:%d:%d:%d'\n", // Reads a maximum of MAXLOGCMDBUF MAXLOGCMDLEN, characters from the command file and writes it to the log MyExecute->m_tStartTime.wMonth, MyExecute- FILE *fpCmd; >m_tStartTime.wDay, int iRead; MyExecute->m_tStartTime.wYear, MyExecute- char szBuf[MAXLOGCMDBUF]; >m_tStartTime.wHour, char szCmd[MAXLOGCMDLEN]; MyExecute->m_tStartTime.wMinute, if ( pfLogFile != NULL ) MyExecute->m_tStartTime.wSecond, { MyExecute- if ( (fpCmd = fopen(szFile, >m_tStartTime.wMilliseconds); FILE_ACCESS_READ)) != NULL) if (MyExecute->m_ExecMthd == execShell) { WriteFileToTpchLog((LPSTR)MyExecute- iRead = fread(szCmd, sizeof(char), sizeof(szCmd) / sizeof(char), >m_szCommand, szFmt); fpCmd); else if (iRead < MAXLOGCMDLEN) { szCmd[iRead] = '\0'; sprintf(szBuffer, szFmt, (LPSTR)MyExecute->m_szCommand); else WriteToTpchLog(szBuffer); szCmd[MAXLOGCMDLEN - 1] = '\0'; } sprintf(szBuf, szFmt, szCmd); #endif WriteToTpchLog(szBuf); fclose(fpCmd); // Initialize the run status for the step to running. The } completion status for } // the step will be initialized by the Shell and ODBC } execution functions. void WriteToTpchLog(char *szMsg) MyExecute->m_StepStatus = gintRunning; { if (MyExecute->m_ExecMthd == execShell) if (pfLogFile != NULL) MyExecute->m_tElapsedTime = MyExecute->ExecuteShell(); { else EnterCriticalSection(&hLogFileWrite); MyExecute->m_tElapsedTime = MyExecute->ExecuteODBC(); fprintf(pfLogFile, szMsg); // Close the output, log and error files LeaveCriticalSection(&hLogFileWrite); if (MyExecute->m_pOutputFile) } MyExecute->m_pOutputFile->Release(); MyExecute->m_pOutputFile = NULL; return; } MyExecute->m_ExecTime = NULL; #endif GetLocalTime(&MyExecute->m_tEndTime);

HP TPC-H FULL DISCLOSURE REPORT 452 © 2005 Hewlett-Packard Company. All rights reserved. TC_ TIME CExecute::ExecuteShell() STDMETHODIMP CExecute::AbortShell() { { STARTUPINFOA Start; if (m_hHandle != SQL_NULL_HSTMT) PROCESS_INFORMATION proc; if (!TerminateProcess(m_hHandle, 0)) DWORD return(RaiseSystemError()); exitCode; TC_ TIME return(S_OK); tElapsed = 0; } _bstr_t szCommand("cmd /c "); TC_ TIME CExecute::ExecuteODBC() LPSTR { szStartDir; TC_ TIME tElapsed CURRENCY = 0; Elapsed; HDBC m_hdbc; SQLRETURN rc; szCommand += m_szCommand; LPSTR szCmd; CURRENCY Elapsed; // Redirect output and error information BOOL szCommand += " > " + m_OutputFile + " 2> " + bDoConnect = FALSE; m_ErrorFile; // ODBC specific initialization // Initialize the STARTUPINFO structure: m_hdbc = SQL_NULL_HDBC; memset(&Start, 0, sizeof(STARTUPINFOA)) ; Start.cb = sizeof(Start); try Start.dwFlags = { STARTF_USESHOWWINDOW; // Allocate a new connection if we are Start.wShowWindow = creating a dynamic connection or if SW_SHOWMINNOACTIVE; // the named connection doesn't exist InitializeConnection(&m_hdbc, memset(&proc, 0, &bDoConnect); sizeof(PROCESS_INFORMATION)) ; // Ensure that the connection is valid. szStartDir = strcmp((LPCTSTR)m_szExecDtls, "") #ifdef _DEBUG == 0 ? NULL : (LPSTR)m_szExecDtls; _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLDriverConnect.\n"); m_ExecTime->Start(); #endif

// Start the shelled application: if (bDoConnect) if (!CreateProcessA( NULL, (LPSTR)szCommand, { NULL, NULL, FALSE, // Allocate connection handle, NORMAL_PRIORITY_CLASS, NULL, open a connection and set connection attributes. szStartDir, &Start, &proc )) #ifdef _DEBUG { _CrtDbgReport(_CRT_WARN, m_StepStatus = gintFailed; NULL, 0, NULL, "Executing SQLDriverConnect.\n"); LogSystemError(m_pErrorFile); #endif

m_ExecTime->Stop(&Elapsed); if (m_bAbort) return((TC_TIME)Elapsed.int64); return(tElapsed); } // Connect to the server using m_hHandle = proc.hProcess; the passed in connection string // Give the process time to execute and finish rc = WaitForSingleObject(m_hHandle, INFINITE); SQLDriverConnect(m_hdbc, NULL, m_ExecTime->Stop(&Elapsed); (unsigned char *)(LPSTR)m_szExecDtls, SQL_NTS, if (!GetExitCodeProcess(m_hHandle, &exitCode)) NULL, 0, NULL, { SQL_DRIVER_NOPROMPT); m_StepStatus = gintFailed; HandleODBCError(rc, LogSystemError(m_pErrorFile); SQL_HANDLE_DBC, m_hdbc, SMSQLDriverConnect); } } else m_StepStatus = gintComplete; ReConnectDeadConnection(&m_hdbc);

// Close all open handles to the shelled process #ifdef _DEBUG CloseHandle(m_hHandle); _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLAllocHandle for hdbc.\n"); return((TC_TIME)Elapsed.int64); #endif }

HP TPC-H FULL DISCLOSURE REPORT 453 © 2005 Hewlett-Packard Company. All rights reserved. if (!m_bAbort && (rc = #ifdef _DEBUG SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, _CrtDbgReport(_CRT_WARN, &m_hHandle)) != SQL_SUCCESS) NULL, 0, NULL, "Executing SQLExecDirect.\n"); HandleODBCError(rc, SQL_HANDLE_DBC, m_hdbc, #endif SMSQLAllocHandle); // Execute the ODBC command // Set connection attributes if any have been modified from the rc = SQLExecDirect(m_hHandle, (unsigned char default values *)szCmd, SQL_NTS); if (m_lRowCount > 0) HandleODBCError(rc, SQL_HANDLE_STMT, { m_hHandle, SMSQLExecDirect); char szConnOptions[512]; sprintf(szConnOptions, "SET ROWCOUNT %d ", free(szCmd); m_lRowCount); SetConnectionOption(szConnOptions, &m_hdbc); // Call a procedure to log the results to the output file } ProcessResultsets();

if (m_bQuotedIds) } SetConnectionOption("SET QUOTED_IDENTIFIER m_ExecTime->Stop(&Elapsed); ON ", &m_hdbc); ResetConnectionProperties(&m_hdbc); if (!m_bAnsiNulls) } SetConnectionOption("SET catch(CODBCError *pErr) ANSI_NULL_DFLT_OFF ON ", &m_hdbc); { m_StepStatus = gintFailed; if (!m_bAbort && m_lQueryTmout > 0) delete pErr; { } #ifdef _DEBUG catch(CExecError *pErr) _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, { "Executing SQLSetStmtAttr.\n"); m_StepStatus = gintFailed; #endif pErr->LogErrors(this); // Set the query timeout on the statement handle delete pErr; rc = SQLSetStmtAttr(m_hHandle, } SQL_ATTR_QUERY_TIMEOUT, &m_lQueryTmout, SQL_IS_UINTEGER); ODBCCleanup(&m_hdbc, &m_hHandle); HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, SMSQLSetStmtAttr); if (m_StepStatus != gintFailed) } m_StepStatus = gintComplete;

if (m_bNoExecute) return((DWORD)Elapsed.int64); SetConnectionOption("SET } NOEXEC ON ", &m_hdbc); else if (m_bParseOnly) void CExecute::InitializeConnection(HDBC *phdbc, BOOL SetConnectionOption("SET PARSEONLY ON ", &m_hdbc); *pbDoConnect) else if (m_bShowQP) { // Important to ensure that this is the last connection attributes SQLRETURN rc; being set - otherwise showplans are generated for all remaining SET statements SetConnectionOption("SET *pbDoConnect = TRUE; SHOWPLAN_TEXT ON ", &m_hdbc); else if (IsDynamicConnection()) { { if (m_bNoCount) #ifdef _DEBUG SetConnectionOption("SET NOCOUNT ON ", &m_hdbc); _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLAllocHandle for m_hdbc.\n") ; if (m_bStatsIO) #endif SetConnectionOption("SET STATISTICS IO ON ", &m_hdbc); // Important to ensure that this is the last connection attributes rc = being set - // otherwise timing statistics are generated for all SQLAllocHandle(SQL_HANDLE_DBC, henv, phdbc); remaining SET statements if (m_bStatsTime) HandleODBCError(rc, SetConnectionOption("SET STATISTICS TIME ON ", SQL_HANDLE_ENV, henv, SMSQLAllocHandle); &m_hdbc); } return; } m_szCmd = (LPSTR)m_szCommand; m_ExecTime->Start();

while ((szCmd = NextCmdInBatch((LPSTR)m_szCommand)) != NULL && !m_bAbort) {

HP TPC-H FULL DISCLOSURE REPORT 454 © 2005 Hewlett-Packard Company. All rights reserved. void CExecute::ReConnectDeadConnection(HDBC *phdbc) EnterCriticalSection(&hConnections); { // Returns the connection handle if the connection, SQLRETURN rc; m_szConnection, exists SQLUINTEGER uConnDead; for (m_iConnectionIndex = iConnectionCount - 1; m_iConnectionIndex >= 0; m_iConnectionIndex--) // Connect to the server using the passed in connection { string if (!strcmp( (p_Connections + rc = SQLGetConnectAttr(*phdbc, m_iConnectionIndex)->szConnectionName, SQL_ATTR_CONNECTION_DEAD, (LPSTR)m_szConnection)) &uConnDead, SQL_IS_UINTEGER, { NULL); if (!(p_Connections + HandleODBCError(rc, SQL_HANDLE_DBC, m_iConnectionIndex)->bInUse) *phdbc, SMSQLDriverConnect); { *phdbc = if (uConnDead == SQL_CD_TRUE) (p_Connections + m_iConnectionIndex)->hdbc; { (p_Connections + // Cleanup the old connection and re- m_iConnectionIndex)->bInUse = TRUE; connect. #ifdef _DEBUG *pbDoConnect = _CrtDbgReport(_CRT_WARN, NULL, 0, FALSE; NULL, "Executing SQLDisconnect.\n"); break; #endif } rc = SQLDisconnect(*phdbc); else #ifdef _DEBUG { _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLFreeHandle for hdbc.\n"); LeaveCriticalSection(&hConnections); #endif SQLFreeHandle(SQL_HANDLE_DBC, *phdbc); throw new *phdbc = SQL_NULL_HDBC; CExecError(CExecError::SM_ERR_CONN_IN_USE); } #ifdef _DEBUG } _CrtDbgReport(_CRT_WARN, NULL, 0, } NULL, "Executing SQLDriverConnect.\n"); #endif if (m_iConnectionIndex < 0) { rc = // Connection was not found. Allocate SQLAllocHandle(SQL_HANDLE_DBC, henv, phdbc); connection handle and add it to list of HandleODBCError(rc, // available connections. SQL_HANDLE_ENV, henv, SMSQLAllocHandle); #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, // Connect to the server using the passed in NULL, "Executing SQLAllocHandle for m_hdbc.\n") ; connection string #endif rc = SQLDriverConnect(*phdbc, NULL, (unsigned char rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, *)(LPSTR)m_szExecDtls, SQL_NTS, phdbc); NULL, 0, NULL, HandleODBCError(rc, SQL_HANDLE_ENV, henv, SQL_DRIVER_NOPROMPT); SMSQLAllocHandle); HandleODBCError(rc, SQL_HANDLE_DBC, *phdbc, SMSQLDriverConnect); m_iConnectionIndex = iConnectionCount++; }

p_Connections = (SM_Connection_Info return; *)realloc(p_Connections, } iConnectionCount * sizeof(SM_Connection_Info)); void CExecute::ResetConnectionUsage() strcpy((p_Connections + m_iConnectionIndex)- { >szConnectionName, (LPSTR)m_szConnection); if(m_iConnectionIndex >= 0 && (p_Connections + m_iConnectionIndex)->hdbc = m_iConnectionIndex < iConnectionCount) *phdbc; { (p_Connections + m_iConnectionIndex)->bInUse = EnterCriticalSection(&hConnections); TRUE; (p_Connections + m_iConnectionIndex)- } >bInUse = FALSE; LeaveCriticalSection(&hConnections); LeaveCriticalSection(&hConnections); } return; } return; }

HP TPC-H FULL DISCLOSURE REPORT 455 © 2005 Hewlett-Packard Company. All rights reserved. void CExecute::ResetConnectionProperties(HDBC *p_hdbc) { LPSTR CExecute::NextCmdInBatch(LPSTR szBatch) SQLRETURN rc; { LPSTR szCmd, szSeparator, szStart; // Reset connection attributes if any have been modified from the char szNext; default values if (m_bNoExecute) szStart = m_szCmd; SetConnectionOption("SET NOEXEC OFF ", p_hdbc); else if (m_bParseOnly) while ( (szSeparator = strstr(szStart, SetConnectionOption("SET PARSEONLY OFF ", p_hdbc); CMD_SEPARATOR)) != NULL) else if (m_bShowQP) { // Reset connection attributes in reverse order szNext = *(szSeparator + SetConnectionOption("SET SHOWPLAN_TEXT OFF ", strlen(CMD_SEPARATOR)); p_hdbc); if ( szNext == '\n' || szNext == '\r' || szNext else == '\0') { break; // Reset connection attributes in reverse order else if (m_bStatsTime) szStart = szSeparator + SetConnectionOption("SET STATISTICS TIME OFF ", strlen(CMD_SEPARATOR); p_hdbc); }

if (m_bNoCount) if (!szSeparator) SetConnectionOption("SET { NOCOUNT OFF ", p_hdbc); // No more GO's if (strlen(m_szCmd) > 0) if (m_bStatsIO) { SetConnectionOption("SET szCmd = STATISTICS IO OFF ", p_hdbc); (LPSTR)malloc(strlen(m_szCmd) + 1); } strcpy(szCmd, m_szCmd); m_szCmd += if (m_lRowCount > 0) strlen(m_szCmd); { } char else szConnOptions[512]; szCmd = NULL; } sprintf(szConnOptions, "SET else if (szSeparator - m_szCmd > 0) ROWCOUNT 0 "); { SetConnectionOption(szConnOptions, // Strip the succeeding newline p_hdbc); szCmd = (LPSTR)malloc(szSeparator - m_szCmd); } strncpy(szCmd, m_szCmd, szSeparator - m_szCmd - 1); *(szCmd + (szSeparator - m_szCmd - 1)) = '\0'; if (m_bQuotedIds) m_szCmd += szSeparator - m_szCmd + SetConnectionOption("SET strlen(CMD_SEPARATOR); QUOTED_IDENTIFIER OFF ", p_hdbc); if ( szNext == '\n' || szNext == '\r') m_szCmd += 1; if (!m_bAnsiNulls) } SetConnectionOption("SET else ANSI_NULL_DFLT_OFF OFF ", p_hdbc); szCmd = NULL;

if (m_lQueryTmout > 0) return(szCmd); { } SQLUINTEGER lQueryTmout = 0; void CExecute::SetConnectionOption(LPSTR szConn, HDBC *pHdbc) #ifdef _DEBUG { _CrtDbgReport(_CRT_WARN, NULL, 0, // Executes the passed in connection options 'set' NULL, "Executing SQLSetStmtAttr.\n") ; statement. Returns True if it succeeded #endif char // Set the query timeout on the statement handle szConnOptions[512]; rc = SQLSetStmtAttr(m_hHandle, SQLRETURN rc; SQL_ATTR_QUERY_TIMEOUT, &lQueryTmout, SQL_IS_UINTEGER); sprintf(szConnOptions, szConn); HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, SMSQLSetStmtAttr); #ifdef _DEBUG } _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLExecDirect for connection option.\n"); return; #endif }

HP TPC-H FULL DISCLOSURE REPORT 456 © 2005 Hewlett-Packard Company. All rights reserved. if (m_bAbort) // Determine the number of result set return; columns. rc = SQLNumResultCols(m_hHandle, rc = SQLExecDirect(m_hHandle, (unsigned char &NumCols); *)szConnOptions, SQL_NTS); HandleODBCError(rc, HandleODBCError(rc, SQL_HANDLE_STMT, SQL_HANDLE_STMT, m_hHandle, SMSQLNumResultCols); m_hHandle, SMSQLExecDirect); if (NumCols > 0) return; { } // Allocate arrays to hold the C STDMETHODIMP CExecute::AbortODBC() type, scale, column and display length of the data { CTypeArray = m_bAbort = TRUE; (SQLSMALLINT *) malloc(NumCols * sizeof(SQLSMALLINT)); try CScaleArray = { (SQLSMALLINT *) malloc(NumCols * if (m_hHandle != SQL_NULL_HSTMT) sizeof(SQLSMALLINT)); { ColLenArray = #ifdef _DEBUG (SQLINTEGER *) malloc(NumCols * sizeof(SQLINTEGER)); _CrtDbgReport(_CRT_WARN, DispLenArray = NULL, 0, NULL, "Executing SQLCancel.\n"); (SQLINTEGER *) malloc(NumCols * sizeof(SQLINTEGER)); #endif OffsetArray = (SQLINTEGER SQLRETURN rc = *) malloc(NumCols * sizeof(SQLINTEGER)); SQLCancel(m_hHandle); OffsetArray[0] = 0; HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, SMSQLCancel); for (i = 0; i < NumCols && } !m_bAbort; i++) } { catch(CODBCError *pErr) #ifdef _DEBUG { delete pErr; _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, } "Executing SQLDescribeCol.\n") ; #endif return(S_OK); // Get the column description, include the SQL type } // Determine the column's byte length. Calculate the offset in the //buffer to the data as the offset to the previous column, plus the void CExecute::ProcessResultsets() //byte length of the previous column, plus the byte length of the { //previous column's length/indicator buffer. SQLSMALLINT *CTypeArray, *CScaleArray; // Note that the byte length of the column and the length/indicator SQLINTEGER *ColLenArray, //buffer are increasedso that, assuming they start on an alignment *DispLenArray, *OffsetArray; //boundary, they will end on the byte before the next alignment SQLSMALLINT iColNameLen, //boundary. Although this might leave some holes in the buffer, it SQLType, iColNull, i, NumCols = 0; //is a relatively inexpensive way to guarantee alignment. SQLINTEGER iDispLen, rc = SQLDescribeCol(m_hHandle, ((SQLUSMALLINT) i)+1, iRowCount; (unsigned char *)szColName, sizeof(szColName), SQLRETURN rc; &iColNameLen, char &SQLType, (unsigned long *)&ColLenArray[i], szColName[MAX_DATA_LEN + 1]; &CScaleArray[i], &iColNull); void *DataPtr; HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, SQLINTEGER iLenOrInd = SMSQLDescribeCol); ALIGNBUF(sizeof(SQLINTEGER)); #ifdef _DEBUG SQLUINTEGER iRowArraySize, _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing iArrayElementSize; SQLColAttribute.\n"); // SQLUINTEGER NumRowsFetched; #endif // SQLUSMALLINT *RowStatusArray; if (m_bAbort) return; rc = SQLColAttribute(m_hHandle, ((SQLUSMALLINT) i)+1, if (!m_pOutputFile || m_bAbort) SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, &iDispLen); return; HandleODBCError(rc, SQL_HANDLE_STMT, do m_hHandle, SMSQLColAttribute); { #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLNumResultCols.\n"); #endif

HP TPC-H FULL DISCLOSURE REPORT 457 © 2005 Hewlett-Packard Company. All rights reserved. // GetDefaultCType contains a switch statement that returns the // For each column, bind the address in the buffer at the start of //default C type for each SQL type. the memory allocated CTypeArray[i] = GetDefaultCType(SQLType); // for that column's data and the address at the start of the if ( (CTypeArray[i] == SQL_C_CHAR || CTypeArray[i] == memory allocated for that SQL_C_BINARY) && ColLenArray[i] > MAX_DATA_LEN) // column's length/indicator buffer. { for (i = 0; i < NumCols; i++) ColLenArray[i] = MAX_DATA_LEN; { iDispLen = MAX_DATA_LEN; SQLBindCol(m_hHandle, i + 1, CTypeArray[i], } (SQLPOINTER)((SQLCHAR *)DataPtr + OffsetArray[i]), ColLenArray[i], (SQLINTEGER DispLenArray[i] = max(iColNameLen, iDispLen); *)((SQLCHAR *)DataPtr + OffsetArray[i] + ColLenArray[i])); DispLenArray[i] = max(DispLenArray[i], sizeof(S_NULL)); HandleODBCError(rc, // Print the column names in the header SQL_HANDLE_STMT, m_hHandle, SMSQLBindCol); PrintData(szColName, SQL_C_CHAR, DispLenArray[i], 0, m_pOutputFile); // Underline each column name // Add a byte for the null-termination character memset(szColName, '-', DispLenArray[i]); ColLenArray[i] += 1; *(szColName + DispLenArray[i]) = '\0'; ColLenArray[i] = ALIGNBUF(ColLenArray[i]); PrintData(szColName, SQL_C_CHAR, // Calculate the offset in the buffer to the data as the offset to the DispLenArray[i], 0, m_pOutputFile); previous column, } // plus the byte length of the previous column, plus the byte m_pOutputFile->WriteLine(NULL); //length of the previous column's length/indicator buffer. if (i) OffsetArray[i] = OffsetArray[i-1] + ColLenArray[i-1] + #ifdef _DEBUG iLenOrInd; _CrtDbgReport(_CRT_WARN, NULL, 0, } NULL, "Executing SQLFetch.\n"); m_pOutputFile->WriteLine(NULL); #endif iArrayElementSize = OffsetArray[NumCols-1] + while (!m_bAbort && (rc = SQLFetch(m_hHandle)) != ColLenArray[NumCols-1] + iLenOrInd; SQL_NO_DATA) iRowArraySize = 1; { // Allocate the data buffer. The size of the buffer is equal to the HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, //offset to the data buffer for the final column, plus the byte SMSQLFetch); //length o f the data buffer and length/indicator /* // buffer for the last column. for (i = 0; i < NumRowsFetched; i++) DataPtr = malloc(iRowArraySize * iArrayElementSize); { // Specify the size of the structure with the if (RowStatusArray[i] == SQL_ROW_SUCCESS|| SQL_ATTR_ROW_BIND_TYPE RowStatusArray[i] == SQL_ROW_SUCCESS_WITH_INFO) // statement attribute. This also declares that row-wise { binding will */ // be used. Declare the rowset size with the for (i = 0; i < NumCols; i++) SQL_ATTR_ROW_ARRAY_SIZE { // statement attribute. Set the // Retrieve and print each row. PrintData accepts a pointer to the SQL_ATTR_ROW_STATUS_PTR statement data, its C type, and its byte length/indicator. // attribute to point to the row status array. if ( *((SQLINTEGER *)((SQLCHAR *)DataPtr + OffsetArray[i] Set the + ColLenArray[i])) == SQL_NULL_DATA) // SQL_ATTR_ROWS_FETCHED_PTR PrintData(S_NULL, SQL_C_CHAR, DispLenArray[i], 0, statement attribute to point to m_pOutputFile); // NumRowsFetched. else /* PrintData((LPVOID)((SQLCHAR *)DataPtr + OffsetArray[i]), RowStatusArray = (SQLUSMALLINT CTypeArray[i], *)malloc(iRowArraySize * sizeof(SQLUSMALLINT)); DispLenArray[i], CScaleArray[i], m_pOutputFile); } SQLSetStmtAttr(m_hHandle, m_pOutputFile->WriteLine(NULL); SQL_ATTR_ROW_BIND_TYPE, &iArrayElementSize, } SQL_IS_UINTEGER); m_pOutputFile->WriteLine(NULL); SQLSetStmtAttr(m_hHandle, free(DataPtr); SQL_ATTR_ROW_ARRAY_SIZE, &iRowArraySize, free(CTypeArray); SQL_IS_UINTEGER); free(CScaleArray); SQLSetStmtAttr(m_hHandle, free(ColLenArray); SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, free(DispLenArray); SQL_IS_POINTER); } SQLSetStmtAttr(m_hHandle, // Write io statistics, if applicable SQL_ATTR_ROWS_FETCHED_PTR, &NumRowsFetched, LogODBCErrors(rc, SQL_HANDLE_STMT, SQL_IS_POINTER); m_hHandle, SMSQLFetch); */ #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLRowCount.\n"); #endif

HP TPC-H FULL DISCLOSURE REPORT 458 © 2005 Hewlett-Packard Company. All rights reserved. if (m_bAbort) { break; if (vData) { // action (insert, update, delete) query switch(CType) rc = SQLRowCount(m_hHandle, { &iRowCount); case SQL_C_CHAR: HandleODBCError(rc, case SQL_C_WCHAR: SQL_HANDLE_STMT, m_hHandle, SMSQLRowCount); case SQL_C_TYPE_DATE: case SQL_C_TYPE_TIME: if (!m_bNoCount && iRowCount != -1) case SQL_C_TYPE_TIMESTAMP: { case SQL_C_INTERVAL_YEAR: sprintf(szColName, "(%d row(s) affected)", iRowCount); case SQL_C_INTERVAL_MONTH: _bstr_t temp(szColName); case SQL_C_INTERVAL_YEAR_TO_MONTH: m_pOutputFile->WriteLine((BSTR)temp); case SQL_C_INTERVAL_DAY: m_pOutputFile->WriteLine(NULL); case SQL_C_INTERVAL_HOUR: } case SQL_C_INTERVAL_MINUTE: #ifdef _DEBUG case SQL_C_INTERVAL_SECOND: _CrtDbgReport(_CRT_WARN, NULL, 0, case SQL_C_INTERVAL_DAY_TO_HOUR: NULL, "Executing SQLFreeStmt.\n"); case SQL_C_INTERVAL_DAY_TO_MINUTE: #endif case SQL_C_INTERVAL_DAY_TO_SECOND: case SQL_C_INTERVAL_HOUR_TO_MINUTE: if (m_bAbort) case SQL_C_INTERVAL_HOUR_TO_SECOND: break; case SQL_C_INTERVAL_MINUTE_TO_SECOND: case SQL_C_BINARY: SQLFreeStmt(m_hHandle, sprintf(fmt, "%%.%ds", iColLen); SQL_UNBIND); j = sprintf(s, fmt, (char *)vData); break; #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, case SQL_C_SHORT: NULL, "Executing SQLMoreResults.\n"); j = sprintf(s, "%d", *(short *)vData); #endif break;

if (m_bAbort) case SQL_C_LONG: break; j = sprintf(s, "%ld", *(long *)vData); break; // Process the next resultset. This function returns 'success with info' even case SQL_C_UBIGINT: // if there is no other resultset and there are j = sprintf(s, "%I64d", *(__int64 *)vData); statistics messages to be printed. break; // Hence the check for -1 rows before printing. case SQL_C_FLOAT: rc=SQLMoreResults(m_hHandle); j = sprintf(s, "%f", *(float *)vData); if (rc != SQL_NO_DATA) break; HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, SMSQLMoreResults); case SQL_C_DOUBLE: j = sprintf(s, "%f", *(double *)vData); } while (rc != SQL_NO_DATA); break; case SQL_C_NUMERIC: return; sprintf(fmt, "%%.0%df", iScale); } j = sprintf(s, fmt, *(double *)vData); break; void CExecute::PrintData(void *vData, SQLSMALLINT CType, default: SQLINTEGER IndPtr, SQLSMALLINT iScale, ISMLog j = sprintf(s, "%s", vData); *pOutput) break; { } // PrintData accepts a pointer to the data, its C type, } // and its byte length/indicator. It contains a switch if (iColLen - j > 0) statement that casts and prints memset(s + j, ' ', iColLen - j); // the data according to its type. *(s + iColLen) = '\0'; char *s; char fmt[MAXBUFLEN]; // Write the field to the output file int j = 0; _bstr_t temp(s); SQLINTEGER iColLen = IndPtr + 1; pOutput->WriteField((BSTR)temp); assert(iColLen); free(s); s = (LPSTR)malloc(iColLen + 1); } return; if (s) }

HP TPC-H FULL DISCLOSURE REPORT 459 © 2005 Hewlett-Packard Company. All rights reserved. SQLSMALLINT CExecute::GetDefaultCType(SQLINTEGER case SQL_INTERVAL_YEAR: SQLType) return(SQL_C_CHAR); { // // GetDefaultCType returns the C type for the passed return(SQL_C_INTERVAL_YEAR); in SQL datatype. case SQL_INTERVAL_MONTH: switch(SQLType) return(SQL_C_CHAR); { // case SQL_CHAR: return(SQL_C_INTERVAL_MONTH); case SQL_VARCHAR: case SQL_LONGVARCHAR: case SQL_INTERVAL_YEAR_TO_MONTH: case SQL_WCHAR: return(SQL_C_CHAR); case SQL_WVARCHAR: // return(SQL_C_INTERVAL_YEAR_TO_MONTH); case SQL_WLONGVARCHAR: return(SQL_C_CHAR); case SQL_INTERVAL_DAY: return(SQL_C_CHAR); case SQL_TINYINT: // return(SQL_C_CHAR); return(SQL_C_INTERVAL_DAY);

case SQL_SMALLINT: case SQL_INTERVAL_HOUR: return(SQL_C_SHORT); return(SQL_C_CHAR); // return(SQL_C_INTERVAL_HOUR); case SQL_INTEGER: return(SQL_C_LONG); case SQL_INTERVAL_MINUTE: return(SQL_C_CHAR); case SQL_BIGINT: // return(SQL_C_INTERVAL_MINUTE); return(SQL_C_UBIGINT); case SQL_INTERVAL_SECOND: case SQL_REAL: return(SQL_C_CHAR); return(SQL_C_FLOAT); // return(SQL_C_INTERVAL_SECOND);

case SQL_FLOAT: case SQL_INTERVAL_DAY_TO_HOUR: case SQL_DOUBLE: return(SQL_C_CHAR); // case SQL_DECIMAL: // return(SQL_C_INTERVAL_DAY_TO_HOUR); return(SQL_C_DOUBLE); case SQL_INTERVAL_DAY_TO_MINUTE: case SQL_DECIMAL: return(SQL_C_CHAR); return(SQL_C_CHAR); // return(SQL_C_INTERVAL_DAY_TO_MINUTE);

case SQL_BIT: case SQL_INTERVAL_DAY_TO_SECOND: return(SQL_C_CHAR); return(SQL_C_CHAR); // return(SQL_C_INTERVAL_DAY_TO_SECOND); case SQL_BINARY: case SQL_VARBINARY: case SQL_INTERVAL_HOUR_TO_MINUTE: case SQL_LONGVARBINARY: return(SQL_C_CHAR); return(SQL_C_CHAR); // return(SQL_C_INTERVAL_HOUR_TO_MINUTE); // return(SQL_C_BINARY); case SQL_INTERVAL_HOUR_TO_SECOND: case SQL_TYPE_DATE: return(SQL_C_CHAR); return(SQL_C_CHAR); // // return(SQL_C_TYPE_DATE); return(SQL_C_INTERVAL_HOUR_TO_SECOND);

case SQL_TYPE_TIME: case SQL_INTERVAL_MINUTE_TO_SECOND: return(SQL_C_CHAR); return(SQL_C_CHAR); // return(SQL_C_TYPE_TIME); // r eturn(SQL_C_INTERVAL_MINUTE_TO_SECOND);

case SQL_TYPE_TIMESTAMP: default: return(SQL_C_CHAR); assert(TRUE); // return(SQL_C_CHAR); return(SQL_C_TYPE_TIMESTAMP); break; } case SQL_NUMERIC: } return(SQL_C_FLOAT);

HP TPC-H FULL DISCLOSURE REPORT 460 © 2005 Hewlett-Packard Company. All rights reserved. /* FUNCTION: LogODBCErrors(SQLRETURN rc, SWORD // call SQLGetDiagRec function with proper ODBC fHandleType, SQLHANDLE handle) handles, repeatedly until COMMENTS: Formats ODBC errors or warnings and logs // function returns SQL_NO_DATA. them. Also initializes the while (!m_bAbort && (nErrResult = completion status for the step SQLGetDiagRec(fHandleType, handle, sMsgNum++, to failure, if an ODBC error has occurred. szErrState, &dwErrCode, szErrText, */ SQL_MAX_MESSAGE_LENGTH-1, &wErrMsgLen)) != SQL_NO_DATA) void CExecute::LogODBCErrors(SQLRETURN nResult, { SWORD fHandleType, SQLHANDLE handle, OdbcOperations if (!SQL_SUCCEEDED(nErrResult)) FailedOp) break; { // Messages returned by the server (e.g. Print if (m_pOutputFile && statements) will be logged to the output file IsServerMessage(dwErrCode, szErrText)) // ODBC warnings will be logged to the log file { // All other ODBC errors will be logged to the error wsprintf(szBuffer, file. SM_SQLMSG_FORMAT, (LPSTR)szErrText); temp = szBuffer; UCHAR m_pOutputFile- szErrState[SQL_SQLSTATE_SIZE+1]; >WriteLine((BSTR) temp); // SQL Error State string } UCHAR else if (IsODBCWarning(szErrState) && szErrText[SQL_MAX_MESSAGE_LENGTH+1]; dwErrCode != SM_SQL_ERR_CHANGED_DB && // SQL Error Text string dwErrCode != char SM_SQL_ERR_CHANGED_LANG) szBuffer[SQL_SQLSTATE_SIZE+SQL_MAX_MES { SAGE_LENGTH+MAXBUFLEN+1] = ""; // Suppress warnings - // formatted Error text Buffer 'Changed database context to...' and 'Changed language setting SWORD wErrMsgLen; to...' // Error message wsprintf(szBuffer, length SM_SQLMSG_FORMAT, SQLINTEGER dwErrCode; ParseOdbcMsgPrefixes((LPCSTR)szErrText)); // Native Error code temp = szBuffer; SQLRETURN nErrResult; m_pOutputFile- // Return Code from >WriteLine((BSTR) temp); SQLGetDiagRec } SWORD sMsgNum = 1; else if (m_pErrorFile && // Error sequence !IsODBCWarning(szErrState)) number { _bstr_t temp; wsprintf(szBuffer, SM_SQLERR_FORMAT, (LPSTR)szErrState, dwErrCode, if (IsErrorReturn(nResult)) (LPSTR)szErrText); { temp = szBuffer; sprintf(szBuffer, "ODBC Operation: '%s' m_pErrorFile- returned error code: %d", >WriteLine((BSTR) temp); g_szOdbcOps[FailedOp], } nResult); } temp = szBuffer; } m_pErrorFile->WriteLine((BSTR) temp); m_StepStatus = gintFailed; /* } FUNCTION: LogErrors(SQLRETURN rc, SWORD fHandleType, SQLHANDLE handle) if (handle == SQL_NULL_HSTMT) COMMENTS: Writes the error message to the error log return; */

#ifdef _DEBUG void CExecError::LogErrors(CExecute *p) _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, { "Executing SQLGetDiagRec.\n") ; _bstr_t temp(m_szExecErrorDesc[m_iErrCode]); #endif if (p->m_pErrorFile) p->m_pErrorFile- >WriteLine((BSTR)temp);

return; }

HP TPC-H FULL DISCLOSURE REPORT 461 © 2005 Hewlett-Packard Company. All rights reserved. /* FUNCTION: ODBCCleanup(HDBC *hdbc, HSTMT *hstmt) // Wrapper function that logs the error raised by an Api function COMMENTS: Cleanup of all ODBC structures to the passed in file */ void CExecute::LogSystemError(ISMLog *pFile) { void CExecute::ODBCCleanup(HDBC *hdbc, HSTMT *hstmt) if (pFile) { { SQLRETURN lReturn; char s[MAXBUFLEN]; GetSystemError(s); #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, _bstr_t temp(s); "Executing ODBCCleanup.\n"); pFile->WriteLine((BSTR)temp); #endif } } if (*hstmt != SQL_NULL_HSTMT) { // Populates the passed in string with the last Windows Api error #ifdef _DEBUG that occurred _CrtDbgReport(_CRT_WARN, NULL, 0, void CExecute::GetSystemError(LPSTR s) NULL, "Executing SQLCloseCursor.\n"); { #endif long c; SQLCloseCursor(hstmt); DWORD e; #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, e = GetLastError(); NULL, "Executing SQLFreeHandle for hstmt.\n") ; #endif c = sprintf(s, "Error code: %ld. ", e); SQLFreeHandle(SQL_HANDLE_STMT, c = hstmt); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | *hstmt = SQL_NULL_HSTMT; FORMAT_MESSAGE_IGNORE_INSERTS, } NULL, e, 0, s + c, MAXBUFLEN - c, NULL); // Cleanup connection if it is a dynamic connection if (IsDynamicConnection()) return; { } if (*hdbc != SQL_NULL_HDBC) { STDMETHODIMP CExecute::get_StepStatus(InstanceStatus #ifdef _DEBUG *pVal) _CrtDbgReport(_CRT_WARN, { NULL, 0, NULL, "Executing SQLDisconnect.\n"); *pVal = m_StepStatus; #endif return S_OK; lReturn = } SQLDisconnect(*hdbc); #ifdef _DEBUG STDMETHODIMP CExecute::WriteError(BSTR szMsg) _CrtDbgReport(_CRT_WARN, { NULL, 0, NULL, "Executing SQLFreeHandle for hdbc.\n"); if (m_pErrorFile) #endif return(m_pErrorFile->WriteLine(szMsg));

SQLFreeHandle(SQL_HANDLE_DBC, hdbc); return S_OK; *hdbc = SQL_NULL_HDBC; } } } else ResetConnectionUsage();

return; }

// Wrapper function that raises an error if a Windows Api fails STDMETHODIMP CExecute::RaiseSystemError(void) { char s[MAXBUFLEN];

GetSystemError(s); return Error(s, 0, NULL, GUID_NULL); }

HP TPC-H FULL DISCLOSURE REPORT 462 © 2005 Hewlett-Packard Company. All rights reserved. // FILE: Execute.h // Define a macro to increase the size of a buffer so it is a // Microsoft TPC-H Kit Ver. 1.00 multiple of teh alignment size. // Copyright Microsoft, 1999 // Thus, if a buffer starts on an alignment boundary, it will end // All Rights Reserved just before the next // // alignment boundary. Here, an alignment size of 4 is used // because this is the size of the // PURPOSE: Declaration of the CExecute // largest data type used in the application's buffer - the size of an // Contact: Reshma Tharamal ([email protected]) SDWORD and of the largest // // default C data type are both 4. If a larger data type (such as // Execute.h : Declaration of the CExecute __int64) is used, it will be // necessary to align for that size. #ifndef __EXECUTE_H_ #define ALIGNSIZE 4 #define __EXECUTE_H_ #define ALIGNBUF(Length) ((Length) % ALIGNSIZE) ? \ ((Length) + ALIGNSIZE - ((Length) % ALIGNSIZE)) : #include (Length) #include #include #define MAX_BUFFER_SIZE 64000 #include "resource.h" // main symbols #include "ExecuteDllCP.h" typedef enum OdbcOperations #include "..\LogWriter\LogWriter.h" { #include "..\LogWriter\SMLog.h" SMSQLAllocHandle, #include "..\common\SMTime\SMTime.h" SMSQLDriverConnect, #include "..\common\SMTime\SMTimer.h" SMSQLExecDirect, SMSQLSetStmtAttr, // ODBC-specific includes SMSQLCancel, #define DBNTWIN32 SMSQLNumResultCols, #include SMSQLDescribeCol, #include SMSQLColAttribute, #include SMSQLFetch, SMSQLGetData, ///////////////////////////////////////////////////////////////////////////// SMSQLRowCount, // CExecute SMSQLMoreResults, SMSQLBindCol, #define WM_TASK_START (WM_USER + 101) }; #define WM_TASK_FINISH (WM_USER + 102) class CODBCError #define SM_SQLERR_FORMAT "SQL { Error State:%s, Native Error Code: %ld\r\nODBC Error: %s" public: // format for ODBC error messages CODBCError(SQLRETURN nResult, SWORD #define SM_SQLWARN_FORMAT SM_SQLERR_FORMAT fHandleType, SQLHANDLE handle, OdbcOperations FailedOp) // format for ODBC warnings { #define SM_SQLMSG_FORMAT "%s" // format for messages m_fHandleType = fHandleType; from the server m_handle = handle; m_FailedOp = #define SM_SQL_STATE_WARNING "0 1000" FailedOp; #define SM_MSG_SERVER "[Microsoft][ODBC SQL Server m_nResult = nResult; Driver][SQL Server]" };

#define SM_SQL_ERR_CHANGED_DB 5701 private: #define SM_SQL_ERR_CHANGED_LANG 5703 SWORD m_fHandleType; SQLHANDLE m_handle; #define SM_STEPMASTER_ERROR OdbcOperations m_FailedOp; "StepMaster Error: " SQLRETURN m_nResult;

#define CMD_SEPARATOR "\nGO" private: #define INV_ARRAY_INDEX -1 inline BOOL IsServerMessage(SQLINTEGER lNativeError, // invalid index into an array UCHAR *szErr){ #define MAXBUFLEN 256 // display buffer size return( (strstr((LPCTSTR)szErr, #define MAXLOGCMDLEN 256 // maximum SM_MSG_SERVER) != NULL) ? (lNativeError == 0) : characters in command that will be // printed to log FALSE); } #define MAXLOGCMDBUF 512 // maximum inline BOOL IsODBCWarning(UCHAR *szSqlState){ characters in command that will be // printed to log return(strcmp((LPCSTR)szSqlState, #define MAX_DATA_LEN 4000 // maximum buffer SM_SQL_STATE_WARNING) == 0);} size for variable-length data types // viz. character and binary inline LPCSTR ParseOdbcMsgPrefixes(LPCSTR szMsg){ char fields *pDest; #define FILE_ACCESS_READ "r" // Open file for read access return( (pDest = strstr(szMsg, SM_MSG_SERVER)) #define S_NULL "NULL" == NULL ? szMsg : pDest + strlen(SM_MSG_SERVER));} };

HP TPC-H FULL DISCLOSURE REPORT 463 © 2005 Hewlett-Packard Company. All rights reserved. class ATL_NO_VTABLE CExecute : LRESULT OnTaskFinished(UINT uMsg, WPARAM public CWindowImpl, wParam, public LPARAM lParam, BOOL& bHandled) CComObjectRootEx, { public CComCoClass, Get64BitTime(&m_tEndTime); public IConnectionPointContainerImpl, public ISupportErrorInfo, Fire_Complete(CEndTime, public IDispatchImpl, return 0; public CProxy_IExecuteEvents< CExecute > } { public: HRESULT FinalConstruct() CExecute() { { HRESULT hr; m_pErrorFile = NULL; RECT rect; //m_pLogFile = NULL; m_pOutputFile = NULL; rect.left=0; rect.right=100; // Initialize the elapsed time for the step rect.top=0; m_tElapsedTime = 0; rect.bottom=100;

// Initialize the run status for the step HWND hwnd = Create( NULL, rect, m_StepStatus = gintPending; "ExecuteWindow", WS_POPUP);

m_hHandle = SQL_NULL_HSTMT; if (!hwnd) m_bAbort = FALSE; return HRESULT_FROM_WIN32(GetLastError()); m_iConnectionIndex = INV_ARRAY_INDEX; hr = CoCreateInstance(CLSID_SMLog, } NULL, CLSCTX_INPROC, IID_ISMLog, (void ~CExecute() **)&m_pErrorFile); { if FAILED(hr) } return(hr); m_pErrorFile->put_Append(TRUE); friend class CExecError; //hr = CoCreateInstance(CLSID_SMLog, public: NULL, CLSCTX_INPROC, DECLARE_WND_CLASS("Execute") // IID_ISMLog, (void **)&m_pLogFile); BEGIN_MSG_MAP(CExecute) //if FAILED(hr) // return(hr); MESSAGE_HANDLER(WM_TASK_FINISH, OnTaskFinished) hr = CoCreateInstance(CLSID_SMLog, NULL, CLSCTX_INPROC, MESSAGE_HANDLER(WM_TASK_START, IID_ISMLog, (void OnTaskStarted) **)&m_pOutputFile); END_MSG_MAP() if FAILED(hr) public: return(hr); m_pOutputFile->put_Append(TRUE); LRESULT OnTaskStarted(UINT uMsg, WPARAM wParam, hr = CoCreateInstance(CLSID_SMTimer, LPARAM lParam, BOOL& bHandled) NULL, CLSCTX_INPROC, { IID_ISMTimer, (void CURRENCY CStartTime = **)&m_ExecTime); Get64BitTime(&m_tStartTime); if FAILED(hr) return(hr); Fire_Start(CStartTime); return 0; return S_OK; } }

HP TPC-H FULL DISCLOSURE REPORT 464 © 2005 Hewlett-Packard Company. All rights reserved. private: void FinalRelease() LPSTR { NextCmdInBatch(LPSTR szBatch); if (m_hWnd != NULL) void ProcessResultsets(); DestroyWindow(); SQLSMALLINT // Close the log and error files GetDefaultCType(SQLINTEGER SQLType); if (m_pErrorFile) void PrintData(void m_pErrorFile->Release(); *vData, SQLSMALLINT CType, SQLINTEGER IndPtr, m_pErrorFile = NULL; SQLSMALLINT if (m_ExecTime) iScale, ISMLog *pOutput); m_ExecTime->Release(); void m_ExecTime = NULL; LogODBCErrors(SQLRETURN nResult, SWORD } fHandleType, SQLHANDLE handle, OdbcOperations DECLARE_REGISTRY_RESOURCEID(IDR_EXECUTE) FailedOp); DECLARE_PROTECT_FINAL_CONSTRUCT() void BEGIN_COM_MAP(CExecute) ODBCCleanup(HDBC *hdbc, HSTMT *hstmt); COM_INTERFACE_ENTRY(IExecute) STDMETHODIMP COM_INTERFACE_ENTRY(ISupportErrorInfo) RaiseSystemError(void); COM_INTERFACE_ENTRY(IDispatch) void COM_INTERFACE_ENTRY(IConnectionPointContainer) LogSystemError(ISMLog *pFile); COM_INTERFACE_ENTRY_IMPL(IConnectionPointContaine void r) GetSystemError(LPSTR s); END_COM_MAP() void BEGIN_CONNECTION_POINT_MAP(CExecute) SetConnectionOption(LPSTR szConn, HDBC CONNECTION_POINT_ENTRY(DIID__IExecuteEvents) *pHdbc); END_CONNECTION_POINT_MAP() void // ISupportsErrorInfo ResetConnectionProperties(HDBC *p_hdbc); STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); // IExecute void public: InitializeConnection(HDBC *phdbc, BOOL STDMETHOD(put_ErrorFile)(/*[in]*/ BSTR newVal); *pbDoConnect); STDMETHOD(put_OutputFile)(/*[in]*/ BSTR newVal); void STDMETHOD(WriteError)(BSTR szMsg); ReConnectDeadConnection(HDBC *phdbc); STDMETHOD(Abort)(); STDMETHOD(get_StepStatus)(/*[out, retval]*/ InstanceStatus void *pVal); ResetConnectionUsage(); STDMETHOD(DoExecute)(/*[in]*/ BSTR szCommand, /*[in]*/ BSTR szExecutionDtls, int /*[in]*/ ExecutionType ExecMethod, m_iConnectionIndex; /*[in]*/ BOOL bNoCount, /*[in]*/ BOOL bNoExecute, /*[in]*/ BOOL bParseOnly, BOOL m_bNoCount, /*[in]*/ BOOL bQuotedIds, /*[in]*/ BOOL bAnsiNulls, /*[in]*/ m_bNoExecute, m_bParseOnly, m_bQuotedIds, m_bAnsiNulls, \ BOOL bShowQP, /*[in]*/ BOOL bStatsTime, /*[in]*/ BOOL bStatsIO, /*[in]*/ m_bShowQP, m_bStatsTime, m_bStatsIO; long lRowCount, long m_lRowCount; /*[in]*/ long lQueryTmout, /*[in]*/ BSTR szConnection); SQLUINTEGER m_lQueryTmout; TC_ TIME ExecuteShell(); _bstr_t m_ErrorFile, TC_ TIME ExecuteODBC(); m_OutputFile; STDMETHODIMP AbortShell(); BOOL m_bAbort; STDMETHODIMP AbortODBC(); _bstr_t m_szCommand; _bstr_t m_szExecDtls; _bstr_t m_szConnection; DWORD m_lMode; SYSTEMTIME m_tStartTime; SYSTEMTIME m_tEndTime; TC_ TIME m_tElapsedTime; ISMLog *m_pErrorFile; //ILog *m_pLogFile; ISMLog *m_pOutputFile; ISMTimer *m_ExecTime; ExecutionType m_ExecMthd; InstanceStatus m_StepStatus; HANDLE m_hHandle; // Process handle for shell commands and //Statement handle for ODBC commands LPSTRm_szCmd;

HP TPC-H FULL DISCLOSURE REPORT 465 © 2005 Hewlett-Packard Company. All rights reserved. private: #endif //__EXECUTE_H_ inline BOOL IsServerMessage(SQLINTEGER lNativeError, // FILE: ExecuteDll.cpp UCHAR *szErr){ // Microsoft TPC-H Kit Ver. 1.00 return( (strstr((LPCTSTR)szErr, // Copyright Microsoft, 1999 SM_MSG_SERVER) != NULL) ? (lNativeError == 0) : // All Rights Reserved FALSE); } // inline BOOL IsODBCWarning(UCHAR *szSqlState){ // return(strcmp((LPCSTR)szSqlState, // PURPOSE: Implementation of DLL Exports. SM_SQL_STATE_WARNING) == 0);} // Contact: Reshma Tharamal ([email protected]) inline BOOL IsErrorReturn(SQLRETURN iRetCode){ // return( (!SQL_SUCCEEDED(iRetCode)) && (iRetCode != SQL_NO_DATA) );} inline LPCSTR ParseOdbcMsgPrefixes(LPCSTR szMsg){ char // Note: Proxy/Stub Information *pDest; // To build a separate proxy/stub DLL, return( (pDest = strstr(szMsg, SM_MSG_SERVER)) // run nmake -f ExecuteDllps.mk in the project directory. == NULL ? szMsg : pDest + strlen(SM_MSG_SERVER));} inline BOOL IsDynamicConnection(){ #include "stdafx.h" return(!strcmp((LPSTR)m_szConnection, ""));} #include "resource.h" inline void HandleODBCError(SQLRETURN rc, SWORD #include fHandleType, SQLHANDLE handle, OdbcOperations OdbcOp) { #include "..\LogWriter\LogWriter.h" if (rc != SQL_SUCCESS) #include "..\LogWriter\LogWriter_i.c" { LogODBCErrors(rc, fHandleType, handle, #include "..\common\SMTime\SMTime.h" OdbcOp); #include "..\common\SMTime\SMTime_i.c" if (IsErrorReturn(rc)) throw new CODBCError(rc, #include "ExecuteDll.h" fHandleType, handle, OdbcOp); #include "SMExecute.h" } return; #include "ExecuteDll_i.c" } #include "Execute.h"

}; CComModule _Module;

class CExecError BEGIN_OBJECT_MAP(ObjectMap) { OBJECT_ENTRY(CLSID_Execute, CExecute) public: END_OBJECT_MAP() typedef enum ExecErrorCodes SQLHENV henv = NULL; // ODBC environment handle { SM_ERR_CONN_IN_USE, static char szCaption[] = "StepMaster"; // Message box }; caption

CExecError(int iError) CRITICAL_SECTION hConnections; // Critical { section to serialize access to available connections m_iErrCode = iError; SM_Connection_Info *p_Connections = NULL; }; // Pointer to open connections int void iConnectionCount = 0; // Number of open LogErrors(CExecute *p); connections

private: #ifdef _TPCH_AUDIT int FILE *pfLogFile = NULL; m_iErrCode; // Log file containing timestamps static char *m_szExecErrorDesc[]; CRITICAL_SECTION hLogFileWrite; }; // Critical section to serialize writes to log static char szFileOpenModeAppend[] = "a+"; void ExecutionThread(LPVOID // Log file open mode lpParameter); static char szEnvVarLogFile[] = "TPCH_LOG_FILE";// Environment variable - initialized to #ifdef _TPCH_AUDIT // log file name if timing information void // is to be logged WriteFileToTpchLog(LPSTR szFile, LPSTR szFmt); #endif void WriteToTpchLog(char *szMsg); void ShowODBCErrors(SWORD fHandleType, SQLHANDLE #endif handle); void CloseOpenConnections();

HP TPC-H FULL DISCLOSURE REPORT 466 © 2005 Hewlett-Packard Company. All rights reserved. ///////////////////////////////////////////////////////////////////////////// else if (dwReason == DLL_PROCESS_DETACH) // DLL Entry Point { extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD #ifdef _TPCH_AUDIT dwReason, LPVOID /*lpReserved*/) if (pfLogFile != NULL) { { if (dwReason == DLL_PROCESS_ATTACH) fclose(pfLogFile); { _Module.Init(ObjectMap, hInstance, &LIBID_EXECUTEDLLLib); DeleteCriticalSection(&hLogFileWrite); DisableThreadLibraryCalls(hInstance); } #ifdef _TPCH_AUDIT #endif char szMsg[MAXBUFLEN]; LPSTR szLogFileName = getenv(szEnvVarLogFile); CloseOpenConnections(); if (szLogFileName == NULL) { if (henv != NULL) sprintf(szMsg, "The environment variable '%s' does SQLFreeEnv(henv); not exist. " "Step timing information will not be written to a log.", DeleteCriticalSection(&hConnections); szEnvVarLogFile); MessageBox(NULL, szMsg, szCaption, MB_OK); _Module.Term(); } } else return TRUE; // ok { } if ( (pfLogFile = fopen(szLogFileName, szFileOpenModeAppend)) == NULL ) void ShowODBCErrors(SWORD fHandleType, SQLHANDLE { handle) sprintf(szMsg, "The file '%s' does not exist. " { "Step timing information will not be written to log.", UCHAR szLogFileName); szErrState[SQL_SQLSTATE_SIZE+1]; // SQL MessageBox(NULL, szMsg, szCaption, MB_OK); Error State string } UCHAR else szErrText[SQL_MAX_MESSAGE_LENGTH+1]; InitializeCriticalSection(&hLogFileWrite); // SQL Error Text string } char #endif szBuffer[SQL_SQLSTATE_SIZE+SQL_MAX_MES InitializeCriticalSection(&hConnections); SAGE_LENGTH+MAXBUFLEN+1] = ""; p_Connections = NULL; iConnectionCount = 0; // formatted Error text Buffer if (!SQL_SUCCEEDED(SQLSetEnvAttr(NULL, SWORD wErrMsgLen; SQL_ATTR_CONNECTION_POOLING, // Error message length (SQLPOINTER)SQL_CP_ONE_PER_HENV , 0))) SQLINTEGER dwErrCode; ShowODBCErrors(SQL_HANDLE_ENV, henv); // Native Error code if SQLRETURN nErrResult; (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, // Return Code from SQL_NULL_HANDLE, &henv))) SQLGetDiagRec { SWORD sMsgNum = 1; ShowODBCErrors(SQL_HANDLE_ENV, henv); // Error sequence number return FALSE; } // call SQLGetDiagRec function with proper ODBC if (!SQL_SUCCEEDED(SQLSetEnvAttr(henv, handles, repeatedly until SQL_ATTR_ODBC_VERSION, (LPVOID)SQL_OV_ODBC3, // function returns SQL_NO_DATA. 0))) while ((nErrResult = SQLGetDiagRec(fHandleType, ShowODBCErrors(SQL_HANDLE_ENV, henv); handle, sMsgNum++, SQLUINTEGER CpMatch; szErrState, &dwErrCode, szErrText, if (!SQL_SUCCEEDED(SQLGetEnvAttr(henv, SQL_MAX_MESSAGE_LENGTH-1, &wErrMsgLen)) SQL_ATTR_CP_MATCH, &CpMatch, 0, NULL))) != SQL_NO_DATA) ShowODBCErrors(SQL_HANDLE_ENV, henv); { if (!SQL_SUCCEEDED(nErrResult)) if (!SQL_SUCCEEDED(SQLSetEnvAttr(henv, break; SQL_ATTR_CP_MATCH, (SQLPOINTER)SQL_CP_STRICT_MATCH, wsprintf(szBuffer, SM_SQLERR_FORMAT, SQL_IS_INTEGER))) (LPSTR)szErrState, dwErrCode, (LPSTR)szErrText); ShowODBCErrors(SQL_HANDLE_ENV, henv); MessageBox(NULL, szBuffer, szCaption, MB_OK); } } }

HP TPC-H FULL DISCLOSURE REPORT 467 © 2005 Hewlett-Packard Company. All rights reserved. void CloseOpenConnections() { ///////////////////////////////////////////////////////////////////////////// // Closes all open connections // DllUnregisterServer - Removes entries from the system registry if (p_Connections) { STDAPI DllUnregisterServer(void) for (int iConnIndex = iConnectionCount - { 1; iConnIndex >= 0; iConnIndex--) return _Module.UnregisterServer(TRUE); { } if ((p_Connections + /* this ALWAYS GENERATED file contains the definitions for iConnIndex)->hdbc != SQL_NULL_HDBC) the interfaces */ { #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, /* File created by MIDL compiler version 5.01.0164 */ NULL, 0, NULL, "Executing SQLDisconnect.\n"); /* at Mon Jun 09 19:33:03 2003 #endif */ /* Compiler settings for SQLDisconnect((p_Connections + iConnIndex)- C:\charles\Stepmaster\ExecuteDll\ExecuteDll.idl: >hdbc); Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext #ifdef _DEBUG error checks: allocation ref bounds_check enum stub_data _CrtDbgReport(_CRT_WARN, */ NULL, 0, NULL, "Executing SQLFreeHandle for hdbc.\n"); //@@MIDL_FILE_HEADING( ) #endif

SQLFreeHandle(SQL_HANDLE_DBC, /* verify that the version is high enough to compile (p_Connections + iConnIndex)->hdbc ); this file*/ (p_Connections + iConnIndex)- #ifndef __REQUIRED_RPCNDR_H_VERSION__ >hdbc = SQL_NULL_HDBC; #define __REQUIRED_RPCNDR_H_VERSION__ 440 } #endif

} #include "rpc.h" #include "rpcndr.h" free(p_Connections); } #ifndef __ExecuteDll_h__ p_Connections = NULL; #define __ExecuteDll_h__

return; #ifdef __cplusplus } extern "C"{ #endif ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE /* Forward Declarations */

STDAPI DllCanUnloadNow(void) #ifndef ___IExecuteEvents_FWD_DEFINED__ { #define ___IExecuteEvents_FWD_DEFINED__ return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; typedef interface _IExecuteEvents _IExecuteEvents; } #endif /* ___IExecuteEvents_FWD_DEFINED__ */

///////////////////////////////////////////////////////////////////////////// // Returns a class factory to create an object of the requested type #ifndef __IExecute_FWD_DEFINED__ #define __IExecute_FWD_DEFINED__ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, typedef interface IExecute IExecute; LPVOID* ppv) #endif /* __IExecute_FWD_DEFINED__ */ { return _Module.GetClassObject(rclsid, riid, ppv); } #ifndef __Execute_FWD_DEFINED__ #define __Execute_FWD_DEFINED__ ///////////////////////////////////////////////////////////////////////////// // DllRegisterServer - Adds entries to the system registry #ifdef __cplusplus typedef class Execute Execute; STDAPI DllRegisterServer(void) #else { typedef struct Execute Execute; // registers object, typelib and all interfaces in typelib #endif /* __cplusplus */ return _Module.RegisterServer(TRUE); } #endif /* __Execute_FWD_DEFINED__ */

HP TPC-H FULL DISCLOSURE REPORT 468 © 2005 Hewlett-Packard Company. All rights reserved. /* header files for imported files */ #include "oaidl.h" ULONG ( STDMETHODCALLTYPE __RPC_FAR #include "ocidl.h" *AddRef )( _IExecuteEvents __RPC_FAR * This); void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); void __RPC_USER MIDL_user_free( void __RPC_FAR * ); ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( /* interface __MIDL_itf_ExecuteDll_0000 */ _IExecuteEvents __RPC_FAR * This); /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR typedef /* [helpstring][uuid] */ *GetTypeInfoCount )( enum ExecutionType _IExecuteEvents __RPC_FAR * This, { execODBC = 0x1, /* [out] */ UINT __RPC_FAR *pctinfo); execShell = 0x2 } ExecutionType; HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( typedef /* [helpstring][uuid] */ _IExecuteEvents __RPC_FAR * This, enum InstanceStatus /* [in] */ UINT iTInfo, { gintDisabled = 0x1, /* [in] */ LCID lcid, gintPending = 0x2, /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR gintRunning = 0x3, *ppTInfo); gintComplete = 0x4, gintFailed = 0x5, HRESULT ( STDMETHODCALLTYPE __RPC_FAR gintAborted = 0x6 *GetIDsOfNames )( } InstanceStatus; _IExecuteEvents __RPC_FAR * This, /* [in] */ REFIID riid, extern RPC_IF_HANDLE /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, __MIDL_itf_ExecuteDll_0000_v0_0_c_ifspec; /* [in] */ UINT cNames, extern RPC_IF_HANDLE /* [in] */ LCID lcid, __MIDL_itf_ExecuteDll_0000_v0_0_s_ifspec; /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);

#ifndef __EXECUTEDLLLib_LIBRARY_DEFINED__ /* [local] */ HRESULT ( STDMETHODCALLTYPE #define __EXECUTEDLLLib_LIBRARY_DEFINED__ __RPC_FAR *Invoke )( _IExecuteEvents __RPC_FAR * This, /* library EXECUTEDLLLib */ /* [in] */ DISPID dispIdMember, /* [helpstring][version][uuid] */ /* [in] */ REFIID riid, /* [in] */ LCID lcid, EXTERN_C const IID LIBID_EXECUTEDLLLib; /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS __RPC_FAR #ifndef ___IExecuteEvents_DISPINTERFACE_DEFINED__ *pDispParams, #define ___IExecuteEvents_DISPINTERFACE_DEFINED__ /* [out] */ VARIANT __RPC_FAR *pVarResult, /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* dispinterface _IExecuteEvents */ /* [out] */ UINT __RPC_FAR *puArgErr); /* [helpstring][uuid] */ END_INTERFACE EXTERN_C const IID DIID__IExecuteEvents; } _IExecuteEventsVtbl;

#if defined(__cplusplus) && !defined(CINTERFACE) interface _IExecuteEvents { MIDL_INTERFACE("551AC532-AB1C-11D2-BC0C- CONST_VTBL struct _IExecuteEventsVtbl __RPC_FAR 00A0C90D2CA5") *lpVtbl; _IExecuteEvents : public IDispatch }; { }; #else /* C style interface */ typedef struct _IExecuteEventsVtbl #ifdef COBJMACROS { #define _IExecuteEvents_QueryInterface(This,riid,ppvObject) BEGIN_INTERFACE \ HRESULT ( STDMETHODCALLTYPE __RPC_FAR (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) *QueryInterface )( _IExecuteEvents __RPC_FAR * This, #define _IExecuteEvents_AddRef(This) \ /* [in] */ REFIID riid, (This)->lpVtbl -> AddRef(This) /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);

HP TPC-H FULL DISCLOSURE REPORT 469 © 2005 Hewlett-Packard Company. All rights reserved. #define _IExecuteEvents_Release(This) \ virtual /* [helpstring][id] */ HRESULT (This)->lpVtbl -> Release(This) STDMETHODCALLTYPE Abort( void) = 0;

#define _IExecuteEvents_GetTypeInfoCount(This,pctinfo) virtual /* [helpstring][id] */ HRESULT \ STDMETHODCALLTYPE WriteError( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) BSTR szMsg) = 0;

#define _IExecuteEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) virtual /* [helpstring][id][propput] */ HRESULT \ STDMETHODCALLTYPE put_OutputFile( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) /* [in] */ BSTR newVal) = 0;

#define virtual /* [helpstring][id][propput] */ HRESULT _IExecuteEvents_GetIDsOfNames(This,riid,rgszNames,cNames, STDMETHODCALLTYPE put_ErrorFile( lcid,rgDispId) \ /* [in] */ BSTR newVal) = 0; (This)->lpVtbl -> }; GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) #else /* C style interface */

#define typedef struct IExecuteVtbl _IExecuteEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pD { ispParams,pVarResult,pExcepInfo,puArgErr) \ BEGIN_INTERFACE (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR HRESULT ( STDMETHODCALLTYPE __RPC_FAR esult,pExcepInfo,puArgErr) *QueryInterface )( IExecute __RPC_FAR * This, #endif /* COBJMACROS */ /* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR #endif /* C style interface */ *ppvObject);

#endif /* ULONG ( STDMETHODCALLTYPE __RPC_FAR ___IExecuteEvents_DISPINTERFACE_DEFINED__ */ *AddRef )( IExecute __RPC_FAR * This); #ifndef __IExecute_INTERFACE_DEFINED__ ULONG ( STDMETHODCALLTYPE __RPC_FAR #define __IExecute_INTERFACE_DEFINED__ *Release )( IExecute __RPC_FAR * This); /* interface IExecute */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR /* [unique][helpstring][dual][uuid][object] */ *GetTypeInfoCount )( IExecute __RPC_FAR * This, EXTERN_C const IID IID_IExecute; /* [out] */ UINT __RPC_FAR *pctinfo);

#if defined(__cplusplus) && !defined(CINTERFACE) HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( MIDL_INTERFACE("5 51AC531-AB1C-11D2-BC0C- IExecute __RPC_FAR * This, 00A0C90D2CA5") /* [in] */ UINT iTInfo, IExecute : public IDispatch /* [in] */ LCID lcid, { /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR public: *ppTInfo); virtual /* [helpstring][id] */ HRESULT HRESULT ( STDMETHODCALLTYPE __RPC_FAR STDMETHODCALLTYPE DoExecute( *GetIDsOfNames )( /* [in] */ BSTR szCommand, IExecute __RPC_FAR * This, /* [in] */ BSTR szExecutionDtls, /* [in] */ REFIID riid, /* [in] */ ExecutionType ExecMethod, /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ BOOL bNoCount, /* [in] */ UINT cNames, /* [in] */ BOOL bNoExecute, /* [in] */ LCID lcid, /* [in] */ BOOL bParseOnly, /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); /* [in] */ BOOL bQuotedIds, /* [local] */ HRESULT ( STDMETHODCALLTYPE /* [in] */ BOOL bAnsiNulls, __RPC_FAR *Invoke )( /* [in] */ BOOL bShowQP, IExecute __RPC_FAR * This, /* [in] */ BOOL bStatsTime, /* [in] */ DISPID dispIdMember, /* [in] */ BOOL bStatsIO, /* [in] */ REFIID riid, /* [in] */ long lRowCount, /* [in] */ LCID lcid, /* [in] */ long lQueryTmout, /* [in] */ WORD wFlags, /* [in] */ BSTR szConnection) = 0; /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, virtual /* [helpstring][id][propget] */ HRESULT /* [out] */ VARIANT __RPC_FAR *pVarResult, STDMETHODCALLTYPE get_StepStatus( /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* [retval][out] */ InstanceStatus __RPC_FAR *pVal) = /* [out] */ UINT __RPC_FAR *puArgErr); 0;

HP TPC-H FULL DISCLOSURE REPORT 470 © 2005 Hewlett-Packard Company. All rights reserved. /* [helpstring][id] */ HRESULT ( #define STDMETHODCALLTYPE __RPC_FAR *DoExecute )( IExecute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgD IExecute __RPC_FAR * This, ispId) \ /* [in] */ BSTR szCommand, (This)->lpVtbl -> /* [in] */ BSTR szExecutionDtls, GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) /* [in] */ ExecutionType ExecMethod, /* [in] */ BOOL bNoCount, #define /* [in] */ BOOL bNoExecute, IExecute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispPara /* [in] */ BOOL bParseOnly, ms,pVarResult,pExcepInfo,puArgErr) \ /* [in] */ BOOL bQuotedIds, (This)->lpVtbl -> /* [in] */ BOOL bAnsiNulls, Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR /* [in] */ BOOL bShowQP, esult,pExcepInfo,puArgErr) /* [in] */ BOOL bStatsTime, /* [in] */ BOOL bStatsIO, #define /* [in] */ long lRowCount, IExecute_DoExecute(This,szCommand,szExecutionDtls,ExecMe /* [in] */ long lQueryTmout, thod,bNoCount, /* [in] */ BSTR szConnection); bNoExecute,bParseOnly,bQuotedIds,bAnsiNulls,bSh owQP,bStatsTime,bStatsIO,lRowCount,lQueryTmout,szConnecti /* [helpstring][id][propget] */ HRESULT ( on)\ STDMETHODCALLTYPE __RPC_FAR *get_StepStatus )( (This)->lpVtbl -> IExecute __RPC_FAR * This, DoExecute(This,szCommand,szExecutionDtls,ExecMethod,bNo /* [retval][out] */ InstanceStatus __RPC_FAR *pVal); Count,bNoExecute,bParseOnly,bQuotedIds, bAnsiNulls,bShowQP,bStatsTime,bStatsIO,lRowCou /* [helpstring][id] */ HRESULT ( nt,lQueryTmout,szConnection) STDMETHODCALLTYPE __RPC_FAR *Abort )( IExecute __RPC_FAR * This); #define IExecute_get_StepStatus(This,pVal) \ (This)->lpVtbl -> get_StepStatus(This,pVal) /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *WriteError )( #define IExecute_Abort(This) \ IExecute __RPC_FAR * This, (This)->lpVtbl -> Abort(This) BSTR szMsg); #define IExecute_WriteError(This,szMsg) \ /* [helpstring][id][propput] */ HRESULT ( (This)->lpVtbl -> WriteError(This,szMsg) STDMETHODCALLTYPE __RPC_FAR *put_OutputFile )( IExecute __RPC_FAR * This, #define IExecute_put_OutputFile(This,newVal) \ /* [in] */ BSTR newVal); (This)->lpVtbl -> put_OutputFile(This,newVal)

/* [helpstring][id][propput] */ HRESULT ( #define IExecute_put_ErrorFile(This,newVal) \ STDMETHODCALLTYPE __RPC_FAR *put_ErrorFile )( (This)->lpVtbl -> put_ErrorFile(This,newVal) IExecute __RPC_FAR * This, /* [in] */ BSTR newVal); #endif /* COBJMACROS */

END_INTERFACE #endif /* C style interface */ } IExecuteVtbl; /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE interface IExecute IExecute_DoExecute_Proxy( { IExecute __RPC_FAR * This, CONST_VTBL struct IExecuteVtbl __RPC_FAR *lpVtbl; /* [in] */ BSTR szCommand, }; /* [in] */ BSTR szExecutionDtls, /* [in] */ ExecutionType ExecMethod, /* [in] */ BOOL bNoCount, /* [in] */ BOOL bNoExecute, #ifdef COBJMACROS /* [in] */ BOOL bParseOnly, #define IExecute_QueryInterface(This,riid,ppvObject) \ /* [in] */ BOOL bQuotedIds, (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) /* [in] */ BOOL bAnsiNulls, /* [in] */ BOOL bShowQP, #define IExecute_AddRef(This) \ /* [in] */ BOOL bStatsTime, (This)->lpVtbl -> AddRef(This) /* [in] */ BOOL bStatsIO, /* [in] */ long lRowCount, #define IExecute_Release(This) \ /* [in] */ long lQueryTmout, (This)->lpVtbl -> Release(This) /* [in] */ BSTR szConnection);

#define IExecute_GetTypeInfoCount(This,pctinfo) \ void __RPC_STUB IExecute_DoExecute_Stub( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, #define IExecute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) PRPC_MESSAGE _pRpcMessage, \ DWORD *_pdwStubPhase); (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)

HP TPC-H FULL DISCLOSURE REPORT 471 © 2005 Hewlett-Packard Company. All rights reserved. /* [helpstring][id][propget] */ HRESULT // FILE: Execute.cpp STDMETHODCALLTYPE IExecute_get_StepStatus_Proxy( // Microsoft TPC-H Kit Ver. 1.00 IExecute __RPC_FAR * This, // Copyright Microsoft, 1999 /* [retval][out] */ InstanceStatus __RPC_FAR *pVal); // All Rights Reserved // // void __RPC_STUB IExecute_get_StepStatus_Stub( // PURPOSE: Implementation of CExecute. IRpcStubBuffer *This, // Contact: Reshma Tharamal ([email protected]) IRpcChannelBuffer *_pRpcChannelBuffer, // PRPC_MESSAGE _pRpcMessage, #include "stdafx.h" DWORD *_pdwStubPhase); #include "ExecuteDll.h" /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE #include "SMExecute.h" IExecute_Abort_Proxy( #include "Execute.h" IExecute __RPC_FAR * This); extern SQLHENV henv; void __RPC_STUB IExecute_Abort_Stub( extern SM_Connection_Info *p_Connections; // IRpcStubBuffer *This, Pointer to open connections IRpcChannelBuffer *_pRpcChannelBuffer, extern int iConnectionCount;// Number of open connections PRPC_MESSAGE _pRpcMessage, extern CRITICAL_SECTION hConnections; DWORD *_pdwStubPhase); // Critical section to serialize // access to available connections /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IExecute_WriteError_Proxy( #ifdef _TPCH_AUDIT IExecute __RPC_FAR * This, extern FILE *pfLogFile; BSTR szMsg); // Log file containing timestamps extern CRITICAL_SECTION hLogFileWrite; void __RPC_STUB IExecute_WriteError_Stub( // Handle to critical section IRpcStubBuffer *This, #endif IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, ///////////////////////////////////////////////////////////////////////////// DWORD *_pdwStubPhase); // CExecute

/* [helpstring][id][propput] */ HRESULT char * g_szOdbcOps[] = { STDMETHODCALLTYPE IExecute_put_OutputFile_Proxy( "SQLAllocHandle", IExecute __RPC_FAR * This, "SQLDriverConnect", /* [in] */ BSTR newVal); "SQLExecDirect", "SQLSetStmtAttr", void __RPC_STUB IExecute_put_OutputFile_Stub( "SQLCancel", IRpcStubBuffer *This, "SQLNumResultCols", IRpcChannelBuffer *_pRpcChannelBuffer, "SQLDescribeCol", PRPC_MESSAGE _pRpcMessage, "SQLColAttribute", DWORD *_pdwStubPhase); "SQLFetch", "SQLGetData", "SQLRowCount", /* [helpstring][id][propput] */ HRESULT "SQLMoreResults", STDMETHODCALLTYPE IExecute_put_ErrorFile_Proxy( "SQLBindCol" IExecute __RPC_FAR * This, }; /* [in] */ BSTR newVal); char * CExecError::m_szExecErrorDesc[] = { void __RPC_STUB IExecute_put_ErrorFile_Stub( "Connection is already in use." IRpcStubBuffer *This, }; IRpcChannelBuffer *_pRpcChannelBuffer, STDMETHODIMP PRPC_MESSAGE _pRpcMessage, CExecute::InterfaceSupportsErrorInfo(REFIID riid) DWORD *_pdwStubPhase); { #endif /* __IExecute_INTERFACE_DEFINED__ */ static const IID* arr[] = EXTERN_C const CLSID CLSID_Execute; { ifdef __cplusplus &IID_IExecute class DECLSPEC_UUID("2EFC198E-AA8D-11D2-BC0C- }; 00A0C90D2CA5") for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) Execute; { #endif if (InlineIsEqualGUID(*arr[i],riid)) #endif /* __EXECUTEDLLLib_LIBRARY_DEFINED__ */ return S_OK; /* Additional Prototypes for ALL interfaces */ } /* end of Additional Prototypes */ return S_FALSE; #ifdef __cplusplus } } #endif

HP TPC-H FULL DISCLOSURE REPORT 472 © 2005 Hewlett-Packard Company. All rights reserved. STDMETHODIMP CExecute::put_OutputFile(BSTR newVal) { if((hThrd = CreateThread( 0, 0, assert(m_pOutputFile); (LPTHREAD_START_ROUTINE)ExecutionThread, m_OutputFile = newVal; this, 0, &tid)) == NULL) return(RaiseSystemError()); HRESULT hr = m_pOutputFile- >put_FileName(newVal); CloseHandle(hThrd); if FAILED(hr) { return S_OK; m_pOutputFile->Release(); } m_pOutputFile = NULL; } STDMETHODIMP CExecute::Abort() return hr; { } if (m_ExecMthd == execShell) return(AbortShell()); //DEL STDMETHODIMP CExecute::put_LogFile(BSTR else newVal) return(AbortODBC()); //DEL { } //DEL assert(m_pLogFile); //DEL void ExecutionThread(LPVOID lpParameter) //DEL m_pLogFile->put_FileName(newVal); { //DEL return S_OK; //DEL } CExecute *MyExecute = (CExecute*)lpParameter;

STDMETHODIMP CExecute::put_ErrorFile(BSTR newVal) MyExecute->m_tElapsedTime = 0; { assert(m_pErrorFile); GetLocalTime(&MyExecute->m_tStartTime); m_ErrorFile = newVal; MyExecute->PostMessage(WM_TASK_START, 0, 0); HRESULT hr = m_pErrorFile- >put_FileName(newVal); #ifdef _TPCH_AUDIT if FAILED(hr) char { szBuffer[MAXLOGCMDBUF]; m_pErrorFile->Release(); char szFmt[MAXBUFLEN]; m_pErrorFile = NULL; } sprintf(szFmt, "Start Step: '%%.%ds' at '%d/%d/%d return hr; %d:%d:%d:%d'\n", } MAXLOGCMDLEN, MyExecute->m_tStartTime.wMonth, STDMETHODIMP CExecute::DoExecute(BSTR szCommand, MyExecute->m_tStartTime.wDay, BSTR szExecutionDtls, ExecutionType ExecMethod, \ MyExecute->m_tStartTime.wYear, BOOL bNoCount, BOOL bNoExecute, BOOL bParseOnly, MyExecute->m_tStartTime.wHour, BOOL bQuotedIds, \ MyExecute->m_tStartTime.wMinute, BOOL bAnsiNulls, BOOL bShowQP, BOOL bStatsTime, MyExecute->m_tStartTime.wSecond, BOOL bStatsIO, \ MyExecute- long lRowCount, long lQueryTmout, BSTR szConnection) >m_tStartTime.wMilliseconds); { if (MyExecute->m_ExecMthd == execShell) HANDLE hThrd; DWORD tid; WriteFileToTpchLog((LPSTR)MyExecute- _CrtSetReportFile(_CRT_WARN, >m_szCommand, szFmt); _CRTDBG_FILE_STDOUT); else m_szCommand = szCommand; { m_szExecDtls = szExecutionDtls; sprintf(szBuffer, szFmt, m_ExecMthd = ExecMethod; (LPSTR)MyExecute->m_szCommand); if (m_ExecMthd == execODBC) WriteToTpchLog(szBuffer); { } m_bNoCount = bNoCount; #endif m_bNoExecute = bNoExecute; m_bParseOnly = bParseOnly; m_bQuotedIds = bQuotedIds; m_bAnsiNulls = bAnsiNulls; m_bShowQP = bShowQP; m_bStatsTime = bStatsTime; m_bStatsIO = bStatsIO; m_lRowCount = lRowCount; m_lQueryTmout = lQueryTmout; m_szConnection = szConnection; }

HP TPC-H FULL DISCLOSURE REPORT 473 © 2005 Hewlett-Packard Company. All rights reserved. // Initialize the run status for the step to running. The completion FILE_ACCESS_READ)) != NULL) status for the step will be initialized by the Shell and ODBC { //execution functions. iRead = fread(szCmd, MyExecute->m_StepStatus = gintRunning; sizeof(char), sizeof(szCmd) / sizeof(char), fpCmd); if (iRead < if (MyExecute->m_ExecMthd == execShell) MAXLOGCMDLEN) MyExecute->m_tElapsedTime = szCmd[iRead] = '\0'; MyExecute->ExecuteShell(); else else szCmd[MAXLOGCMDLEN - 1] = '\0'; MyExecute->m_tElapsedTime = sprintf(szBuf, szFmt, szCmd); MyExecute->ExecuteODBC(); WriteToTpchLog(szBuf); fclose(fpCmd); // Close the output, log and error files } if (MyExecute->m_pOutputFile) } MyExecute->m_pOutputFile->Release(); } MyExecute->m_pOutputFile = NULL; void WriteToTpchLog(char *szMsg) MyExecute->m_ExecTime = NULL; { if (pfLogFile != NULL) GetLocalTime(&MyExecute->m_tEndTime); { EnterCriticalSection(&hLogFileWrite); #ifdef _TPCH_AUDIT fprintf(pfLogFile, szMsg); sprintf(szFmt, "Complete Step: '%%.%ds' at LeaveCriticalSection(&hLogFileWrite); '%d/%d/%d %d:%d:%d:%d'\n", } MAXLOGCMDLEN, MyExecute->m_tEndTime.wMonth, return; MyExecute->m_tEndTime.wDay, } MyExecute->m_tEndTime.wYear, #endif MyExecute->m_tEndTime.wHour, MyExecute->m_tEndTime.wMinute, TC_ TIME CExecute::ExecuteShell() MyExecute->m_tEndTime.wSecond, { MyExecute- STARTUPINFOA Start; >m_tEndTime.wMilliseconds); PROCESS_INFORMATION proc; if (MyExecute->m_ExecMthd == execShell) DWORD exitCode; TC_ TIME tElapsed = 0; WriteFileToTpchLog((LPSTR)MyExecute- _bstr_t szCommand("cmd /c "); >m_szCommand, szFmt); LPSTR szStartDir; else CURRENC Elapsed; { szCommand += m_szCommand; sprintf(szBuffer, szFmt, // Redirect output and error information (LPSTR)MyExecute->m_szCommand); szCommand += " > " + m_OutputFile + " 2> " + m_ErrorFile; WriteToTpchLog(szBuffer); // Initialize the STARTUPINFO structure: } memset(&Start, 0, sizeof(STARTUPINFOA)) ; #endif Start.cb = sizeof(Start); Start.dwFlags = STARTF_USESHOWWINDOW; MyExecute->PostMessage(WM_TASK_FINISH, 0, Start.wShowWindow = SW_SHOWMINNOACTIVE; 0); memset(&proc, 0, sizeof(PROCESS_INFORMATION)) ; szStartDir = strcmp((LPCTSTR)m_szExecDtls, "") == 0 ? NULL return; : (LPSTR)m_szExecDtls; } m_ExecTime->Start(); // Start the shelled application: #ifdef _TPCH_AUDIT if (!CreateProcessA( NULL, (LPSTR)szCommand, NULL, NULL, FALSE, void WriteFileToTpchLog(LPSTR szFile, LPSTR szFmt) NORMAL_PRIORITY_CLASS, NULL, szStartDir, &Start, { &proc )) // Reads a maximum of MAXLOGCMDBUF { characters from the command file and writes it to the log m_StepStatus = gintFailed; FILE *fpCmd; LogSystemError(m_pErrorFile); int iRead; char szBuf[MAXLOGCMDBUF]; m_ExecTime->Stop(&Elapsed); char szCmd[MAXLOGCMDLEN]; return((TC_TIME)Elapsed.int64); if ( pfLogFile != NULL ) } { if ( (fpCmd = fopen(szFile,

HP TPC-H FULL DISCLOSURE REPORT 474 © 2005 Hewlett-Packard Company. All rights reserved. if (m_bAbort) m_hHandle = proc.hProcess; return(tElapsed); // Give the process time to execute and finish // Connect to the server using the passed in connection string WaitForSingleObject(m_hHandle, INFINITE); rc = SQLDriverConnect(m_hdbc, NULL, m_ExecTime->Stop(&Elapsed); (unsigned char *)(LPSTR)m_szExecDtls, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT); if (!GetExitCodeProcess(m_hHandle, &exitCode)) HandleODBCError(rc, SQL_HANDLE_DBC, m_hdbc, { SMSQLDriverConnect); m_StepStatus = gintFailed; } LogSystemError(m_pErrorFile); } ReConnectDeadConnection(&m_hdbc); else m_StepStatus = gintComplete; #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing // Close all open handles to the shelled process SQLAllocHandle for hdbc.\n"); CloseHandle(m_hHandle); #endif if (!m_bAbort && (rc = return((TC_TIME)Elapsed.int64); SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, } &m_hHandle)) != SQL_SUCCESS) HandleODBCError(rc, SQL_HANDLE_DBC, m_hdbc, STDMETHODIMP CExecute::AbortShell() SMSQLAllocHandle); { // Set connection attributes if any have been modified from the if (m_hHandle != SQL_NULL_HSTMT) default values if (!TerminateProcess(m_hHandle, 0)) if (m_lRowCount > 0) return(RaiseSystemError()); { char szConnOptions[512]; return(S_OK); sprintf(szConnOptions, "SET } ROWCOUNT %d ", m_lRowCount); SetConnectionOption(szConnOptions, &m_hdbc); TC_ TIME CExecute::ExecuteODBC() } { TC_ TIME tElapsed if (m_bQuotedIds) = 0; SetConnectionOption("SET QUOTED_IDENTIFIER HDBC m_hdbc; ON ", &m_hdbc); SQLRETURN rc; if (!m_bAnsiNulls) LPSTR szCmd; SetConnectionOption("SET CURRENCY Elapsed; ANSI_NULL_DFLT_OFF ON ", &m_hdbc); BOOL bDoConnect = FALSE; if (!m_bAbort && m_lQueryTmout > 0) { // ODBC specific initialization #ifdef _DEBUG m_hdbc = SQL_NULL_HDBC; _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLSetStmtAttr.\n"); try #endif { // Set the query timeout on the statement handle // Allocate a new connection if we are rc = SQLSetStmtAttr(m_hHandle, creating a dynamic connection or if SQL_ATTR_QUERY_TIMEOUT, &m_lQueryTmout, // the named connection doesn't exist SQL_IS_UINTEGER); InitializeConnection(&m_hdbc, HandleODBCError(rc, SQL_HANDLE_STMT, &bDoConnect); m_hHandle, SMSQLSetStmtAttr); } // Ensure that the connection is valid. if (m_bNoExecute) #ifdef _DEBUG SetConnectionOption("SET NOEXEC ON ", _CrtDbgReport(_CRT_WARN, NULL, 0, &m_hdbc); NULL, "Executing SQLDriverConnect.\n"); else if (m_bParseOnly) #endif SetConnectionOption("SET PARSEONLY ON ", &m_hdbc); if (bDoConnect) else if (m_bShowQP) { // Important to ensure that this is the last connection // Allocate connection handle, attributes being set - open a connection and set connection attributes. // otherwise showplans are generated for all remaining #ifdef _DEBUG SET statements _CrtDbgReport(_CRT_WARN, SetConnectionOption("SET SHOWPLAN_TEXT ON NULL, 0, NULL, "Executing SQLDriverConnect.\n"); ", &m_hdbc); #endif else {

HP TPC-H FULL DISCLOSURE REPORT 475 © 2005 Hewlett-Packard Company. All rights reserved. if (m_bNoCount) void CExecute::InitializeConnection(HDBC *phdbc, BOOL *pbDoConnect) SetConnectionOption("SET NOCOUNT ON ", { &m_hdbc); SQLRETURN rc;

if (m_bStatsIO) *pbDoConnect = TRUE;

SetConnectionOption("SET STATISTICS IO ON ", if (IsDynamicConnection()) &m_hdbc); { #ifdef _DEBUG // Important to ensure that this _CrtDbgReport(_CRT_WARN, NULL, 0, is the last connection attributes being set - NULL, "Executing SQLAllocHandle for m_hdbc.\n") ; // otherwise timing statistics are #endif generated for all remaining SET statements if (m_bStatsTime) rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, phdbc); SetConnectionOption("SET STATISTICS TIME ON HandleODBCError(rc, ", &m_hdbc); SQL_HANDLE_ENV, henv, SMSQLAllocHandle); } return; m_szCmd = (LPSTR)m_szCommand; } m_ExecTime->Start(); EnterCriticalSection(&hConnections); while ((szCmd = // Returns the connection handle if the connection, NextCmdInBatch((LPSTR)m_szCommand)) != NULL && m_szConnection, exists !m_bAbort) for (m_iConnectionIndex = iConnectionCount - 1; { m_iConnectionIndex >= 0; m_iConnectionIndex--) #ifdef _DEBUG { _CrtDbgReport(_CRT_WARN, if (!strcmp( (p_Connections + NULL, 0, NULL, "Executing SQLExecDirect.\n"); m_iConnectionIndex)->szConnectionName, #endif (LPSTR)m_szConnection)) { // Execute the ODBC command if (!(p_Connections + rc = m_iConnectionIndex)->bInUse) SQLExecDirect(m_hHandle, (unsigned char *)szCmd, { SQL_NTS); *phdbc = HandleODBCError(rc, (p_Connections + m_iConnectionIndex)->hdbc; SQL_HANDLE_STMT, m_hHandle, SMSQLExecDirect); (p_Connections + m_iConnectionIndex)->bInUse = TRUE; free(szCmd); *pbDoConnect = // Call a procedure to log the FALSE; results to the output file break; ProcessResultsets(); } } else m_ExecTime->Stop(&Elapsed); {

ResetConnectionProperties(&m_hdbc); LeaveCriticalSection(&hConnections); } catch(CODBCError *pErr) { throw new m_StepStatus = gintFailed; CExecError(CExecError::SM_ERR_CONN_IN_USE); delete pErr; } } } catch(CExecError *pErr) } { m_StepStatus = gintFailed; if (m_iConnectionIndex < 0) pErr->LogErrors(this); { delete pErr; // Connection was not found. Allocate } connection handle and add it to list of // available connections. ODBCCleanup(&m_hdbc, &m_hHandle); #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, if (m_StepStatus != gintFailed) NULL, "Executing SQLAllocHandle for m_hdbc.\n") ; m_StepStatus = gintComplete; #endif

return((DWORD)Elapsed.int64); }

HP TPC-H FULL DISCLOSURE REPORT 476 © 2005 Hewlett-Packard Company. All rights reserved. rc = rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, phdbc); SQLAllocHandle(SQL_HANDLE_DBC, henv, phdbc); HandleODBCError(rc, HandleODBCError(rc, SQL_HANDLE_ENV, henv, SMSQLAllocHandle); SQL_HANDLE_ENV, henv, SMSQLAllocHandle);

m_iConnectionIndex = // Connect to the server using the passed in iConnectionCount++; connection string rc = SQLDriverConnect(*phdbc, NULL, p_Connections = (SM_Connection_Info (unsigned char *)realloc(p_Connections, *)(LPSTR)m_szExecDtls, SQL_NTS, iConnectionCount * NULL, 0, NULL, sizeof(SM_Connection_Info)); SQL_DRIVER_NOPROMPT); HandleODBCError(rc, strcpy((p_Connections + SQL_HANDLE_DBC, *phdbc, SMSQLDriverConnect); m_iConnectionIndex)->szConnectionName, } (LPSTR)m_szConnection); (p_Connections + m_iConnectionIndex)- return; >hdbc = *phdbc; } (p_Connections + m_iConnectionIndex)- >bInUse = TRUE; void CExecute::ResetConnectionUsage() } { if(m_iConnectionIndex >= 0 && LeaveCriticalSection(&hConnections); m_iConnectionIndex < iConnectionCount) { return; EnterCriticalSection(&hConnections); } (p_Connections + m_iConnectionIndex)- >bInUse = FALSE; void CExecute::ReConnectDeadConnection(HDBC *phdbc) LeaveCriticalSection(&hConnections); { } SQLRETURN rc; SQLUINTEGER uConnDead; return; } // Connect to the server using the passed in connection string void CExecute::ResetConnectionProperties(HDBC *p_hdbc) rc = SQLGetConnectAttr(*phdbc, { SQL_ATTR_CONNECTION_DEAD, SQLRETURN rc; &uConnDead, SQL_IS_UINTEGER, NULL); // Reset connection attributes if any have been HandleODBCError(rc, SQL_HANDLE_DBC, modified from the default values *phdbc, SMSQLDriverConnect); if (m_bNoExecute) if (uConnDead == SQL_CD_TRUE) SetConnectionOption("SET NOEXEC { OFF ", p_hdbc); // Cleanup the old connection and re- else if (m_bParseOnly) connect. SetConnectionOption("SET PARSEONLY #ifdef _DEBUG OFF ", p_hdbc); _CrtDbgReport(_CRT_WARN, NULL, 0, else if (m_bShowQP) NULL, "Executing SQLDisconnect.\n"); // Reset connection attributes in reverse #endif order rc = SQLDisconnect(*phdbc); SetConnectionOption("SET #ifdef _DEBUG SHOWPLAN_TEXT OFF ", p_hdbc); _CrtDbgReport(_CRT_WARN, NULL, 0, else NULL, "Executing SQLFreeHandle for hdbc.\n"); { #endif // Reset connection attributes in reverse SQLFreeHandle(SQL_HANDLE_DBC, order *phdbc); if (m_bStatsTime) *phdbc = SQL_NULL_HDBC; SetConnectionOption("SET STATISTICS TIME OFF ", p_hdbc); #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, if (m_bNoCount) NULL, "Executing SQLDriverConnect.\n"); SetConnectionOption("SET #endif NOCOUNT OFF ", p_hdbc);

if (m_bStatsIO) SetConnectionOption("SET STATISTICS IO OFF ", p_hdbc); }

HP TPC-H FULL DISCLOSURE REPORT 477 © 2005 Hewlett-Packard Company. All rights reserved. if (m_lRowCount > 0) if (!szSeparator) { { char // No more GO's szConnOptions[512]; if (strlen(m_szCmd) > 0) { sprintf(szConnOptions, "SET szCmd = ROWCOUNT 0 "); (LPSTR)malloc(strlen(m_szCmd) + 1); SetConnectionOption(szConnOptions, strcpy(szCmd, m_szCmd); p_hdbc); m_szCmd += } strlen(m_szCmd); } if (m_bQuotedIds) else SetConnectionOption("SET szCmd = NULL; QUOTED_IDENTIFIER OFF ", p_hdbc); } else if (szSeparator - m_szCmd > 0) if (!m_bAnsiNulls) { SetConnectionOption("SET // Strip the succeeding newline ANSI_NULL_DFLT_OFF OFF ", p_hdbc); szCmd = (LPSTR)malloc(szSeparator - m_szCmd); if (m_lQueryTmout > 0) strncpy(szCmd, m_szCmd, szSeparator - { m_szCmd - 1); SQLUINTEGER *(szCmd + (szSeparator - m_szCmd - 1)) lQueryTmout = 0; = '\0'; m_szCmd += szSeparator - m_szCmd + #ifdef _DEBUG strlen(CMD_SEPARATOR); _CrtDbgReport(_CRT_WARN, NULL, 0, if ( szNext == '\n' || szNext == '\r') NULL, "Executing SQLSetStmtAttr.\n") ; m_szCmd += 1; #endif } else // Set the query timeout on the statement szCmd = NULL; handle rc = SQLSetStmtAttr(m_hHandle, return(szCmd); SQL_ATTR_QUERY_TIMEOUT, &lQueryTmout, } SQL_IS_UINTEGER); HandleODBCError(rc, void CExecute::SetConnectionOption(LPSTR szConn, HDBC SQL_HANDLE_STMT, m_hHandle, SMSQLSetStmtAttr); *pHdbc) } { // Executes the passed in connection options 'set' return; statement. Returns True if it succeeded } char szConnOptions[512]; LPSTR CExecute::NextCmdInBatch(LPSTR szBatch) SQLRETURN rc; { LPSTR szCmd, szSeparator, szStart; sprintf(szConnOptions, szConn); char szNext; #ifdef _DEBUG szStart = m_szCmd; _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLExecDirect for connection option.\n"); while ( (szSeparator = strstr(szStart, #endif CMD_SEPARATOR)) != NULL) { if (m_bAbort) szNext = *(szSeparator + return; strlen(CMD_SEPARATOR)); if ( szNext == '\n' || szNext == '\r' || szNext rc = SQLExecDirect(m_hHandle, (unsigned char == '\0') *)szConnOptions, SQL_NTS); break; HandleODBCError(rc, SQL_HANDLE_STMT, else m_hHandle, SMSQLExecDirect); szStart = szSeparator + strlen(CMD_SEPARATOR); return; } }

HP TPC-H FULL DISCLOSURE REPORT 478 © 2005 Hewlett-Packard Company. All rights reserved. if (NumCols > 0) STDMETHODIMP CExecute::AbortODBC() { { // Allocate arrays to hold the C type, scale, column m_bAbort = TRUE; and display length of the data CTypeArray = (SQLSMALLINT *) malloc(NumCols try * sizeof(SQLSMALLINT)); { CScaleArray = (SQLSMALLINT *) malloc(NumCols if (m_hHandle != SQL_NULL_HSTMT) * sizeof(SQLSMALLINT)); { ColLenArray = (SQLINTEGER *) malloc(NumCols #ifdef _DEBUG * sizeof(SQLINTEGER)); _CrtDbgReport(_CRT_WARN, DispLenArray = (SQLINTEGER *) malloc(NumCols NULL, 0, NULL, "Executing SQLCancel.\n"); * sizeof(SQLINTEGER)); #endif OffsetArray = (SQLINTEGER *) malloc(NumCols * sizeof(SQLINTEGER)); SQLRETURN rc = OffsetArray[0] = 0; SQLCancel(m_hHandle); HandleODBCError(rc, for (i = 0; i < NumCols && !m_bAbort; i++) SQL_HANDLE_STMT, m_hHandle, SMSQLCancel); { } #ifdef _DEBUG } _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, catch(CODBCError *pErr) "Executing SQLDescribeCol.\n") ; { #endif delete pErr; } // Get the column description, include the SQL type // Determine the column's byte length. Calculate the return(S_OK); offset in the buffer to the } // data as the offset to the previous column, plus the byte length of the previous void CExecute::ProcessResultsets() // column, plus the byte length of the previous { column's length/indicator buffer. SQLSMALLINT *CTypeArray, *CScaleArray; // Note that the byte length of the column and the SQLINTEGER *ColLenArray, length/indicator buffer are increased *DispLenArray, *OffsetArray; // so that, assuming they start on an alignment SQLSMALLINT iColNameLen, boundary, they will end on the byte SQLType, iColNull, i, NumCols = 0; // before the next alignment boundary. Although this SQLINTEGER iDispLen, might leave some holes in the iRowCount; // buffer, it is a relatively inexpensive way to SQLRETURN rc; guarantee alignment. char rc = SQLDescribeCol(m_hHandle, szColName[MAX_DATA_LEN + 1]; ((SQLUSMALLINT) i)+1, void *DataPtr; (unsigned char *)szColName, SQLINTEGER iLenOrInd = sizeof(szColName), &iColNameLen, ALIGNBUF(sizeof(SQLINTEGER)); &SQLType, (unsigned long SQLUINTEGER iRowArraySize, *)&ColLenArray[i], &CScaleArray[i], &iColNull); iArrayElementSize; HandleODBCError(rc, SQL_HANDLE_STMT, // SQLUINTEGER NumRowsFetched; m_hHandle, SMSQLDescribeCol); // SQLUSMALLINT *RowStatusArray; #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, if (!m_pOutputFile || m_bAbort) "Executing SQLColAttribute.\n"); return; #endif

do if (m_bAbort) { return; #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, rc = SQLColAttribute(m_hHandle, NULL, "Executing SQLNumResultCols.\n"); ((SQLUSMALLINT) i)+1, SQL_DESC_DISPLAY_SIZE, #endif NULL, 0, // Determine the number of result set NULL, &iDispLen); columns. HandleODBCError(rc, rc = SQLNumResultCols(m_hHandle, SQL_HANDLE_STMT, m_hHandle, SMSQLColAttribute); &NumCols); HandleODBCError(rc, SQL_HANDLE_STMT, m_hHandle, SMSQLNumResultCols);

HP TPC-H FULL DISCLOSURE REPORT 479 © 2005 Hewlett-Packard Company. All rights reserved. SQLSetStmtAttr(m_hHandle, // GetDefaultCType contains a switch SQL_ATTR_ROW_BIND_TYPE, &iArrayElementSize, statement that returns the default C type SQL_IS_UINTEGER); // for each SQL type. SQLSetStmtAttr(m_hHandle, CTypeArray[i] = SQL_ATTR_ROW_ARRAY_SIZE, &iRowArraySize, GetDefaultCType(SQLType); SQL_IS_UINTEGER); if ( (CTypeArray[i] == SQL_C_CHAR || SQLSetStmtAttr(m_hHandle, CTypeArray[i] == SQL_C_BINARY) && SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, SQL_IS_POINTER); ColLenArray[i] > MAX_DATA_LEN) SQLSetStmtAttr(m_hHandle, { SQL_ATTR_ROWS_FETCHED_PTR, &NumRowsFetched, ColLenArray[i] = SQL_IS_POINTER); MAX_DATA_LEN; */ iDispLen = MAX_DATA_LEN; // For each column, bind the address in the buffer at } the start of the memory allocated // for that column's data and the address at the start of DispLenArray[i] = max(iColNameLen, the memory allocated for that iDispLen); // column's length/indicator buffer. DispLenArray[i] = max(DispLenArray[i], for (i = 0; i < NumCols; i++) sizeof(S_NULL)); { SQLBindCol(m_hHandle, i + 1, CTypeArray[i], // Print the column names in the header (SQLPOINTER)((SQLCHAR *)DataPtr + OffsetArray[i]), PrintData(szColName, SQL_C_CHAR, ColLenArray[i], (SQLINTEGER *)((SQLCHAR DispLenArray[i], 0, m_pOutputFile); *)DataPtr + OffsetArray[i] + ColLenArray[i])); HandleODBCError(rc, SQL_HANDLE_STMT, // Add a byte for the null-termination m_hHandle, SMSQLBindCol); character // Underline each column name ColLenArray[i] += 1; memset(szColName, '-', DispLenArray[i]); ColLenArray[i] = *(szColName + DispLenArray[i]) = '\0'; ALIGNBUF(ColLenArray[i]); PrintData(szColName, SQL_C_CHAR, DispLenArray[i], 0, m_pOutputFile); // Calculate the offset in the buffer to the } data as the offset to the previous column, m_pOutputFile->WriteLine(NULL); // plus the byte length of the previous column, plus the byte length of the previous #ifdef _DEBUG // column's length/indicator buffer. _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, if (i) OffsetArray[i] = OffsetArray[i- "Executing SQLFetch.\n"); 1] + ColLenArray[i-1] + iLenOrInd; #endif } m_pOutputFile->WriteLine(NULL); while (!m_bAbort && (rc = SQLFetch(m_hHandle)) iArrayElementSize = != SQL_NO_DATA) OffsetArray[NumCols-1] + ColLenArray[NumCols-1] + { iLenOrInd; HandleODBCError(rc, SQL_HANDLE_STMT, iRowArraySize = 1; m_hHandle, SMSQLFetch); // Allocate the data buffer. The size of the /* buffer is equal to the offset to the data for (i = 0; i < NumRowsFetched; i++) // buffer for the final column, plus the byte { length of the data buffer and length/indicator if (RowStatusArray[i] == SQL_ROW_SUCCESS|| // buffer for the last column. RowStatusArray[i] == SQL_ROW_SUCCESS_WITH_INFO) DataPtr = malloc(iRowArraySize * { iArrayElementSize); */ // Specify the size of the structure with the for (i = 0; i < NumCols; i++) SQL_ATTR_ROW_BIND_TYPE { // statement attribute. This also declares // Retrieve and print each row. PrintData accepts a that row-wise binding will pointer to the data, its C type, // be used. Declare the rowset size with the // and its byte length/indicator. SQL_ATTR_ROW_ARRAY_SIZE if ( *((SQLINTEGER *)((SQLCHAR *)DataPtr + // statement attribute. Set the OffsetArray[i] + ColLenArray[i])) == SQL_NULL_DATA) SQL_ATTR_ROW_STATUS_PTR statement PrintData(S_NULL, SQL_C_CHAR, // attribute to point to the row status array. DispLenArray[i], 0, m_pOutputFile); Set the else // SQL_ATTR_ROWS_FETCHED_PTR PrintData((LPVOID)((SQLCHAR statement attribute to point to *)DataPtr + OffsetArray[i]), CTypeArray[i], // NumRowsFetched. /* DispLenArray[i], CScaleArray[i], m_pOutputFile); RowStatusArray = (SQLUSMALLINT } *)malloc(iRowArraySize * sizeof(SQLUSMALLINT)); m_pOutputFile->WriteLine(NULL);

HP TPC-H FULL DISCLOSURE REPORT 480 © 2005 Hewlett-Packard Company. All rights reserved. } void CExecute::PrintData(void *vData, SQLSMALLINT CType, m_pOutputFile->WriteLine(NULL); SQLINTEGER IndPtr, SQLSMALLINT iScale, ISMLog /* *pOutput) free(RowStatusArray); { */ // PrintData accepts a pointer to the data, its C type, free(DataPtr); // and its byte length/indicator. It contains a switch statement that casts and prints free(CTypeArray); // the data according to its type. free(CScaleArray); free(ColLenArray); char *s; free(DispLenArray); char fmt[MAXBUFLEN]; } int j = 0; SQLINTEGER iColLen = IndPtr + 1; // Write io statistics, if applicable assert(iColLen); LogODBCErrors(rc, SQL_HANDLE_STMT, s = (LPSTR)malloc(iColLen + 1); m_hHandle, SMSQLFetch); if (s) { #ifdef _DEBUG if (vData) _CrtDbgReport(_CRT_WARN, NULL, 0, { NULL, "Executing SQLRowCount.\n"); switch(CType) #endif { case SQL_C_CHAR: if (m_bAbort) case SQL_C_WCHAR: break; case SQL_C_TYPE_DATE: case SQL_C_TYPE_TIME: // action (insert, update, delete) query case SQL_C_TYPE_TIMESTAMP: rc = SQLRowCount(m_hHandle, case SQL_C_INTERVAL_YEAR: &iRowCount); case SQL_C_INTERVAL_MONTH: HandleODBCError(rc, case SQL_HANDLE_STMT, m_hHandle, SMSQLRowCount); SQL_C_INTERVAL_YEAR_TO_MONTH: case SQL_C_INTERVAL_DAY: if (!m_bNoCount && iRowCount != -1) case SQL_C_INTERVAL_HOUR: { case SQL_C_INTERVAL_MINUTE: sprintf(szColName, "(%d case SQL_C_INTERVAL_SECOND: row(s) affected)", iRowCount); case _bstr_t temp(szColName); SQL_C_INTERVAL_DAY_TO_HOUR: m_pOutputFile- case >WriteLine((BSTR)temp); SQL_C_INTERVAL_DAY_TO_MINUTE: m_pOutputFile- case >WriteLine(NULL); SQL_C_INTERVAL_DAY_TO_SECOND: } case SQL_C_INTERVAL_HOUR_TO_MINUTE: #ifdef _DEBUG case _CrtDbgReport(_CRT_WARN, NULL, 0, SQL_C_INTERVAL_HOUR_TO_SECOND: NULL, "Executing SQLFreeStmt.\n"); case #endif SQL_C_INTERVAL_MINUTE_TO_SECOND: case SQL_C_BINARY: if (m_bAbort) sprintf(fmt, "%%.%ds", break; iColLen); SQLFreeStmt(m_hHandle, SQL_UNBIND); j = sprintf(s, fmt, (char *)vData); #ifdef _DEBUG break; _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "Executing SQLMoreResults.\n"); case SQL_C_SHORT: #endif j = sprintf(s, "%d", *(short if (m_bAbort) *)vData); break; break; // Process the next resultset. This function returns 'success with //info' even if there is no other resultset and there are statistics case SQL_C_LONG: //messages to be printed. Hence the check for -1 rows before j = sprintf(s, "%ld", *(long //printing. *)vData); rc=SQLMoreResults(m_hHandle); break; if (rc != SQL_NO_DATA) HandleODBCError(rc, SQL_HANDLE_STMT, case SQL_C_UBIGINT: m_hHandle, SMSQLMoreResults); j = sprintf(s, "%I64d", } while (rc != SQL_NO_DATA); *(__int64 *)vData); return; break; }

HP TPC-H FULL DISCLOSURE REPORT 481 © 2005 Hewlett-Packard Company. All rights reserved.

case SQL_C_FLOAT: case SQL_FLOAT: j = sprintf(s, "%f", *(float case SQL_DOUBLE: *)vData); // case SQL_DECIMAL: break; return(SQL_C_DOUBLE);

case SQL_C_DOUBLE: case SQL_DECIMAL: j = sprintf(s, "%f", *(double return(SQL_C_CHAR); *)vData); break; case SQL_BIT: return(SQL_C_CHAR); case SQL_C_NUMERIC: sprintf(fmt, "%%.0%df", case SQL_BINARY: iScale); case SQL_VARBINARY: j = sprintf(s, fmt, *(double case SQL_LONGVARBINARY: *)vData); return(SQL_C_CHAR); break; // return(SQL_C_BINARY);

default: case SQL_TYPE_DATE: j = sprintf(s, "%s", vData); return(SQL_C_CHAR); break; // return(SQL_C_TYPE_DATE); } } case SQL_TYPE_TIME: return(SQL_C_CHAR); // Strip off terminating null character and pad the // return(SQL_C_TYPE_TIME); string with blanks if (iColLen - j > 0) case SQL_TYPE_TIMESTAMP: memset(s + j, ' ', iColLen - j); return(SQL_C_CHAR); // *(s + iColLen) = '\0'; return(SQL_C_TYPE_TIMESTAMP);

// Write the field to the output file case SQL_NUMERIC: _bstr_t temp(s); return(SQL_C_FLOAT); pOutput->WriteField((BSTR)temp); free(s); case SQL_INTERVAL_YEAR: } return(SQL_C_CHAR); // return; return(SQL_C_INTERVAL_YEAR); } case SQL_INTERVAL_MONTH: SQLSMALLINT CExecute::GetDefaultCType(SQLINTEGER return(SQL_C_CHAR); SQLType) // { return(SQL_C_INTERVAL_MONTH); // GetDefaultCType returns the C type for the passed in SQL datatype. case SQL_INTERVAL_YEAR_TO_MONTH: return(SQL_C_CHAR); switch(SQLType) // { return(SQL_C_INTERVAL_YEAR_TO_MONTH); case SQL_CHAR: case SQL_VARCHAR: case SQL_INTERVAL_DAY: case SQL_LONGVARCHAR: return(SQL_C_CHAR); case SQL_WCHAR: // case SQL_WVARCHAR: return(SQL_C_INTERVAL_DAY); case SQL_WLONGVARCHAR: case SQL_INTERVAL_HOUR: return(SQL_C_CHAR); return(SQL_C_CHAR); // case SQL_TINYINT: return(SQL_C_INTERVAL_HOUR); return(SQL_C_CHAR); case SQL_SMALLINT: case SQL_INTERVAL_MINUTE: return(SQL_C_SHORT); return(SQL_C_CHAR); case SQL_INTEGER: // return(SQL_C_LONG); return(SQL_C_INTERVAL_MINUTE); case SQL_BIGINT: return(SQL_C_UBIGINT); case SQL_INTERVAL_SECOND: return(SQL_C_CHAR); case SQL_REAL: // return(SQL_C_FLOAT); return(SQL_C_INTERVAL_SECOND);

HP TPC-H FULL DISCLOSURE REPORT 482 © 2005 Hewlett-Packard Company. All rights reserved. case SQL_INTERVAL_DAY_TO_HOUR: SWORD wErrMsgLen; // Error message length return(SQL_C_CHAR); SQLINTEGER dwErrCode; // Native Error code // SQLRETURN nErrResult; // Return return(SQL_C_INTERVAL_DAY_TO_HOUR); Code from SQLGetDiagRec SWORD sMsgNum = 1; // Error sequence number case SQL_INTERVAL_DAY_TO_MINUTE: _bstr_t temp; return(SQL_C_CHAR); if (IsErrorReturn(nResult)) // { return(SQL_C_INTERVAL_DAY_TO_MINUTE); sprintf(szBuffer, "ODBC Operation: '%s' returned error code: %d", case SQL_INTERVAL_DAY_TO_SECOND: g_szOdbcOps[FailedOp], nResult); return(SQL_C_CHAR); temp = szBuffer; // m_pErrorFile->WriteLine((BSTR) temp); return(SQL_C_INTERVAL_DAY_TO_SECOND); m_StepStatus = gintFailed; } case SQL_INTERVAL_HOUR_TO_MINUTE: return(SQL_C_CHAR); if (handle == SQL_NULL_HSTMT) // return; return(SQL_C_INTERVAL_HOUR_TO_MINUTE); #ifdef _DEBUG case SQL_INTERVAL_HOUR_TO_SECOND: _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, return(SQL_C_CHAR); "Executing SQLGetDiagRec.\n") ; // #endif return(SQL_C_INTERVAL_HOUR_TO_SECOND); // call SQLGetDiagRec function with proper ODBC handles, repeatedly until case SQL_INTERVAL_MINUTE_TO_SECOND: // function returns SQL_NO_DATA. return(SQL_C_CHAR); while (!m_bAbort && (nErrResult = // SQLGetDiagRec(fHandleType, handle, sMsgNum++, return(SQL_C_INTERVAL_MINUTE_TO_SECON szErrState, &dwErrCode, szErrText, D); SQL_MAX_MESSAGE_LENGTH-1, &wErrMsgLen)) != SQL_NO_DATA) default: { assert(TRUE); if (!SQL_SUCCEEDED(nErrResult)) return(SQL_C_CHAR); break; break; } if (m_pOutputFile && } IsServerMessage(dwErrCode, szErrText)) { /* wsprintf(szBuffer, SM_SQLMSG_FORMAT, FUNCTION: LogODBCErrors(SQLRETURN rc, SWORD (LPSTR)szErrText); fHandleType, SQLHANDLE handle) temp = szBuffer; COMMENTS: Formats ODBC errors or warnings and logs m_pOutputFile->WriteLine((BSTR) temp); them. Also initializes the } completion status for the step else if (IsODBCWarning(szErrState) && dwErrCode to failure, if an ODBC error has occurred. != SM_SQL_ERR_CHANGED_DB && */ dwErrCode != SM_SQL_ERR_CHANGED_LANG) void CExecute::LogODBCErrors(SQLRETURN nResult, { SWORD fHandleType, SQLHANDLE handle, OdbcOperations // Suppress warnings - 'Changed database FailedOp) context to...' and 'Changed language setting to...' { wsprintf(szBuffer, // Messages returned by the server (e.g. Print SM_SQLMSG_FORMAT, statements) will be logged to the output file ParseOdbcMsgPrefixes((LPCSTR)szErrText)); // ODBC warnings will be logged to the log file temp = szBuffer; // All other ODBC errors will be logged to the error m_pOutputFile->WriteLine((BSTR) file. temp); } UCHAR szErrState[SQL_SQLSTATE_SIZE+1]; else if (m_pErrorFile && // SQL Error State string !IsODBCWarning(szErrState)) UCHAR { szErrText[SQL_MAX_MESSAGE_LENGTH+1]; wsprintf(szBuffer, // SQL Error Text string SM_SQLERR_FORMAT, (LPSTR)szErrState, dwErrCode, char (LPSTR)szErrText); szBuffer[SQL_SQLSTATE_SIZE+SQL_MAX_MES temp = szBuffer; SAGE_LENGTH+MAXBUFLEN+1] = ""; m_pErrorFile->WriteLine((BSTR) temp); } // formatted Error text Buffer } }

HP TPC-H FULL DISCLOSURE REPORT 483 © 2005 Hewlett-Packard Company. All rights reserved. // Wrapper function that raises an error if a Windows Api fails /* STDMETHODIMP CExecute::RaiseSystemError(void) FUNCTION: LogErrors(SQLRETURN rc, SWORD { fHandleType, SQLHANDLE handle) char s[MAXBUFLEN]; COMMENTS: Writes the error message to the error log */ GetSystemError(s); void CExecError::LogErrors(CExecute *p) return Error(s, 0, NULL, GUID_NULL); { } _bstr_t temp(m_szExecErrorDesc[m_iErrCode]); // Wrapper function that logs the error raised by an Api function if (p->m_pErrorFile) to the passed in file p->m_pErrorFile- void CExecute::LogSystemError(ISMLog *pFile) >WriteLine((BSTR)temp); { return; if (pFile) } { /* char s[MAXBUFLEN]; FUNCTION: ODBCCleanup(HDBC *hdbc, HSTMT *hstmt) GetSystemError(s); COMMENTS: Cleanup of all ODBC structures */ _bstr_t temp(s); pFile->WriteLine((BSTR)temp); void CExecute::ODBCCleanup(HDBC *hdbc, HSTMT *hstmt) } { } SQLRETURN lReturn; // Populates the passed in string with the last Windows Api error #ifdef _DEBUG that occurred _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, void CExecute::GetSystemError(LPSTR s) "Executing ODBCCleanup.\n"); { #endif long c; DWORD e; if (*hstmt != SQL_NULL_HSTMT) { e = GetLastError(); #ifdef _DEBUG _CrtDbgReport(_CRT_WARN, NULL, 0, c = sprintf(s, "Error code: %ld. ", e); NULL, "Executing SQLCloseCursor.\n"); c = #endif FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | SQLCloseCursor(hstmt); FORMAT_MESSAGE_IGNORE_INSERTS, #ifdef _DEBUG NULL, e, 0, s + c, MAXBUFLEN - c, _CrtDbgReport(_CRT_WARN, NULL, 0, NULL); NULL, "Executing SQLFreeHandle for hstmt.\n") ; #endif return; SQLFreeHandle(SQL_HANDLE_STMT, } hstmt); *hstmt = SQL_NULL_HSTMT; STDMETHODIMP CExecute::get_StepStatus(InstanceStatus } *pVal) // Cleanup connection if it is a dynamic connection { if (IsDynamicConnection()) *pVal = m_StepStatus; { return S_OK; if (*hdbc != SQL_NULL_HDBC) } { #ifdef _DEBUG STDMETHODIMP CExecute::WriteError(BSTR szMsg) _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, { "Executing SQLDisconnect.\n"); if (m_pErrorFile) #endif return(m_pErrorFile->WriteLine(szMsg)); lReturn = SQLDisconnect(*hdbc); #ifdef _DEBUG return S_OK; _CrtDbgReport(_CRT_WARN, } NULL, 0, NULL, "Executing SQLFreeHandle for hdbc.\n"); #endif

SQLFreeHandle(SQL_HANDLE_DBC, hdbc); *hdbc = SQL_NULL_HDBC; } } else ResetConnectionUsage();

return; }

HP TPC-H FULL DISCLOSURE REPORT 484 © 2005 Hewlett-Packard Company. All rights reserved. // FILE: Execute.h // Define a macro to increase the size of a buffer so it is a // Microsoft TPC-H Kit Ver. 1.00 multiple of teh alignment size. // Copyright Microsoft, 1999 // Thus, if a buffer starts on an alignment boundary, it will end // All Rights Reserved just before the next // // alignment boundary. Here, an alignment size of 4 is used // because this is the size of the // PURPOSE: Declaration of the CExecute // largest data type used in the application's buffer - the size of an // Contact: Reshma Tharamal ([email protected]) SDWORD and of the largest // // default C data type are both 4. If a larger data type (such as // Execute.h : Declaration of the CExecute __int64) is used, it will be // necessary to align for that size. #ifndef __EXECUTE_H_ #define ALIGNSIZE 4 #define __EXECUTE_H_ #define ALIGNBUF(Length) ((Length) % ALIGNSIZE) ? \ ((Length) + ALIGNSIZE - ((Length) % ALIGNSIZE)) : #include (Length) #include #include #define MAX_BUFFER_SIZE 64000 #include "resource.h" // main symbols #include "ExecuteDllCP.h" typedef enum OdbcOperations #include "..\LogWriter\LogWriter.h" { #include "..\LogWriter\SMLog.h" SMSQLAllocHandle, #include "..\common\SMTime\SMTime.h" SMSQLDriverConnect, #include "..\common\SMTime\SMTimer.h" SMSQLExecDirect, SMSQLSetStmtAttr, // ODBC-specific includes SMSQLCancel, #define DBNTWIN32 SMSQLNumResultCols, #include SMSQLDescribeCol, #include SMSQLColAttribute, #include SMSQLFetch, SMSQLGetData, ///////////////////////////////////////////////////////////////////////////// SMSQLRowCount, // CExecute SMSQLMoreResults, SMSQLBindCol, #define WM_TASK_START (WM_USER + 101) }; #define WM_TASK_FINISH (WM_USER + 102) class CODBCError #define SM_SQLERR_FORMAT "SQL Error { State:%s, Native Error Code: %ld\r\nODBC Error: %s" public: CODBCError(SQLRETURN nResult, SWORD // format for ODBC error messages fHandleType, SQLHANDLE handle, OdbcOperations #define SM_SQLWARN_FORMA FailedOp) SM_SQLERR_FORMAT // format for ODBC { warnings m_fHandleType = fHandleType; #define SM_SQLMSG_FORMAT "%s" m_handle = handle; // format for messages from the server m_FailedOp = FailedOp; m_nResult = nResult; #define SM_SQL_STATE_WARNING "0 1000" }; #define SM_MSG_SERVER "[Microsoft][ODBC SQL Server Driver][SQL private: Server]" SWORD m_fHandleType; #define SM_SQL_ERR_CHANGED_DB 5701 SQLHANDLE m_handle; #define SM_SQL_ERR_CHANGED_LANG 5703 OdbcOperations m_FailedOp; #define SM_STEPMASTER_ERROR "StepMaster Error: " SQLRETURN m_nResult; #define CMD_SEPARATOR "\nGO" #define INV_ARRAY_INDEX -1 // invalid index into an private: array inline BOOL IsServerMessage(SQLINTEGER lNativeError, #define MAXBUFLEN 256 // display buffer size UCHAR *szErr){ #define MAXLOGCMDLEN 256 // maximum return( (strstr((LPCTSTR)szErr, //characters in command that will be printed to log SM_MSG_SERVER) != NULL) ? (lNativeError == 0) : #define MAXLOGCMDBUF 512 // maximum FALSE); } //characters in command that will be printed to log inline BOOL IsODBCWarning(UCHAR *szSqlState){ #define MAX_DATA_LEN 4000 // maximum buffer return(strcmp((LPCSTR)szSqlState, //size for variable-length data types // viz. character and binary SM_SQL_STATE_WARNING) == 0);} //fields inline LPCSTR ParseOdbcMsgPrefixes(LPCSTR szMsg){ char #define FILE_ACCESS_READ "r" // Open file for read access *pDest; #define S_NULL "NULL" return( (pDest = strstr(szMsg, SM_MSG_SERVER)) == NULL ? szMsg : pDest + strlen(SM_MSG_SERVER));} };

HP TPC-H FULL DISCLOSURE REPORT 485 © 2005 Hewlett-Packard Company. All rights reserved. class ATL_NO_VTABLE CExecute : LRESULT OnTaskFinished(UINT uMsg, WPARAM wParam, public CWindowImpl, LPARAM lParam, BOOL& bHandled) public { CComObjectRootEx, CURRENCY CEndTime = public CComCoClass, Fire_Complete(CEndTime, public IConnectionPointContainerImpl, (long)m_tElapsedTime); public ISupportErrorInfo, return 0; public IDispatchImpl, public CProxy_IExecuteEvents< CExecute > HRESULT FinalConstruct() { { public: HRESULT hr; CExecute() RECT rect; { rect.left=0; m_pErrorFile = NULL; rect.right=100; //m_pLogFile = NULL; rect.top=0; m_pOutputFile = NULL; rect.bottom=100; HWND hwnd = Create( NULL, rect, // Initialize the elapsed time for the step "ExecuteWindow", WS_POPUP); m_tElapsedTime = 0; if (!hwnd) // Initialize the run status for the step return m_StepStatus = gintPending; HRESULT_FROM_WIN32(GetLastError()); hr = CoCreateInstance(CLSID_SMLog, m_hHandle = SQL_NULL_HSTMT; NULL, CLSCTX_INPROC, m_bAbort = FALSE; IID_ISMLog, (void **)&m_pErrorFile); if FAILED(hr) m_iConnectionIndex = return(hr); INV_ARRAY_INDEX; m_pErrorFile->put_Append(TRUE); } //hr = CoCreateInstance(CLSID_SMLog, NULL, CLSCTX_INPROC, ~CExecute() // IID_ISMLog, (void **)&m_pLogFile); { //if FAILED(hr) } // return(hr); hr = CoCreateInstance(CLSID_SMLog, friend class CExecError; NULL, CLSCTX_INPROC, IID_ISMLog, (void **)&m_pOutputFile); public: if FAILED(hr) DECLARE_WND_CLASS("Execute") return(hr); m_pOutputFile->put_Append(TRUE); BEGIN_MSG_MAP(CExecute) hr = CoCreateInstance(CLSID_SMTimer, NULL, CLSCTX_INPROC, MESSAGE_HANDLER(WM_TASK_FINISH, IID_ISMTimer, (void **)&m_ExecTime); OnTaskFinished) if FAILED(hr) return(hr); MESSAGE_HANDLER(WM_TASK_START, OnTaskStarted) return S_OK; END_MSG_MAP() } public:

LRESULT OnTaskStarted(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { CURRENCY CStartTime = Get64BitTime(&m_tStartTime);

Fire_Start(CStartTime); return 0; }

HP TPC-H FULL DISCLOSURE REPORT 486 © 2005 Hewlett-Packard Company. All rights reserved. void FinalRelease() { DWORD m_lMode; if (m_hWnd != NULL) //DATE m_CurTime; DestroyWindow(); SYSTEMTIME m_tStartTime; // Close the log and error files SYSTEMTIME m_tEndTime; if (m_pErrorFile) TC_ TIME m_tElapsedTime; m_pErrorFile->Release(); ISMLog *m_pErrorFile; m_pErrorFile = NULL; //ILog *m_pLogFile; ISMLog *m_pOutputFile; //if (m_pLogFile) ISMTimer *m_ExecTime; // m_pLogFile->Release(); ExecutionType m_ExecMthd; //m_pLogFile = NULL; InstanceStatus m_StepStatus; HANDLE m_hHandle; if (m_ExecTime) // Process handle for shell commands and m_ExecTime->Release(); m_ExecTime = NULL; // Statement handle } for ODBC commands LPSTR m_szCmd; DECLARE_REGISTRY_RESOURCEID(IDR_EXECUTE) private: DECLARE_PROTECT_FINAL_CONSTRUCT() LPSTR NextCmdInBatch(LPSTR szBatch); BEGIN_COM_MAP(CExecute) void ProcessResultsets(); COM_INTERFACE_ENTRY(IExecute) SQLSMALLINT COM_INTERFACE_ENTRY(ISupportErrorInfo) GetDefaultCType(SQLINTEGER SQLType); COM_INTERFACE_ENTRY(IDispatch) void PrintData(void COM_INTERFACE_ENTRY(IConnectionPointCont *vData, SQLSMALLINT CType, SQLINTEGER IndPtr, ainer) SQLSMALLINT COM_INTERFACE_ENTRY_IMPL(IConnectionPoi iScale, ISMLog *pOutput); ntContainer) void END_COM_MAP() LogODBCErrors(SQLRETURN nResult, SWORD BEGIN_CONNECTION_POINT_MAP(CExecute) fHandleType, SQLHANDLE handle, CONNECTION_POINT_ENTRY(DIID__IExecuteEvents) OdbcOperations END_CONNECTION_POINT_MAP() FailedOp); void // ISupportsErrorInfo ODBCCleanup(HDBC *hdbc, HSTMT *hstmt); STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); STDMETHODIMP RaiseSystemError(void); void // IExecute LogSystemError(ISMLog *pFile); public: void STDMETHOD(put_ErrorFile)(/*[in]*/ BSTR GetSystemError(LPSTR s); newVal); void STDMETHOD(put_OutputFile)(/*[in]*/ BSTR SetConnectionOption(LPSTR szConn, HDBC newVal); *pHdbc); STDMETHOD(WriteError)(BSTR szMsg); void STDMETHOD(Abort)(); ResetConnectionProperties(HDBC *p_hdbc); STDMETHOD(get_StepStatus)(/*[out, retval]*/ InstanceStatus *pVal); void STDMETHOD(DoExecute)(/*[in]*/ BSTR InitializeConnection(HDBC *phdbc, BOOL szCommand, /*[in]*/ BSTR szExecutionDtls, *pbDoConnect); /*[in]*/ ExecutionType ExecMethod, void /*[in]*/ BOOL bNoCount, /*[in]*/ BOOL ReConnectDeadConnection(HDBC *phdbc); bNoExecute, /*[in]*/ BOOL bParseOnly, /*[in]*/ BOOL bQuotedIds, /*[in]*/ void BOOL bAnsiNulls, /*[in]*/ BOOL bShowQP, ResetConnectionUsage(); /*[in]*/ BOOL bStatsTime, /*[in]*/ BOOL bStatsIO, /*[in]*/ long lRowCount, int m_iConnectionIndex; /*[in]*/ long lQueryTmout, /*[in]*/ BSTR BOOL m_bNoCount, m_bNoExecute, szConnection); m_bParseOnly, m_bQuotedIds, m_bAnsiNulls, \ TC_ TIME ExecuteShell(); TC_ TIME ExecuteODBC(); m_bShowQP, m_bStatsTime, m_bStatsIO; STDMETHODIMP AbortShell(); long m_lRowCount; STDMETHODIMP AbortODBC(); SQLUINTEGER m_lQueryTmout; _bstr_t m_szCommand; _bstr_t m_ErrorFile, _bstr_t m_szExecDtls; m_OutputFile; _bstr_t m_szConnection; BOOL m_bAbort;

HP TPC-H FULL DISCLOSURE REPORT 487 © 2005 Hewlett-Packard Company. All rights reserved. private: #endif //__EXECUTE_H_ inline BOOL IsServerMessage(SQLINTEGER lNativeError, // FILE: ExecuteDll.cpp UCHAR *szErr){ // Microsoft TPC-H Kit Ver. 1.00 return( (strstr((LPCTSTR)szErr, // Copyright Microsoft, 1999 SM_MSG_SERVER) != NULL) ? (lNativeError == 0) : // All Rights Reserved FALSE); } // inline BOOL IsODBCWarning(UCHAR *szSqlState){ // return(strcmp((LPCSTR)szSqlState, // PURPOSE: Implementation of DLL Exports. SM_SQL_STATE_WARNING) == 0);} // Contact: Reshma Tharamal ([email protected]) inline BOOL IsErrorReturn(SQLRETURN iRetCode){ // return( (!SQL_SUCCEEDED(iRetCode)) && (iRetCode != SQL_NO_DATA) );} inline LPCSTR ParseOdbcMsgPrefixes(LPCSTR szMsg){ char // Note: Proxy/Stub Information *pDest; // To build a separate proxy/stub DLL, return( (pDest = strstr(szMsg, SM_MSG_SERVER)) // run nmake -f ExecuteDllps.mk in the project directory. == NULL ? szMsg : pDest + strlen(SM_MSG_SERVER));} inline BOOL IsDynamicConnection(){ #include "stdafx.h" return(!strcmp((LPSTR)m_szConnection, ""));} #include "resource.h" inline void HandleODBCError(SQLRETURN rc, SWORD #include fHandleType, SQLHANDLE handle, OdbcOperations OdbcOp) { #include "..\LogWriter\LogWriter.h" if (rc != SQL_SUCCESS) #include "..\LogWriter\LogWriter_i.c" { LogODBCErrors(rc, fHandleType, handle, #include "..\common\SMTime\SMTime.h" OdbcOp); #include "..\common\SMTime\SMTime_i.c" if (IsErrorReturn(rc)) throw new CODBCError(rc, #include "ExecuteDll.h" fHandleType, handle, OdbcOp); #include "SMExecute.h" } return; #include "ExecuteDll_i.c" } #include "Execute.h"

}; CComModule _Module;

class CExecError BEGIN_OBJECT_MAP(ObjectMap) { OBJECT_ENTRY(CLSID_Execute, CExecute) public: END_OBJECT_MAP() typedef enum ExecErrorCodes { SQLHENV henv = NULL; SM_ERR_CONN_IN_USE, // ODBC environment handle }; static char szCaption[] = "StepMaster"; // Message box caption CExecError(int iError) { CRITICAL_SECTION hConnections; m_iErrCode = iError; // Critical section to serialize access }; // to available connections void SM_Connection_Info *p_Connections = NULL; LogErrors(CExecute *p); // Pointer to open connections int private: iConnectionCount = 0;// Number of open connections int m_iErrCode; #ifdef _TPCH_AUDIT static char *m_szExecErrorDesc[]; FILE *pfLogFile = NULL; }; // Log file containing timestamps CRITICAL_SECTION hLogFileWrite; void ExecutionThread(LPVOID // Critical section to serialize writes to log lpParameter); static char szFileOpenModeAppend[] = "a+"; // Log file open mode #ifdef _TPCH_AUDIT void static char szEnvVarLogFile[] = WriteFileToTpchLog(LPSTR szFile, LPSTR szFmt); "TPCH_LOG_FILE";// Environment variable - initialized to void WriteToTpchLog(char *szMsg); // log file name if timing information #endif // is to be logged #endif

HP TPC-H FULL DISCLOSURE REPORT 488 © 2005 Hewlett-Packard Company. All rights reserved. void ShowODBCErrors(SWORD fHandleType, SQLHANDLE SQLUINTEGER CpMatch; handle); if (!SQL_SUCCEEDED(SQLGetEnvAttr(henv, void CloseOpenConnections(); SQL_ATTR_CP_MATCH, &CpMatch, 0, NULL))) ShowODBCErrors(SQL_HANDLE_ENV, henv); ///////////////////////////////////////////////////////////////////////////// if (!SQL_SUCCEEDED(SQLSetEnvAttr(henv, // DLL Entry Point SQL_ATTR_CP_MATCH,

extern "C" (SQLPOINTER)SQL_CP_STRICT_MATCH, BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD SQL_IS_INTEGER))) dwReason, LPVOID /*lpReserved*/) ShowODBCErrors(SQL_HANDLE_ENV, henv); { } if (dwReason == DLL_PROCESS_ATTACH) else if (dwReason == DLL_PROCESS_DETACH) { { _Module.Init(ObjectMap, hInstance, #ifdef _TPCH_AUDIT &LIBID_EXECUTEDLLLib); if (pfLogFile != NULL) DisableThreadLibraryCalls(hInstance); { fclose(pfLogFile); #ifdef _TPCH_AUDIT char szMsg[MAXBUFLEN]; DeleteCriticalSection(&hLogFileWrite); LPSTR szLogFileName = } getenv(szEnvVarLogFile); #endif CloseOpenConnections(); if (szLogFileName == NULL) if (henv != NULL) { SQLFreeEnv(henv); sprintf(szMsg, "The DeleteCriticalSection(&hConnections); environment variable '%s' does not exist. " _Module.Term(); "Step timing } information will not be written to a log.", szEnvVarLogFile); return TRUE; // ok MessageBox(NULL, szMsg, } szCaption, MB_OK); void ShowODBCErrors(SWORD fHandleType, SQLHANDLE } handle) else { { UCHAR if ( (pfLogFile = fopen(szLogFileName, szErrState[SQL_SQLSTATE_SIZE+1]; // SQL szFileOpenModeAppend)) == NULL ) Error State string { UCHAR sprintf(szMsg, "The file '%s' does not exist. " szErrText[SQL_MAX_MESSAGE_LENGTH+1]; "Step timing information will not be written to log.", // SQL Error Text string szLogFileName); char MessageBox(NULL, szMsg, szCaption, MB_OK); szBuffer[SQL_SQLSTATE_SIZE+SQL_MAX_MES } SAGE_LENGTH+MAXBUFLEN+1] = ""; else // formatted Error text Buffer InitializeCriticalSection(&hLogFileWrite); SWORD wErrMsgLen; // Error message } length #endif SQLINTEGER dwErrCode; InitializeCriticalSection(&hConnections); // Native Error code p_Connections = NULL; SQLRETURN nErrResult; iConnectionCount = 0; // Return Code from if (!SQL_SUCCEEDED(SQLSetEnvAttr(NULL, SQLGetDiagRec SQL_ATTR_CONNECTION_POOLING, SWORD sMsgNum = 1; // Error sequence number // call SQLGetDiagRec function with proper ODBC (SQLPOINTER)SQL_CP_ONE_PER_HENV , 0))) handles, repeatedly until // function returns SQL_NO_DATA. ShowODBCErrors(SQL_HANDLE_ENV, henv); while ((nErrResult = SQLGetDiagRec(fHandleType, handle, sMsgNum++, if szErrState, &dwErrCode, szErrText, (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, SQL_MAX_MESSAGE_LENGTH-1, &wErrMsgLen)) SQL_NULL_HANDLE, &henv))) != SQL_NO_DATA) { { if (!SQL_SUCCEEDED(nErrResult)) ShowODBCErrors(SQL_HANDLE_ENV, henv); break; return FALSE; wsprintf(szBuffer, } SM_SQLERR_FORMAT, (LPSTR)szErrState, dwErrCode, if (!SQL_SUCCEEDED(SQLSetEnvAttr(henv, (LPSTR)szErrText); SQL_ATTR_ODBC_VERSION, (LPVOID)SQL_OV_ODBC3, MessageBox(NULL, szBuffer, szCaption, MB_OK); 0))) } ShowODBCErrors(SQL_HANDLE_ENV, henv); }

HP TPC-H FULL DISCLOSURE REPORT 489 © 2005 Hewlett-Packard Company. All rights reserved. void CloseOpenConnections() ///////////////////////////////////////////////////////////////////////////// { // DllUnregisterServer - Removes entries from the system // Closes all open connections registry

if (p_Connections) STDAPI DllUnregisterServer(void) { { for (int iConnIndex = iConnectionCount - return _Module.UnregisterServer(TRUE); 1; iConnIndex >= 0; iConnIndex--) } { /* this ALWAYS GENERATED file contains the definitions for if ((p_Connections + the interfaces */ iConnIndex)->hdbc != SQL_NULL_HDBC) { #ifdef _DEBUG /* File created by MIDL compiler version 5.01.0164 */ _CrtDbgReport(_CRT_WARN, /* at Mon Jun 09 19:33:03 2003 NULL, 0, NULL, "Executing SQLDisconnect.\n"); */ #endif /* Compiler settings for C:\charles\Stepmaster\ExecuteDll\ExecuteDll.idl: SQLDisconnect((p_Connections + iConnIndex)- Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext >hdbc); error checks: allocation ref bounds_check enum stub_data #ifdef _DEBUG */ _CrtDbgReport(_CRT_WARN, //@@MIDL_FILE_HEADING( ) NULL, 0, NULL, "Executing SQLFreeHandle for hdbc.\n"); #endif /* verify that the version is high enough to compile SQLFreeHandle(SQL_HANDLE_DBC, this file*/ (p_Connections + iConnIndex)->hdbc ); #ifndef __REQUIRED_RPCNDR_H_VERSION__ (p_Connections + iConnIndex)- #define __REQUIRED_RPCNDR_H_VERSION__ 440 >hdbc = SQL_NULL_HDBC; #endif } #include "rpc.h" } #include "rpcndr.h"

free(p_Connections); #ifndef __ExecuteDll_h__ } #define __ExecuteDll_h__ p_Connections = NULL; #ifdef __cplusplus return; extern "C"{ } #endif

///////////////////////////////////////////////////////////////////////////// /* Forward Declarations */ // Used to determine whether the DLL can be unloaded by OLE #ifndef ___IExecuteEvents_FWD_DEFINED__ STDAPI DllCanUnloadNow(void) #define ___IExecuteEvents_FWD_DEFINED__ { typedef interface _IExecuteEvents _IExecuteEvents; return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; #endif /* ___IExecuteEvents_FWD_DEFINED__ */ }

///////////////////////////////////////////////////////////////////////////// #ifndef __IExecute_FWD_DEFINED__ // Returns a class factory to create an object of the requested type #define __IExecute_FWD_DEFINED__ typedef interface IExecute IExecute; STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, #endif /* __IExecute_FWD_DEFINED__ */ LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); #ifndef __Execute_FWD_DEFINED__ } #define __Execute_FWD_DEFINED__

///////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus // DllRegisterServer - Adds entries to the system registry typedef class Execute Execute; #else STDAPI DllRegisterServer(void) typedef struct Execute Execute; { #endif /* __cplusplus */ // registers object, typelib and all interfaces in typelib return _Module.RegisterServer(TRUE); #endif /* __Execute_FWD_DEFINED__ */ }

HP TPC-H FULL DISCLOSURE REPORT 490 © 2005 Hewlett-Packard Company. All rights reserved. /* header files for imported files */ #else /* C style interface */ #include "oaidl.h" #include "ocidl.h" typedef struct _IExecuteEventsVtbl { void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); BEGIN_INTERFACE void __RPC_USER MIDL_user_free( void __RPC_FAR * ); HRESULT ( STDMETHODCALLTYPE __RPC_FAR /* interface __MIDL_itf_ExecuteDll_0000 */ *QueryInterface )( /* [local] */ _IExecuteEvents __RPC_FAR * This, /* [in] */ REFIID riid, typedef /* [helpstring][uuid] */ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR enum ExecutionType *ppvObject); { execODBC = 0x1, execShell = 0x2 ULONG ( STDMETHODCALLTYPE __RPC_FAR } ExecutionType; *AddRef )( _IExecuteEvents __RPC_FAR * This); typedef /* [helpstring][uuid] */ enum InstanceStatus ULONG ( STDMETHODCALLTYPE __RPC_FAR { gintDisabled = 0x1, *Release )( gintPending = 0x2, _IExecuteEvents __RPC_FAR * This); gintRunning = 0x3, gintComplete = 0x4, HRESULT ( STDMETHODCALLTYPE __RPC_FAR gintFailed = 0x5, *GetTypeInfoCount )( gintAborted = 0x6 _IExecuteEvents __RPC_FAR * This, } InstanceStatus; /* [out] */ UINT __RPC_FAR *pctinfo);

HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( extern RPC_IF_HANDLE _IExecuteEvents __RPC_FAR * This, __MIDL_itf_ExecuteDll_0000_v0_0_c_ifspec; /* [in] */ UINT iTInfo, extern RPC_IF_HANDLE /* [in] */ LCID lcid, __MIDL_itf_ExecuteDll_0000_v0_0_s_ifspec; /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);

#ifndef __EXECUTEDLLLib_LIBRARY_DEFINED__ HRESULT ( STDMETHODCALLTYPE __RPC_FAR #define __EXECUTEDLLLib_LIBRARY_DEFINED__ *GetIDsOfNames )( _IExecuteEvents __RPC_FAR * This, /* library EXECUTEDLLLib */ /* [in] */ REFIID riid, /* [helpstring][version][uuid] */ /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, EXTERN_C const IID LIBID_EXECUTEDLLLib; /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);

#ifndef ___IExecuteEvents_DISPINTERFACE_DEFINED__ /* [local] */ HRESULT ( STDMETHODCALLTYPE #define ___IExecuteEvents_DISPINTERFACE_DEFINED__ __RPC_FAR *Invoke )( _IExecuteEvents __RPC_FAR * This, /* dispinterface _IExecuteEvents */ /* [in] */ DISPID dispIdMember, /* [helpstring][uuid] */ /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, EXTERN_C const IID DIID__IExecuteEvents; /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, /* [out] */ VARIANT __RPC_FAR *pVarResult, #if defined(__cplusplus) && !defined(CINTERFACE) /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* [out] */ UINT __RPC_FAR *puArgErr); MIDL_INTERFACE("551AC532-AB1C-11D2-BC0C- 00A0C90D2CA5") END_INTERFACE _IExecuteEvents : public IDispatch } _IExecuteEventsVtbl; { }; interface _IExecuteEvents { CONST_VTBL struct _IExecuteEventsVtbl __RPC_FAR *lpVtbl; };

HP TPC-H FULL DISCLOSURE REPORT 491 © 2005 Hewlett-Packard Company. All rights reserved. #ifdef COBJMACROS

#define _IExecuteEvents_QueryInterface(This,riid,ppvObject) virtual /* [helpstring][id][propget] */ HRESULT \ STDMETHODCALLTYPE get_StepStatus( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) /* [retval][out] */ InstanceStatus __RPC_FAR *pVal) = 0; #define _IExecuteEvents_AddRef(This) \ (This)->lpVtbl -> AddRef(This) virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Abort( void) = 0; #define _IExecuteEvents_Release(This) \ (This)->lpVtbl -> Release(This) virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteError( BSTR szMsg) = 0; #define _IExecuteEvents_GetTypeInfoCount(This,pctinfo) \ virtual /* [helpstring][id][propput] */ HRESULT (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) STDMETHODCALLTYPE put_OutputFile( /* [in] */ BSTR newVal) = 0; #define _IExecuteEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ virtual /* [helpstring][id][propput] */ HRESULT (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) STDMETHODCALLTYPE put_ErrorFile( /* [in] */ BSTR newVal) = 0; #define _IExecuteEvents_GetIDsOfNames(This,riid,rgszNames,cNames, }; lcid,rgDispId) \ (This)->lpVtbl -> #else /* C style interface */ GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) typedef struct IExecuteVtbl #define { _IExecuteEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pD BEGIN_INTERFACE ispParams,pVarResult,pExcepInfo,puArgErr) \ (This)->lpVtbl -> HRESULT ( STDMETHODCALLTYPE __RPC_FAR Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR *QueryInterface )( esult,pExcepInfo,puArgErr) IExecute __RPC_FAR * This, /* [in] */ REFIID riid, #endif /* COBJMACROS */ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR #endif /* C style interface */ *ppvObject); #endif /* ___IExecuteEvents_DISPINTERFACE_DEFINED__ */ ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( #ifndef __IExecute_INTERFACE_DEFINED__ IExecute __RPC_FAR * This); #define __IExecute_INTERFACE_DEFINED__ ULONG ( STDMETHODCALLTYPE __RPC_FAR /* interface IExecute */ *Release )( /* [unique][helpstring][dual][uuid][object] */ IExecute __RPC_FAR * This); EXTERN_C const IID IID_IExecute; #if defined(__cplusplus) && !defined(CINTERFACE) HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( MIDL_INTERFACE("551AC531-AB1C-11D2-BC0C- IExecute __RPC_FAR * This, 00A0C90D2CA5") /* [out] */ UINT __RPC_FAR *pctinfo); IExecute : public IDispatch { HRESULT ( STDMETHODCALLTYPE __RPC_FAR public: *GetTypeInfo )( virtual /* [helpstring][id] */ HRESULT IExecute __RPC_FAR * This, STDMETHODCALLTYPE DoExecute( /* [in] */ UINT iTInfo, /* [in] */ BSTR szCommand, /* [in] */ LCID lcid, /* [in] */ BSTR szExecutionDtls, /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR /* [in] */ ExecutionType ExecMethod, *ppTInfo); /* [in] */ BOOL bNoCount, /* [in] */ BOOL bNoExecute, HRESULT ( STDMETHODCALLTYPE __RPC_FAR /* [in] */ BOOL bParseOnly, *GetIDsOfNames )( /* [in] */ BOOL bQuotedIds, IExecute __RPC_FAR * This, /* [in] */ BOOL bAnsiNulls, /* [in] */ REFIID riid, /* [in] */ BOOL bShowQP, /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ BOOL bStatsTime, /* [in] */ UINT cNames, /* [in] */ BOOL bStatsIO, /* [in] */ LCID lcid, /* [in] */ long lRowCount, /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); /* [in] */ long lQueryTmout, /* [in] */ BSTR szConnection) = 0;

HP TPC-H FULL DISCLOSURE REPORT 492 © 2005 Hewlett-Packard Company. All rights reserved. #ifdef COBJMACROS /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( #define IExecute_QueryInterface(This,riid,ppvObject) \ IExecute __RPC_FAR * This, (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, #define IExecute_AddRef(This) \ /* [in] */ LCID lcid, (This)->lpVtbl -> AddRef(This) /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS __RPC_FAR #define IExecute_Release(This) \ *pDispParams, (This)->lpVtbl -> Release(This) /* [out] */ VARIANT __RPC_FAR *pVarResult, /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, #define IExecute_GetTypeInfoCount(This,pctinfo) \ /* [out] */ UINT __RPC_FAR *puArgErr); (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)

/* [helpstring][id] */ HRESULT ( #define IExecute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) STDMETHODCALLTYPE __RPC_FAR *DoExecute )( \ IExecute __RPC_FAR * This, (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) /* [in] */ BSTR szCommand, /* [in] */ BSTR szExecutionDtls, #define /* [in] */ ExecutionType ExecMethod, IExecute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgD /* [in] */ BOOL bNoCount, ispId) \ /* [in] */ BOOL bNoExecute, (This)->lpVtbl -> /* [in] */ BOOL bParseOnly, GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) /* [in] */ BOOL bQuotedIds, /* [in] */ BOOL bAnsiNulls, #define /* [in] */ BOOL bShowQP, IExecute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispPara /* [in] */ BOOL bStatsTime, ms,pVarResult,pExcepInfo,puArgErr) \ /* [in] */ BOOL bStatsIO, (This)->lpVtbl -> /* [in] */ long lRowCount, Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR /* [in] */ long lQueryTmout, esult,pExcepInfo,puArgErr) /* [in] */ BSTR szConnection);

/* [helpstring][id][propget] */ HRESULT ( #define STDMETHODCALLTYPE __RPC_FAR *get_StepStatus )( IExecute_DoExecute(This,szCommand,szExecutionDtls,ExecMe IExecute __RPC_FAR * This, thod,bNoCount,bNoExecute, /* [retval][out] */ InstanceStatus __RPC_FAR *pVal); bParseOnly,bQuotedIds,bAnsiNulls,bShowQP,bStats Time,bStatsIO,lRowCount,lQueryTmout,szConnection)\ /* [helpstring][id] */ HRESULT ( (This)->lpVtbl -> STDMETHODCALLTYPE __RPC_FAR *Abort )( DoExecute(This,szCommand,szExecutionDtls,ExecMethod,bNo IExecute __RPC_FAR * This); Count,bNoExecute,bParseOnly, bQuotedIds,bAnsiNulls,bShowQP,bStatsTime,bStatsI /* [helpstring][id] */ HRESULT ( O,lRowCount,lQueryTmout,szConnection) STDMETHODCALLTYPE __RPC_FAR *WriteError )( IExecute __RPC_FAR * This, #define IExecute_get_StepStatus(This,pVal) \ BSTR szMsg); (This)->lpVtbl -> get_StepStatus(This,pVal)

/* [helpstring][id][propput] */ HRESULT ( #define IExecute_Abort(This) \ STDMETHODCALLTYPE __RPC_FAR *put_OutputFile )( (This)->lpVtbl -> Abort(This) IExecute __RPC_FAR * This, /* [in] */ BSTR newVal); #define IExecute_WriteError(This,szMsg) \ (This)->lpVtbl -> WriteError(This,szMsg) /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_ErrorFile )( #define IExecute_put_OutputFile(This,newVal) \ IExecute __RPC_FAR * This, (This)->lpVtbl -> put_OutputFile(This,newVal) /* [in] */ BSTR newVal); #define IExecute_put_ErrorFile(This,newVal) \ END_INTERFACE (This)->lpVtbl -> put_ErrorFile(This,newVal) } IExecuteVtbl; #endif /* COBJMACROS */ interface IExecute { CONST_VTBL struct IExecuteVtbl __RPC_FAR *lpVtbl; #endif /* C style interface */ };

HP TPC-H FULL DISCLOSURE REPORT 493 © 2005 Hewlett-Packard Company. All rights reserved. /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE void __RPC_STUB IExecute_put_OutputFile_Stub( IExecute_DoExecute_Proxy( IRpcStubBuffer *This, IExecute __RPC_FAR * This, IRpcChannelBuffer *_pRpcChannelBuffer, /* [in] */ BSTR szCommand, PRPC_MESSAGE _pRpcMessage, /* [in] */ BSTR szExecutionDtls, DWORD *_pdwStubPhase); /* [in] */ ExecutionType ExecMethod, /* [in] */ BOOL bNoCount, /* [in] */ BOOL bNoExecute, /* [helpstring][id][propput] */ HRESULT /* [in] */ BOOL bParseOnly, STDMETHODCALLTYPE IExecute_put_ErrorFile_Proxy( /* [in] */ BOOL bQuotedIds, IExecute __RPC_FAR * This, /* [in] */ BOOL bAnsiNulls, /* [in] */ BSTR newVal); /* [in] */ BOOL bShowQP, /* [in] */ BOOL bStatsTime, /* [in] */ BOOL bStatsIO, void __RPC_STUB IExecute_put_ErrorFile_Stub( /* [in] */ long lRowCount, IRpcStubBuffer *This, /* [in] */ long lQueryTmout, IRpcChannelBuffer *_pRpcChannelBuffer, /* [in] */ BSTR szConnection); PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase);

void __RPC_STUB IExecute_DoExecute_Stub( IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, #endif /* __IExecute_INTERFACE_DEFINED__ */ PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); EXTERN_C const CLSID CLSID_Execute;

/* [helpstring][id][propget] */ HRESULT #ifdef __cplusplus STDMETHODCALLTYPE IExecute_get_StepStatus_Proxy( IExecute __RPC_FAR * This, class DECLSPEC_UUID("2EFC198E-AA8D-11D2-BC0C- /* [retval][out] */ InstanceStatus __RPC_FAR *pVal); 00A0C90D2CA5") Execute; #endif void __RPC_STUB IExecute_get_StepStatus_Stub( #endif /* __EXECUTEDLLLib_LIBRARY_DEFINED__ */ IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, /* Additional Prototypes for ALL interfaces */ PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); /* end of Additional Prototypes */

#ifdef __cplusplus /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE } IExecute_Abort_Proxy( #endif IExecute __RPC_FAR * This); #endif // FILE: Execute.cpp void __RPC_STUB IExecute_Abort_Stub( // // FILE: ExecuteDllCP.h IRpcStubBuffer *This, // Microsoft TPC-H Kit Ver. 1.00 IRpcChannelBuffer *_pRpcChannelBuffer, // Copyright Microsoft, 1999 PRPC_MESSAGE _pRpcMessage, // All Rights Reserved DWORD *_pdwStubPhase); // // /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE // PURPOSE: Connection point implementation IExecute_WriteError_Proxy( // Contact: Reshma Tharamal ([email protected]) IExecute __RPC_FAR * This, // BSTR szMsg); #ifndef _EXECUTEDLLCP_H_ #define _EXECUTEDLLCP_H_ void __RPC_STUB IExecute_WriteError_Stub( IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase);

/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IExecute_put_OutputFile_Proxy( IExecute __RPC_FAR * This, /* [in] */ BSTR newVal);

HP TPC-H FULL DISCLOSURE REPORT 494 © 2005 Hewlett-Packard Company. All rights reserved. template #endif// FILE: resource.h class CProxy_IExecuteEvents : public IConnectionPointImpl // Copyright Microsoft, 1999 { // All Rights Reserved //Warning this class may be recreated by the wizard. // public: // VOID Fire_Start(CY StartTime) // PURPOSE: Resource file { // Contact: Reshma Tharamal ([email protected]) T* pT = static_cast(this); // int nConnectionIndex; //{{NO_DEPENDENCIES}} CComVariant* pvars = new // Microsoft Developer Studio generated include file. CComVariant[1]; // Used by ExecuteDll.rc int nConnections = m_vec.GetSize(); // #define IDS_PROJNAME 100 for (nConnectionIndex = 0; #define IDR_EXECUTE 101 nConnectionIndex < nConnections; nConnectionIndex++) #define IDR_LOG 102 { #define IDR_EXECUTESHELL 103 pT->Lock(); CComPtr sp = #define SM_SYSTEM_ERROR 0x0201 m_vec.GetAt(nConnectionIndex); pT->Unlock(); // Next default values for new objects IDispatch* pDispatch = // reinterpret_cast(sp.p); #ifdef APSTUDIO_INVOKED if (pDispatch != NULL) #ifndef APSTUDIO_READONLY_SYMBOLS { #define _APS_NEXT_RESOURCE_VALUE 201 pvars[0] = StartTime; #define _APS_NEXT_COMMAND_VALUE 32768 DISPPARAMS disp = { pvars, #define _APS_NEXT_CONTROL_VALUE 201 NULL, 1, 0 }; #define _APS_NEXT_SYMED_VALUE 104 pDispatch->Invoke(0x1, #endif IID_NULL, LOCALE_USER_DEFAULT, #endif DISPATCH_METHOD, // FILE: SMExecute.h &disp, NULL, NULL, NULL); // Microsoft TPC-H Kit Ver. 1.00 } // Copyright Microsoft, 1999 } // All Rights Reserved delete[] pvars; // // } // PURPOSE: Common include file for Execute.cpp and VOID Fire_Complete(CY EndTime, LONG Elapsed) ExecuteDll.cpp { // Contact: Reshma Tharamal ([email protected]) T* pT = static_cast(this); // int nConnectionIndex; CComVariant* pvars = new #pragma once CComVariant[2]; int nConnections = m_vec.GetSize(); // ODBC-specific includes for (nConnectionIndex = 0; #define DBNTWIN32 nConnectionIndex < nConnections; nConnectionIndex++) #include { #include pT->Lock(); #include CComPtr sp = m_vec.GetAt(nConnectionIndex); #define CONNECTION_NAME_LEN 256 // connection pT->Unlock(); name length IDispatch* pDispatch = reinterpret_cast(sp.p); typedef struct _SM_Connection_Info if (pDispatch != NULL) { { char pvars[1] = EndTime; szConnectionName[CONNECTION_NAME_LEN]; pvars[0] = Elapsed; HDBC hdbc; DISPPARAMS disp = { pvars, NULL, 2, 0 }; BOOL bInUse; pDispatch->Invoke(0x2, } SM_Connection_Info; IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); } } delete[] pvars; } };

HP TPC-H FULL DISCLOSURE REPORT 495 © 2005 Hewlett-Packard Company. All rights reserved. // FILE: stdafx.cpp // Microsoft TPC-H Kit Ver. 1.00 // Copyright Microsoft, 1999 // All Rights Reserved // // // PURPOSE: source file that includes just the standard includes // Contact: Reshma Tharamal ([email protected]) // // stdafx.cpp : source file that includes just the standard includes // stdafx.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

#ifdef _ATL_STATIC_REGISTRY #include #include #endif

#include // FILE: stdafx.h // Microsoft TPC-H Kit Ver. 1.00 // Copyright Microsoft, 1999 // All Rights Reserved // // // PURPOSE: include file for standard system include files, // or project specific include files that are used frequently, // but are changed infrequently // Contact: Reshma Tharamal ([email protected]) //

#if !defined(AFX_STDAFX_H__551AC528_AB1C_11D2_BC0C_ 00A0C90D2CA5__INCLUDED_) #define AFX_STDAFX_H__551AC528_AB1C_11D2_BC0C_00A0C90 D2CA5__INCLUDED_

#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000

#define STRICT #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #define _ATL_APARTMENT_THREADED

#include //You may derive a class from CComModule and use it if you want to override //something, but do not change the name of _Module extern CComModule _Module; #include

//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__551AC528_AB1C_11D2_BC0C_ 00A0C90D2CA5__INCLUDED)

HP TPC-H FULL DISCLOSURE REPORT 496 © 2005 Hewlett-Packard Company. All rights reserved. // FILE: resource.h ///////////////////////////////////////////////////////////////////////////// // Microsoft TPC-H Kit Ver. 1.00 // DLL Entry Point // Copyright Microsoft, 1999 // All Rights Reserved extern "C" // BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD // dwReason, LPVOID /*lpReserved*/) // PURPOSE: Resource file { // Contact: Reshma Tharamal ([email protected]) if (dwReason == DLL_PROCESS_ATTACH) // { //{{NO_DEPENDENCIES}} _Module.Init(ObjectMap, hInstance, // Microsoft Developer Studio generated include file. &LIBID_SMTIMELib); // Used by SMTime.rc DisableThreadLibraryCalls(hInstance); // } #define IDS_PROJNAME 100 else if (dwReason == DLL_PROCESS_DETACH) #define IDR_SMTIMER 102 _Module.Term(); return TRUE; // ok // Next default values for new objects } // #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_READONLY_SYMBOLS // Used to determine whether the DLL can be unloaded by OLE #define _APS_NEXT_RESOURCE_VALUE 201 #define _APS_NEXT_COMMAND_VALUE 32768 STDAPI DllCanUnloadNow(void) #define _APS_NEXT_CONTROL_VALUE 201 { #define _APS_NEXT_SYMED_VALUE 103 return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; #endif } #endif // FILE: SMTime.cpp ///////////////////////////////////////////////////////////////////////////// // Microsoft TPC-H Kit Ver. 1.00 // Returns a class factory to create an object of the requested type // Copyright Microsoft, 1999 // All Rights Reserved STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, // LPVOID* ppv) // { // PURPOSE: Implementation of DLL Exports. return _Module.GetClassObject(rclsid, riid, ppv); // Contact: Reshma Tharamal ([email protected]) } // // SMTime.cpp : Implementation of DLL Exports. ///////////////////////////////////////////////////////////////////////////// // DllRegisterServer - Adds entries to the system registry

// Note: Proxy/Stub Information STDAPI DllRegisterServer(void) // To build a separate proxy/stub DLL, { // run nmake -f SMTimeps.mk in the project directory. // registers object, typelib and all interfaces in typelib return _Module.RegisterServer(TRUE); #include "stdafx.h" } #include "resource.h" #include ///////////////////////////////////////////////////////////////////////////// #include "SMTime.h" // DllUnregisterServer - Removes entries from the system registry #include "SMTime_i.c" #include "SMTimer.h" STDAPI DllUnregisterServer(void) { return _Module.UnregisterServer(TRUE); CComModule _Module; }

BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_SMTimer, CSMTimer) /* this ALWAYS GENERATED file contains the definitions for END_OBJECT_MAP() the interfaces */

/* File created by MIDL compiler version 5.01.0164 */ /* at Thu Sep 19 17:49:55 2002 */ /* Compiler settings for C:\charles\Stepmaster\COMMON\SMTime\SMTime.idl: Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext error checks: allocation ref bounds_check enum stub_data */ //@@MIDL_FILE_HEADING( )

HP TPC-H FULL DISCLOSURE REPORT 497 © 2005 Hewlett-Packard Company. All rights reserved. /* verify that the version is high enough to compile virtual /* [helpstring][id] */ HRESULT this file*/ STDMETHODCALLTYPE Start( void) = 0; #ifndef __REQUIRED_RPCNDR_H_VERSION__ #define __REQUIRED_RPCNDR_H_VERSION__ 440 virtual /* [helpstring][id] */ HRESULT #endif STDMETHODCALLTYPE Stop( CURRENCY __RPC_FAR *pElapsedTime) = 0; #include "rpc.h" #include "rpcndr.h" virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Running( #ifndef __RPCNDR_H_VERSION__ /* [retval][out] */ BOOL __RPC_FAR *pVal) = 0; #error this stub requires an updated version of #endif // __RPCNDR_H_VERSION__ };

#ifndef COM_NO_WINDOWS_H #else /* C style interface */ #include "windows.h" #include "ole2.h" typedef struct ISMTimerVtbl #endif /*COM_NO_WINDOWS_H*/ { BEGIN_INTERFACE #ifndef __SMTime_h__ #define __SMTime_h__ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( #ifdef __cplusplus ISMTimer __RPC_FAR * This, extern "C"{ /* [in] */ REFIID riid, #endif /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); /* Forward Declarations */ ULONG ( STDMETHODCALLTYPE __RPC_FAR #ifndef __ISMTimer_FWD_DEFINED__ *AddRef )( #define __ISMTimer_FWD_DEFINED__ ISMTimer __RPC_FAR * This); typedef interface ISMTimer ISMTimer; #endif /* __ISMTimer_FWD_DEFINED__ */ ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( ISMTimer __RPC_FAR * This); #ifndef __SMTimer_FWD_DEFINED__ #define __SMTimer_FWD_DEFINED__ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( #ifdef __cplusplus ISMTimer __RPC_FAR * This, typedef class SMTimer SMTimer; /* [out] */ UINT __RPC_FAR *pctinfo); #else typedef struct SMTimer SMTimer; HRESULT ( STDMETHODCALLTYPE __RPC_FAR #endif /* __cplusplus */ *GetTypeInfo )( ISMTimer __RPC_FAR * This, #endif /* __SMTimer_FWD_DEFINED__ */ /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR /* header files for imported files */ *ppTInfo); #include "oaidl.h" #include "ocidl.h" HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); ISMTimer __RPC_FAR * This, void __RPC_USER MIDL_user_free( void __RPC_FAR * ); /* [in] */ REFIID riid, /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, #ifndef __ISMTimer_INTERFACE_DEFINED__ /* [in] */ UINT cNames, #define __ISMTimer_INTERFACE_DEFINED__ /* [in] */ LCID lcid, /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); /* interface ISMTimer */ /* [unique][helpstring][dual][uuid][object] */ /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( EXTERN_C const IID IID_ISMTimer; ISMTimer __RPC_FAR * This, /* [in] */ DISPID dispIdMember, #if defined(__cplusplus) && !defined(CINTERFACE) /* [in] */ REFIID riid, /* [in] */ LCID lcid, MIDL_INTERFACE("1A6D0AE4-8528-453B-B8E3- /* [in] */ WORD wFlags, 8DAD1F0561B7") /* [out][in] */ DISPPARAMS __RPC_FAR ISMTimer : public IDispatch *pDispParams, { /* [out] */ VARIANT __RPC_FAR *pVarResult, public: /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* [out] */ UINT __RPC_FAR *puArgErr);

HP TPC-H FULL DISCLOSURE REPORT 498 © 2005 Hewlett-Packard Company. All rights reserved. /* [helpstring][id] */ HRESULT ( /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE STDMETHODCALLTYPE __RPC_FAR *Start )( ISMTimer_Start_Proxy( ISMTimer __RPC_FAR * This); ISMTimer __RPC_FAR * This);

/* [helpstring][id] */ HRESULT ( void __RPC_STUB ISMTimer_Start_Stub( STDMETHODCALLTYPE __RPC_FAR *Stop )( IRpcStubBuffer *This, ISMTimer __RPC_FAR * This, IRpcChannelBuffer *_pRpcChannelBuffer, CURRENCY __RPC_FAR *pElapsedTime); PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Running )( /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ISMTimer __RPC_FAR * This, ISMTimer_Stop_Proxy( /* [retval][out] */ BOOL __RPC_FAR *pVal); ISMTimer __RPC_FAR * This, CURRENCY __RPC_FAR *pElapsedTime); END_INTERFACE } ISMTimerVtbl; void __RPC_STUB ISMTimer_Stop_Stub( IRpcStubBuffer *This, interface ISMTimer IRpcChannelBuffer *_pRpcChannelBuffer, { PRPC_MESSAGE _pRpcMessage, CONST_VTBL struct ISMTimerVtbl __RPC_FAR *lpVtbl; DWORD *_pdwStubPhase); }; /* [helpstring][id][propget] */ HRESULT #ifdef COBJMACROS STDMETHODCALLTYPE ISMTimer_get_Running_Proxy( ISMTimer __RPC_FAR * This, #define ISMTimer_QueryInterface(This,riid,ppvObject) /* [retval][out] */ BOOL __RPC_FAR *pVal); \ (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) void __RPC_STUB ISMTimer_get_Running_Stub( IRpcStubBuffer *This, #define ISMTimer_AddRef(This) \ IRpcChannelBuffer *_pRpcChannelBuffer, (This)->lpVtbl -> AddRef(This) PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); #define ISMTimer_Release(This) \ (This)->lpVtbl -> Release(This) #endif /* __ISMTimer_INTERFACE_DEFINED__ */ #ifndef __SMTIMELib_LIBRARY_DEFINED__ #define ISMTimer_GetTypeInfoCount(This,pctinfo) \ #define __SMTIMELib_LIBRARY_DEFINED__ (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) /* library SMTIMELib */ #define ISMTimer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) /* [helpstring][version][uuid] */ \ (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) EXTERN_C const IID LIBID_SMTIMELib; #define ISMTimer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rg DispId) \ #ifndef __StepMasterTimeFunctions_MODULE_DEFINED__ (This)->lpVtbl -> #define __StepMasterTimeFunctions_MODULE_DEFINED__ GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)

#define /* module StepMasterTimeFunctions */ ISMTimer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispPar /* [dllname][version][helpstring] */ ams,pVarResult,pExcepInfo,puArgErr) \ (This)->lpVtbl -> /* [entry][helpstring] */ CURRENCY __stdcall Get64BitTime( Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR /* [in] */ LPSYSTEMTIME lpInitTime); esult,pExcepInfo,puArgErr) /* [entry][helpstring] */ void __stdcall JulianToTime( #define ISMTimer_Start(This) \ /* [in] */ CURRENCY julianTS, (This)->lpVtbl -> Start(This) /* [out][in] */ int __RPC_FAR *yr, /* [out][in] */ int __RPC_FAR *mm, #define ISMTimer_Stop(This,pElapsedTime) \ /* [out][in] */ int __RPC_FAR *dd, (This)->lpVtbl -> Stop(This,pElapsedTime) /* [out][in] */ int __RPC_FAR *hh, /* [out][in] */ int __RPC_FAR *mi, #define ISMTimer_get_Running(This,pVal) \ /* [out][in] */ int __RPC_FAR *ss, (This)->lpVtbl -> get_Running(This,pVal) /* [out][in] */ int __RPC_FAR *ms);

#endif /* COBJMACROS */

#endif /* C style interface */

HP TPC-H FULL DISCLOSURE REPORT 499 © 2005 Hewlett-Packard Company. All rights reserved. #endif /* __StepMasterTimeFunctions_MODULE_DEFINED__ // FILE: SMTime.cpp */ // Microsoft TPC-H Kit Ver. 1.00 // Copyright Microsoft, 1999 EXTERN_C const CLSID CLSID_SMTimer; // All Rights Reserved // #ifdef __cplusplus // // PURPOSE: Implementation of DLL Exports. class DECLSPEC_UUID("27BAB71B-89E1-4A78-8854- // Contact: Reshma Tharamal ([email protected]) FDFFBDC8037E") // SMTimer; // SMTime.cpp : Implementation of DLL Exports. #endif #endif /* __SMTIMELib_LIBRARY_DEFINED__ */ // Note: Proxy/Stub Information /* Additional Prototypes for ALL interfaces */ // To build a separate proxy/stub DLL, // run nmake -f SMTimeps.mk in the project directory. /* end of Additional Prototypes */ #include "stdafx.h" #ifdef __cplusplus #include "resource.h" } #include #endif #include "SMTime.h"

#endif #include "SMTime_i.c" // FILE: resource.h #include "SMTimer.h" // Microsoft TPC-H Kit Ver. 1.00 // Copyright Microsoft, 1999 // All Rights Reserved CComModule _Module; // // BEGIN_OBJECT_MAP(ObjectMap) // PURPOSE: Resource file OBJECT_ENTRY(CLSID_SMTimer, CSMTimer) // Contact: Reshma Tharamal ([email protected]) END_OBJECT_MAP() // //{{NO_DEPENDENCIES}} ///////////////////////////////////////////////////////////////////////////// // Microsoft Developer Studio generated include file. // DLL Entry Point // Used by SMTime.rc // extern "C" #define IDS_PROJNAME 100 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD #define IDR_SMTIMER 102 dwReason, LPVOID /*lpReserved*/) { // Next default values for new objects if (dwReason == DLL_PROCESS_ATTACH) // { #ifdef APSTUDIO_INVOKED _Module.Init(ObjectMap, hInstance, #ifndef APSTUDIO_READONLY_SYMBOLS &LIBID_SMTIMELib); #define _APS_NEXT_RESOURCE_VALUE 201 DisableThreadLibraryCalls(hInstance); #define _APS_NEXT_COMMAND_VALUE 32768 } #define _APS_NEXT_CONTROL_VALUE 201 else if (dwReason == DLL_PROCESS_DETACH) #define _APS_NEXT_SYMED_VALUE 103 _Module.Term(); #endif return TRUE; // ok #endif }

///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE

STDAPI DllCanUnloadNow(void) { return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; }

///////////////////////////////////////////////////////////////////////////// // Returns a class factory to create an object of the requested type

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); }

HP TPC-H FULL DISCLOSURE REPORT 500 © 2005 Hewlett-Packard Company. All rights reserved. ///////////////////////////////////////////////////////////////////////////// /* Forward Declarations */ // DllRegisterServer - Adds entries to the system registry #ifndef __ISMTimer_FWD_DEFINED__ STDAPI DllRegisterServer(void) #define __ISMTimer_FWD_DEFINED__ { typedef interface ISMTimer ISMTimer; // registers object, typelib and all interfaces in typelib #endif /* __ISMTimer_FWD_DEFINED__ */ return _Module.RegisterServer(TRUE); } #ifndef __SMTimer_FWD_DEFINED__ ///////////////////////////////////////////////////////////////////////////// #define __SMTimer_FWD_DEFINED__ // DllUnregisterServer - Removes entries from the system registry #ifdef __cplusplus typedef class SMTimer SMTimer; STDAPI DllUnregisterServer(void) #else { typedef struct SMTimer SMTimer; return _Module.UnregisterServer(TRUE); #endif /* __cplusplus */ } #endif /* __SMTimer_FWD_DEFINED__ */

/* this ALWAYS GENERATED file contains the definitions for the interfaces */ /* header files for imported files */ #include "oaidl.h" #include "ocidl.h" /* File created by MIDL compiler version 5.01.0164 */ /* at Thu Sep 19 17:49:55 2002 void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); */ void __RPC_USER MIDL_user_free( void __RPC_FAR * ); /* Compiler settings for C:\charles\Stepmaster\COMMON\SMTime\SMTime.idl: #ifndef __ISMTimer_INTERFACE_DEFINED__ Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext #define __ISMTimer_INTERFACE_DEFINED__ error checks: allocation ref bounds_check enum stub_data */ /* interface ISMTimer */ //@@MIDL_FILE_HEADING( ) /* [unique][helpstring][dual][uuid][object] */

/* verify that the version is high enough to compile EXTERN_C const IID IID_ISMTimer; this file*/ #ifndef __REQUIRED_RPCNDR_H_VERSION__ #if defined(__cplusplus) && !defined(CINTERFACE) #define __REQUIRED_RPCNDR_H_VERSION__ 440 #endif MIDL_INTERFACE("1A6D0AE4-8528-453B-B8E3- 8DAD1F0561B7") #include "rpc.h" ISMTimer : public IDispatch #include "rpcndr.h" { public: #ifndef __RPCNDR_H_VERSION__ virtual /* [helpstring][id] */ HRESULT #error this stub requires an updated version of STDMETHODCALLTYPE Start( void) = 0; #endif // __RPCNDR_H_VERSION__ virtual /* [helpstring][id] */ HRESULT #ifndef COM_NO_WINDOWS_H STDMETHODCALLTYPE Stop( #include "windows.h" CURRENCY __RPC_FAR *pElapsedTime) = 0; #include "ole2.h" #endif /*COM_NO_WINDOWS_H*/ virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Running( #ifndef __SMTime_h__ /* [retval][out] */ BOOL __RPC_FAR *pVal) = 0; #define __SMTime_h__ }; #ifdef __cplusplus #else /* C style interface */ extern "C"{ typedef struct ISMTimerVtbl #endif { BEGIN_INTERFACE

HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( ISMTimer __RPC_FAR * This, /* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR

HP TPC-H FULL DISCLOSURE REPORT 501 © 2005 Hewlett-Packard Company. All rights reserved. *ppvObject); #define ISMTimer_Release(This) \ ULONG ( STDMETHODCALLTYPE __RPC_FAR (This)->lpVtbl -> Release(This) *AddRef )( ISMTimer __RPC_FAR * This); #define ISMTimer_GetTypeInfoCount(This,pctinfo) \ ULONG ( STDMETHODCALLTYPE __RPC_FAR (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) *Release )( ISMTimer __RPC_FAR * This); #define ISMTimer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) HRESULT ( STDMETHODCALLTYPE __RPC_FAR \ *GetTypeInfoCount )( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ISMTimer __RPC_FAR * This, /* [out] */ UINT __RPC_FAR *pctinfo); #define HRESULT ( STDMETHODCALLTYPE __RPC_FAR ISMTimer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rg *GetTypeInfo )( DispId) \ ISMTimer __RPC_FAR * This, (This)->lpVtbl -> /* [in] */ UINT iTInfo, GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) /* [in] */ LCID lcid, /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR #define *ppTInfo); ISMTimer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispPar HRESULT ( STDMETHODCALLTYPE __RPC_FAR ams,pVarResult,pExcepInfo,puArgErr) \ *GetIDsOfNames )( (This)->lpVtbl -> ISMTimer __RPC_FAR * This, Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarR /* [in] */ REFIID riid, esult,pExcepInfo,puArgErr) /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, #define ISMTimer_Start(This) \ /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); (This)->lpVtbl -> Start(This) /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( #define ISMTimer_Stop(This,pElapsedTime) \ ISMTimer __RPC_FAR * This, (This)->lpVtbl -> Stop(This,pElapsedTime) /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, #define ISMTimer_get_Running(This,pVal) \ /* [in] */ LCID lcid, (This)->lpVtbl -> get_Running(This,pVal) /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS __RPC_FAR #endif /* COBJMACROS */ *pDispParams, /* [out] */ VARIANT __RPC_FAR *pVarResult, /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, #endif /* C style interface */ /* [out] */ UINT __RPC_FAR *puArgErr); END_INTERFACE } ISMTimerVtbl; interface ISMTimer /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE { ISMTimer_Start_Proxy( CONST_VTBL struct ISMTimerVtbl __RPC_FAR *lpVtbl; ISMTimer __RPC_FAR * This); }; /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Start )( void __RPC_STUB ISMTimer_Start_Stub( ISMTimer __RPC_FAR * This); IRpcStubBuffer *This, /* [helpstring][id] */ HRESULT ( IRpcChannelBuffer *_pRpcChannelBuffer, STDMETHODCALLTYPE __RPC_FAR *Stop )( PRPC_MESSAGE _pRpcMessage, ISMTimer __RPC_FAR * This, DWORD *_pdwStubPhase); CURRENCY __RPC_FAR *pElapsedTime); /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Running )( /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ISMTimer __RPC_FAR * This, ISMTimer_Stop_Proxy( /* [retval][out] */ BOOL __RPC_FAR *pVal); ISMTimer __RPC_FAR * This, CURRENCY __RPC_FAR *pElapsedTime); #ifdef COBJMACROS void __RPC_STUB ISMTimer_Stop_Stub( #define ISMTimer_QueryInterface(This,riid,ppvObject) IRpcStubBuffer *This, \ IRpcChannelBuffer *_pRpcChannelBuffer, (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); #define ISMTimer_AddRef(This) \ (This)->lpVtbl -> AddRef(This)

HP TPC-H FULL DISCLOSURE REPORT 502 © 2005 Hewlett-Packard Company. All rights reserved. /* [helpstring][id][propget] */ HRESULT // FILE: resource.h STDMETHODCALLTYPE ISMTimer_get_Running_Proxy( // // FILE: SMTimer.cpp ISMTimer __RPC_FAR * This, // Microsoft TPC-H Kit Ver. 1.00 /* [retval][out] */ BOOL __RPC_FAR *pVal); // Copyright Microsoft, 1999 // All Rights Reserved void __RPC_STUB ISMTimer_get_Running_Stub( // IRpcStubBuffer *This, // IRpcChannelBuffer *_pRpcChannelBuffer, // PURPOSE: Implementation of CSMTimer PRPC_MESSAGE _pRpcMessage, // Contact: Reshma Tharamal ([email protected]) DWORD *_pdwStubPhase); // // SMTimer.cpp : Implementation of CSMTimer #endif /* __ISMTimer_INTERFACE_DEFINED__ */ #include "stdafx.h" #include "SMTime.h" #ifndef __SMTIMELib_LIBRARY_DEFINED__ #include "SMTimer.h" #define __SMTIMELib_LIBRARY_DEFINED__ ///////////////////////////////////////////////////////////////////////////// /* library SMTIMELib */ // CSMTimer /* [helpstring][version][uuid] */ ////////////////////////////////////////////////////////////////////// EXTERN_C const IID LIBID_SMTIMELib; // Construction/Destruction ////////////////////////////////////////////////////////////////////// #ifndef __StepMasterTimeFunctions_MODULE_DEFINED__ #define __StepMasterTimeFunctions_MODULE_DEFINED__ CSMTimer::~CSMTimer() {

/* module StepMasterTimeFunctions */ } /* [dllname][version][helpstring] */ STDMETHODIMP CSMTimer::Start() /* [entry][helpstring] */ CURRENCY __stdcall Get64BitTime( { /* [in] */ LPSYSTEMTIME lpInitTime); // Starts the timer assert(!m_bInProcess); /* [entry][helpstring] */ void __stdcall JulianToTime( m_bInProcess = TRUE; /* [in] */ CURRENCY julianTS, /* [out][in] */ int __RPC_FAR *yr, m_lStartTime = MyTickCount(); /* [out][in] */ int __RPC_FAR *mm, /* [out][in] */ int __RPC_FAR *dd, return S_OK; /* [out][in] */ int __RPC_FAR *hh, } /* [out][in] */ int __RPC_FAR *mi, /* [out][in] */ int __RPC_FAR *ss, STDMETHODIMP CSMTimer::Stop(CURRENCY /* [out][in] */ int __RPC_FAR *ms); *pElapsedTime) { #endif /* __StepMasterTimeFunctions_MODULE_DEFINED__ TC_ TIME lEndTime = MyTickCount(); */ // Stops the timer and returns the elapsed time EXTERN_C const CLSID CLSID_SMTimer; assert(m_bInProcess); m_bInProcess = FALSE; #ifdef __cplusplus pElapsedTime->int64 = lEndTime - m_lStartTime; class DECLSPEC_UUID("27BAB71B-89E1-4A78-8854- FDFFBDC8037E") return S_OK; SMTimer; } #endif #endif /* __SMTIMELib_LIBRARY_DEFINED__ */

/* Additional Prototypes for ALL interfaces */

/* end of Additional Prototypes */

#ifdef __cplusplus } #endif

HP TPC-H FULL DISCLOSURE REPORT 503 © 2005 Hewlett-Packard Company. All rights reserved. TC_ TIME CSMTimer::MyTickCount(void) // JulianDay computes the number of days since Jan 1, 1900. { // This function is valid for dates from 1-Jan-1900 to 1-Jan-2100. TC_ TIME currentTC; // 1-Jan-1900 = 0 LARGE_INTEGER l; int JulianDay( int yr, int mm, int dd ) __int64 count; { // MonthArray contains cumulative days for months in //The purpose of this function is to prevent the 49 day a non leap-year wrapping effect of the int MonthArray[12] = { 0, 31, 59, 90, 120, 151, 181, //system API GetTickCount(). This function 212, 243, 273, 304, 334}; essentially provides a monotonically int j1, j2; //increasing timer value which is milliseconds from class instantiation. // compute day of year (j1) j1 = MonthArray[mm-1] + dd - 1; if ( m_bCountUnavailable ) // adjust day of year if this is a leap year and it is after { February count = (__int64)GetTickCount(); if ((yr % 4)==0 && (yr != 1900) && (mm > 2)) currentTC = (TC_TIME)(count- j1++; m_baseTC); // compute number of days from 1/1/1900 to } beginning of present year else j2 = (yr-1900)*365 + (yr-1901)/4; { return j1+j2; QueryPerformanceCounter(&l); count = (__int64)l.HighPart << 32 | } (__int64)l.LowPart; currentTC = (TC_TIME)(((count- // Breaks up the Julian Time into it's sub-components m_baseTC) * 1000) / m_Timerfreq); void __stdcall SMTime_JulianToTime( CURRENCY CurJulian, } int* yr, int* mm, int* dd, int *hh, return currentTC; int *mi, int *ss, int *ms ) } { int julianDay, msLeft; STDMETHODIMP CSMTimer::get_Running(BOOL *pVal) JULIAN_TIME julianTS = { CurJulian.int64; *pVal = m_bInProcess; *ms = julianTS % 1000; return S_OK; } julianTS /= 1000;

CURRENCY __stdcall Get64BitTime(LPSYSTEMTIME julianDay = (int)(julianTS / ( 60 * 60 * 24 )); lpInitTime) { JulianToCalendar(julianDay, yr, mm, dd ); __int64 ms_day, ms_hour, ms_minute, ms_seconds, ms_milliseconds, ms_total; msLeft = (int)(julianTS - (julianDay * (__int64)( 60 * int day; 60 * 24 ))); SYSTEMTIME tim; CURRENCY tmReturn; *hh = msLeft / (60 * 60); if ( lpInitTime ) msLeft = msLeft - *hh * 3600; memcpy(&tim, lpInitTime, *mi = msLeft / (60); sizeof(SYSTEMTIME)); *ss = msLeft % 60; else } GetLocalTime(&tim); // JulianToCalendar converts a day index (from the JulianDay day = JulianDay((int)tim.wYear, (int)tim.wMonth, function) to (int)tim.wDay); // its corresponding calendar value (mm/dd/yr). The valid range ms_day = (__int64)day * (__int64)(24 * for days 1000 * 60 * 60); // is { 0 .. 73049 } for dates from 1-Jan-1900 to 1-Jan-2100. ms_hour = void JulianToCalendar( int day, int* yr, int* mm, int* dd ) (__int64)tim.wHour * (__int64)(1000 * 3600); { ms_minute = (__int64)tim.wMinute * int y, m, d; (1000 * 60); // month array contains days of months for months in ms_seconds = a non leap-year (__int64)(tim.wSecond * 1000); int month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, ms_milliseconds = (__int64)tim.wMilliseconds; 31, 30, 31 }; ms_total = ms_day + ms_hour + ms_minute + ms_seconds + ms_milliseconds; tmReturn.int64 = ms_total; return tmReturn; }

HP TPC-H FULL DISCLOSURE REPORT 504 © 2005 Hewlett-Packard Company. All rights reserved. // compute year from days ///////////////////////////////////////////////////////////////////////////// if (day < 365) // CSMTimer y = 1900; class ATL_NO_VTABLE CSMTimer : else public y = 1901 + ((day-365)/1461)*4 + (4*((day- CComObjectRootEx, 365)%1461)+3)/1461; public CComCoClass, if ((y % 4)==0 && (y != 1900)) public IDispatchImpl else { month[1] = 28; public: CSMTimer() d = day - JulianDay( y, 1, 1 ) + 1; { m = 1; LARGE_INTEGER l;

while (d > month[m-1]) if ( !QueryPerformanceFrequency(&l) ) { { d = d - month[m-1]; m_baseTC = m++; (__int64)GetTickCount(); } m_bCountUnavailable = TRUE; *yr = y; } *mm = m; else *dd = d; { }// FILE: SMTimer.h m_bCountUnavailable = // Microsoft TPC-H Kit Ver. 1.00 FALSE; // Copyright Microsoft, 1999 // All Rights Reserved m_Timerfreq = // (__int64)l.HighPart << 32 | (__int64)l.LowPart; // // PURPOSE: Declaration of the CSMTimer QueryPerformanceCounter(&l); // Contact: Reshma Tharamal ([email protected]) m_baseTC = // (__int64)l.HighPart << 32 | (__int64)l.LowPart; // SMTimer.h : Declaration of the CSMTimer } m_bInProcess = FALSE; #ifndef __SMTIMER_H_ } #define __SMTIMER_H_ DECLARE_REGISTRY_RESOURCEID(IDR_SMTIMER) #include "resource.h" // main symbols DECLARE_PROTECT_FINAL_CONSTRUCT() #include "assert.h" BEGIN_COM_MAP(CSMTimer) #define MAX_JULIAN_TIME 0x7FFFFFFFFFFFFFFF COM_INTERFACE_ENTRY(ISMTimer) #define JULIAN_TIME __int64 COM_INTERFACE_ENTRY(IDispatch) #define TC_ TIME DWORD // COM_INTERFACE_ENTRY2(IDispatch, ISMTimer) #ifdef SMTIMER END_COM_MAP() #define DLL_LINK __declspec( dllexport ) #else // ISMTimer #define DLL_LINK __declspec( dllimport ) public: #endif STDMETHOD(get_Running)(/*[out, retval]*/ BOOL *pVal); #ifdef __cplusplus STDMETHOD(Stop)(CURRENCY *pElapsedTime); extern "C" STDMETHOD(Start)(); { virtual ~CSMTimer(); #endif //DLL_LINK CURRENCY __stdcall private: SMTime_Get64BitTime(LPSYSTEMTIME lpInitTime); __int64 m_baseTC; int JulianDay( int yr, int mm, int __int64 m_Timerfreq; dd ); BOOL m_bCountUnavailable; void JulianToCalendar( int day, int* yr, int* TC_TIME m_lStartTime; mm, int* dd ); BOOL m_bInProcess; #ifdef __cplusplus } TC_ TIME MyTickCount(void); #endif };

HP TPC-H FULL DISCLOSURE REPORT 505 © 2005 Hewlett-Packard Company. All rights reserved. #endif //__SMTIMER_H_ // stdafx.cpp : source file that includes just the standard includes // stdafx.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

#ifdef _ATL_STATIC_REGISTRY #include #include #endif

#include // FILE: stdafx.h // Microsoft TPC-H Kit Ver. 1.00 // Copyright Microsoft, 1999 // All Rights Reserved // // // PURPOSE: include file for standard system include files, // or project specific include files that are used frequently, // but are changed infrequently // Contact: Reshma Tharamal ([email protected]) //

#if !defined(AFX_STDAFX_H__4CDF88F4_EE9C_4F29_8212_61 557F251BDD__INCLUDED_) #define AFX_STDAFX_H__4CDF88F4_EE9C_4F29_8212_61557F251 BDD__INCLUDED_

#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000

#define STRICT #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #define _ATL_APARTMENT_THREADED

#include //You may derive a class from CComModule and use it if you want to override //something, but do not change the name of _Module extern CComModule _Module; #include

//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__4CDF88F4_EE9C_4F29_8212_61 557F251BDD__INCLUDED)

HP TPC-H FULL DISCLOSURE REPORT 506 © 2005 Hewlett-Packard Company. All rights reserved. Workspace_parameters

workspace_id = 12 parameter_id = 200 parameter_type = 0 parameter_name FLATFILE_DIR_14 parameter_value G:\mnt\ntfs\14\flat14

workspace_id = 12 parameter_id = 213 parameter_type = 0 parameter_name FLATFILE_DIR_22 parameter_value G:\mnt\ntfs\22\flat22

workspace_id = 12 parameter_id = 214 parameter_type = 0 parameter_name FLATFILE_DIR_23 parameter_value G:\mnt\ntfs\23\flat23

workspace_id = 12 parameter_id = 215 parameter_type = 0 parameter_name FLATFILE_DIR_24 parameter_value G:\mnt\ntfs\24\flat24

workspace_id = 12 parameter_id = 216 parameter_type = 0 parameter_name FLATFILE_DIR_20 parameter_value G:\mnt\ntfs\20\flat20

workspace_id = 12 parameter_id = 204 parameter_type = 0 parameter_name BCP_ROWS parameter_value 10000

workspace_id = 12 parameter_id = 195 parameter_type = 0 parameter_name FLATFILE_DIR_9 parameter_value G:\mnt\ntfs\9\flat9

workspace_id = 12 parameter_id = 196 parameter_type = 0 parameter_name FLATFILE_DIR_10 parameter_value G:\mnt\ntfs\10\flat10

workspace_id = 12 parameter_id = 197 parameter_type = 0 parameter_name FLATFILE_DIR_11 parameter_value G:\mnt\ntfs\11\flat11

workspace_id = 12 parameter_id = 168 parameter_type = 0 parameter_name FLATFILE_DIR_1 parameter_value G:\mnt\ntfs\1\flat1

workspace_id = 12 parameter_id = 199 parameter_type = 0 parameter_name FLATFILE_DIR_13 parameter_value G:\mnt\ntfs\13\flat13

workspace_id = 12 parameter_id = 146 parameter_type = 0 parameter_name DBNAME parameter_value tpch3000g

workspace_id = 12 parameter_id = 201 parameter_type = 0 parameter_name FLATFILE_DIR_15 parameter_value G:\mnt\ntfs\15\flat15

HP TPC-H FULL DISCLOSURE REPORT 507 © 2005 Hewlett-Packard Company. All rights reserved. workspace_id = 12 parameter_id = 202 parameter_type = 0 parameter_name FLATFILE_DIR_16 parameter_value G:\mnt\ntfs\16\flat16

workspace_id = 12 parameter_id = 191 parameter_type = 0 parameter_name FLATFILE_DIR_5 parameter_value G:\mnt\ntfs\5\flat5

workspace_id = 12 parameter_id = 192 parameter_type = 0 parameter_name FLATFILE_DIR_6 parameter_value G:\mnt\ntfs\6\flat6

workspace_id = 12 parameter_id = 193 parameter_type = 0 parameter_name FLATFILE_DIR_7 parameter_value G:\mnt\ntfs\7\flat7

workspace_id = 12 parameter_id = 194 parameter_type = 0 parameter_name FLATFILE_DIR_8 parameter_value G:\mnt\ntfs\8\flat8

workspace_id = 12 parameter_id = 190 parameter_type = 0 parameter_name TOTAL_LOAD_FILES_PER_TABLE parameter_value 96

workspace_id = 12 parameter_id = 189 parameter_type = 0 parameter_name FILES_PER_UPDATE_SET parameter_value 16

workspace_id = 12 parameter_id = 185 parameter_type = 0 parameter_name SERVER parameter_value SQLORCAH

workspace_id = 12 parameter_id = 198 parameter_type = 0 parameter_name FLATFILE_DIR_12 parameter_value G:\mnt\ntfs\12\flat12

workspace_id = 12 parameter_id = 158 parameter_type = 0 parameter_name TOOLS_DIR parameter_value %KIT_DIR%\tools

workspace_id = 12 parameter_id = 210 parameter_type = 0 parameter_name FLATFILE_DIR_18 parameter_value G:\mnt\ntfs\18\flat18

workspace_id = 12 parameter_id = 211 parameter_type = 0 parameter_name FLATFILE_DIR_19 parameter_value G:\mnt\ntfs\19\flat19

workspace_id = 12 parameter_id = 167 parameter_type = 0 parameter_name FLATFILE_DIR_2 parameter_value G:\mnt\ntfs\2\flat2

workspace_id = 12 parameter_id = 166 parameter_type = 0 parameter_name FLATFILE_DIR_3 parameter_value G:\mnt\ntfs\3\flat3

workspace_id = 12 parameter_id = 165 parameter_type = 0 parameter_name FLATFILE_DIR_4 HP TPC-H FULL DISCLOSURE REPORT 508 © 2005 Hewlett-Packard Company. All rights reserved. parameter_value G:\mnt\ntfs\4\flat4

workspace_id = 12 parameter_id = 164 parameter_type = 3 parameter_name RUN_ID parameter_value 2

workspace_id = 12 parameter_id = 163 parameter_type = 0 parameter_name KIT_DIR parameter_value g:\kit3000g

workspace_id = 12 parameter_id = 162 parameter_type = 0 parameter_name RUN_DIR parameter_value %KIT_DIR%\run

workspace_id = 12 parameter_id = 161 parameter_type = 0 parameter_name QUERY_DIR parameter_value %RUN_DIR%\Queries

workspace_id = 12 parameter_id = 212 parameter_type = 0 parameter_name FLATFILE_DIR_21 parameter_value G:\mnt\ntfs\21\flat21

workspace_id = 12 parameter_id = 159 parameter_type = 0 parameter_name MAX_STREAMS parameter_value 8

workspace_id = 12 parameter_id = 145 parameter_type = 0 parameter_name TRACEFLAGS parameter_value -c -E -x -T834 -T2301

workspace_id = 12 parameter_id = 157 parameter_type = 3 parameter_name DEFAULT_DIR parameter_value %KIT_DIR%\OUTPUT

workspace_id = 12 parameter_id = 155 parameter_type = 0 parameter_name TABLE_LOAD_PARALLELISM parameter_value 32

workspace_id = 12 parameter_id = 154 parameter_type = 0 parameter_name INDEX_CREATE_PARALLELISM parameter_value 4

workspace_id = 12 parameter_id = 153 parameter_type = 0 parameter_name VALIDATION_DIR parameter_value %SETUP_DIR%\Validation

workspace_id = 12 parameter_id = 150 parameter_type = 0 parameter_name UPDATE_SETS parameter_value 16

workspace_id = 12 parameter_id = 149 parameter_type = 0 parameter_name SCALEFACTOR parameter_value 3000

workspace_id = 12 parameter_id = 148 parameter_type = 3 parameter_name OUTPUT_DIR parameter_value g:\kit3000g\OUTPUT\2

HP TPC-H FULL DISCLOSURE REPORT 509 © 2005 Hewlett-Packard Company. All rights reserved. workspace_id = 12 parameter_id = 147 parameter_type = 0 parameter_name SETUP_DIR parameter_value %KIT_DIR%\Setup

workspace_id = 12 parameter_id = 209 parameter_type = 0 parameter_name FLATFILE_DIR_17 parameter_value G:\mnt\ntfs\17\flat17

workspace_id = 12 parameter_id = 160 parameter_type = 0 parameter_name TEMPLATE_DIR parameter_value %RUN_DIR%\templates Connection_dtls works connectio connection_name connection_string_nam connecti pace_id n_name_id e on_type

12 70 Static_Connection_to_Master MASTERDBCONNECTION 1

12 69 Static_Connection_to_DB DBCONNECTION 1

12 68 Dynamic_Connection_to_Master MASTERDBCONNECTION 2

12 67 Dynamic_Connection_to_DB DBCONNECTION 2

Workspace_connections

workspace_id 12 connection_i 19 connection_nam MASTERDBCONNECTION connection_valu DRIVER=SQL Server;SERVER=%SERVER%;UID=sa;PWD=sql*perf1; description no_count_displa 0 no_execute 0 parse_query_only 0 ANSI_quoted_identifiers 0 ANSI_nulls -1 show_query_pla 0 show_stats_time 0 show_stats_io 0 parse_odbc_msg_prefixes -1 row_count 0 tsql_batch_separator GO query_time_out 0 server_language (Default) character_translatio -1 regional_settings 0

workspace_id 12 connection_i 18 connection_nam DBCONNECTION connection_valu DRIVER=SQL description no_count_displa 0 no_execute 0 parse_query_only 0 ANSI_quoted_identifiers 0

HP TPC-H FULL DISCLOSURE REPORT 510 © 2005 Hewlett-Packard Company. All rights reserved. ANSI_nulls -1 show_query_pla 0 show_stats_time 0 show_stats_io 0 parse_odbc_msg_prefixes -1 row_count 0 tsql_batch_separator GO query_time_out 0 server_language (Default) character_translatio -1 regional_settings 0

Att_steps workspace_id 12

step_label = SqlServer Startup step_id = 1087 global_flag = -1 sequence_no = 1 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 0 execution_mechanism = 2 continuation_criteria 0 failure_details = step_file_name version_no 2.0 start_directory = C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\ parent_version_no = 0.0 step_text = start sqlservr %TRACEFLAGS%

step_label = SqlServer Shutdown step_id = 1088 global_flag = -1 sequence_no = 2 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 0 execution_mechanism = 2 continuation_criteria 0 failure_details = step_file_name version_no 5.0 start_directory = parent_version_no = 0.0 step_text = osql -Usa -Psql*perf1 -t10 -Q"shutdown"

step_label = Configure SqlServer step_id = 1093 global_flag = 0 sequence_no = 2 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 73.0 start_directory = parent_version_no = 0.0 step_text =

step_label = Create and Load remaining Tables step_id = 1094 global_flag = 0 sequence_no = 5 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details =

HP TPC-H FULL DISCLOSURE REPORT 511 © 2005 Hewlett-Packard Company. All rights reserved. step_file_name version_no 99.2 start_directory = parent_version_no = 0.0 step_text =

step_label = Create Indexes and Statistics step_id = 1095 global_flag = 0 sequence_no = 6 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 47.0 start_directory = parent_version_no = 0.0 step_text =

step_label = Prep Database, End of Load step_id = 1096 global_flag = 0 sequence_no = 7 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 75.2 start_directory = parent_version_no = 0.0 step_text =

step_label = Generate Queries via QGen step_id = 1099 global_flag = 0 sequence_no = 8 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 15.0 start_directory = parent_version_no = 0.0 step_text =

step_label = Begin of Timed Load step_id = 1107 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 73.0 step_text = -- Create temporary table for timing in the Master Database -- -- This is just temporary until we build the TPCH_AUX_TABLE later --

-- -- Delete any existing tpch_temp_timer table -- if exists ( select name from sysobjects where name = 'tpch_temp_timer' ) drop table tpch_temp_timer

-- -- Create the temporary table -- create table tpch_temp_timer ( load_start_time datetime ) HP TPC-H FULL DISCLOSURE REPORT 512 © 2005 Hewlett-Packard Company. All rights reserved. -- -- Store the starting time in the temporary table -- insert into tpch_temp_timer values (getdate())

step_label = Create remaining Tables step_id = 1111 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1094 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 13.0 start_directory = parent_version_no = 99.2 step_text =

step_label = Parallel Partitioned Table Load step_id = 1112 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1094 enabled_flag -1 iterator_name = TABLE degree_parallelis 32 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 35.0 start_directory = parent_version_no = 99.2 step_text =

step_label = Parallel Load Simple Tables step_id = 1113 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1094 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 15.0 start_directory = parent_version_no = 99.2 step_text =

step_label = Create Clustered Index LI step_id = 1115 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1456 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateClusteredIndexes1.sql version_no 18.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 9.0 step_text =

step_label = Create NC Indexes in Parallel step_id = 1116 global_flag = 0 sequence_no = 4 step_level = 1 parent_step_id = 1095 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 7.5 start_directory = parent_version_no = 47.0 step_text =

HP TPC-H FULL DISCLOSURE REPORT 513 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Reset DB_Option "Trunc" step_id = 1119 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1096 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 11.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 75.2 step_text = sp_dboption %DBNAME%, 'trunc. ',false

step_label = Install Refresh Function Stored Procedures step_id = 1120 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1096 enabled_flag -1 iterator_name = degree_parallelis %MAX_STREAMS% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 9.0 start_directory = parent_version_no = 75.2 step_text =

step_label = Backup TPC-H Database step_id = 1121 global_flag = 0 sequence_no = 4 step_level = 1 parent_step_id = 1096 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 5.1 start_directory = parent_version_no = 75.2 step_text =

step_label = End of timed Load step_id = 1122 global_flag = 0 sequence_no = 5 step_level = 1 parent_step_id = 1096 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 9.0 start_directory = Static_Connection_to_DB parent_version_no = 75.2 step_text = UPDATE TPCH_AUX_TABLE SET LoadFinish = getdate() GO

SELECT LoadStart AS 'Load Start TimeStamp', LoadFinish AS 'Load Finish TimeStamp', QgenSeed AS 'Generated QGen Seed' FROM TPCH_AUX_TABLE GO

step_label = Generate QGEN Seed step_id = 1124 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1099 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 5.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 15.0

HP TPC-H FULL DISCLOSURE REPORT 514 © 2005 Hewlett-Packard Company. All rights reserved. step_text = DECLARE @Finish datetime DECLARE @seed0 integer

-- -- Get ending time of database load -- SELECT @Finish=LoadFinish FROM TPCH_AUX_TABLE

-- -- Calculate seed per clause 2.1.3.3 -- SET @seed0 = CONVERT(integer,100000000*DATEPART(MM,@Finish)+1000000*DATEPART(DD,@Finish)+1000 0*DATEPART(HH,@Finish)+100*DATEPART(MI,@Finish)+DATEPART(SS,@Finish))

-- -- Update the benchmark auxillary table -- UPDATE TPCH_AUX_TABLE SET QgenSeed=@seed0

SELECT * from TPCH_AUX_TABLE

step_label = Generate Power Queries step_id = 1132 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1099 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 3.2 start_directory = parent_version_no = 15.0 step_text =

step_label = Generate Stream Queries step_id = 1133 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1099 enabled_flag -1 iterator_name = STREAM_NUM degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 3.2 start_directory = parent_version_no = 15.0 step_text =

step_label = Create Auxilliary Table step_id = 1145 global_flag = 0 sequence_no = 8 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\Utility\CreateBuildTimer.sql version_no 12.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 73.0 step_text =

step_label = Create Base Tables step_id = 1146 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1111 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateTables.sql version_no 9.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 13.0 step_text = HP TPC-H FULL DISCLOSURE REPORT 515 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Load Nation Table step_id = 1155 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1113 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 15.0 step_text = bulk insert %DBNAME%..NATION from '%FLATFILE_DIR_1%\nation.tbl' with (FieldTerminator = '|', RowTerminator ='|\n',tablock)

step_label = Load Region Table step_id = 1156 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1113 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 15.0 step_text = bulk insert %DBNAME%..REGION from '%FLATFILE_DIR_1%\region.tbl' with (FieldTerminator = '|', RowTerminator ='|\n',tablock)

step_label = CreateIndexStream1 step_id = 1157 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1116 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateIndexesStream1.sql version_no 9.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 7.5 step_text =

step_label = CreateIndexStream2 step_id = 1158 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1116 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateIndexesStream2.sql version_no 7.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 7.5 step_text =

step_label = CreateIndexStream3 step_id = 1159 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1116 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateIndexesStream3.sql version_no 6.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 7.5 step_text =

step_label = Execute the backup step_id = 1165 global_flag = 0 HP TPC-H FULL DISCLOSURE REPORT 516 © 2005 Hewlett-Packard Company. All rights reserved. sequence_no = 1 step_level = 2 parent_step_id = 1121 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\BackupDatabase.sql version_no 6.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 5.1 step_text =

step_label = Install RF1 Stored Procedure(s) step_id = 1166 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1120 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\StoredProcs\CreateRF1Proc.sql version_no 16.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 9.0 step_text =

step_label = Install RF2 Stored Procedure(s) step_id = 1167 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1120 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\StoredProcs\CreateRF2Proc.sql version_no 13.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 9.0 step_text =

step_label = Generate Power Query Directory step_id = 1168 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1132 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = %RUN_DIR% parent_version_no = 3.2 step_text = if not exist %QUERY_DIR%\Power mkdir %QUERY_DIR%\Power

step_label = Generate QGen Command File step_id = 1169 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1132 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 5.0 start_directory = %TEMPLATE_DIR% parent_version_no = 3.2 step_text = :: :: First use OSQL to grab the QgenSeed value from TPCH_AUX_TABLE :: osql -Usa -Psql*perf1 -n -d%DBNAME% -w 255 -i%SETUP_DIR%\Generate\GenQGENcmd.sql > %SETUP_DIR%\Generate\QgenCmd.cmd

step_label = Parallel Power Query Generation step_id = 1170 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1132 enabled_flag -1 iterator_name = degree_parallelis %MAX_STREAMS%

HP TPC-H FULL DISCLOSURE REPORT 517 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.2 start_directory = parent_version_no = 3.2 step_text =

step_label = Set Seed Value for Stream step_id = 1171 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1133 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 3.2 step_text = -- -- Increment QGen Seed in TPCH_AUX_TABLE -- UPDATE TPCH_AUX_TABLE SET QgenSeed = QgenSeed + %STREAM_NUM%

step_label = Create Query Stream Directories step_id = 1172 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1133 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = %QUERY_DIR% parent_version_no = 3.2 step_text = if not exist %QUERY_DIR%\STREAM%STREAM_NUM% mkdir %QUERY_DIR%\STREAM%STREAM_NUM%

step_label = Generate QGen Stream Command File step_id = 1173 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1133 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 5.0 start_directory = %TEMPLATE_DIR% parent_version_no = 3.2 step_text = :: :: First use OSQL to grab the QgenSeed value from TPCH_AUX_TABLE :: osql -Usa -Psql*perf1 -n -d%DBNAME% -w 255 - i%SETUP_DIR%\Generate\GenQgenStreamCmd.sql > %SETUP_DIR%\Generate\QgenStreamCmd.cmd

step_label = Parallel Stream Query Generation step_id = 1174 global_flag = 0 sequence_no = 4 step_level = 2 parent_step_id = 1133 enabled_flag -1 iterator_name = degree_parallelis %MAX_STREAMS% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.1 start_directory = parent_version_no = 3.2 step_text =

HP TPC-H FULL DISCLOSURE REPORT 518 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Re-set QGen Seed Value step_id = 1175 global_flag = 0 sequence_no = 5 step_level = 2 parent_step_id = 1133 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 3.2 step_text = -- -- Resets the QGen seed kept in the temporary table -- UPDATE TPCH_AUX_TABLE SET QgenSeed = QgenSeed - %STREAM_NUM%

step_label = Power - Execute Generated QGen Command File step_id = 1199 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1170 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\Generate\QgenCmd.cmd version_no 2.0 start_directory = %TEMPLATE_DIR% parent_version_no = 0.2 step_text =

step_label = Throughput - Execute Generated QGen Command File step_id = 1200 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1174 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\Generate\QgenStreamCmd.cmd version_no 1.0 start_directory = %TEMPLATE_DIR% parent_version_no = 0.1 step_text =

step_label = Set Correlation step_id = 1343 global_flag = 0 sequence_no = 6 step_level = 1 parent_step_id = 1095 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name version_no 3.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 47.0 step_text = alter database %DBNAME% set date_correlation_optimization ON

step_label = Create Statistics step_id = 1358 global_flag = 0 sequence_no = 5 step_level = 1 parent_step_id = 1095 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name version_no 3.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 47.0 step_text = sp_createstats

step_label = Load Partitioned Tables from FlatFile_Dir_1 step_id = 1363 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1112 enabled_flag -1

HP TPC-H FULL DISCLOSURE REPORT 519 © 2005 Hewlett-Packard Company. All rights reserved. iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_1%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_2 step_id = 1364 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_2%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_3 step_id = 1365 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_3%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_4 step_id = 1366 global_flag = 0 sequence_no = 4 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_4%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_5 step_id = 1367 global_flag = 0 sequence_no = 5 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_5%\%TABLE%.tbl.%PARALLEL_PROCESS%' HP TPC-H FULL DISCLOSURE REPORT 520 © 2005 Hewlett-Packard Company. All rights reserved. with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_6 step_id = 1368 global_flag = 0 sequence_no = 6 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_6%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_7 step_id = 1369 global_flag = 0 sequence_no = 7 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_7%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_8 step_id = 1370 global_flag = 0 sequence_no = 8 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_8%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_9 step_id = 1371 global_flag = 0 sequence_no = 9 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_9%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_10 step_id = 1372 global_flag = 0 sequence_no = 10 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4

HP TPC-H FULL DISCLOSURE REPORT 521 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_10%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_11 step_id = 1373 global_flag = 0 sequence_no = 11 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_11%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_12 step_id = 1374 global_flag = 0 sequence_no = 12 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_12%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_13 step_id = 1375 global_flag = 0 sequence_no = 13 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_13%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_14 step_id = 1376 global_flag = 0 sequence_no = 14 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 22.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_14%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

HP TPC-H FULL DISCLOSURE REPORT 522 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Load Partitioned Tables from FlatFile_Dir_15 step_id = 1377 global_flag = 0 sequence_no = 15 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 21.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_15%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_16 step_id = 1378 global_flag = 0 sequence_no = 16 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 22.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_16%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Set sp_configure Options step_id = 1439 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\Utility\conf_tpch.sql version_no 26.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 73.0 step_text =

step_label = Create FK Constraints step_id = 1441 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1095 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\createFK.sql version_no 4.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 47.0 step_text =

step_label = Primary Key Small Tables step_id = 1443 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1095 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\PK_Small_Tables.sql version_no 14.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 47.0 step_text =

step_label = Primary Key Large Tables step_id = 1444 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1095 enabled_flag -1 HP TPC-H FULL DISCLOSURE REPORT 523 © 2005 Hewlett-Packard Company. All rights reserved. iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\PK_Large_Tables.sql version_no 12.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 47.0 step_text =

step_label = Wait for SQL to shutdown step_id = 1445 global_flag = 0 sequence_no = 5 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 16.0 start_directory = parent_version_no = 73.0 step_text = g:\kit3000g\tools\utility\sleep 600

step_label = Wait for SQL to startup step_id = 1446 global_flag = 0 sequence_no = 7 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 18.0 start_directory = parent_version_no = 73.0 step_text = g:\kit3000g\tools\utility\sleep 300

step_label = Start SQL step_id = 1447 global_flag = 0 sequence_no = 6 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 10.0 start_directory = C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn parent_version_no = 73.0 step_text = start sqlservr %TRACEFLAGS%

step_label = Shutdown SQL step_id = 1448 global_flag = 0 sequence_no = 4 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 1 failure_details = step_file_name version_no 17.0 start_directory = parent_version_no = 73.0 step_text = sqlcmd -SSQLORCAH -Usa -Psql*perf1 -t10 -Q"shutdown"

step_label = Set Database Options step_id = 1449 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1093 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 25.0 HP TPC-H FULL DISCLOSURE REPORT 524 © 2005 Hewlett-Packard Company. All rights reserved. start_directory = Static_Connection_to_Master parent_version_no = 73.0 step_text = alter database %DBNAME% set PAGE_VERIFY NONE GO sp_dboption %DBNAME%, 'trunc. log on chkpt.',true GO sp_dboption '%DBNAME%','auto create statistics','OFF' GO sp_dboption '%DBNAME%','auto update statistics','OFF' GO

step_label = Verify TPC-H Load step_id = 1450 global_flag = 0 sequence_no = 6 step_level = 1 parent_step_id = 1096 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\Utility\VerifyTpchLoad.sql version_no 1.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 75.2 step_text =

step_label = Create Database step_id = 1451 global_flag = 0 sequence_no = 1 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 13.0 start_directory = parent_version_no = 0.0 step_text =

step_label = Create TPC-H Database step_id = 1452 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1451 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateDataBase.sql version_no 5.0 start_directory = Static_Connection_to_Master parent_version_no = 13.0 step_text =

step_label = Lineitem Table step_id = 1456 global_flag = 0 sequence_no = 3 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 9.0 start_directory = parent_version_no = 0.0 step_text =

step_label = Create Lineitem Table on Load_FG step_id = 1457 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1456 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details =

HP TPC-H FULL DISCLOSURE REPORT 525 © 2005 Hewlett-Packard Company. All rights reserved. step_file_name %SETUP_DIR%\%DBNAME%\CreateTableLI.sql version_no 9.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 9.0 step_text =

step_label = Load LineItem step_id = 1458 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1456 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 4.0 start_directory = parent_version_no = 9.0 step_text =

step_label = Files LINEITEM step_id = 1459 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1458 enabled_flag -1 iterator_name = degree_parallelis %TABLE_LOAD_PARALLELISM% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 4.1 start_directory = parent_version_no = 4.0 step_text =

step_label = Load Lineitem 1 step_id = 1460 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\1\flat1\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 11 step_id = 1461 global_flag = 0 sequence_no = 11 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\11\flat11\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 12 step_id = 1462 global_flag = 0 sequence_no = 12 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 HP TPC-H FULL DISCLOSURE REPORT 526 © 2005 Hewlett-Packard Company. All rights reserved. step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\12\flat12\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 13 step_id = 1463 global_flag = 0 sequence_no = 13 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 3.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\13\flat13\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 14 step_id = 1464 global_flag = 0 sequence_no = 14 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\14\flat14\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 15 step_id = 1465 global_flag = 0 sequence_no = 15 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\15\flat15\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 16 step_id = 1466 global_flag = 0 sequence_no = 16 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 3.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\16\flat16\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 2 step_id = 1467 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1459 enabled_flag -1

HP TPC-H FULL DISCLOSURE REPORT 527 © 2005 Hewlett-Packard Company. All rights reserved. iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\2\flat2\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 3 step_id = 1468 global_flag = 0 sequence_no = 3 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\3\flat3\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 4 step_id = 1469 global_flag = 0 sequence_no = 4 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\4\flat4\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 5 step_id = 1470 global_flag = 0 sequence_no = 5 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\5\flat5\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 6 step_id = 1471 global_flag = 0 sequence_no = 6 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\6\flat6\LINEITEM.tbl.%SET%' HP TPC-H FULL DISCLOSURE REPORT 528 © 2005 Hewlett-Packard Company. All rights reserved. with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 7 step_id = 1472 global_flag = 0 sequence_no = 7 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\7\flat7\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 8 step_id = 1473 global_flag = 0 sequence_no = 8 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\8\flat8\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 9 step_id = 1474 global_flag = 0 sequence_no = 9 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\9\flat9\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 10 step_id = 1475 global_flag = 0 sequence_no = 10 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 2.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\10\flat10\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Orders Table step_id = 1476 global_flag = 0 sequence_no = 4 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1

HP TPC-H FULL DISCLOSURE REPORT 529 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 7.0 start_directory = parent_version_no = 0.0 step_text =

step_label = Create Orders Table on Load_FG step_id = 1477 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1476 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateTableORDERS.sql version_no 2.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 7.0 step_text =

step_label = Load Orders step_id = 1478 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1476 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.1 start_directory = parent_version_no = 7.0 step_text =

step_label = Files ORDERS step_id = 1479 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1478 enabled_flag -1 iterator_name = degree_parallelis %TABLE_LOAD_PARALLELISM% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.2 start_directory = parent_version_no = 1.1 step_text =

step_label = Load Orders 1 step_id = 1480 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\1\flat1\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 2 step_id = 1481 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 HP TPC-H FULL DISCLOSURE REPORT 530 © 2005 Hewlett-Packard Company. All rights reserved. step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\2\flat2\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 3 step_id = 1482 global_flag = 0 sequence_no = 3 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\3\flat3\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 4 step_id = 1483 global_flag = 0 sequence_no = 4 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\4\flat4\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 5 step_id = 1484 global_flag = 0 sequence_no = 5 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\5\flat5\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 6 step_id = 1485 global_flag = 0 sequence_no = 6 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\6\flat6\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 7 step_id = 1486 global_flag = 0 sequence_no = 7 step_level = 3 parent_step_id = 1479 enabled_flag -1

HP TPC-H FULL DISCLOSURE REPORT 531 © 2005 Hewlett-Packard Company. All rights reserved. iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\7\flat7\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 8 step_id = 1487 global_flag = 0 sequence_no = 8 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\8\flat8\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 9 step_id = 1488 global_flag = 0 sequence_no = 9 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\9\flat9\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 10 step_id = 1489 global_flag = 0 sequence_no = 10 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\10\flat10\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 11 step_id = 1490 global_flag = 0 sequence_no = 11 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\11\flat11\ORDERS.tbl.%SET%' HP TPC-H FULL DISCLOSURE REPORT 532 © 2005 Hewlett-Packard Company. All rights reserved. with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 12 step_id = 1491 global_flag = 0 sequence_no = 12 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\12\flat12\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 13 step_id = 1492 global_flag = 0 sequence_no = 13 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\13\flat13\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 14 step_id = 1493 global_flag = 0 sequence_no = 14 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\14\flat14\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 15 step_id = 1494 global_flag = 0 sequence_no = 15 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\15\flat15\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 16 step_id = 1495 global_flag = 0 sequence_no = 16 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4

HP TPC-H FULL DISCLOSURE REPORT 533 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\16\flat16\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Create Clustered Index Order step_id = 1496 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1476 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\CreateClusteredIndexes2.sql version_no 3.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 7.0 step_text =

step_label = Remove Load_FG step_id = 1497 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1096 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\%DBNAME%\Remove_Stage_FG.sql version_no 2.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 75.2 step_text =

step_label = Load Lineitem 17 step_id = 1498 global_flag = 0 sequence_no = 17 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\17\flat17\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 18 step_id = 1499 global_flag = 0 sequence_no = 18 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\18\flat18\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 19 step_id = 1500 global_flag = 0

HP TPC-H FULL DISCLOSURE REPORT 534 © 2005 Hewlett-Packard Company. All rights reserved. sequence_no = 19 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\19\flat19\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 20 step_id = 1501 global_flag = 0 sequence_no = 20 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\20\flat20\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 21 step_id = 1502 global_flag = 0 sequence_no = 21 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 3.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\21\flat21\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 22 step_id = 1503 global_flag = 0 sequence_no = 22 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\22\flat22\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 23 step_id = 1504 global_flag = 0 sequence_no = 23 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\23\flat23\LINEITEM.tbl.%SET%'

HP TPC-H FULL DISCLOSURE REPORT 535 © 2005 Hewlett-Packard Company. All rights reserved. with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Lineitem 24 step_id = 1505 global_flag = 0 sequence_no = 24 step_level = 3 parent_step_id = 1459 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 4.1 step_text = bulk insert %DBNAME%..LINEITEM from 'G:\mnt\ntfs\24\flat24\LINEITEM.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 17 step_id = 1506 global_flag = 0 sequence_no = 17 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\17\flat17\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 18 step_id = 1507 global_flag = 0 sequence_no = 18 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\18\flat18\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 19 step_id = 1508 global_flag = 0 sequence_no = 19 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\19\flat19\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 20 step_id = 1509 global_flag = 0 sequence_no = 20 step_level = 3 parent_step_id = 1479 enabled_flag -1

HP TPC-H FULL DISCLOSURE REPORT 536 © 2005 Hewlett-Packard Company. All rights reserved. iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\20\flat20\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 21 step_id = 1510 global_flag = 0 sequence_no = 21 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\21\flat21\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 22 step_id = 1511 global_flag = 0 sequence_no = 22 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\22\flat22\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 23 step_id = 1512 global_flag = 0 sequence_no = 23 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\23\flat23\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

step_label = Load Orders 24 step_id = 1513 global_flag = 0 sequence_no = 24 step_level = 3 parent_step_id = 1479 enabled_flag -1 iterator_name = SET degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 1.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 1.2 step_text = bulk insert %DBNAME%..ORDERS from 'G:\mnt\ntfs\24\flat24\ORDERS.tbl.%SET%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=10000)

HP TPC-H FULL DISCLOSURE REPORT 537 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Load Partitioned Tables from FlatFile_Dir_17 step_id = 1522 global_flag = 0 sequence_no = 17 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_17%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_18 step_id = 1523 global_flag = 0 sequence_no = 18 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_18%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_19 step_id = 1524 global_flag = 0 sequence_no = 19 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_19%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_20 step_id = 1525 global_flag = 0 sequence_no = 20 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_20%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_21 step_id = 1526 global_flag = 0 sequence_no = 21 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0

HP TPC-H FULL DISCLOSURE REPORT 538 © 2005 Hewlett-Packard Company. All rights reserved. start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_21%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_22 step_id = 1527 global_flag = 0 sequence_no = 22 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_22%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_23 step_id = 1528 global_flag = 0 sequence_no = 23 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_23%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

step_label = Load Partitioned Tables from FlatFile_Dir_24 step_id = 1529 global_flag = 0 sequence_no = 24 step_level = 2 parent_step_id = 1112 enabled_flag -1 iterator_name = PARALLEL_PROCESS degree_parallelis 4 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 23.0 start_directory = Dynamic_Connection_to_Master parent_version_no = 35.0 step_text = bulk insert %DBNAME%..%TABLE% from '%FLATFILE_DIR_24%\%TABLE%.tbl.%PARALLEL_PROCESS%' with (FieldTerminator = '|', RowTerminator ='|\n',tablock,ROWS_PER_BATCH=%BCP_ROWS%)

Iterator_values workspac step_id version type iterator_value sequence e_id _no _no

12 1507 1.0 1 69 0

12 1493 1.0 1 53 0

12 1493 1.0 3 1 0

12 1494 1.0 1 57 0

12 1494 1.0 3 1 0

12 1494 1.0 2 60 0

HP TPC-H FULL DISCLOSURE REPORT 539 © 2005 Hewlett-Packard Company. All rights reserved. 12 1495 1.0 2 64 0

12 1495 1.0 1 61 0

12 1495 1.0 3 1 0

12 1506 1.0 3 1 0

12 1506 1.0 2 68 0

12 1506 1.0 1 65 0

12 1512 1.0 3 1 0

12 1507 1.0 2 72 0

12 1492 1.0 3 1 0

12 1508 1.0 2 76 0

12 1508 1.0 1 73 0

12 1508 1.0 3 1 0

12 1509 1.0 1 77 0

12 1509 1.0 3 1 0

12 1509 1.0 2 80 0

12 1510 1.0 2 84 0

12 1510 1.0 1 81 0

12 1510 1.0 3 1 0

12 1511 1.0 1 85 0

12 1511 1.0 2 88 0

12 1200 1.0 3 1 0

12 1507 1.0 3 1 0 12 1488 1.0 2 36 0

12 1483 1.0 2 16 0

12 1484 1.0 1 17 0

12 1484 1.0 2 20 0

12 1484 1.0 3 1 0

12 1485 1.0 2 24 0

12 1485 1.0 3 1 0

12 1485 1.0 1 21 0

12 1486 1.0 1 25 0

12 1486 1.0 2 28 0

12 1486 1.0 3 1 0

12 1487 1.0 1 29 0

12 1487 1.0 2 32 0

12 1493 1.0 2 56 0

12 1488 1.0 1 33 0

12 1492 1.0 1 49 0

12 1488 1.0 3 1 0

12 1489 1.0 1 37 0

HP TPC-H FULL DISCLOSURE REPORT 540 © 2005 Hewlett-Packard Company. All rights reserved. 12 1489 1.0 2 40 0

12 1489 1.0 3 1 0

12 1490 1.0 3 1 0

12 1490 1.0 1 41 0

12 1490 1.0 2 44 0

12 1491 1.0 3 1 0

12 1491 1.0 2 48 0

12 1491 1.0 1 45 0

12 1492 1.0 2 52 0

12 1512 1.0 2 92 0

12 1487 1.0 3 1 0

12 1462 2.0 1 45 0

12 1473 2.0 1 29 0 12 1473 2.0 2 32 0

12 1474 2.0 1 33 0

12 1474 2.0 2 36 0

12 1474 2.0 3 1 0

12 1475 2.0 1 37 0

12 1475 2.0 2 40 0

12 1475 2.0 3 1 0

12 1461 2.0 1 41 0

12 1461 2.0 2 44 0

12 1461 2.0 3 1 0

12 1511 1.0 3 1 0

12 1462 2.0 3 1 0

12 1472 2.0 2 28 0

12 1133 3.2 1 1 0

12 1133 3.2 2 %MAX_STREAMS% 0

12 1133 3.2 3 1 0

12 1199 2.0 1 1 0

12 1199 2.0 2 22 0

12 1199 2.0 3 1 0

12 1112 35.0 4 PARTSUPP 0

12 1112 35.0 4 CUSTOMER 2

12 1112 35.0 4 SUPPLIER 3

12 1112 35.0 4 PART 1

12 1200 1.0 2 22 0

12 1200 1.0 1 1 0

12 1462 2.0 2 48 0

12 1468 2.0 2 12 0

HP TPC-H FULL DISCLOSURE REPORT 541 © 2005 Hewlett-Packard Company. All rights reserved. 12 1512 1.0 1 89 0

12 1513 1.0 1 93 0

12 1513 1.0 3 1 0

12 1513 1.0 2 96 0 12 1529 23.0 3 1 0

12 1529 23.0 1 93 0

12 1529 23.0 2 96 0

12 1460 2.0 3 1 0

12 1460 2.0 2 4 0

12 1460 2.0 1 1 0

12 1467 2.0 1 5 0

12 1467 2.0 2 8 0

12 1473 2.0 3 1 0

12 1468 2.0 3 1 0

12 1472 2.0 1 25 0

12 1468 2.0 1 9 0

12 1469 2.0 3 1 0

12 1469 2.0 1 13 0

12 1469 2.0 2 16 0

12 1470 2.0 3 1 0

12 1470 2.0 2 20 0

12 1470 2.0 1 17 0

12 1471 2.0 3 1 0

12 1471 2.0 2 24 0

12 1471 2.0 1 21 0

12 1472 2.0 3 1 0

12 1482 1.0 3 1 0

12 1467 2.0 3 1 0

12 1367 21.0 3 1 0

12 1528 23.0 3 1 0

12 1528 23.0 2 92 0

12 1528 23.0 1 89 0

12 1364 23.0 3 1 0

12 1364 23.0 1 5 0

12 1364 23.0 2 8 0 12 1365 21.0 2 12 0

12 1365 21.0 1 9 0

12 1365 21.0 3 1 0

12 1366 21.0 1 13 0

12 1366 21.0 3 1 0

HP TPC-H FULL DISCLOSURE REPORT 542 © 2005 Hewlett-Packard Company. All rights reserved. 12 1483 1.0 3 1 0

12 1367 21.0 1 17 0

12 1527 23.0 3 1 0

12 1367 21.0 2 20 0

12 1368 21.0 1 21 0

12 1368 21.0 3 1 0

12 1368 21.0 2 24 0

12 1369 21.0 3 1 0

12 1369 21.0 1 25 0

12 1369 21.0 2 28 0

12 1370 21.0 1 29 0

12 1370 21.0 2 32 0

12 1370 21.0 3 1 0

12 1371 21.0 2 36 0

12 1371 21.0 1 33 0

12 1366 21.0 2 16 0

12 1523 23.0 2 72 0

12 1375 21.0 3 1 0

12 1375 21.0 2 52 0

12 1376 22.0 3 1 0

12 1376 22.0 2 56 0

12 1376 22.0 1 53 0

12 1377 21.0 1 57 0

12 1377 21.0 3 1 0

12 1377 21.0 2 60 0

12 1378 22.0 2 64 0 12 1378 22.0 1 61 0

12 1378 22.0 3 1 0

12 1522 23.0 2 68 0

12 1527 23.0 1 85 0

12 1522 23.0 1 65 0

12 1527 23.0 2 88 0

12 1523 23.0 3 1 0

12 1523 23.0 1 69 0

12 1524 23.0 1 73 0

12 1524 23.0 3 1 0

12 1524 23.0 2 76 0

12 1525 23.0 1 77 0

12 1525 23.0 2 80 0

12 1525 23.0 3 1 0

HP TPC-H FULL DISCLOSURE REPORT 543 © 2005 Hewlett-Packard Company. All rights reserved. 12 1526 23.0 2 84 0

12 1526 23.0 3 1 0

12 1526 23.0 1 81 0

12 1372 21.0 2 40 0

12 1522 23.0 3 1 0

12 1504 1.0 3 1 0

12 1371 21.0 3 1 0

12 1500 1.0 2 76 0

12 1500 1.0 3 1 0

12 1501 1.0 2 80 0

12 1501 1.0 3 1 0

12 1501 1.0 1 77 0

12 1502 3.0 2 84 0

12 1502 3.0 3 1 0

12 1502 3.0 1 81 0

12 1503 1.0 1 85 0

12 1503 1.0 2 88 0 12 1503 1.0 3 1 0

12 1499 1.0 3 1 0

12 1504 1.0 2 92 0

12 1499 1.0 2 72 0

12 1505 1.0 2 96 0

12 1505 1.0 1 93 0

12 1505 1.0 3 1 0

12 1480 1.0 3 1 0

12 1480 1.0 1 1 0

12 1480 1.0 2 4 0

12 1481 1.0 3 1 0

12 1481 1.0 2 8 0

12 1481 1.0 1 5 0

12 1482 1.0 2 12 0

12 1482 1.0 1 9 0

12 1375 21.0 1 49 0

12 1504 1.0 1 89 0

12 1464 2.0 3 1 0

12 1483 1.0 1 13 0

12 1372 21.0 3 1 0

12 1373 21.0 2 44 0

12 1373 21.0 3 1 0

12 1373 21.0 1 41 0

HP TPC-H FULL DISCLOSURE REPORT 544 © 2005 Hewlett-Packard Company. All rights reserved. 12 1374 21.0 1 45 0

12 1374 21.0 2 48 0

12 1374 21.0 3 1 0

12 1363 23.0 2 4 0

12 1363 23.0 3 1 0

12 1363 23.0 1 1 0

12 1463 3.0 1 49 0

12 1500 1.0 1 73 0 12 1463 3.0 2 52 0

12 1372 21.0 1 37 0

12 1464 2.0 1 53 0

12 1464 2.0 2 56 0

12 1465 2.0 3 1 0

12 1465 2.0 1 57 0

12 1465 2.0 2 60 0

12 1466 3.0 1 61 0

12 1466 3.0 2 64 0

12 1466 3.0 3 1 0

12 1498 1.0 1 65 0

12 1498 1.0 2 68 0

12 1498 1.0 3 1 0

12 1499 1.0 1 69 0

12 1463 3.0 3 1 0 13 Runs - Real Deal 0 Workspace_parameters

workspace_id = 13 parameter_id = 180 parameter_type = 0 parameter_name TOOLS_DIR parameter_value %KIT_DIR%\Tools

workspace_id = 13 parameter_id = 170 parameter_type = 3 parameter_name OUTPUT_DIR parameter_value G:\kit\output\60

workspace_id = 13 parameter_id = 171 parameter_type = 0 parameter_name QUERY_DIR parameter_value %RUN_DIR%\Queries

workspace_id = 13 parameter_id = 172 parameter_type = 0 parameter_name DBNAME parameter_value tpch1000g

workspace_id = 13 parameter_id = 173 parameter_type = 0 parameter_name DELETE_PARALLELISM parameter_value 48

HP TPC-H FULL DISCLOSURE REPORT 545 © 2005 Hewlett-Packard Company. All rights reserved. workspace_id = 13 parameter_id = 174 parameter_type = 0 parameter_name INSERT_PARALLELISM parameter_value 48

workspace_id = 13 parameter_id = 175 parameter_type = 0 parameter_name DELETE_EXECUTIONS parameter_value 144

workspace_id = 13 parameter_id = 176 parameter_type = 0 parameter_name INSERT_EXECUTIONS parameter_value 144

workspace_id = 13 parameter_id = 169 parameter_type = 0 parameter_name RUN_DIR parameter_value %KIT_DIR%\Run

workspace_id = 13 parameter_id = 178 parameter_type = 3 parameter_name DEFAULT_DIR parameter_value %KIT_DIR%\output

workspace_id = 13 parameter_id = 208 parameter_type = 0 parameter_name UPDATE_SETS parameter_value 16

workspace_id = 13 parameter_id = 181 parameter_type = 0 parameter_name BATCH_SIZE parameter_value 40

workspace_id = 13 parameter_id = 182 parameter_type = 0 parameter_name KIT_DIR parameter_value G:\kit

workspace_id = 13 parameter_id = 183 parameter_type = 3 parameter_name RUN_ID parameter_value 60

workspace_id = 13 parameter_id = 184 parameter_type = 0 parameter_name TRACEFLAGS parameter_value -c -x -E -T697

workspace_id = 13 parameter_id = 186 parameter_type = 0 parameter_name SETUP_DIR parameter_value %KIT_DIR%\Setup

workspace_id = 13 parameter_id = 206 parameter_type = 0 parameter_name RF_FLATFILE_DIR parameter_value G:\mnt\ntfs\17\rf1000g

workspace_id = 13 parameter_id = 207 parameter_type = 0 parameter_name FILES_PER_UPDATE_SET parameter_value 16

workspace_id = 13 parameter_id = 177 parameter_type = 0 parameter_name MAX_STREAMS parameter_value 7

HP TPC-H FULL DISCLOSURE REPORT 546 © 2005 Hewlett-Packard Company. All rights reserved. Connection_dtls works connectio connection_name connection_string_nam connecti pace_id n_name_id e on_type

13 84 Power_Dynamic_DB_Connection DBCONNECTION 2

13 87 Dynamic_Connection_to_Master MASTERCONNECTION 2

13 83 Throughput_Static_Stream_10_Connection DBCONNECTION 1

13 82 Throughput_Static_Stream_9_Connection DBCONNECTION 1

13 81 Throughput_Static_Stream_8_Connection DBCONNECTION 1

13 80 Throughput_Static_Stream_7_Connection DBCONNECTION 1

13 79 Throughput_Static_Stream_6_Connection DBCONNECTION 1

13 78 Throughput_Static_Stream_5_Connection DBCONNECTION 1

13 77 Throughput_Static_Stream_4_Connection DBCONNECTION 1

13 76 Throughput_Static_Stream_3_Connection DBCONNECTION 1

13 75 Throughput_Static_Stream_2_Connection DBCONNECTION 1

13 74 Throughput_Static_Stream_1_Connection DBCONNECTION 1

13 73 Throughput_RF_Connection DBCONNECTION 2

13 72 Dynamic_Connection_to_DB DBCONNECTION 2

13 71 Power_Static_DB_Connection DBCONNECTION 1

Workspace_connections

workspace_id 13 connection_i 21 connection_nam MASTERCONNECTION connection_valu DRIVER=SQL Server;SERVER=(local);UID=sa;PWD=ssdl; description no_count_displa 0 no_execute 0 parse_query_only 0 ANSI_quoted_identifiers 0 ANSI_nulls -1 show_query_pla 0 show_stats_time 0 show_stats_io 0 parse_odbc_msg_prefixes -1 row_count 0 tsql_batch_separator GO query_time_out 0 server_language (Default) character_translatio -1 regional_settings 0

workspace_id 13 connection_i 20 connection_nam DBCONNECTION connection_valu DRIVER=SQL Server;SERVER=(local);UID=sa;PWD=ssdl;DATABASE=%DBNAME%; description HP TPC-H FULL DISCLOSURE REPORT 547 © 2005 Hewlett-Packard Company. All rights reserved. no_count_displa 0 no_execute 0 parse_query_only 0 ANSI_quoted_identifiers 0 ANSI_nulls -1 show_query_pla 0 show_stats_time 0 show_stats_io 0 parse_odbc_msg_prefixes -1 row_count 0 tsql_batch_separator GO query_time_out 0 server_language (Default) character_translatio -1 regional_settings 0

Att_steps workspace_id 13

step_label = Clear any Outstanding Semaphores step_id = 1201 global_flag = 0 sequence_no = 1 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 76.0 start_directory = %TOOLS_DIR% parent_version_no = 0.0 step_text = :: :: This step must always be run to insure that a semaphore.exe was not left open by a :: previous run :: :: If there are no open semaphore.exe's then the 'KILL' will do nothing. :: %TOOLS_DIR%\Uti lity\KILL.EXE SEMAPHORE.EXE

step_label = Execute Power Run step_id = 1202 global_flag = 0 sequence_no = 2 step_level = 0 parent_step_id = 0 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 123.1 start_directory = parent_version_no = 0.0 step_text =

step_label = Execute Throughput Run step_id = 1203 global_flag = 0 sequence_no = 3 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 2 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 45.0 start_directory = parent_version_no = 0.0 step_text =

HP TPC-H FULL DISCLOSURE REPORT 548 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Power - Sequential Query Execution step_id = 1205 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1202 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 27.1 start_directory = parent_version_no = 123.1 step_text =

step_label = Power - Increment Update Set step_id = 1207 global_flag = 0 sequence_no = 4 step_level = 1 parent_step_id = 1202 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 48.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 123.1 step_text = UPDATE TPCH_AUX_TABLE SET updateset=updateset+1

step_label = Sequential Refresh Stream Execution step_id = 1208 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1203 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.3 start_directory = parent_version_no = 45.0 step_text =

step_label = Parallel Stream Execution step_id = 1209 global_flag = 0 sequence_no = 2 step_level = 1 parent_step_id = 1203 enabled_flag -1 iterator_name = degree_parallelis %MAX_STREAMS% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 2.0 start_directory = parent_version_no = 45.0 step_text = step_label = Power - Execute Query 14 step_id = 1211 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %QUERY_DIR%\Power\14.sql version_no 15.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 02 step_id = 1212 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %QUERY_DIR%\Power\2.sql version_no 16.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1

HP TPC-H FULL DISCLOSURE REPORT 549 © 2005 Hewlett-Packard Company. All rights reserved. step_text =

step_label = Power - Execute Query 09 step_id = 1213 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %QUERY_DIR%\Power\9.sql version_no 14.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 20 step_id = 1214 global_flag = 0 sequence_no = 4 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %QUERY_DIR%\Power\20.sql version_no 13.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 06 step_id = 1215 global_flag = 0 sequence_no = 5 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\6.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 17 step_id = 1216 global_flag = 0 sequence_no = 6 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\17.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 18 step_id = 1217 global_flag = 0 sequence_no = 7 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\18.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 08 step_id = 1218 global_flag = 0 sequence_no = 8 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 HP TPC-H FULL DISCLOSURE REPORT 550 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\8.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 21 step_id = 1219 global_flag = 0 sequence_no = 9 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\21.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 13 step_id = 1220 global_flag = 0 sequence_no = 10 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\13.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 03 step_id = 1221 global_flag = 0 sequence_no = 11 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\3.sql version_no 13.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 22 step_id = 1222 global_flag = 0 sequence_no = 12 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\22.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 16 step_id = 1223 global_flag = 0 sequence_no = 13 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %QUERY_DIR%\Power\16.sql version_no 15.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

HP TPC-H FULL DISCLOSURE REPORT 551 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Power - Execute Query 04 step_id = 1224 global_flag = 0 sequence_no = 14 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\4.sql version_no 13.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 11 step_id = 1225 global_flag = 0 sequence_no = 15 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\11.sql version_no 13.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 15 step_id = 1226 global_flag = 0 sequence_no = 16 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\15.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 01 step_id = 1227 global_flag = 0 sequence_no = 17 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\1.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 10 step_id = 1228 global_flag = 0 sequence_no = 18 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\10.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 19 step_id = 1229 global_flag = 0 sequence_no = 19 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\19.sql version_no 12.0

HP TPC-H FULL DISCLOSURE REPORT 552 © 2005 Hewlett-Packard Company. All rights reserved. start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 05 step_id = 1230 global_flag = 0 sequence_no = 20 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\5.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 07 step_id = 1231 global_flag = 0 sequence_no = 21 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\7.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Power - Execute Query 12 step_id = 1232 global_flag = 0 sequence_no = 22 step_level = 2 parent_step_id = 1205 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\Power\12.sql version_no 12.0 start_directory = Power_Static_DB_Connection parent_version_no = 27.1 step_text =

step_label = Throughput - Semaphore Loop for RF Delay step_id = 1234 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1208 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 2.0 start_directory = %TOOLS_DIR% parent_version_no = 1.3 step_text = %TOOLS_DIR%\Uti lity\semaphore -waitgroup S -count %MAX_STREAMS%

step_label = Throughput - Refresh Streams step_id = 1235 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1208 enabled_flag -1 iterator_name = STREAM_NUM degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.3 start_directory = parent_version_no = 1.3 step_text =

step_label = Stream 1 Manager step_id = 1236 global_flag = 0

HP TPC-H FULL DISCLOSURE REPORT 553 © 2005 Hewlett-Packard Company. All rights reserved. sequence_no = 1 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.3 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 2 Manager step_id = 1237 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.2 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 3 Manager step_id = 1238 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.1 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 4 Manager step_id = 1239 global_flag = 0 sequence_no = 4 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.2 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 5 Manager step_id = 1240 global_flag = 0 sequence_no = 5 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.2 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 6 Manager step_id = 1241 global_flag = 0 sequence_no = 6 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 2.1 start_directory = parent_version_no = 2.0

HP TPC-H FULL DISCLOSURE REPORT 554 © 2005 Hewlett-Packard Company. All rights reserved. step_text =

step_label = Stream 7 Manager step_id = 1242 global_flag = 0 sequence_no = 7 step_level = 2 parent_step_id = 1209 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.1 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 8 Manager step_id = 1243 global_flag = 0 sequence_no = 8 step_level = 2 parent_step_id = 1209 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.0 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 9 Manager step_id = 1244 global_flag = 0 sequence_no = 9 step_level = 2 parent_step_id = 1209 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.0 start_directory = parent_version_no = 2.0 step_text =

step_label = Stream 10 Manager step_id = 1245 global_flag = 0 sequence_no = 10 step_level = 2 parent_step_id = 1209 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.0 start_directory = parent_version_no = 2.0 step_text =

step_label = Throughput - RF1 - Stream%STREAM_NUM% step_id = 1246 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1235 enabled_flag -1 iterator_name = degree_parallelis %INSERT_PARALLELISM% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.2 start_directory = parent_version_no = 0.3 step_text =

step_label = Throughput - RF2 - Stream%STREAM_NUM% step_id = 1247 global_flag = 0 sequence_no = 4 step_level = 3 parent_step_id = 1235 enabled_flag -1 iterator_name = degree_parallelis %DELETE_PARALLELISM% HP TPC-H FULL DISCLOSURE REPORT 555 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 1.1 start_directory = parent_version_no = 0.3 step_text =

step_label = Throughput - Stream - Increment Update Set step_id = 1248 global_flag = 0 sequence_no = 5 step_level = 3 parent_step_id = 1235 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name version_no 1.0 start_directory = Throughput_RF_Connection parent_version_no = 0.3 step_text = UPDATE TPCH_AUX_TABLE SET updateset=updateset+1

step_label = Throughput - Query Stream 1 step_id = 1249 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1236 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM1\Stream1Q%QUERY%.sql version_no 2.0 start_directory = Throughput_Static_Stream_1_Connection parent_version_no = 0.3 step_text =

step_label = Throughput - Post to Semaphore (S1) step_id = 1250 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1236 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 2.0 start_directory = %TOOLS_DIR% parent_version_no = 0.3 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.1

step_label = Throughput - Query Stream 2 step_id = 1251 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1237 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM2\Stream2Q%QUERY%.sql version_no 2.0 start_directory = Throughput_Static_Stream_2_Connection parent_version_no = 0.2 step_text =

step_label = Throughput - Post to Semaphore (S2) step_id = 1252 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1237 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 1.0 start_directory = %TOOLS_DIR% parent_version_no = 0.2

HP TPC-H FULL DISCLOSURE REPORT 556 © 2005 Hewlett-Packard Company. All rights reserved. step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.2

step_label = Throughput - Query Stream 3 step_id = 1253 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1238 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM3\Stream3Q%QUERY%.sql version_no 1.0 start_directory = Throughput_Static_Stream_3_Connection parent_version_no = 0.1 step_text =

step_label = Throughput - Post to Semaphore (S3) step_id = 1254 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1238 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 0.1 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.3

step_label = Throughput - Query Stream 4 step_id = 1255 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1239 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM4\Stream4Q%QUERY%.sql version_no 1.0 start_directory = Throughput_Static_Stream_4_Connection parent_version_no = 0.2 step_text =

step_label = Throughput - Post to Semaphore (S4) step_id = 1256 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1239 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 1.0 start_directory = %TOOLS_DIR% parent_version_no = 0.2 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.4

step_label = Throughput - Query Stream 5 step_id = 1257 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1240 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM5\Stream5Q%QUERY%.sql version_no 1.0 start_directory = Throughput_Static_Stream_5_Connection parent_version_no = 0.2 step_text =

HP TPC-H FULL DISCLOSURE REPORT 557 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Throughput - Post to Semaphore (S5) step_id = 1258 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1240 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 1.0 start_directory = %TOOLS_DIR% parent_version_no = 0.2 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.5

step_label = Throughput - Query Stream 6 step_id = 1259 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1241 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM6\Stream6Q%QUERY%.sql version_no 1.0 start_directory = Throughput_Static_Stream_6_Connection parent_version_no = 2.1 step_text =

step_label = Throughput - Post to Semaphore (S6) step_id = 1260 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1241 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 2.1 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.6

step_label = Throughput - Query Stream 7 step_id = 1261 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1242 enabled_flag -1 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM7\Stream7Q%QUERY%.sql version_no 1.0 start_directory = Throughput_Static_Stream_7_Connection parent_version_no = 1.1 step_text =

step_label = Throughput - Post to Semaphore (S7) step_id = 1262 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1242 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 1.1 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.7

step_label = Throughput - Query Stream 8 step_id = 1263 global_flag = 0

HP TPC-H FULL DISCLOSURE REPORT 558 © 2005 Hewlett-Packard Company. All rights reserved. sequence_no = 1 step_level = 3 parent_step_id = 1243 enabled_flag 0 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM8\Stream8Q%QUERY%.sql version_no 0.0 start_directory = Throughput_Static_Stream_8_Connection parent_version_no = 1.0 step_text =

step_label = Throughput - Post to Semaphore (S8) step_id = 1264 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1243 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 1.0 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.8

step_label = Throughput - Query Stream 9 step_id = 1265 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1244 enabled_flag 0 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM9\Stream9Q%QUERY%.sql version_no 0.0 start_directory = Throughput_Static_Stream_9_Connection parent_version_no = 1.0 step_text =

step_label = Throughput - Post to Semaphore (S9) step_id = 1266 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1244 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 1.0 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.9

step_label = Throughput - Query Stream 10 step_id = 1267 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1245 enabled_flag 0 iterator_name = QUERY degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name %QUERY_DIR%\STREAM10\Stream10Q%QUERY%.sql version_no 0.0 start_directory = Throughput_Static_Stream_10_Connection parent_version_no = 1.0 step_text =

step_label = Throughput - Post to Semaphore (S10) step_id = 1268 global_flag = 0 sequence_no = 2 step_level = 3 parent_step_id = 1245 enabled_flag 0 iterator_name = degree_parallelis 1 HP TPC-H FULL DISCLOSURE REPORT 559 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 2 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 1.0 step_text = %TOOLS_DIR%\Uti lity\semaphore -signal S.10

step_label = Throughput - Execute Stream%STREAM_NUM% RF1 step_id = 1269 global_flag = 0 sequence_no = 1 step_level = 4 parent_step_id = 1246 enabled_flag -1 iterator_name = INSERT_SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name version_no 6.0 start_directory = Throughput_RF_Connection parent_version_no = 1.2 step_text = -- -- Execute the Refresh RF1 Stored Procedure -- EXEC RF1 %INSERT_SEGMENT%, %BATCH_SIZE%, %INSERT_PARALLELISM%, %INSERT_EXECUTIONS%

step_label = Throughput - Execute Stream%STREAM_NUM% RF2 step_id = 1270 global_flag = 0 sequence_no = 1 step_level = 4 parent_step_id = 1247 enabled_flag -1 iterator_name = DELETE_SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name version_no 5.0 start_directory = Throughput_RF_Connection parent_version_no = 1.1 step_text = -- -- Execute the Refresh RF2 Stored Procedure -- EXEC RF2 %DELETE_SEGMENT%, %BATCH_SIZE%, %DELETE_PARALLELISM%, %DELETE_EXECUTIONS%

step_label = SqlServer Startup step_id = 1294 global_flag = -1 sequence_no = 1 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 0 execution_mechanism = 2 continuation_criteria 0 failure_details = step_file_name version_no 0.0 start_directory = parent_version_no = 0.0 step_text = start "SqlServer" sqlservr -c %TRACEFLAGS% %TOOLS_DIR%\Uti lity\wait4sql 40000

step_label = SqlServer Shutdown step_id = 1295 global_flag = -1 sequence_no = 2 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 0 execution_mechanism = 2 continuation_criteria 0 failure_details = step_file_name version_no 0.0 start_directory = parent_version_no = 0.0 step_text = isql -Usa -P -t10 -Q"shutdown" %TOOLS_DIR%\Uti lity\wait4sql 10000

HP TPC-H FULL DISCLOSURE REPORT 560 © 2005 Hewlett-Packard Company. All rights reserved. step_label = Wait For SQL Server step_id = 1296 global_flag = -1 sequence_no = 3 step_level = 0 parent_step_id = 0 enabled_flag 0 iterator_name = degree_parallelis 0 execution_mechanism = 2 continuation_criteria 0 failure_details = step_file_name version_no 0.0 start_directory = %TOOLS_DIR% parent_version_no = 0.0 step_text = %TOOLS_DIR%\Uti lity\wait4sql.exe 60000

step_label = Power - Execute RF1 step_id = 1405 global_flag = 0 sequence_no = 1 step_level = 1 parent_step_id = 1202 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 21.0 start_directory = parent_version_no = 123.1 step_text =

step_label = Parallel RF1 Execution step_id = 1406 global_flag = 0 sequence_no = 4 step_level = 2 parent_step_id = 1405 enabled_flag -1 iterator_name = degree_parallelis %INSERT_PARALLELISM% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 3.0 start_directory = parent_version_no = 21.0 step_text =

step_label = Execute RF1 step_id = 1407 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1406 enabled_flag -1 iterator_name = INSERT_SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 13.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 3.0 step_text = -- -- Execute the Refresh RF1 Stored Procedure --

EXEC RF1 %INSERT_SEGMENT%, %BATCH_SIZE%, %INSERT_PARALLELISM%, %INSERT_EXECUTIONS%

step_label = Create RF1 Tables step_id = 1411 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1405 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\storedprocs\RF1_init.sql version_no 11.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 21.0

HP TPC-H FULL DISCLOSURE REPORT 561 © 2005 Hewlett-Packard Company. All rights reserved. step_text =

step_label = Parallel Load RF1 Input step_id = 1414 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1405 enabled_flag -1 iterator_name = degree_parallelis %FILES_PER_UPDATE_SET% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 2.0 start_directory = parent_version_no = 21.0 step_text =

step_label = Throughput - Load RF1 Input step_id = 1415 global_flag = 0 sequence_no = 1 step_level = 5 parent_step_id = 1431 enabled_flag -1 iterator_name = SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name G:\kit\setup\StoredProcs\RF1_load.sql version_no 4.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 0.1 step_text =

step_label = Create RF1 Indices step_id = 1417 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1405 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name G:\kit\setup\StoredProcs\RF1_index.sql version_no 5.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 21.0 step_text =

step_label = Power - Execute RF2 step_id = 1419 global_flag = 0 sequence_no = 3 step_level = 1 parent_step_id = 1202 enabled_flag 0 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 18.0 start_directory = parent_version_no = 123.1 step_text =

step_label = Create RF2 Tables step_id = 1420 global_flag = 0 sequence_no = 1 step_level = 2 parent_step_id = 1419 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\StoredProcs\RF2_init.sql version_no 6.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 18.0 step_text =

step_label = Parallel Load RF2 Input step_id = 1421 global_flag = 0 sequence_no = 2 step_level = 2 parent_step_id = 1419 enabled_flag -1 iterator_name = degree_parallelis %FILES_PER_UPDATE_SET%

HP TPC-H FULL DISCLOSURE REPORT 562 © 2005 Hewlett-Packard Company. All rights reserved. execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 2.0 start_directory = parent_version_no = 18.0 step_text =

step_label = Load RF2 Input step_id = 1422 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1421 enabled_flag -1 iterator_name = SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\StoredProcs\RF2_load.sql version_no 4.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 2.0 step_text =

step_label = Create RF2 Indices step_id = 1424 global_flag = 0 sequence_no = 3 step_level = 2 parent_step_id = 1419 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name G:\kit\setup\StoredProcs\RF2_index.sql version_no 4.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 18.0 step_text =

step_label = Parallel RF2 Execution step_id = 1425 global_flag = 0 sequence_no = 4 step_level = 2 parent_step_id = 1419 enabled_flag -1 iterator_name = degree_parallelis %DELETE_PARALLELISM% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 2.0 start_directory = parent_version_no = 18.0 step_text =

step_label = Execute RF2 step_id = 1426 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1425 enabled_flag -1 iterator_name = DELETE_SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name version_no 11.0 start_directory = Power_Dynamic_DB_Connection parent_version_no = 2.0 step_text = -- -- Execute the Refresh RF2 Stored Procedure --

EXEC RF2 %DELETE_SEGMENT%, %BATCH_SIZE%, %DELETE_PARALLELISM%, %DELETE_EXECUTIONS%

step_label = Throughput - Init RF1 Input step_id = 1428 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1235 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = HP TPC-H FULL DISCLOSURE REPORT 563 © 2005 Hewlett-Packard Company. All rights reserved. step_file_name version_no 0.1 start_directory = parent_version_no = 0.3 step_text =

step_label = Throughput - Init RF2 Input step_id = 1429 global_flag = 0 sequence_no = 3 step_level = 3 parent_step_id = 1235 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.1 start_directory = parent_version_no = 0.3 step_text =

step_label = Throughput - Create RF1 Tables step_id = 1430 global_flag = 0 sequence_no = 1 step_level = 4 parent_step_id = 1428 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name G:\kit\setup\StoredProcs\RF1_init.sql version_no 8.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 0.1 step_text =

step_label = Throughput - Parallel Load RF1 Input step_id = 1431 global_flag = 0 sequence_no = 2 step_level = 4 parent_step_id = 1428 enabled_flag -1 iterator_name = degree_parallelis %FILES_PER_UPDATE_SET% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.1 start_directory = parent_version_no = 0.1 step_text =

step_label = Load RF1 Input step_id = 1432 global_flag = 0 sequence_no = 1 step_level = 3 parent_step_id = 1414 enabled_flag -1 iterator_name = SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 1 failure_details = step_file_name %SETUP_DIR%\StoredProcs\RF1_load.sql version_no 3.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 2.0 step_text =

step_label = Throughput - Create RF1 Indices step_id = 1434 global_flag = 0 sequence_no = 3 step_level = 4 parent_step_id = 1428 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name version_no 0.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 0.1 step_text = create clustered index NEWORDERS_CLUIDX on NEWORDERS (O_ORDERDATE) on GENERAL_FG

create clustered index NEWLINEITEM_CLUIDX HP TPC-H FULL DISCLOSURE REPORT 564 © 2005 Hewlett-Packard Company. All rights reserved. on NEWLINEITEM (L_ORDERKEY) on GENERAL_FG

step_label = Throughput - Create RF2 Tables step_id = 1435 global_flag = 0 sequence_no = 1 step_level = 4 parent_step_id = 1429 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name G:\kit\setup\StoredProcs\RF2_init.sql version_no 5.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 0.1 step_text =

step_label = Throughput - Parallel Load RF2 Input step_id = 1436 global_flag = 0 sequence_no = 2 step_level = 4 parent_step_id = 1429 enabled_flag -1 iterator_name = degree_parallelis %FILES_PER_UPDATE_SET% execution_mechanism = 0 continuation_criteria 0 failure_details = step_file_name version_no 0.1 start_directory = parent_version_no = 0.1 step_text =

step_label = Throughput - Load RF2 Input step_id = 1437 global_flag = 0 sequence_no = 1 step_level = 5 parent_step_id = 1436 enabled_flag -1 iterator_name = SEGMENT degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name G:\kit\setup\StoredProcs\RF2_load.sql version_no 3.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 0.1 step_text =

step_label = Throughput - Create RF2 Indices step_id = 1438 global_flag = 0 sequence_no = 3 step_level = 4 parent_step_id = 1429 enabled_flag -1 iterator_name = degree_parallelis 1 execution_mechanism = 1 continuation_criteria 2 failure_details = step_file_name G:\kit\setup\StoredProcs\RF2_index.sql version_no 3.0 start_directory = Dynamic_Connection_to_DB parent_version_no = 0.1 step_text =

HP TPC-H FULL DISCLOSURE REPORT 565 © 2005 Hewlett-Packard Company. All rights reserved. Iterator_values workspac step_id version type iterator_value sequence e_id _no _no

13 1269 6.0 2 %INSERT_EXECUTIONS% 0

13 1432 3.0 1 1 0

13 1432 3.0 2 %FILES_PER_UPDATE_SET% 0

13 1432 3.0 3 1 0

13 1235 0.3 2 %MAX_STREAMS% 0

13 1235 0.3 1 1 0

13 1235 0.3 3 1 0

13 1265 0.0 2 22 0 13 1265 0.0 1 1 0

13 1265 0.0 3 1 0

13 1263 0.0 2 22 0

13 1263 0.0 3 1 0

13 1267 0.0 1 1 0

13 1269 6.0 1 1 0

13 1422 4.0 2 %FILES_PER_UPDATE_SET% 0

13 1269 6.0 3 1 0

13 1270 5.0 1 1 0

13 1270 5.0 2 %DELETE_EXECUTIONS% 0

13 1270 5.0 3 1 0

13 1415 4.0 1 1 0

13 1415 4.0 2 %FILES_PER_UPDATE_SET% 0

13 1415 4.0 3 1 0

13 1437 3.0 3 1 0

13 1437 3.0 1 1 0

13 1437 3.0 2 %FILES_PER_UPDATE_SET% 0

13 1267 0.0 3 1 0

13 1267 0.0 2 22 0

13 1263 0.0 1 1 0

13 1249 2.0 2 22 0

13 1251 2.0 2 22 0

13 1251 2.0 3 1 0 HP TPC-H FULL DISCLOSURE REPORT 566 © 2005 Hewlett-Packard Company. All rights reserved. 13 1251 2.0 1 1 0

13 1253 1.0 2 22 0

13 1253 1.0 3 1 0

13 1253 1.0 1 1 0

13 1255 1.0 1 1 0

13 1255 1.0 2 22 0 13 1255 1.0 3 1 0

13 1257 1.0 2 22 0

13 1422 4.0 1 1 0

13 1257 1.0 3 1 0

13 1422 4.0 3 1 0

13 1259 1.0 2 22 0

13 1259 1.0 3 1 0

13 1261 1.0 2 22 0

13 1261 1.0 3 1 0

13 1261 1.0 1 1 0

13 1407 13.0 3 1 0

13 1407 13.0 2 %INSERT_EXECUTIONS% 0

13 1407 13.0 1 1 0

13 1426 11.0 3 1 0

13 1426 11.0 2 %DELETE_EXECUTIONS% 0

13 1426 11.0 1 1 0

13 1249 2.0 1 1 0

13 1257 1.0 1 1 0

HP TPC-H FULL DISCLOSURE REPORT 567 © 2005 Hewlett-Packard Company. All rights reserved. Semaphore.cpp #define _WIN32_WINNT 0x0400 for (i=0; i { #include WaitForSingleObject( hSemaphore, INFINITE ); #include GetLocalTime( &Time ); #include printf( "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d - released \n", #include Ti me.wYear, Time.wMonth, Time.wDay, Time.wHour, Time.wMinute, #include Ti me.wSecond ); void main(int argc, char **argv) } { CloseHandle( hSemaphore ); typedef enum { eUnknown, eWait, eSignal, eRelease, eWaitList, } eWaitGroup } OPERATION; else if ((eOP == eWaitGroup) || (eOP == eWaitList)) OPERATION eOP = eUnknown; { int iCount; char **szEventNames; int i; szEventNames = new char*[iCount]; HANDLE hSemaphore; char szTmp[128]; HANDLE *pHandles; printf( "event-list =" ); SYSTEMTIME Time; for (i=0; i0;i--) } { else if (eOP == eWaitGroup) int idx = WaitForMultipleObjects( i, pHandles, FALSE /* wait for all */, { INFINITE ) - WAIT_OBJECT_0; if ((argc != 5) || (_stricmp(argv[3], "-count") != 0)) GetLocalTime( &Time ); goto usage; printf( "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d - signaled: %s \n", iCount = atoi(argv[4]); Ti me.wYear, Time.wMonth, Time.wDay, Time.wHour, Time.wMinute, if (iCount < 1) Ti me.wSecond, szEventNames[idx] ); goto usage; HANDLE hTmp = pHandles[idx]; } pHandles[idx] = pHandles[i-1]; else pHandles[i-1] = hTmp; // eWaitList or eSignal char* szTmp = szEventNames[idx]; iCount = argc - 2; szEventNames[idx] = szEventNames[i-1]; if (eOP == eWait) szEventNames[i-1] = szTmp; { } printf( "semaphore name = %s\n", argv[2] ); for (i=0; i

HP TPC-H FULL DISCLOSURE REPORT 568 © 2005 Hewlett-Packard Company. All rights reserved. DWORD dwError = GetLastError(); "List of Events: \n" cout << "*ERROR* OpenSemaphore returned " << dwError << endl; "A list of events (alpha-numeric tags) is specified for the waiter. The exit(EXIT_FAILURE); \n" } "waiter doesn't complete until all of the events have been signaled. A if (!ReleaseSemaphore( hSemaphore, iCount, NULL )) \n" { "given event may be signaled more than once. There are two ways to DWORD dwError = GetLastError(); define \n" cout << "*ERROR* ReleaseSemaphore returned " << dwError << "the list of events, either explicitly (-waitlist) by naming all of them or endl; \n" exit(EXIT_FAILURE); "implicitly (-waitgroup) with a prefix and a count. Using the -waitgroup } \n" CloseHandle( hSemaphore ); "option, you provide an alpha-numeric tag which is used as the prefix } for a \n" else if (eOP == eSignal) "group of events. The event names are generated by concatenating { the prefix \n" for (i=0; i\", where is 1 to the specified count. \n" { ); HANDLE hHandle = OpenEvent( EVENT_MODIFY_STATE, FALSE, exit(EXIT_FAILURE); argv[i+2] ); } if (hHandle == NULL) { DWORD dwError = GetLastError(); cout << "*ERROR* OpenEvent returned " << dwError << endl; exit(EXIT_FAILURE); } SetEvent( hHandle ); CloseHandle( hHandle ); } } exit(EXIT_SUCCESS); // syntax was bad; show usage and quit usage: printf( "Semaphore Uti lity - Ver. 1.2 - 26-Jul-99 \n" "Copyright (C) Microsoft Corp 1999. All rights reserved.\n\n" "usage: \n" " semaphore { -wait | -release } [ -count ] \n" " semaphore { -waitlist | -signal } \n" " semaphore -waitgroup -count \n" "\n" " == alpha-numeric identifier \n" " == integer > 0; default value = 1 \n" " == { ... } \n" " == alpha-numeric identifier \n" " == alpha-numeric identifier \n" "\n" "There are two modes to choose from: a semaphore or a list of events. \n" "\n" "Semaphore mode: \n" "A semaphore is a single identifier with an associated count. Each time \n" "the semaphore is released, the count is decremented by one (or the amount \n" "specified). When the count reaches zero, the waiter completes. If there \n" "are multiple waiters on the same semaphore, each release releases only \n" "the number of waiters specified in count.\n" "\n"

HP TPC-H FULL DISCLOSURE REPORT 569 © 2005 Hewlett-Packard Company. All rights reserved. Appendix G: DBGen Modifications

Four files from the dbgen 2.1.1b source were modified. They are listed below. rnd.c

/* #define int32_t __int32 * $Id: rnd.c,v 1.6 2004/03/26 20:22:56 jms Exp $ #endif * #include "dss.h" * Revision History #include "rnd.h" * ======* $Log: rnd.c,v $ char *env_config PROTO((char *tag, char *dflt)); * Revision 1.6 2004/03/26 20:22:56 jms void NthElement(DSS_HUGE, DSS_HUGE *); * correct Solaris header * void * Revision 1.5 2004/03/02 20:50:50 jms dss_random(DSS_HUGE *tgt, DSS_HUGE lower, DSS_HUGE upper, * MP/RAS porting changes long stream) * { * Revision 1.4 2004/02/18 16:37:33 jms *tgt = UnifInt(lower, upper, stream); * add int32_t for solaris Seed[stream].usage += 1; * * Revision 1.3 2004/02/18 16:26:49 jms return; * 32/64 bit changes for overflow handling needed additional changes } when ported back to windows * void * Revision 1.2 2004/02/18 16:17:32 jms row_start(int t) \ * add 32bit specific changes to UnifInt { * int i; * Revision 1.1.1.1 2003/08/08 21:50:34 jms for (i=0; i <= MAX_STREAM; i++) * recreation after CVS crash Seed[i].usage = 0 ; * * Revision 1.3 2003/08/08 21:35:26 jms return; * first integration of rng64 for o_custkey and l_partkey } * * Revision 1.2 2003/08/07 17:58:34 jms void * Convery RNG to 64bit space as preparation for new large scale RNG row_stop(int t) \ * { * Revision 1.1.1.1 2003/04/03 18:54:21 jms int i; * initial checkin * /* need to allow for handling the master and detail together */ * if (t == ORDER_LINE) */ t = ORDER; /* if (t == PART_PSUPP) * RANDOM.C -- Implements Park & Miller's "Minimum Standard" t = PART; RNG * for (i=0; i <= MAX_STREAM; i++) * (Reference: CACM, Oct 1988, pp 1192-1201) if ((Seed[i].table == t) || (Seed[i].table == * tdefs[t].child)) * NextRand: Computes next random integer { * UnifInt: Yields an long uniformly distributed between given bounds if (set_seeds && (Seed[i].usage > * UnifReal: ields a real uniformly distributed between given bounds Seed[i].boundary)) * Exponential: Yields a real exponentially distributed with given mean { * fprintf(stderr, "\nSEED */ CHANGE: seed[%d].usage = %d\n", i, #include "c onfig.h" Seed[i].usage); #include Seed[i].boundary = #include Seed[i].usage; #ifdef LINUX } #include else #endif { #ifdef IBM #include NthElement((Seed[i].boundary - Seed[i].usage), #endif &Seed[i].value); #ifdef SOLARIS } #include } #endif return; #ifdef ATT } #include #endif void #ifdef WIN32 dump_seeds(int tbl) HP TPC-H FULL DISCLOSURE REPORT 570 © 2005 Hewlett-Packard Company. All rights reserved. { * sign, their sum lies between -(nM-1) and +(nM-1). If int i; * non-negative, it is the answer (i.e., it's congruent to * nA*nSeed and lies between 0 and nM-1). Otherwise adding nM for (i=0; i <= MAX_STREAM; i++) * yields a number still congruent to nA*nSeed, but now between if (Seed[i].table == tbl) * 0 and nM-1, so that's the answer. printf("%d:\t%ld\n", i, Seed[i].value); */ return; } nSeed = ((unsigned long long)nSeed * 16807) % 2147483647; /********************************************************* ********* if ((nSeed <= 0) || (nSeed >= 2147483647)) { NextRand: Computes next random integer printf("Error!!\n") ; exit(-1); ********************************************************** } *********/ return (nSeed); } /* * long NextRand( long nSeed ) /********************************************************* */ ********* DSS_HUGE NextRand(DSS_HUGE nSeed) UnifInt: Yields an long uniformly distributed between given bounds

/* ********************************************************** * nSeed is the previous random number; the returned value is the *********/ * next random number. The routine generates all numbers in the * range 1 .. nM-1. /* */ * long UnifInt( long nLow, long nHigh, long nStream ) */ { DSS_HUGE UnifInt(DSS_HUGE nLow, DSS_HUGE nHigh, long nStream) /* * The routine returns (nSeed * nA) mod nM, where nA (the /* * multiplier) is 16807, and nM (the modulus) is * Returns an integer uniformly distributed between nLow and nHigh, * 2147483647 = 2^31 - 1. * including * the endpoints. nStream is the random number stream. * * Stream 0 is used if nStream is not in the range 0..MAX_STREAM. * nM is prime and nA is a primitive element of the range 1..nM-1. */ * This * means that the map nSeed = (nSeed*nA) mod nM, starting * from any nSeed in 1..nM-1, runs through all elements of 1..nM-1 { * before repeating. It never hits 0 or nM. double dRange; * DSS_HUGE nTemp; * To compute (nSeed * nA) mod nM without overflow, use the int32_t nLow32 = (int32_t)nLow, * following trick. Write nM as nQ * nA + nR, where nQ = nM / nA nHigh32 = (int32_t)nHigh; * and nR = nM % nA. (For nM = 2147483647 and nA = 16807, * get nQ = 127773 and nR = 2836.) Write nSeed as nU * nQ + nV, if (nStream < 0 || nStream > MAX_STREAM) * where nU = nSeed / nQ and nV = nSeed % nQ. Then we have: nStream = 0; * * nM = nA * nQ + nR nQ = nM / nA nR < nA < nQ if (nLow > nHigh) * { * nSeed = nU * nQ + nV nU = nSeed / nQ nV < nU nTemp = nLow; * nLow = nHigh; * Since nA < nQ, we have nA*nQ < nM < nA*nQ + nA < nA*nQ + nHigh = nTemp; nQ, } * i.e., nM/nQ = nA. This gives bounds on nU and nV as well: * nM > nSeed => nM/nQ * >= nSeed/nQ => nA >= nU ( > nV ). if ((nHigh == MAX_LONG) && (nLow == 0)) * dRange = DOUBLE_CAST (nHigh32 - nLow32 + 1); * Using ~ to mean "congruent mod nM" this gives: else * dRange = DOUBLE_CAST (nHigh - nLow + 1); * nA * nSeed ~ nA * (nU*nQ + nV) Seed[nStream].value = NextRand(Seed[nStream].value); * nTemp = (long) (((double) Seed[nStream].value / dM) * (dRange)); * ~ nA*nU*nQ + nA*nV return (nLow + nTemp); * /* * ~ nU * (-nR) + nA*nV (as nA*nQ ~ -nR) Seed[nStream].value = NextRand(Seed[nStream].value); * nTemp = nHigh - nLow + 1; * Both products in the last sum can be computed without overflow return((Seed[nStream].value % nTemp) + nLow); * (i.e., both have absolute value < nM) since nU*nR < nA*nQ < nM, */ * and nA*nV < nA*nQ < nM. Since the two products have opposite }

HP TPC-H FULL DISCLOSURE REPORT 571 © 2005 Hewlett-Packard Company. All rights reserved. speed_seed.c

/* * $Id: speed_seed.c,v 1.2 2004/01/22 03:54:12 jms Exp $ /* Nth Element of sequence starting with StartSeed */ * void NthElement (DSS_HUGE N, DSS_HUGE *StartSeed) * Revision History { * ======DSS_HUGE Z; * $Log: speed_seed.c,v $ DSS_HUGE Mult; * Revision 1.2 2004/01/22 03:54:12 jms static int ln=-1; * 64 bit support changes for customer address int i; * * Revision 1.1.1.1 2003/08/08 22:37:36 jms if ((verbose > 0) && ++ln % 1000 == 0) * recreation after CVS crash { * i = ln % LN_CNT; * Revision 1.3 2003/08/08 22:37:36 jms fprintf(stderr, "%c\b", lnoise[i]); * first integration of rng64 for o_custkey and l_partkey } * Mult = Multiplier; * Revision 1.2 2003/08/07 17:58:34 jms Z = (DSS_HUGE) *StartSeed; * Convery RNG to 64bit space as preparation for new large scale RNG while (N > 0 ) * { * Revision 1.1.1.1 2003/04/03 18:54:21 jms if (N % 2 != 0) // testing for oddness, this seems portable * initial checkin Z = (Mult * Z) % Modulus; * N = N / 2; // integer division, truncates * Mult = (Mult * Mult) % Modulus; */ } #include *StartSeed = Z; #include #include "dss.h" return; #include "rng64.h" } #include "dss.h" /* updates Seed[column] using the a_rnd algorithm */ /* _tal long RandSeed = "Random^SeedFromTimestamp" (void); */ void fake_a_rnd(int min, int max, int column) #define FAKE_V_STR(avg, sd, cnt) \ { ADVANCE_STREAM(sd, \ DSS_HUGE len; (long)(Seed[sd].boundary*cnt)) DSS_HUGE itcount; #define ADVANCE_STREAM(stream_id, num_calls) \ NthElement(num_calls, &Seed[stream_id].value) RANDOM(len, min, max, column); #define ADVANCE_STREAM64(stream_id, num_calls) \ if (len % 5L == 0) Seed[stream_id].value = AdvanceRand64(Seed[stream_id].value, itcount = len/5; num_calls) else itcount = len/5 + 1L; #define MAX_COLOR 92 NthElement(itcount, &Seed[column].usage); long name_bits[MAX_COLOR / BITS_PER_LONG]; return; extern seed_t Seed[]; }

/* WARNING! This routine assumes the existence of 64-bit */ long /* integers. The notation used here- "HUGE" is *not* ANSI standard. */ sd_part(int child, DSS_HUGE skip_count) /* Hopefully, you have this extension as well. If not, use whatever */ { /* nonstandard trick you need to in order to get 64 bit integers. */ int i; /* The book says that this will work if MAXINT for the type you choose */ for (i=P_MFG_SD; i<= P_CNTR_SD; i++) /* is at least 2**46 - 1, so 64 bits is more than you *really* need */ ADVANCE_STREAM(i, skip_count); static DSS_HUGE Multiplier = 16807; /* or whatever nonstandard */ FAKE_V_STR(P_CMNT_LEN, P_CMNT_SD, skip_count); static DSS_HUGE Modulus = 2147483647; /* trick you use to get 64 ADVANCE_STREAM(P_NAME_SD, skip_count * 92); bit int */ return(0L); /* Advances value of Seed after N applications of the random number } generator with multiplier Mult and given Modulus. long NthElement(Seed[],count); sd_line(int child, DSS_HUGE skip_count) { Theory: We are using a generator of the form int i,j; X_n = [Mult * X_(n-1)] mod Modulus. It turns out that X_n = [(Mult ** n) X_0] mod Modulus. for (j=0; j < O_LCNT_MAX; j++) This can be computed using a divide-and-conquer technique, see { the code below. for (i=L_QTY_SD; i<= L_RFLG_SD; i++) if (scale >= 30000 && i == In words, this means that if you want the value of the Seed after n L_PKEY_SD) applications of the generator, you multiply the initial value of the Seed by the "super multiplier" which is the basic multiplier raised ADVANCE_STREAM64(i, skip_count); to the nth power, and then take mod Modulus. else */ HP TPC-H FULL DISCLOSURE REPORT 572 © 2005 Hewlett-Packard Company. All rights reserved. ADVANCE_STREAM(i, sd_psupp(int child, DSS_HUGE skip_count) skip_count); { } int j;

FAKE_V_STR(L_CMNT_LEN, L_CMNT_SD, skip_count); for (j=0; j < SUPP_PER_PART; j++) /* need to special case this as the link between master and { detail */ ADVANCE_STREAM(PS_QTY_SD, if (child == 1) skip_count); { ADVANCE_STREAM(PS_SCST_SD, ADVANCE_STREAM(O_ODATE_SD, skip_count); skip_count); } ADVANCE_STREAM(O_LCNT_SD, FAKE_V_STR(PS_CMNT_LEN, PS_CMNT_SD, skip_count); skip_count); } return(0L); return(0L); } } long long sd_cust(int child, DSS_HUGE skip_count) sd_order(int child, DSS_HUGE skip_count) { { ADVANCE_STREAM(O_LCNT_SD, skip_count); FAKE_V_STR(C_ADDR_LEN, C_ADDR_SD, skip_count); /* FAKE_V_STR(C_CMNT_LEN, C_CMNT_SD, skip_count); if (scale >= 30000) ADVANCE_STREAM(C_NTRG_SD, skip_count); ADVANCE_STREAM(O_CKEY_SD, ADVANCE_STREAM(C_PHNE_SD, 3L * skip_count); skip_count); ADVANCE_STREAM(C_ABAL_SD, skip_count); else ADVANCE_STREAM(C_MSEG_SD, skip_count); ADVANCE_STREAM64(O_CKEY_SD, return(0L); skip_count); } */ if (scale >= 30000) long ADVANCE_STREAM64(O_CKEY_SD, sd_supp(int child, DSS_HUGE skip_count) skip_count); { else ADVANCE_STREAM(S_NTRG_SD, skip_count); ADVANCE_STREAM(O_CKEY_SD, ADVANCE_STREAM(S_PHNE_SD, 3L * skip_count); skip_count); ADVANCE_STREAM(S_ABAL_SD, skip_count); FAKE_V_STR(O_CMNT_LEN, O_CMNT_SD, FAKE_V_STR(S_ADDR_LEN, S_ADDR_SD, skip_count); skip_count); FAKE_V_STR(S_CMNT_LEN, S_CMNT_SD, skip_count); ADVANCE_STREAM(O_SUPP_SD, skip_count); ADVANCE_STREAM(BBB_CMNT_SD, skip_count); ADVANCE_STREAM(O_CLRK_SD, skip_count); ADVANCE_STREAM(BBB_JNK_SD, skip_count); ADVANCE_STREAM(O_PRIO_SD, skip_count); ADVANCE_STREAM(BBB_OFFSET_SD, skip_count); ADVANCE_STREAM(O_ODATE_SD, skip_count); ADVANCE_STREAM(BBB_TYPE_SD, skip_count); /* avoid one trudge */ return (0L); } return(0L); } long driver.c

/* * * $Id: driver.c,v 1.5 2004/04/07 20:17:29 jms Exp $ * Revision 1.2 2003/08/07 17:58:34 jms * * Convery RNG to 64bit space as preparation for new large scale RNG * Revision History * * ======* Revision 1.1.1.1 2003/04/03 18:54:21 jms * $Log: driver.c,v $ * initial checkin * Revision 1.5 2004/04/07 20:17:29 jms * * bug #58 (join fails between order/lineitem) * * */ * Revision 1.4 2004/02/18 16:26:49 jms /* main driver for dss banchmark */ * 32/64 bit changes for overflow handling needed additional changes when ported back to windows #define DECLARER /* EXTERN * references get defined here */ * Revision 1.3 2004/01/22 05:49:29 jms #define NO_FUNC (int (*) ()) NULL /* to clean up tdefs */ * AIX porting (AIX 5.1) #define NO_LFUNC (long (*) ()) NULL /* to clean up * tdefs */ * Revision 1.2 2004/01/22 03:54:12 jms * 64 bit support changes for customer address #include "config.h" * #include * Revision 1.1.1.1 2003/08/08 21:50:33 jms #if (defined(_POSIX_)||!defined(WIN32)) /* Change for * recreation after CVS crash Windows NT */ * #include * Revision 1.3 2003/08/08 21:35:26 jms #include * first integration of rng64 for o_custkey and l_partkey #endif /* WIN32 */ HP TPC-H FULL DISCLOSURE REPORT 573 © 2005 Hewlett-Packard Company. All rights reserved. #include /* */ * flat file output in .tbl #include * long base; -- base scale rowcount of table; #include * 0 if derived #include * int (*header) (); -- function to prep output #include * int (*loader[2]) (); -- functions to present output #include * long (*gen_seed) (); -- functions to seed the RNG #include * int (*verify) (); -- function to verfiy the data set without building #ifdef HP it #include * int child; -- non-zero if there is an associated detail table #endif * unsigned long vtotal; -- "c hecksum"total #if (defined(WIN32)&&!defined(_POSIX_)) * } tdef; #include * #pragma warning(disable:4201) */ #pragma warning(disable:4214) #pragma warning(disable:4514) /* #define WIN32_LEAN_AND_MEAN * flat file print functions; used with -F(lat) option #define NOATOM */ #define NOGDICAPMASKS int pr_cust (customer_t * c, int mode); #define NOMETAFILE int pr_line (order_t * o, int mode); #define NOMINMAX int pr_order (order_t * o, int mode); #define NOMSG int pr_part (part_t * p, int mode); #define NOOPENFILE int pr_psupp (part_t * p, int mode); #define NORASTEROPS int pr_supp (supplier_t * s, int mode); #define NOSCROLL int pr_order_line (order_t * o, int mode); #define NOSOUND int pr_part_psupp (part_t * p, int mode); #define NOSYSMETRICS int pr_nation (code_t * c, int mode); #define NOTEXTMETRIC int pr_region (code_t * c, int mode); #define NOWH #define NOCOMM /* #define NOKANJI * inline load functions; used with -D(irect) option #define NOMCX */ #include int ld_cust (customer_t * c, int mode); #pragma warning(default:4201) int ld_line (order_t * o, int mode); #pragma warning(default:4214) int ld_order (order_t * o, int mode); #endif int ld_part (part_t * p, int mode); int ld_psupp (part_t * p, int mode); #include "dss.h" int ld_supp (supplier_t * s, int mode); #include "dsstypes.h" int ld_order_line (order_t * o, int mode); int ld_part_psupp (part_t * p, int mode); /* int ld_nation (code_t * c, int mode); * Function prototypes int ld_region (code_t * c, int mode); */ void usage (void); /* int prep_direct (char *); * seed generation functions; used with '-O s' option int close_direct (void); */ void kill_load (void); long sd_cust (int child, DSS_HUGE skip_count); int pload (int tbl); long sd_line (int child, DSS_HUGE skip_count); void gen_tbl (int tnum, DSS_HUGE start, DSS_HUGE count, long sd_order (int child, DSS_HUGE skip_count); long upd_num); long sd_part (int child, DSS_HUGE skip_count); int pr_drange (int tbl, DSS_HUGE min, DSS_HUGE long sd_psupp (int child, DSS_HUGE skip_count); cnt, long num); long sd_supp (int child, DSS_HUGE skip_count); int set_files (int t, int pload); long sd_order_line (int child, DSS_HUGE skip_count); int partial (int, int); long sd_part_psupp (int child, DSS_HUGE skip_count);

/* extern int optind, opterr; * header output functions); used with -h(eader) option extern char *optarg; */ DSS_HUGE rowcnt = 0, minrow = 0; int hd_cust (FILE * f); long upd_num = 0; int hd_line (FILE * f); double flt_scale; int hd_order (FILE * f); #if (defined(WIN32)&&!defined(_POSIX_)) int hd_part (FILE * f); char *spawn_args[25]; int hd_psupp (FILE * f); #endif int hd_supp (FILE * f); int hd_order_line (FILE * f); int hd_part_psupp (FILE * f); /* int hd_nation (FILE * f); * general table descriptions. See dss.h for details on structure int hd_region (FILE * f); * NOTE: tables with no scaling info are scaled according to * another table /* * * data verfication functions; used with -O v option * */ * the following is based on the tdef structure defined in dss.h as: int vrf_cust (customer_t * c, int mode); * typedef struct int vrf_line (order_t * o, int mode); * { int vrf_order (order_t * o, int mode); * char *name; -- name of the table; int vrf_part (part_t * p, int mode); HP TPC-H FULL DISCLOSURE REPORT 574 © 2005 Hewlett-Packard Company. All rights reserved. int vrf_psupp (part_t * p, int mode); if (table & (1 << i)) int vrf_supp (supplier_t * s, int mode); child_table: int vrf_order_line (order_t * o, int mode); { int vrf_part_psupp (part_t * p, int mode); if (pload != -1) int vrf_nation (code_t * c, int mode); sprintf (line, "%s.%d", tdefs[i].name, int vrf_region (code_t * c, int mode); pload); else { tdef tdefs[] = printf ("Enter new destination for %s { data: ", {"part.tbl", "part table", 200000, hd_part, tdefs[i].name); {pr_part, ld_part}, sd_part, vrf_part, PSUPP, 0}, if (fgets (line, sizeof (line), stdin) == {"partsupp.tbl", "partsupplier table", 200000, hd_psupp, NULL) {pr_psupp, ld_psupp}, sd_psupp, vrf_psupp, return (-1);; NONE, 0}, if ((new_name = strchr (line, '\n')) != {"supplier.tbl", "suppliers table", 10000, hd_supp, NULL) {pr_supp, ld_supp}, sd_supp, vrf_supp, NONE, *new_name = '\0'; 0}, if (strlen (line) == 0) {"customer.tbl", "customers table", 150000, hd_cust, return (0); {pr_cust, ld_cust}, sd_cust, vrf_cust, NONE, 0}, } {"orders.tbl", "order table", 150000, hd_order, new_name = (char *) malloc (strlen (line) + 1); {pr_order, ld_order}, sd_order, vrf_order, LINE, MALLOC_CHECK (new_name); 0}, strcpy (new_name, line); {"lineitem.tbl", "lineitem table", 150000, hd_line, tdefs[i].name = new_name; {pr_line, ld_line}, sd_line, vrf_line, NONE, 0}, if (tdefs[i].child != NONE) {"orders.tbl", "orders/lineitem tables", 150000, { hd_order_line, i = tdefs[i].child; {pr_order_line, ld_order_line}, sd_order, tdefs[i].child = NONE; vrf_order_line, LINE, 0}, goto child_table; {"part.tbl", "part/partsupplier tables", 200000, } hd_part_psupp, } {pr_part_psupp, ld_part_psupp}, sd_part, vrf_part_psupp, PSUPP, 0}, return (0); {"nation.tbl", "nation table", NATIONS_MAX, hd_nation, } {pr_nation, ld_nation}, NO_LFUNC, vrf_nation, NONE, 0}, {"region.tbl", "region table", NATIONS_MAX, hd_region, {pr_region, ld_region}, NO_LFUNC, vrf_region, /* NONE, 0}, * read the distributions needed in the benchamrk }; */ void int *pids; load_dists (void) { read_dist (env_config (DIST_TAG, DIST_DFLT), "p_cntr", /* &p_cntr_set); * routines to handle the graceful cleanup of multi-process loads read_dist (env_config (DIST_TAG, DIST_DFLT), "colors", */ &colors); read_dist (env_config (DIST_TAG, DIST_DFLT), void "p_types", &p_types_set); stop_proc (int signum) read_dist (env_config (DIST_TAG, DIST_DFLT), "nations", { &nations); exit (0); read_dist (env_config (DIST_TAG, DIST_DFLT), "regions", } ®ions); read_dist (env_config (DIST_TAG, DIST_DFLT), void "o _oprio", kill_load (void) &o_priority_set); { read_dist (env_config (DIST_TAG, DIST_DFLT), "instruct", int i; &l_instruct_set); read_dist (env_config (DIST_TAG, DIST_DFLT), "smode", #if !defined(U2200) && !defined(DOS) &l_smode_set); for (i = 0; i < children; i++) read_dist (env_config (DIST_TAG, DIST_DFLT), if (pids[i]) "c ategory", KILL (pids[i]); &l_category_set); #endif /* !U2200 && !DOS */ read_dist (env_config (DIST_TAG, DIST_DFLT), "rflag", return; &l_rflag_set); } read_dist (env_config (DIST_TAG, DIST_DFLT), "msegmnt", &c_mseg_set); /* * re-set default output file names /* load the distributions that contain text generation */ */ read_dist (env_config (DIST_TAG, DIST_DFLT), "nouns", int &nouns); set_files (int i, int pload) read_dist (env_config (DIST_TAG, DIST_DFLT), "verbs", { &verbs); char line[80], *new_name; read_dist (env_config (DIST_TAG, DIST_DFLT), "adjectives", &adjectives); HP TPC-H FULL DISCLOSURE REPORT 575 © 2005 Hewlett-Packard Company. All rights reserved. read_dist (env_config (DIST_TAG, DIST_DFLT), "adverbs", &adverbs); rows_this_segment=0; read_dist (env_config (DIST_TAG, DIST_DFLT), upd_num += "auxillaries", &auxillaries); 10000; read_dist (env_config (DIST_TAG, DIST_DFLT), } "t erminators", &terminators); } read_dist (env_config (DIST_TAG, DIST_DFLT), "articles", &articles); if (set_seeds == 0) read_dist (env_config (DIST_TAG, DIST_DFLT), if (validate) "prepositions", &prepositions); read_dist (env_config (DIST_TAG, DIST_DFLT), tdefs[tnum].verify(&o, 0); "grammar", &grammar); else read_dist (env_config (DIST_TAG, DIST_DFLT), "np", &np); tdefs[tnum].loader[direct] (&o, upd_num); read_dist (env_config (DIST_TAG, DIST_DFLT), "vp", break; &vp); case SUPP: mk_supp (i, &supp); } if (set_seeds == 0) if (validate) /* * generate a particular table tdefs[tnum].verify(&supp, 0); */ else void gen_tbl (int tnum, DSS_HUGE start, DSS_HUGE count, long upd_num) tdefs[tnum].loader[direct] (&supp, upd_num); { break; static order_t o; case CUST: supplier_t supp; mk_cust (i, &cust); customer_t cust; if (set_seeds == 0) part_t part; if (validate) code_t code; static int completed = 0; tdefs[tnum].verify(&cust, 0); DSS_HUGE i; else

DSS_HUGE rows_per_segment=0; tdefs[tnum].loader[direct] (&cust, upd_num); DSS_HUGE rows_this_segment=-1; break; DSS_HUGE residual_rows=0; case PSUPP: case PART: if (insert_segments) case PART_PSUPP: { mk_part (i, &part); rows_per_segment = count / insert_segments; if (set_seeds == 0) residual_rows = count - (rows_per_segment * if (validate) insert_segments); } tdefs[tnum].verify(&part, 0); else for (i = start; count; count--, i++) { tdefs[tnum].loader[direct] (&part, upd_num); LIFENOISE (1000, i); break; row_start(tnum); case NATION: mk_nation (i, &code); switch (tnum) if (set_seeds == 0) { if (validate) case LINE: case ORDER: tdefs[tnum].verify(&code, 0); case ORDER_LINE: else mk_order (i, &o, upd_num % 10000); tdefs[tnum].loader[direct] (&code, 0); if (insert_segments && (upd_num > 0)) break; if((upd_num / 10000) < residual_rows) case REGION: { mk_region (i, &code); if((++rows_this_segment) if (set_seeds == 0) > rows_per_segment) if (validate) { tdefs[tnum].verify(&code, 0); else rows_this_segment=0; upd_num += tdefs[tnum].loader[direct] (&code, 0); 10000; break; } } } row_stop(tnum); else if (set_seeds && (i % tdefs[tnum].base) < 2) { { if((++rows_this_segment) printf("\nSeeds for %s at rowcount >= rows_per_segment) %ld\n", tdefs[tnum].comment, i); { dump_seeds(tnum); } HP TPC-H FULL DISCLOSURE REPORT 576 © 2005 Hewlett-Packard Company. All rights reserved. } { completed |= 1 << tnum; DSS_HUGE rowcnt; } DSS_HUGE extra;

if (verbose > 0) { void fprintf (stderr, "\tStarting to load stage %d of %d usage (void) for %s...", { s, children, tdefs[tbl].comment); fprintf (stderr, "%s\n%s\n\t%s\n%s %s\n\n", } "USAGE:", "dbgen [-{vfFD}] [-O {fhmsv}][-T if (direct == 0) {pcsoPSOL}]", set_files (tbl, s); "[-s ][-C ][-S ]", "dbgen [-v] [-O {dfhmr}] [-s ]", rowcnt = set_state(tbl, scale, children, s, &extra); "[-U ] [-r ]"); fprintf (stderr, "-b -- load distributions for \n"); if (s == children) fprintf (stderr, "-C -- use processes to generate gen_tbl (tbl, rowcnt * (s - 1) + 1, rowcnt + extra, data\n"); upd_num); fprintf (stderr, " [Under DOS, must be used with - else S]\n"); gen_tbl (tbl, rowcnt * (s - 1) + 1, rowcnt, fprintf (stderr, "-D -- do database load in line\n"); upd_num); fprintf (stderr, "-d -- split deletes between files\n"); fprintf (stderr, "-f -- force. Overwrite existing files\n") ; if (verbose > 0) fprintf (stderr, "-F -- generate flat files output\n"); fprintf (stderr, "done.\n"); fprintf (stderr, "-h -- display this message\n"); fprintf (stderr, "-i -- split inserts between files\n"); return (0); fprintf (stderr, "-n -- inline load into database \n"); } fprintf (stderr, "-O d -- generate SQL syntax for deletes\n"); fprintf (stderr, "-O f -- over-ride default output file names\n") ; int fprintf (stderr, "-O h -- output files with headers\n") ; pload (int tbl) fprintf (stderr, "-O m -- produce columnar output\n"); { fprintf (stderr, "-O r -- generate key ranges for deletes.\n") ; int c = 0, i, status; fprintf (stderr, "-O v -- Verify data set without generating it.\n"); if (verbose > 0) fprintf (stderr, "-q -- enable QUIET mode\n"); { fprintf (stderr, "-r -- updates refresh (n/100)%% of fprintf (stderr, "Starting %d children to load %s", the\n"); children, tdefs[tbl].comment); fprintf (stderr, " data set\n") ; } fprintf (stderr, "-s -- set Scale Factor (SF) to \n"); for (c = 0; c < children; c++) fprintf (stderr, "-S -- build the th step of the { data/update set\n"); pids[c] = SPAWN (); fprintf (stderr, "-T c -- generate cutomers ONLY\n"); if (pids[c] == -1) fprintf (stderr, "-T l -- generate nation/region ONLY\n"); { fprintf (stderr, "-T L -- generate lineitem ONLY\n"); perror ("Child loader not created"); fprintf (stderr, "-T n -- generate nation ONLY\n"); kill_load (); fprintf (stderr, "-T o -- generate orders/lineitem ONLY\n"); exit (-1); fprintf (stderr, "-T O -- generate orders ONLY\n"); } fprintf (stderr, "-T p -- generate parts/partsupp ONLY\n"); else if (pids[c] == 0) /* CHILD */ fprintf (stderr, "-T P -- generate parts ONLY\n"); { fprintf (stderr, "-T r -- generate region ONLY\n"); SET_HANDLER (stop_proc); fprintf (stderr, "-T s -- generate suppliers ONLY\n"); verbose = 0; fprintf (stderr, "-T S -- generate partsupp ONLY\n"); partial (tbl, c+1); fprintf (stderr, "-U -- generate update sets\n") ; exit (0); fprintf (stderr, "-v -- enable VERBOSE mode\n"); } fprintf (stderr, else if (verbose > 0) /* "\nTo generate the SF=1 (1GB), validation PARENT */ database population, use:\n"); fprintf (stderr, "."); fprintf (stderr, "\tdbgen -vfF -s 1\n"); } fprintf (stderr, "\nTo generate updates for a SF=1 (1GB), use:\n"); if (verbose > 0) fprintf (stderr, "\tdbgen -v -U 1 -s 1\n"); fprintf (stderr, "waiting..."); } c = children; /* while (c) * pload() -- handle the parallel loading of tables { */ i = WAIT (&status, pids[c - 1]); #ifndef DOS if (i == -1 && children) /* { * int partial(int tbl, int s) -- generate the s-th part of the named tables if (errno == ECHILD) data fprintf (stderr, "\nCould not */ wait on pid %d\n", pids[c - 1]); int else if (errno == EINTR) partial (int tbl, int s) HP TPC-H FULL DISCLOSURE REPORT 577 © 2005 Hewlett-Packard Company. All rights reserved. fprintf (stderr, "\nProcess case 'c': /* generate %d stopped abnormally\n", pids[c - 1]); customer ONLY */ else if (errno == EINVAL) table = 1 << CUST; fprintf (stderr, "\nProgram break; bug\n"); case 'L': /* generate } lineitems ONLY */ if (! WIFEXITED(status)) { table = 1 << LINE; (void) fprintf(stderr, "\nProcess %d: ", break; i); case 'l': /* generate code if (WIFSIGNALED(status)) { table ONLY */ (void) fprintf(stderr, "rcvd table = 1 << NATION; signal %d\n", table |= 1 << REGION; break; WTERMSIG(status)); case 'n': /* generate } else if nation table ONLY */ (WIFSTOPPED(status)) { table = 1 << NATION; (void) fprintf(stderr, break; "s topped, signal %d\n", case 'O': /* generate orders ONLY */ WSTOPSIG(status)); table = 1 << ORDER; } break; case 'o': /* generate } orders/lineitems ONLY */ c--; table = 1 << ORDER_LINE; } break; case 'P': /* generate part if (verbose > 0) ONLY */ fprintf (stderr, "done\n"); table = 1 << PART; return (0); break; } case 'p': /* generate #endif /* !DOS */ part/partsupp ONLY */ table = 1 << PART_PSUPP; void break; process_options (int count, char **vector) case 'r': /* generate { region table ONLY */ int option; table = 1 << REGION; break; while ((option = getopt (count, vector, case 'S': /* generate "b:C:Dd:Ffi:hn:O:P:qr:s:S:T:U:v")) != -1) partsupp ONLY */ switch (option) table = 1 << PSUPP; { break; case 'b': /* case 's': /* generate load distributions from named file */ suppliers ONLY */ d_path = (char *)malloc(strlen(optarg) table = 1 << SUPP; + 1); break; MALLOC_CHECK(d_path); default: strcpy(d_path, optarg); fprintf (stderr, "Unknown table name break; %s\n", case 'q': /* all optarg); prompts disabled */ usage (); verbose = -1; exit (1); break; } case 'i': break; insert_segments = atoi (optarg); case 's': /* break; scale by Percentage of base rowcount */ case 'd': case 'P': /* for delete_segments = atoi (optarg); backward compatibility */ break; flt_scale = atof (optarg); case 'S': /* generate a if (flt_scale < MIN_SCALE) particular STEP */ { step = atoi (optarg); int i; break; int int_scale; case 'v': /* life noises enabled */ scale = 1; verbose = 1; int_scale = (int)(1000 * break; flt_scale); case 'f': /* blind for (i = PART; i < overwrites; Force */ REGION; i++) force = 1; { break; tdefs[i].base = case 'T': /* generate a (DSS_HUGE)(int_scale * tdefs[i].base)/1000; specifc table */ if (tdefs[i].base switch (*optarg) < 1) { tdefs[i].base = 1; HP TPC-H FULL DISCLOSURE REPORT 578 © 2005 Hewlett-Packard Company. All rights reserved. } case 'r': } /* set the refresh (update) percentage */ else refresh = atoi (optarg); scale = (long) flt_scale; break; /* #ifndef DOS if (scale > MAX_SCALE) case 'C': { children = atoi (optarg); fprintf (stderr, "%s %5.0f break; %s\n\t%s\n\n", #endif /* !DOS */ "NOTE: Data case 'n': generation for scale factors >", /* set name of database for direct load */ db_name = (char *) MAX_SCALE, malloc (strlen (optarg) + 1); "GB is still in MALLOC_CHECK development,", (db_name); "and is not yet strcpy (db_name, optarg); supported.\n"); break; fprintf (stderr, default: "Your resulting printf ("ERROR: option data set MAY NOT BE COMPLIANT!\n"); '%c' unknown.\n", } */ *(vector[optind] + 1)); break; case 'h': case 'O': /* /* something unexpected */ optional actions */ fprintf (stderr, switch (tolower (*optarg)) "%s Population { Generator (Version %d.%d.%d%s)\n", case 'd': /* NAME, generate SQL for deletes */ VERSION, RELEASE, gen_sql = 1; break; MODIFICATION, PATCH); case 'f': /* fprintf (stderr, "Copyright over-ride default file names */ %s %s\n", TPC, C_DATES); fnames = 1; usage (); break; exit (1); case 'h': /* } generate headers */ header = 1; #ifndef DOS break; if (children != 1 && step == -1) case 'm': /* { generate columnar output */ pids = malloc(children * sizeof(pid_t)); columnar = 1; MALLOC_CHECK(pids) break; } case 'r': /* #else generate key ranges for delete */ if (children != 1 && step < 0) gen_rng = 1; { break; fprintf(stderr, "ERROR: -C must be accompanied case 's': /* by -S on this platform\n"); calibrate the RNG usage */ exit(1); set_seeds = 1; } break; #endif /* DOS */ case 'v': /* validate the data set */ return; validate = 1; } break; default: /* fprintf (stderr, "Unknown * MAIN option name %s\n", * optarg); * assumes the existance of getopt() to clean up the command usage (); * line handling exit (1); */ } int break; main (int ac, char **av) case 'D': { /* direct load of generated data */ DSS_HUGE i; direct = 1; break; table = (1 << CUST) | case 'F': (1 << SUPP) | /* generate flat files for later loading */ (1 << NATION) | direct = 0; (1 << REGION) | break; (1 << PART_PSUPP) | case 'U': (1 << ORDER_LINE); /* generate flat files for update stream */ force = 0; updates = atoi (optarg); insert_segments=0; break; delete_segments=0; HP TPC-H FULL DISCLOSURE REPORT 579 © 2005 Hewlett-Packard Company. All rights reserved. insert_orders_segment=0; /* insert_lineitem_segment=0; * adjust RNG for any prior update delete_segment=0; generation verbose = 0; */ columnar = 0; sd_order(0, rowcnt * (step - 1)); set_seeds = 0; sd_line(0, rowcnt * (step - 1)); header = 0; upd_num = step - 1; direct = 0; } scale = 1; else flt_scale = 1.0; upd_num = 0; updates = 0; refresh = UPD_PCT; while (upd_num < updates) step = -1; { tdefs[ORDER].base *= if (verbose > 0) ORDERS_PER_CUST; fprintf (stderr, /* have to do this after init */ "Generating update pair tdefs[LINE].base *= #%d for %s [pid: %d]", ORDERS_PER_CUST; upd_num + 1, /* have to do this after init */ tdefs[ORDER_LINE].comment, DSS_PROC); tdefs[ORDER_LINE].base *= insert_orders_segment=0; ORDERS_PER_CUST; insert_lineitem_segment=0; /* have to do this after init */ delete_segment=0; fnames = 0; minrow = upd_num * rowcnt + 1; db_name = NULL; gen_tbl (ORDER_LINE, minrow, gen_sql = 0; rowcnt, upd_num + 1); gen_rng = 0; if (verbose > 0) children = 1; fprintf (stderr, "done.\n"); d_path = NULL; pr_drange (ORDER_LINE, minrow, rowcnt, upd_num + 1); #ifdef NO_SUPPORT upd_num++; signal (SIGINT, exit); } #endif /* NO_SUPPORT */ process_options (ac, av); exit (0); #if (defined(WIN32)&&!defined(_POSIX_)) } for (i = 0; i < ac; i++) { /** spawn_args[i] = malloc ((strlen (av[i]) + 1) * ** actual data generation section starts here sizeof (char)); **/ MALLOC_CHECK (spawn_args[i]); /* strcpy (spawn_args[i], av[i]); * open database connection or set all the file names, as appropriate } */ spawn_args[ac] = NULL; if (direct) #endif prep_direct ((db_name) ? db_name : DBNAME); else if (fnames) if (verbose >= 0) for (i = PART; i <= REGION; i++) { { fprintf (stderr, if (table & (1 << i)) "%s Population Generator (Version if (set_files ((int)i, -1)) %d.%d.%d%s)\n", { NAME, VERSION, RELEASE, fprintf (stderr, MODIFICATION, PATCH); "Load aborted!\n"); fprintf (stderr, "Copyright %s %s\n", TPC, exit (1); C_DATES); } } }

load_dists (); /* /* have to do this after init */ * traverse the tables, invoking the appropriate data generation routine tdefs[NATION].base = nations.count; for any to be built tdefs[REGION].base = regions.count; */ for (i = PART; i <= REGION; i++) /* if (table & (1 << i)) * updates are never parallelized { */ if (children > 1 && i < NATION) if (updates) if (step >= 0) { { /* if (validate) * set RNG to start generating rows beyond { SF=scale */ INTERNAL_ERROR("Cannot validate parallel data set_state (ORDER, scale, children, children + 1, generation"); &i); } rowcnt = (int)(tdefs[ORDER_LINE].base / 10000 else * scale * refresh); if (step > 0) partial ((int)i, step); { } HP TPC-H FULL DISCLOSURE REPORT 580 © 2005 Hewlett-Packard Company. All rights reserved. #ifdef DOS else else { rowcnt = tdefs[i].base; fprintf (stderr, if (verbose > 0)

"P arallel load is not supported on your platform.\n") ; fprintf (stderr, "%s data for %s [pid: %ld]", exit (1); } (validate)?"Validating":"Generating", tdefs[i].comment, #else DSS_PROC); else gen_tbl ((int)i, { minrow, rowcnt, upd_num); if (validate) if (verbose > 0) { fprintf (stderr, "done.\n"); INTERNAL_ERROR("Cannot validate parallel data } generation"); if (validate) } else printf("Validation checksum for %s at %d GB: %0x\n", pload ((int)i); tdefs[i].name, scale, tdefs[i].vtotal); } } #endif /* DOS */ else if (direct) { close_direct (); minrow = 1; if (i < NATION) return (0); } rowcnt = tdefs[i].base * scale; qgen.c

/* int process_options PROTO((int cnt, char **args)); * $Id: qgen.c,v 1.1.1.1 2003/04/03 18:54:21 jms Exp $ int setup PROTO((void)); * void qsub PROTO((char *qtag, int flags)); * Revision History * ======* $Log: qgen.c,v $ * Revision 1.1.1.1 2003/04/03 18:54:21 jms extern char *optarg; * recreation after CVS crash extern int optind; * char **mk_ascdate(void); * Revision 1.1.1.1 2003/04/03 18:54:21 jms extern seed_t Seed[]; * initial checkin * char **asc_date; * int snum = -1; */ char *prog; /* tdef tdefs = { NULL }; * qgen.c -- routines to convert query templates to executable query long rndm; * text for TPC-H and TPC-R double flt_scale; */ distribution q13a, q13b; #define DECLARER int qnum;

#include #include /* #if (defined(_POSIX_)||!defined(WIN32)) * FUNCTION strip_comments(line) #include * #else * remove all comments from 'line'; recognizes both {} and -- comments #include "process.h" */ #endif /* WIN32 */ int #include strip_comments(char *line) #include { #include "config.h" static int in_comment = 0; #include "dss.h" char *cp1, *cp2; #include "tpcd.h" #include "permute.h" cp1 = line;

while (1) /* traverse the entire string */ #define LINE_SIZE 512 { if (in_comment) /* { * Function Protoypes if ((cp2 = strchr(cp1, '}')) != NULL) /* comment ends */ */ { void varsub PROTO((int qnum, int vnum, int flags)); strcpy(cp1, cp2 + 1); int strip_comments PROTO((char *line)); in_comment = 0; void usage PROTO((void)); continue; HP TPC-H FULL DISCLOSURE REPORT 581 © 2005 Hewlett-Packard Company. All rights reserved. } else rowcnt = rowcnt_dflt[qnum]; { varsub(qnum, 0, flags); /* set the variables */ *cp1 = '\0'; if (flags & DFLT_NUM) break; fprintf(ofp, SET_ROWCOUNT, rowcnt); } while (fgets(line, BUFSIZ, qfp) != NULL) } { else /* not in_comment */ if (!(flags & COMMENT)) { strip_comments(line); if ((cp2 = strchr(cp1, '-')) != NULL) mark = line; { while ((cptr = strchr(mark, VTAG)) != NULL) if (*(cp2 + 1) == '-') /* found a '--' comment */ { { *cptr = '\0'; *cp2 = '\0'; cptr++; break; fprintf(ofp,"%s", mark); } switch(*cptr) } { if ((cp2 = strchr(cp1, '{')) != NULL) /* comment starts */ case 'b': { case 'B': in_comment = 1; if (!(flags & ANSI)) *cp2 = ' '; fprintf(ofp,"%s\n", START_TRAN); continue; cptr++; } break; else break; case 'c': } case 'C': } if (flags & DBASE) return(0); fprintf(ofp, SET_DBASE, db_name); } cptr++; break; /* case 'e': * FUNCTION qsub(char *qtag, int flags) case 'E': * if (!(flags & ANSI)) * based on the settings of flags, and the template file $QDIR/qtag.sql fprintf(ofp,"%s\n", END_TRAN); * make the following substitutions to turn a query template into EQT cptr++; * break; * String Converted to Based on case 'n': * ======case 'N': * first line database ; -n from command line if (!(flags & DFLT_NUM)) * second line set explain on; -x from command line { * : parameter rowcnt=atoi(++cptr); * :k set number while (isdigit(*cptr) || *cptr == ' ') cptr++; * :o output to outpath/qnum.snum fprintf(ofp, SET_ROWCOUNT, rowcnt); * -o from command line, SET_OUTPUT } * :s stream number continue; * :b BEGIN WORK; -a from command line, case 'o': START_TRAN case 'O': * :e COMMIT WORK; -a from command line, if (flags & OUTPUT) END_TRAN fprintf(ofp,"%s '%s/%s.%d'", SET_OUTPUT, osuff, * :q query number qtag, (snum < 0)?0:snum); * :n sets rowcount to be returned cptr++; */ break; void case 'q': qsub(char *qtag, int flags) case 'Q': { fprintf(ofp,"%s", qtag); static char *line = NULL, cptr++; *qpath = NULL; break; FILE *qfp; case 's': char *cptr, case 'S': *mark, fprintf(ofp,"%d", (snum < 0)?0:snum); *qroot = NULL; cptr++; break; qnum = atoi(qtag); case 'X': if (line == NULL) case 'x': { if (flags & EXPLAIN) line = malloc(BUFSIZ); fprintf(ofp, "%s\n", GEN_QUERY_PLAN); qpath = malloc(BUFSIZ); cptr++; MALLOC_CHECK(line); break; MALLOC_CHECK(qpath); case '1': } case '2': case '3': qroot = env_config(QDIR_TAG, QDIR_DFLT); case '4': sprintf(qpath, "%s%c%s.sql", case '5': qroot, PATH_SEP, qtag); case '6': qfp = fopen(qpath, "r"); case '7': OPEN_CHECK(qfp, qpath); case '8': HP TPC-H FULL DISCLOSURE REPORT 582 © 2005 Hewlett-Packard Company. All rights reserved. case '9': exit(0); varsub(qnum, atoi(cptr), flags & DFLT); break; while (isdigit(*++cptr)); case 'i': /* set stream initialization file name */ break; ifile = malloc(strlen(optarg) + 1); default: MALLOC_CHECK(ifile); fprintf(stderr, "-- unknown flag '%c%c' strcpy(ifile, optarg); ignored\n", flags |= INIT; VTAG, *cptr); break; cptr++; case 'l': /* log parameter usages */ break; lfile = malloc(strlen(optarg) + 1); } MALLOC_CHECK(lfile); mark=cptr; strcpy(lfile, optarg); } flags |= LOG; fprintf(ofp,"%s", mark); break; } case 'N': /* use default rowcounts */ fclose(qfp); flags |= DFLT_NUM; fflush(stdout); break; return; case 'n': /* set database name */ } db_name = malloc(strlen(optarg) + 1); MALLOC_CHECK(db_name); void strcpy(db_name, optarg); usage(void) flags |= DBASE; { break; printf("%s Parameter Substitution (v. %d.%d.%d%s)\n", case 'o': /* set the output path */ NAME, VERSION,RELEASE, osuff = malloc(strlen(optarg) + 1); MODIFICATION,PATCH); MALLOC_CHECK(osuff); printf("Copyright %s %s\n", TPC, C_DATES); strcpy(osuff, optarg); printf("USAGE: %s [ queries ]\n", prog); flags |=OUTPUT; printf("Options:\n"); break; printf("\t-a\t\t-- use ANSI semantics.\n"); case 'p': /* permutation for a given stream */ printf("\t-b \t-- load distributions from \n"); snum = atoi(optarg); printf("\t-c\t\t-- retain comments found in template.\n"); break; printf("\t-d\t\t-- use default substitution values.\n"); case 'r': /* set random number seed for parameter gen */ printf("\t-h\t\t-- print this usage summary.\n") ; flags |= SEED; printf("\t-i \t-- use the contents of file to begin a query.\n"); rndm = atol(optarg); printf("\t-l \t-- log parameters to .\n") ; break; printf("\t-n \t-- connect to database .\n"); case 's': /* scale of data set to run against */ printf("\t-N\t\t-- use default rowcounts and ignore :n directive.\n"); flt_scale = atof(optarg); printf("\t-o \t-- set the output file base path to .\n") ; /* printf("\t-p \t\t-- use the query permutation for stream \n"); if (scale > MAX_SCALE) printf("\t-r \t\t-- seed the random number generator with \n"); fprintf(stderr, printf("\t-s \t\t-- base substitutions on an SF of \n") ; "%s %5.0f %s\n%s\n", printf("\t-v\t\t-- verbose.\n"); printf("\t-t \t-- use the contents of file to complete a "WARNING: Support for scale factors >", query\n"); printf("\t-x\t\t-- enable SET EXPLAIN in each query.\n"); MAX_SCALE, } "GB is still in development.", int process_options(int cnt, char **args) "Data set integrity is not guaranteed.\n"); { */ int flag; break; case 't': /* set termination file name */ while((flag = getopt(cnt, args, "ab:cdhi:n:Nl:o:p:r:s:t:vx")) != -1) tfile = malloc(strlen(optarg) + 1); switch(flag) MALLOC_CHECK(tfile); { strcpy(tfile, optarg); case 'a': /* use ANSI semantics */ flags |= TERMINATE; flags |= ANSI; break; break; case 'v': /* verbose */ case 'b': /* load distributions flags |= VERBOSE; from named file */ break; d_path = (char case 'x': /* set explain in the queries */ *)malloc(strlen(optarg) + 1); flags |= EXPLAIN; break; MALLOC_CHECK(d_path); default: strcpy(d_path, optarg); printf("unknown option '%s' ignored\n", args[optind]); break; usage(); case 'c': /* retain comments in EQT */ exit(1); flags |= COMMENT; break; break; } case 'd': /* use default substitution values */ return(0); flags |= DFLT; } break; case 'h': /* just generate the usage summary */ int usage(); setup(void) HP TPC-H FULL DISCLOSURE REPORT 583 © 2005 Hewlett-Packard Company. All rights reserved. { Seed[0].value = rndm; asc_date = mk_ascdate(); for (i=1; i <= QUERIES_PER_SET; i++) read_dist(env_config(DIST_TAG, DIST_DFLT), "p_cntr", { &p_cntr_set); Seed[0].value = read_dist(env_config(DIST_TAG, DIST_DFLT), "colors", &colors); NextRand(Seed[0].value); read_dist(env_config(DIST_TAG, DIST_DFLT), "p_types", Seed[i].value = Seed[0].value; &p_types_set); } read_dist(env_config(DIST_TAG, DIST_DFLT), "nations", printf("-- using %ld as a seed to the RNG\n", &nations); rndm); read_dist(env_config(DIST_TAG, DIST_DFLT), "nations2", } &nations2); else read_dist(env_config(DIST_TAG, DIST_DFLT), "regions", printf("-- using default substitutions\n"); ®ions); read_dist(env_config(DIST_TAG, DIST_DFLT), "o_oprio", if (flags & INIT) /* init stream with ifile */ &o_priority_set); { read_dist(env_config(DIST_TAG, DIST_DFLT), "instruct", ifp = fopen(ifile, "r"); &l_instruct_set); OPEN_CHECK(ifp, ifile); read_dist(env_config(DIST_TAG, DIST_DFLT), "smode", while (fgets(line, LINE_SIZE, ifp) != NULL) &l_smode_set); fprintf(stdout, "%s", line); read_dist(env_config(DIST_TAG, DIST_DFLT), "category", } &l_category_set); read_dist(env_config(DIST_TAG, DIST_DFLT), "rflag", if (snum >= 0) &l_rflag_set); if (optind < ac) read_dist(env_config(DIST_TAG, DIST_DFLT), "msegmnt", for (i=optind; i < ac; i++) &c_mseg_set); { read_dist(env_config(DIST_TAG, DIST_DFLT), "Q13a", char qname[10]; &q13a); sprintf(qname, "%d", SEQUENCE(snum, atoi(av[i]))); read_dist(env_config(DIST_TAG, DIST_DFLT), "Q13b", qsub(qname, flags); &q13b); } else return(0); for (i=1; i <= QUERIES_PER_SET; i++) } { char qname[10]; sprintf(qname, "%d", SEQUENCE(snum, i)); main(int ac, char **av) qsub(qname, flags); { } int i; else FILE *ifp; if (optind < ac) char line[LINE_SIZE]; for (i=optind; i < ac; i++) qsub(av[i], flags); prog = av[0]; else flt_scale = (double)1.0; for (i=1; i <= QUERIES_PER_SET; i++) flags = 0; { d_path = NULL; char qname[10]; process_options(ac, av); sprintf(qname, "%d", i); if (flags & VERBOSE) qsub(qname, flags); fprintf(ofp, } "-- TPC %s Parameter Substitution (Version %d.%d.%d%s)\n", if (flags & TERMINATE) /* terminate stream with tfile */ NAME, VERSION, RELEASE, MODIFICATION, PATCH); { ifp = fopen(tfile, "r"); setup(); if (ifp == NULL) OPEN_CHECK(ifp, tfile); if (!(flags & DFLT)) /* perturb the RNG */ while (fgets(line, LINE_SIZE, ifp) != NULL) { fprintf(stdout, "%s", line); if (!(flags & SEED)) } rndm = (long)((unsigned)time(NULL) * DSS_PROC); if (rndm < 0) return(0); rndm += 2147483647; }

HP TPC-H FULL DISCLOSURE REPORT 584 © 2005 Hewlett-Packard Company. All rights reserved. Appendix H: Price Quotations

Microsoft Corporation Tel 425 882 8080 One Microsoft Way Fax 425 936 7329 Redmond, WA 98052-6399 http://www.microsoft.com/ Microsoft

November 1, 2005 Hewlett-Packard Company Gunter Zink One Microsoft Way Redmond, WA 98052

Mr. Zink:

Here is the information you requested regarding pricing for several Microsoft products to be used in conjunction with your TPC-H benchmark testing.

All pricing shown is in US Dollars ($). Part Description Unit Price Quantity Price Number

SQL Server 2005 Enterprise Itanium Edition Server License with 25 CALs 810-04794 Discount Schedule: Open Program - No Level $8,487 1 $8,487 Unit Price reflects a 39% discount from the retail unit price of $13,969.

SQL Server 2005 Client License Discount Schedule: Open Program - No Level 359-01911 $156 45 $7,020 Unit Price reflects a 4% discount from the retail unit price of $163.

Visual C++ Standard Edition 254-00170 $109 1 $109 No Discounts Applied

Visual Basic 2003 .Net Professional 046-00856 $109 1 $109 No Discounts Applied

Microsoft Problem Resolution Services N/A $245 1 $245 Professional Support (1 Incident)

Some products may not be currently orderable but will be available through Microsoft's normal distribution channels by November 7, 2005.

Defect support is included in the purchase price. Additional support is available from Microsoft PSS on an incident by incident basis at $245 per call.

This quote is valid for the next 90 days.

If we can be of any further assistance, please contact Jamie Reding at (425) 703-0510 or [email protected].

Reference ID: PHguzi0501118344. Please include this Reference ID in any correspondence regarding this price quote.

HP TPC-H FULL DISCLOSURE REPORT 585 © 2005 Hewlett-Packard Company. All rights reserved. HP Integrity Superdome Report Date: November 7 2005

HP Superdome 32-way cabinet A5201A, Opt. 429 $236,716 1 $236,716 Superdome 32 way add-on cabinet A5202A, Opt. 006 $251,200 1 $251,200 IPF Superdome Cell Board (sx1000) A6866A $19,200 16 $307,200 HP 12 Slot PCI-X Chassis for sx1000 A6864A $16,805 8 $134,440 3 Year Svc & Support Price (Hardware and Software) 1 $535,718 HP Superdome Itanium2 1.6 GHz 9M 2 CPU AD003A $41,800 16 $668,800 Superdome 128GB Memory Pack AB547A $282,880 2 $565,760 I/O chassis enclosure for PCI chassis A5862A $25,725 4 $102,900 Graphite I/O expansion power subsystem A5861D $34,860 2 $69,720 12 Slot PCI-X Chassis for rack system E A6864AZ $16,805 8 $134,440 HP ProCurve Switch2124 J4868A $279 1 $279 $212 Core I/O card A6865A $1,045 1 $1,045 HP Superdome Rack System Mgmt. Station A9802B $6,500 1 $6,500 1U RackMT Display/Keyboard/Mouse AB243AZ $3,046 1 $3,046 1000Base-T Gigabit Eth Adp A7061A $270 2 $540 FC-HBA 2GB, 1 Channel AB467A $1,520 2 $3,040 HP Smart Array Controller 6402 (incl. boot) A9890A $1,669 49 $81,781 HP Dual Channel U320 SCSI Adapter A7173 $795 1 $795 36GB, 15krpm Ultra3 Wide disk 286776-B22 $299 679 $203,021 36GB, 15krpm Ultra3 Wide disk 10% spares 286776-B22 $299 68 $20,332 Storageworks MSA30 SB (incl boot) 302969-B21 $2,829 49 $138,621 Storageworks MSA30 SB 10% spares 302969-B21 $2,829 5 $14,145 SW 4000 39FT Cable All 150214-B21 $114 49 $5,586 HP Rack System / E, 41U A4902D $1,910 6 $11,460 Rear Door for 41U rack A5213DZ $334 6 $2,004 4 Bay Rack Support HA1103A Opt 6EC $1,558 1 $1,558 PDCA Redundant Power Source A5800A $578 2 $1,156 HP Power Distribution Unit 200-240V / Opt. AW4 A5137AZ $239 21 $5,019 Modular Storage Array 1000 201723-B22 $6,995 1 $6,995 MSA1000 controller 218231-B22 $4,290 1 $4,290 MSA1000 Fibre Channel I/O Module 218960-B21 $375 1 $375 Storage MAS1000 Support 3yrs 24x7 4hr incl disks HA110A3 #6FG $3,222 1 $3,222 146GB, 10krpm U320 disk 286716-B22 $499 8 $3,992 5M LC to LC Cable Kit 221692-B22 $82 4 $328 SCSI Cable 10m VHDTS68 / HDTS68 Multimd C2363B $335 1 $335 SCSI Terminator LVD/SE HDTS68 Multimd C2364A $100 1 $100 HP C13/C14 Jumper Cord 2.5M E7742A $25 1 $25 5300 Tape Array C7508AZ $1,045 1 $1,045 DVD Rom drive Q1592A $649 1 $649 Server Subtotal $2,987,680 $540,710

HP TPC-H FULL DISCLOSURE REPORT 586 © 2005 Hewlett-Packard Company. All rights reserved. HP Integrity Superdome Report Date: November 07 2005

3 Yr Part Unit Extended Description Qty. Maint Number Price Price Price Microsoft Windows Server 2003 DC Edition 64-bit Service Pack 1 T2372A opt032 $64,000 1 $64,000 Server Software Subtotal $64,000 Total Extended Price $3,592,390 HP's Large Configuration Discount * Total Discounts $1,281,904

* All discounts are based on US list prices and for 3 year cost of ownership: $2,310,487 similar quantities and configurations. An approximate 35.68 % discount was based on the overall specific components and support pricing from vendor 1 in this single quotation. Discounts for similarly sized configurations will be similar to those quoted here, but may vary based on the components in the configuration.

Sales contact: HP Sales Development, 19111 Pruneridge Ave., Cupertino, CA 95014 (408) 447 2320

HP TPC-H FULL DISCLOSURE REPORT 587 © 2005 Hewlett-Packard Company. All rights reserved.