github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/workload/tpcds/tpcds.go (about) 1 // Copyright 2019 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package tpcds 12 13 import ( 14 "context" 15 gosql "database/sql" 16 "fmt" 17 "strconv" 18 "strings" 19 "time" 20 21 "github.com/cockroachdb/cockroach/pkg/util/log" 22 "github.com/cockroachdb/cockroach/pkg/util/timeutil" 23 "github.com/cockroachdb/cockroach/pkg/workload" 24 "github.com/cockroachdb/cockroach/pkg/workload/histogram" 25 "github.com/cockroachdb/errors" 26 "github.com/spf13/pflag" 27 ) 28 29 type tpcds struct { 30 flags workload.Flags 31 connFlags *workload.ConnFlags 32 33 queriesToRunRaw string 34 queriesToOmitRaw string 35 queryTimeLimit time.Duration 36 selectedQueries []int 37 vectorize string 38 } 39 40 func init() { 41 workload.Register(tpcdsMeta) 42 } 43 44 var tpcdsMeta = workload.Meta{ 45 Name: `tpcds`, 46 Description: `TPC-DS is a read-only workload of "decision support" queries on large datasets.`, 47 Version: `1.0.0`, 48 New: func() workload.Generator { 49 g := &tpcds{} 50 g.flags.FlagSet = pflag.NewFlagSet(`tpcds`, pflag.ContinueOnError) 51 g.flags.Meta = map[string]workload.FlagMeta{ 52 `queries-to-omit`: {RuntimeOnly: true}, 53 `queries-to-run`: {RuntimeOnly: true}, 54 `query-time-limit`: {RuntimeOnly: true}, 55 `vectorize`: {RuntimeOnly: true}, 56 } 57 58 // NOTE: we're skipping queries 27, 36, 70, and 86 by default at the moment 59 // because they require some modifications. 60 g.flags.StringVar(&g.queriesToOmitRaw, `queries-to-omit`, 61 `27,36,70,86`, 62 `Queries not to run (i.e. all others will be run). Use a comma separated list of query numbers`) 63 g.flags.StringVar(&g.queriesToRunRaw, `queries`, 64 ``, 65 `Queries to run. Use a comma separated list of query numbers. If omitted, all queries are run. `+ 66 `Note that --queries-to-omit flag has a higher precedence`) 67 g.flags.DurationVar(&g.queryTimeLimit, `query-time-limit`, 5*time.Minute, 68 `Time limit for a single run of a query`) 69 g.flags.StringVar(&g.vectorize, `vectorize`, `on`, 70 `Set vectorize session variable`) 71 g.connFlags = workload.NewConnFlags(&g.flags) 72 return g 73 }, 74 } 75 76 // Meta implements the Generator interface. 77 func (*tpcds) Meta() workload.Meta { return tpcdsMeta } 78 79 // Flags implements the Flagser interface. 80 func (w *tpcds) Flags() workload.Flags { return w.flags } 81 82 // Hooks implements the Hookser interface. 83 func (w *tpcds) Hooks() workload.Hooks { 84 return workload.Hooks{ 85 Validate: func() error { 86 if w.queryTimeLimit <= 0 { 87 return errors.Errorf("non-positive query time limit was set: %s", w.queryTimeLimit) 88 } 89 skipQuery := make([]bool, NumQueries+1) 90 for _, queryName := range strings.Split(w.queriesToOmitRaw, `,`) { 91 queryNum, err := strconv.Atoi(queryName) 92 if err != nil { 93 return err 94 } 95 if queryNum < 1 || queryNum > NumQueries { 96 return errors.Errorf("unknown query %d (only queries in range [1, %d] are supported)", 97 queryNum, NumQueries) 98 } 99 skipQuery[queryNum] = true 100 } 101 if w.queriesToRunRaw != `` { 102 for _, queryName := range strings.Split(w.queriesToRunRaw, `,`) { 103 queryNum, err := strconv.Atoi(queryName) 104 if err != nil { 105 return err 106 } 107 if _, ok := QueriesByNumber[queryNum]; !ok { 108 return errors.Errorf(`unknown query: %s (probably, the query needs modifications, `+ 109 `so it is disabled for now)`, queryName) 110 } 111 if !skipQuery[queryNum] { 112 w.selectedQueries = append(w.selectedQueries, queryNum) 113 } 114 } 115 return nil 116 } 117 for queryNum := 1; queryNum <= NumQueries; queryNum++ { 118 if !skipQuery[queryNum] { 119 w.selectedQueries = append(w.selectedQueries, queryNum) 120 } 121 } 122 return nil 123 }, 124 } 125 } 126 127 // Tables implements the Generator interface. 128 func (w *tpcds) Tables() []workload.Table { 129 // Note: we specify InitialRows for the Tables with non-zero count of tuples 130 // so that `workload init` returns an error that tpcds doesn't support init. 131 return []workload.Table{ 132 { 133 Name: `call_center`, 134 Schema: tpcdsCallCenterSchema, 135 InitialRows: workload.Tuples(-1, nil), 136 }, 137 { 138 Name: `catalog_page`, 139 Schema: tpcdsCatalogPageSchema, 140 InitialRows: workload.Tuples(-1, nil), 141 }, 142 { 143 Name: `catalog_returns`, 144 Schema: tpcdsCatalogReturnsSchema, 145 InitialRows: workload.Tuples(-1, nil), 146 }, 147 { 148 Name: `catalog_sales`, 149 Schema: tpcdsCatalogSalesSchema, 150 InitialRows: workload.Tuples(-1, nil), 151 }, 152 { 153 Name: `customer`, 154 Schema: tpcdsCustomerSchema, 155 InitialRows: workload.Tuples(-1, nil), 156 }, 157 { 158 Name: `customer_address`, 159 Schema: tpcdsCustomerAddressSchema, 160 InitialRows: workload.Tuples(-1, nil), 161 }, 162 { 163 Name: `customer_demographics`, 164 Schema: tpcdsCustomerDemographicsSchema, 165 InitialRows: workload.Tuples(-1, nil), 166 }, 167 { 168 Name: `date_dim`, 169 Schema: tpcdsDateDimSchema, 170 InitialRows: workload.Tuples(-1, nil), 171 }, 172 { 173 Name: `dbgen_version`, 174 Schema: tpcdsDbgenVersionSchema, 175 InitialRows: workload.Tuples(-1, nil), 176 }, 177 { 178 Name: `household_demographics`, 179 Schema: tpcdsHouseholdDemographicsSchema, 180 InitialRows: workload.Tuples(-1, nil), 181 }, 182 { 183 Name: `income_band`, 184 Schema: tpcdsIncomeBandSchema, 185 InitialRows: workload.Tuples(-1, nil), 186 }, 187 { 188 Name: `inventory`, 189 Schema: tpcdsInventorySchema, 190 InitialRows: workload.Tuples(-1, nil), 191 }, 192 { 193 Name: `item`, 194 Schema: tpcdsItemSchema, 195 InitialRows: workload.Tuples(-1, nil), 196 }, 197 { 198 Name: `promotion`, 199 Schema: tpcdsPromotionSchema, 200 InitialRows: workload.Tuples(-1, nil), 201 }, 202 { 203 Name: `reason`, 204 Schema: tpcdsReasonSchema, 205 InitialRows: workload.Tuples(-1, nil), 206 }, 207 { 208 Name: `ship_mode`, 209 Schema: tpcdsShipModeSchema, 210 InitialRows: workload.Tuples(-1, nil), 211 }, 212 { 213 Name: `store`, 214 Schema: tpcdsStoreSchema, 215 InitialRows: workload.Tuples(-1, nil), 216 }, 217 { 218 Name: `store_returns`, 219 Schema: tpcdsStoreReturnsSchema, 220 InitialRows: workload.Tuples(-1, nil), 221 }, 222 { 223 Name: `store_sales`, 224 Schema: tpcdsStoreSalesSchema, 225 InitialRows: workload.Tuples(-1, nil), 226 }, 227 { 228 Name: `time_dim`, 229 Schema: tpcdsTimeDimSchema, 230 InitialRows: workload.Tuples(-1, nil), 231 }, 232 { 233 Name: `warehouse`, 234 Schema: tpcdsWarehouseSchema, 235 InitialRows: workload.Tuples(-1, nil), 236 }, 237 { 238 Name: `web_page`, 239 Schema: tpcdsWebPageSchema, 240 InitialRows: workload.Tuples(-1, nil), 241 }, 242 { 243 Name: `web_returns`, 244 Schema: tpcdsWebReturnsSchema, 245 InitialRows: workload.Tuples(-1, nil), 246 }, 247 { 248 Name: `web_sales`, 249 Schema: tpcdsWebSalesSchema, 250 InitialRows: workload.Tuples(-1, nil), 251 }, 252 { 253 Name: `web_site`, 254 Schema: tpcdsWebSiteSchema, 255 InitialRows: workload.Tuples(-1, nil), 256 }, 257 } 258 } 259 260 // Ops implements the Opser interface. 261 func (w *tpcds) Ops(urls []string, reg *histogram.Registry) (workload.QueryLoad, error) { 262 sqlDatabase, err := workload.SanitizeUrls(w, w.connFlags.DBOverride, urls) 263 if err != nil { 264 return workload.QueryLoad{}, err 265 } 266 db, err := gosql.Open(`cockroach`, strings.Join(urls, ` `)) 267 if err != nil { 268 return workload.QueryLoad{}, err 269 } 270 // Allow a maximum of concurrency+1 connections to the database. 271 db.SetMaxOpenConns(w.connFlags.Concurrency + 1) 272 db.SetMaxIdleConns(w.connFlags.Concurrency + 1) 273 274 ql := workload.QueryLoad{SQLDatabase: sqlDatabase} 275 for i := 0; i < w.connFlags.Concurrency; i++ { 276 worker := &worker{ 277 config: w, 278 db: db, 279 } 280 ql.WorkerFns = append(ql.WorkerFns, worker.run) 281 } 282 return ql, nil 283 } 284 285 type worker struct { 286 config *tpcds 287 db *gosql.DB 288 ops int 289 } 290 291 func (w *worker) run(ctx context.Context) error { 292 queryNum := w.config.selectedQueries[w.ops%len(w.config.selectedQueries)] 293 w.ops++ 294 295 prep := fmt.Sprintf("SET statement_timeout='%s'; SET vectorize=%s;", 296 w.config.queryTimeLimit, w.config.vectorize) 297 _, err := w.db.Exec(prep) 298 if err != nil { 299 return err 300 } 301 query := QueriesByNumber[queryNum] 302 303 var rows *gosql.Rows 304 start := timeutil.Now() 305 err = func() error { 306 done := make(chan error, 1) 307 go func(context.Context) { 308 var err error 309 rows, err = w.db.Query(query) 310 done <- err 311 }(ctx) 312 select { 313 case <-time.After(w.config.queryTimeLimit * 2): 314 return errors.Errorf("[q%d] timed out, but did not cancel execution", queryNum) 315 case err := <-done: 316 return err 317 } 318 }() 319 if rows != nil { 320 defer rows.Close() 321 } 322 if err != nil { 323 log.Infof(ctx, "[q%d] error: %s", queryNum, err) 324 return err 325 } 326 var numRows int 327 for rows.Next() { 328 numRows++ 329 } 330 if err := rows.Err(); err != nil { 331 log.Infof(ctx, "[q%d] error: %s", queryNum, err) 332 return err 333 } 334 elapsed := timeutil.Since(start) 335 // TODO(yuzefovich): at the moment, we're not printing out the histograms 336 // since that would just be too much noise; however, having the percentiles 337 // in the output would also be useful. 338 log.Infof(ctx, "[q%d] returned %d rows after %.2f seconds", 339 queryNum, numRows, elapsed.Seconds()) 340 return nil 341 } 342 343 const ( 344 tpcdsDbgenVersionSchema = `( 345 dv_version VARCHAR(16), 346 dv_create_date DATE, 347 dv_create_time TIME, 348 dv_cmdline_args VARCHAR(200) 349 )` 350 351 tpcdsCustomerAddressSchema = `( 352 ca_address_sk INT8 NOT NULL, 353 ca_address_id CHAR(16) NOT NULL, 354 ca_street_number CHAR(10), 355 ca_street_name VARCHAR(60), 356 ca_street_type CHAR(15), 357 ca_suite_number CHAR(10), 358 ca_city VARCHAR(60), 359 ca_county VARCHAR(30), 360 ca_state CHAR(2), 361 ca_zip CHAR(10), 362 ca_country VARCHAR(20), 363 ca_gmt_offset DECIMAL(5,2), 364 ca_location_type CHAR(20), 365 PRIMARY KEY (ca_address_sk) 366 )` 367 368 tpcdsCustomerDemographicsSchema = `( 369 cd_demo_sk INT8 NOT NULL, 370 cd_gender CHAR, 371 cd_marital_status CHAR, 372 cd_education_status CHAR(20), 373 cd_purchase_estimate INT8, 374 cd_credit_rating CHAR(10), 375 cd_dep_count INT8, 376 cd_dep_employed_count INT8, 377 cd_dep_college_count INT8, 378 PRIMARY KEY (cd_demo_sk) 379 )` 380 381 tpcdsDateDimSchema = `( 382 d_date_sk INT8 NOT NULL, 383 d_date_id CHAR(16) NOT NULL, 384 d_date DATE, 385 d_month_seq INT8, 386 d_week_seq INT8, 387 d_quarter_seq INT8, 388 d_year INT8, 389 d_dow INT8, 390 d_moy INT8, 391 d_dom INT8, 392 d_qoy INT8, 393 d_fy_year INT8, 394 d_fy_quarter_seq INT8, 395 d_fy_week_seq INT8, 396 d_day_name CHAR(9), 397 d_quarter_name CHAR(6), 398 d_holiday CHAR, 399 d_weekend CHAR, 400 d_following_holiday CHAR, 401 d_first_dom INT8, 402 d_last_dom INT8, 403 d_same_day_ly INT8, 404 d_same_day_lq INT8, 405 d_current_day CHAR, 406 d_current_week CHAR, 407 d_current_month CHAR, 408 d_current_quarter CHAR, 409 d_current_year CHAR, 410 PRIMARY KEY (d_date_sk) 411 )` 412 413 tpcdsWarehouseSchema = `( 414 w_warehouse_sk INT8 NOT NULL, 415 w_warehouse_id CHAR(16) NOT NULL, 416 w_warehouse_name VARCHAR(20), 417 w_warehouse_sq_ft INT8, 418 w_street_number CHAR(10), 419 w_street_name VARCHAR(60), 420 w_street_type CHAR(15), 421 w_suite_number CHAR(10), 422 w_city VARCHAR(60), 423 w_county VARCHAR(30), 424 w_state CHAR(2), 425 w_zip CHAR(10), 426 w_country VARCHAR(20), 427 w_gmt_offset DECIMAL(5,2), 428 PRIMARY KEY (w_warehouse_sk) 429 )` 430 431 tpcdsShipModeSchema = `( 432 sm_ship_mode_sk INT8 NOT NULL, 433 sm_ship_mode_id CHAR(16) NOT NULL, 434 sm_type CHAR(30), 435 sm_code CHAR(10), 436 sm_carrier CHAR(20), 437 sm_contract CHAR(20), 438 PRIMARY KEY (sm_ship_mode_sk) 439 )` 440 441 tpcdsTimeDimSchema = `( 442 t_time_sk INT8 NOT NULL, 443 t_time_id CHAR(16) NOT NULL, 444 t_time INT8, 445 t_hour INT8, 446 t_minute INT8, 447 t_second INT8, 448 t_am_pm CHAR(2), 449 t_shift CHAR(20), 450 t_sub_shift CHAR(20), 451 t_meal_time CHAR(20), 452 PRIMARY KEY (t_time_sk) 453 )` 454 455 tpcdsReasonSchema = `( 456 r_reason_sk INT8 NOT NULL, 457 r_reason_id CHAR(16) NOT NULL, 458 r_reason_desc CHAR(100), 459 PRIMARY KEY (r_reason_sk) 460 )` 461 462 tpcdsIncomeBandSchema = `( 463 ib_income_band_sk INT8 NOT NULL, 464 ib_lower_bound INT8, 465 ib_upper_bound INT8, 466 PRIMARY KEY (ib_income_band_sk) 467 )` 468 469 tpcdsItemSchema = `( 470 i_item_sk INT8 NOT NULL, 471 i_item_id CHAR(16) NOT NULL, 472 i_rec_start_date DATE, 473 i_rec_end_date DATE, 474 i_item_desc VARCHAR(200), 475 i_current_price DECIMAL(7,2), 476 i_wholesale_cost DECIMAL(7,2), 477 i_brand_id INT8, 478 i_brand CHAR(50), 479 i_class_id INT8, 480 i_class CHAR(50), 481 i_category_id INT8, 482 i_category CHAR(50), 483 i_manufact_id INT8, 484 i_manufact CHAR(50), 485 i_size CHAR(20), 486 i_formulation CHAR(20), 487 i_color CHAR(20), 488 i_units CHAR(10), 489 i_container CHAR(10), 490 i_manager_id INT8, 491 i_product_name CHAR(50), 492 PRIMARY KEY (i_item_sk) 493 )` 494 495 tpcdsStoreSchema = `( 496 s_store_sk INT8 NOT NULL, 497 s_store_id CHAR(16) NOT NULL, 498 s_rec_start_date DATE, 499 s_rec_end_date DATE, 500 s_closed_date_sk INT8, 501 s_store_name VARCHAR(50), 502 s_number_employees INT8, 503 s_floor_space INT8, 504 s_hours CHAR(20), 505 s_manager VARCHAR(40), 506 s_market_id INT8, 507 s_geography_class VARCHAR(100), 508 s_market_desc VARCHAR(100), 509 s_market_manager VARCHAR(40), 510 s_division_id INT8, 511 s_division_name VARCHAR(50), 512 s_company_id INT8, 513 s_company_name VARCHAR(50), 514 s_street_number VARCHAR(10), 515 s_street_name VARCHAR(60), 516 s_street_type CHAR(15), 517 s_suite_number CHAR(10), 518 s_city VARCHAR(60), 519 s_county VARCHAR(30), 520 s_state CHAR(2), 521 s_zip CHAR(10), 522 s_country VARCHAR(20), 523 s_gmt_offset DECIMAL(5,2), 524 s_tax_precentage DECIMAL(5,2), 525 PRIMARY KEY (s_store_sk) 526 )` 527 528 tpcdsCallCenterSchema = `( 529 cc_call_center_sk INT8 NOT NULL, 530 cc_call_center_id CHAR(16) NOT NULL, 531 cc_rec_start_date DATE, 532 cc_rec_end_date DATE, 533 cc_closed_date_sk INT8, 534 cc_open_date_sk INT8, 535 cc_name VARCHAR(50), 536 cc_class VARCHAR(50), 537 cc_employees INT8, 538 cc_sq_ft INT8, 539 cc_hours CHAR(20), 540 cc_manager VARCHAR(40), 541 cc_mkt_id INT8, 542 cc_mkt_class CHAR(50), 543 cc_mkt_desc VARCHAR(100), 544 cc_market_manager VARCHAR(40), 545 cc_division INT8, 546 cc_division_name VARCHAR(50), 547 cc_company INT8, 548 cc_company_name CHAR(50), 549 cc_street_number CHAR(10), 550 cc_street_name VARCHAR(60), 551 cc_street_type CHAR(15), 552 cc_suite_number CHAR(10), 553 cc_city VARCHAR(60), 554 cc_county VARCHAR(30), 555 cc_state CHAR(2), 556 cc_zip CHAR(10), 557 cc_country VARCHAR(20), 558 cc_gmt_offset DECIMAL(5,2), 559 cc_tax_percentage DECIMAL(5,2), 560 PRIMARY KEY (cc_call_center_sk) 561 )` 562 563 tpcdsCustomerSchema = `( 564 c_customer_sk INT8 NOT NULL, 565 c_customer_id CHAR(16) NOT NULL, 566 c_current_cdemo_sk INT8, 567 c_current_hdemo_sk INT8, 568 c_current_addr_sk INT8, 569 c_first_shipto_date_sk INT8, 570 c_first_sales_date_sk INT8, 571 c_salutation CHAR(10), 572 c_first_name CHAR(20), 573 c_last_name CHAR(30), 574 c_preferred_cust_flag CHAR, 575 c_birth_day INT8, 576 c_birth_month INT8, 577 c_birth_year INT8, 578 c_birth_country VARCHAR(20), 579 c_login CHAR(13), 580 c_email_address CHAR(50), 581 c_last_review_date CHAR(10), 582 PRIMARY KEY (c_customer_sk) 583 )` 584 585 tpcdsWebSiteSchema = `( 586 web_site_sk INT8 NOT NULL, 587 web_site_id CHAR(16) NOT NULL, 588 web_rec_start_date DATE, 589 web_rec_end_date DATE, 590 web_name VARCHAR(50), 591 web_open_date_sk INT8, 592 web_close_date_sk INT8, 593 web_class VARCHAR(50), 594 web_manager VARCHAR(40), 595 web_mkt_id INT8, 596 web_mkt_class VARCHAR(50), 597 web_mkt_desc VARCHAR(100), 598 web_market_manager VARCHAR(40), 599 web_company_id INT8, 600 web_company_name CHAR(50), 601 web_street_number CHAR(10), 602 web_street_name VARCHAR(60), 603 web_street_type CHAR(15), 604 web_suite_number CHAR(10), 605 web_city VARCHAR(60), 606 web_county VARCHAR(30), 607 web_state CHAR(2), 608 web_zip CHAR(10), 609 web_country VARCHAR(20), 610 web_gmt_offset DECIMAL(5,2), 611 web_tax_percentage DECIMAL(5,2), 612 PRIMARY KEY (web_site_sk) 613 )` 614 615 tpcdsStoreReturnsSchema = `( 616 sr_returned_date_sk INT8, 617 sr_return_time_sk INT8, 618 sr_item_sk INT8 NOT NULL, 619 sr_customer_sk INT8, 620 sr_cdemo_sk INT8, 621 sr_hdemo_sk INT8, 622 sr_addr_sk INT8, 623 sr_store_sk INT8, 624 sr_reason_sk INT8, 625 sr_ticket_number INT8 NOT NULL, 626 sr_return_quantity INT8, 627 sr_return_amt DECIMAL(7,2), 628 sr_return_tax DECIMAL(7,2), 629 sr_return_amt_inc_tax DECIMAL(7,2), 630 sr_fee DECIMAL(7,2), 631 sr_return_ship_cost DECIMAL(7,2), 632 sr_refunded_cash DECIMAL(7,2), 633 sr_reversed_charge DECIMAL(7,2), 634 sr_store_credit DECIMAL(7,2), 635 sr_net_loss DECIMAL(7,2), 636 PRIMARY KEY (sr_item_sk, sr_ticket_number) 637 )` 638 639 tpcdsHouseholdDemographicsSchema = `( 640 hd_demo_sk INT8 NOT NULL, 641 hd_income_band_sk INT8, 642 hd_buy_potential CHAR(15), 643 hd_dep_count INT8, 644 hd_vehicle_count INT8, 645 PRIMARY KEY (hd_demo_sk) 646 )` 647 648 tpcdsWebPageSchema = `( 649 wp_web_page_sk INT8 NOT NULL, 650 wp_web_page_id CHAR(16) NOT NULL, 651 wp_rec_start_date DATE, 652 wp_rec_end_date DATE, 653 wp_creation_date_sk INT8, 654 wp_access_date_sk INT8, 655 wp_autogen_flag CHAR, 656 wp_customer_sk INT8, 657 wp_url VARCHAR(100), 658 wp_type CHAR(50), 659 wp_char_count INT8, 660 wp_link_count INT8, 661 wp_image_count INT8, 662 wp_max_ad_count INT8, 663 PRIMARY KEY (wp_web_page_sk) 664 )` 665 666 tpcdsPromotionSchema = `( 667 p_promo_sk INT8 NOT NULL, 668 p_promo_id CHAR(16) NOT NULL, 669 p_start_date_sk INT8, 670 p_end_date_sk INT8, 671 p_item_sk INT8, 672 p_cost DECIMAL(15,2), 673 p_response_target INT8, 674 p_promo_name CHAR(50), 675 p_channel_dmail CHAR, 676 p_channel_email CHAR, 677 p_channel_catalog CHAR, 678 p_channel_tv CHAR, 679 p_channel_radio CHAR, 680 p_channel_press CHAR, 681 p_channel_event CHAR, 682 p_channel_demo CHAR, 683 p_channel_details VARCHAR(100), 684 p_purpose CHAR(15), 685 p_discount_active CHAR, 686 PRIMARY KEY (p_promo_sk) 687 )` 688 689 tpcdsCatalogPageSchema = `( 690 cp_catalog_page_sk INT8 NOT NULL, 691 cp_catalog_page_id CHAR(16) NOT NULL, 692 cp_start_date_sk INT8, 693 cp_end_date_sk INT8, 694 cp_department VARCHAR(50), 695 cp_catalog_number INT8, 696 cp_catalog_page_number INT8, 697 cp_description VARCHAR(100), 698 cp_type VARCHAR(100), 699 PRIMARY KEY (cp_catalog_page_sk) 700 )` 701 702 tpcdsInventorySchema = `( 703 inv_date_sk INT8 NOT NULL, 704 inv_item_sk INT8 NOT NULL, 705 inv_warehouse_sk INT8 NOT NULL, 706 inv_quantity_on_hand INT8, 707 PRIMARY KEY (inv_date_sk, inv_item_sk, inv_warehouse_sk) 708 )` 709 710 tpcdsCatalogReturnsSchema = `( 711 cr_returned_date_sk INT8, 712 cr_returned_time_sk INT8, 713 cr_item_sk INT8 NOT NULL, 714 cr_refunded_customer_sk INT8, 715 cr_refunded_cdemo_sk INT8, 716 cr_refunded_hdemo_sk INT8, 717 cr_refunded_addr_sk INT8, 718 cr_returning_customer_sk INT8, 719 cr_returning_cdemo_sk INT8, 720 cr_returning_hdemo_sk INT8, 721 cr_returning_addr_sk INT8, 722 cr_call_center_sk INT8, 723 cr_catalog_page_sk INT8, 724 cr_ship_mode_sk INT8, 725 cr_warehouse_sk INT8, 726 cr_reason_sk INT8, 727 cr_order_number INT8 NOT NULL, 728 cr_return_quantity INT8, 729 cr_return_amount DECIMAL(7,2), 730 cr_return_tax DECIMAL(7,2), 731 cr_return_amt_inc_tax DECIMAL(7,2), 732 cr_fee DECIMAL(7,2), 733 cr_return_ship_cost DECIMAL(7,2), 734 cr_refunded_cash DECIMAL(7,2), 735 cr_reversed_charge DECIMAL(7,2), 736 cr_store_credit DECIMAL(7,2), 737 cr_net_loss DECIMAL(7,2), 738 PRIMARY KEY (cr_item_sk, cr_order_number) 739 )` 740 741 tpcdsWebReturnsSchema = `( 742 wr_returned_date_sk INT8, 743 wr_returned_time_sk INT8, 744 wr_item_sk INT8 NOT NULL, 745 wr_refunded_customer_sk INT8, 746 wr_refunded_cdemo_sk INT8, 747 wr_refunded_hdemo_sk INT8, 748 wr_refunded_addr_sk INT8, 749 wr_returning_customer_sk INT8, 750 wr_returning_cdemo_sk INT8, 751 wr_returning_hdemo_sk INT8, 752 wr_returning_addr_sk INT8, 753 wr_web_page_sk INT8, 754 wr_reason_sk INT8, 755 wr_order_number INT8 NOT NULL, 756 wr_return_quantity INT8, 757 wr_return_amt DECIMAL(7,2), 758 wr_return_tax DECIMAL(7,2), 759 wr_return_amt_inc_tax DECIMAL(7,2), 760 wr_fee DECIMAL(7,2), 761 wr_return_ship_cost DECIMAL(7,2), 762 wr_refunded_cash DECIMAL(7,2), 763 wr_reversed_charge DECIMAL(7,2), 764 wr_account_credit DECIMAL(7,2), 765 wr_net_loss DECIMAL(7,2), 766 PRIMARY KEY (wr_item_sk, wr_order_number) 767 )` 768 769 tpcdsWebSalesSchema = `( 770 ws_sold_date_sk INT8, 771 ws_sold_time_sk INT8, 772 ws_ship_date_sk INT8, 773 ws_item_sk INT8 NOT NULL, 774 ws_bill_customer_sk INT8, 775 ws_bill_cdemo_sk INT8, 776 ws_bill_hdemo_sk INT8, 777 ws_bill_addr_sk INT8, 778 ws_ship_customer_sk INT8, 779 ws_ship_cdemo_sk INT8, 780 ws_ship_hdemo_sk INT8, 781 ws_ship_addr_sk INT8, 782 ws_web_page_sk INT8, 783 ws_web_site_sk INT8, 784 ws_ship_mode_sk INT8, 785 ws_warehouse_sk INT8, 786 ws_promo_sk INT8, 787 ws_order_number INT8 NOT NULL, 788 ws_quantity INT8, 789 ws_wholesale_cost DECIMAL(7,2), 790 ws_list_price DECIMAL(7,2), 791 ws_sales_price DECIMAL(7,2), 792 ws_ext_discount_amt DECIMAL(7,2), 793 ws_ext_sales_price DECIMAL(7,2), 794 ws_ext_wholesale_cost DECIMAL(7,2), 795 ws_ext_list_price DECIMAL(7,2), 796 ws_ext_tax DECIMAL(7,2), 797 ws_coupon_amt DECIMAL(7,2), 798 ws_ext_ship_cost DECIMAL(7,2), 799 ws_net_paid DECIMAL(7,2), 800 ws_net_paid_inc_tax DECIMAL(7,2), 801 ws_net_paid_inc_ship DECIMAL(7,2), 802 ws_net_paid_inc_ship_tax DECIMAL(7,2), 803 ws_net_profit DECIMAL(7,2), 804 PRIMARY KEY (ws_item_sk, ws_order_number) 805 )` 806 807 tpcdsCatalogSalesSchema = `( 808 cs_sold_date_sk INT8, 809 cs_sold_time_sk INT8, 810 cs_ship_date_sk INT8, 811 cs_bill_customer_sk INT8, 812 cs_bill_cdemo_sk INT8, 813 cs_bill_hdemo_sk INT8, 814 cs_bill_addr_sk INT8, 815 cs_ship_customer_sk INT8, 816 cs_ship_cdemo_sk INT8, 817 cs_ship_hdemo_sk INT8, 818 cs_ship_addr_sk INT8, 819 cs_call_center_sk INT8, 820 cs_catalog_page_sk INT8, 821 cs_ship_mode_sk INT8, 822 cs_warehouse_sk INT8, 823 cs_item_sk INT8 NOT NULL, 824 cs_promo_sk INT8, 825 cs_order_number INT8 NOT NULL, 826 cs_quantity INT8, 827 cs_wholesale_cost DECIMAL(7,2), 828 cs_list_price DECIMAL(7,2), 829 cs_sales_price DECIMAL(7,2), 830 cs_ext_discount_amt DECIMAL(7,2), 831 cs_ext_sales_price DECIMAL(7,2), 832 cs_ext_wholesale_cost DECIMAL(7,2), 833 cs_ext_list_price DECIMAL(7,2), 834 cs_ext_tax DECIMAL(7,2), 835 cs_coupon_amt DECIMAL(7,2), 836 cs_ext_ship_cost DECIMAL(7,2), 837 cs_net_paid DECIMAL(7,2), 838 cs_net_paid_inc_tax DECIMAL(7,2), 839 cs_net_paid_inc_ship DECIMAL(7,2), 840 cs_net_paid_inc_ship_tax DECIMAL(7,2), 841 cs_net_profit DECIMAL(7,2), 842 PRIMARY KEY (cs_item_sk, cs_order_number) 843 )` 844 845 tpcdsStoreSalesSchema = `( 846 ss_sold_date_sk INT8, 847 ss_sold_time_sk INT8, 848 ss_item_sk INT8 NOT NULL, 849 ss_customer_sk INT8, 850 ss_cdemo_sk INT8, 851 ss_hdemo_sk INT8, 852 ss_addr_sk INT8, 853 ss_store_sk INT8, 854 ss_promo_sk INT8, 855 ss_ticket_number INT8 NOT NULL, 856 ss_quantity INT8, 857 ss_wholesale_cost DECIMAL(7,2), 858 ss_list_price DECIMAL(7,2), 859 ss_sales_price DECIMAL(7,2), 860 ss_ext_discount_amt DECIMAL(7,2), 861 ss_ext_sales_price DECIMAL(7,2), 862 ss_ext_wholesale_cost DECIMAL(7,2), 863 ss_ext_list_price DECIMAL(7,2), 864 ss_ext_tax DECIMAL(7,2), 865 ss_coupon_amt DECIMAL(7,2), 866 ss_net_paid DECIMAL(7,2), 867 ss_net_paid_inc_tax DECIMAL(7,2), 868 ss_net_profit DECIMAL(7,2), 869 PRIMARY KEY (ss_item_sk, ss_ticket_number) 870 )` 871 )