Development
Data Generation without Loops
Loops should be used sparingly. While it might be tempting to use loops for inserting data using insert statements, this will considerably slow down the test cases. Instead, it is better to generate data using the built-in `range` and `repeat` functions.  
To create the table `integers` with the values `[0, 1, .., 98,  99]`, run:  
```sql
CREATE TABLE integers AS SELECT * FROM range(0, 100, 1) t1(i);
```  
To create the table `strings` with 100 times the value `hello`, run:  
```sql
CREATE TABLE strings AS SELECT * FROM repeat('hello', 100) t1(s);
```  
Using these two functions, together with clever use of cross products and other expressions, many different types of datasets can be efficiently generated. The `random()` function can also be used to generate random data.  
An alternative option is to read data from an existing CSV or Parquet file. There are several large CSV files that can be loaded from the directory `test/sql/copy/csv/data/real` using a `COPY INTO` statement or the `read_csv_auto` function.  
The TPC-H and TPC-DS extensions can also be used to generate synthetic data, using e.g. `CALL dbgen(sf = 1)` or `CALL dsdgen(sf = 1)`.