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  )