diff --git a/README.md b/README.md
new file mode 100644
index 0000000..fd73f17
--- /dev/null
+++ b/README.md
@@ -0,0 +1,289 @@
+# SQLite Benchmark Wrapper
+
+## Description
+
+This wrapper facilitates the automated execution of an SQLite database benchmark. The benchmark measures SQLite insert performance under concurrent load by creating multiple database instances, each populated with randomized records in parallel. It stresses the I/O subsystem, filesystem journaling (WAL mode), and process scheduling under varying levels of concurrency.
+
+The wrapper provides:
+- Automated SQLite benchmark setup and execution.
+- Configurable table sizes and concurrency levels.
+- Multi-iteration testing with averaged results.
+- Result collection, processing, and verification.
+- CSV and JSON output formats.
+- System configuration metadata capture.
+- Integration with test_tools framework.
+- Optional Performance Co-Pilot (PCP) integration.
+
+## Command-Line Options
+
+```
+SQLite Options:
+ --table_entries : Comma-separated list of table sizes to create.
+ Each value specifies the number of rows to insert per database. Default: 5000.
+ --procs : Comma-separated list of process counts to test.
+ Each value specifies how many concurrent SQLite database processes to run.
+ If not set, automatically generates intervals up to the number of CPU cores (max 8 intervals).
+
+General test_tools options:
+ --home_parent : Parent home directory. If not set, defaults to current working directory.
+ --host_config : Host configuration name, defaults to current hostname.
+ --iterations : Number of times to run the test, defaults to 1.
+ --run_user: User that is actually running the test on the test system. Defaults to current user.
+ --sys_type: Type of system working with (aws, azure, hostname). Defaults to hostname.
+ --sysname: Name of the system running, used in determining config files. Defaults to hostname.
+ --tuned_setting: Used in naming the results directory. For RHEL, defaults to current active tuned profile.
+ For non-RHEL systems, defaults to 'none'.
+ --use_pcp: Enable Performance Co-Pilot monitoring during test execution.
+ --tools_git : Git repo to retrieve the required tools from.
+ Default: https://github.com/redhat-performance/test_tools-wrappers
+ --usage: Display this usage message.
+```
+
+## What the Script Does
+
+The `run_sqlite.sh` script performs the following workflow:
+
+1. **Environment Setup**:
+ - Clones the test_tools-wrappers repository if not present (default: ~/test_tools).
+ - Sources error codes and general setup utilities.
+ - Gathers system hardware information.
+
+2. **Package Installation**:
+ - Installs required dependencies via package_tool: sqlite, sqlite-devel, gcc, git, bc, time, and others.
+ - Dependencies are defined in sqlite.json for RHEL-based systems.
+
+3. **Process List Generation**:
+ - If `--procs` is not specified, automatically determines concurrency levels.
+ - Detects the number of CPU cores via `nproc`.
+ - Generates evenly spaced intervals up to the core count (capped at 8 intervals).
+
+4. **Table Entry Generation**:
+ - Generates a file of SQL INSERT statements with randomized data for each requested table size.
+ - Each record contains a sequence number, timestamp, a random 4-digit value (F1), and a random 16-digit value (F2).
+ - Insertion files are cached and reused if they already exist for a given table size.
+
+5. **Database Creation and Execution**:
+ - For each combination of iteration, table size, and process count:
+ - Spawns the requested number of concurrent processes.
+ - Each process creates its own SQLite database with WAL journaling mode.
+ - Creates a table `pts1` with columns: I (SMALLINT), DT (TIMESTAMP), F1 (VARCHAR(4)), F2 (VARCHAR(16)).
+ - Each process inserts the full set of records 3 times sequentially.
+ - A ready file synchronizes all processes to start simultaneously.
+ - Execution time is captured via `/bin/time` for each process.
+
+6. **Data Collection**:
+ - Captures elapsed, system, and user time for each process in `sqlite_timeing_*` files.
+ - Records start and end timestamps for each process.
+ - Optionally records PCP performance data during execution.
+
+7. **Result Processing**:
+ - Groups results by table size and process count.
+ - Averages elapsed time across iterations and processes.
+ - Sums user and system time across processes, then averages across iterations.
+ - Generates CSV files with configuration and performance data.
+ - Creates JSON output for verification.
+ - Validates results against Pydantic schema (results_schema.py).
+
+8. **Verification**:
+ - Validates results against Pydantic schema ensuring:
+ - Table entries and process counts are positive integers.
+ - All time values are positive, finite numbers.
+ - Timestamps are valid datetime objects.
+ - Uses csv_to_json and verify_results from test_tools.
+
+9. **Output**:
+ - Creates results directory in `${HOME}/export_results/sqlite_`.
+ - Saves all raw timing files, processed CSV/JSON, and system metadata.
+ - Optionally saves PCP performance data.
+ - Archives results to configured storage location.
+
+## Dependencies
+
+**General packages required**: sqlite, sqlite-devel, gcc, git, bc, time, wget, tcl, tcl-devel, zip, unzip, perf
+
+**Additional RHEL packages**: lksctp-tools-devel, perl-FindBin, perl-IPC-Cmd, perl-Time-Piece, pcp-zeroconf, pcp-pmda-openmetrics, pcp-pmda-denki
+
+To run:
+```bash
+git clone
+cd sqlite-wrapper/sqlite
+./run_sqlite.sh
+```
+
+The script will automatically detect your CPU configuration and generate appropriate concurrency levels.
+
+## The SQLite Benchmark
+
+The benchmark tests SQLite insert throughput under concurrent load using WAL (Write-Ahead Logging) journaling mode.
+
+### Database Schema
+
+Each database instance uses a single table:
+
+```sql
+CREATE TABLE pts1 (
+ 'I' SMALLINT NOT NULL,
+ 'DT' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ 'F1' VARCHAR(4) NOT NULL,
+ 'F2' VARCHAR(16) NOT NULL
+);
+```
+
+- **I**: Sequential record number.
+- **DT**: Insertion timestamp.
+- **F1**: Random 4-digit value.
+- **F2**: Random 16-digit value.
+
+### Execution Model
+
+For each process count N:
+1. N independent SQLite databases are created, each with WAL journaling enabled.
+2. All N processes wait on a synchronization barrier (ready file).
+3. Once released, each process inserts the full record set 3 times sequentially.
+4. Timing is average across allprocess.
+
+### Performance Metrics
+
+Each test configuration reports five key metrics:
+
+1. **Real_time**: Average elapsed (wall-clock) time per process across iterations.
+2. **User_time**: Total user-space CPU time summed across processes.
+3. **System_time**: Total kernel CPU time summed across processes.
+4. **Start_Date**: Timestamp when the test run began.
+5. **End_Date**: Timestamp when the test run completed.
+
+## Output Files
+
+The results directory contains:
+
+- **results_sqlite_\.csv**: CSV file with performance metrics for each table size
+- **sqlite_verify.json**: JSON file with validated results data
+- **sqlite_timeing_\***: Raw timing files from each process in each iteration
+- **sqlite-insertions_\**: Cached SQL insertion files for each table size
+- **runner_db_\***: Generated execution scripts for each database process
+- **meta_data\*.yml**: System metadata (CPU info, memory, kernel version)
+- **PCP data** (if --use_pcp option used): Performance Co-Pilot monitoring data
+
+## Examples
+
+### Basic run with defaults
+```bash
+./run_sqlite.sh
+```
+This runs with:
+- 5000 table entries
+- Automatically determined process counts (up to 8 intervals across available cores)
+- 1 iteration of the complete test suite
+
+### Run with specific table sizes
+```bash
+./run_sqlite.sh --table_entries 1000,5000,10000
+```
+Tests with three different table sizes to measure how insert volume affects performance.
+
+### Run with specific process counts
+```bash
+./run_sqlite.sh --procs 1,4,8,16
+```
+Tests with 1, 4, 8, and 16 concurrent database processes.
+
+### Run multiple iterations
+```bash
+./run_sqlite.sh --iterations 3
+```
+Runs the complete test suite 3 times and averages the results for consistency.
+
+### Run with PCP monitoring
+```bash
+./run_sqlite.sh --use_pcp
+```
+Collects Performance Co-Pilot data during the run for detailed performance analysis.
+
+### Combination example
+```bash
+./run_sqlite.sh --table_entries 5000,10000 --procs 1,4,8 --iterations 3 --use_pcp
+```
+Runs 3 iterations with PCP monitoring, testing two table sizes across three concurrency levels.
+
+## How Concurrency Scaling Works
+
+### Default Behavior (Auto-detected)
+When `--procs` is not specified:
+- The script detects the number of CPU cores via `nproc`.
+- If the system has fewer than 8 cores, it uses the core count as the number of intervals.
+- Otherwise, it generates 8 evenly spaced intervals up to the core count.
+- For example, on a 32-core system: 4, 8, 12, 16, 20, 24, 28, 32.
+
+### With --procs
+Specify exact process counts to test:
+- Useful for targeting specific concurrency levels.
+- Allows testing beyond the core count for oversubscription analysis.
+
+## How Result Averaging Works
+
+When running multiple iterations (--iterations > 1):
+
+1. Each iteration produces a complete set of timing results for all process/table-entry combinations.
+2. Raw timing results are saved in separate `sqlite_timeing_*` files.
+3. The wrapper extracts metrics from each iteration:
+ - Elapsed time is averaged across iterations and processes.
+ - User and system time are summed across processes, then averaged across iterations.
+4. Summary CSV shows averaged values with 2 decimal places.
+
+This approach:
+- Reduces impact of transient system effects.
+- Provides more reliable performance measurements.
+- Helps identify result variance across runs.
+
+## Return Codes
+
+The script uses standardized error codes from test_tools error_codes:
+- **0 (E_SUCCESS)**: Success
+- **101**: Git clone failure
+- **E_USAGE**: Invalid usage/arguments
+- Non-zero exit from csv_to_json or verify_results indicates validation failure.
+
+## Notes
+
+### Supported Platforms
+- **Linux**: x86_64 and aarch64 architectures
+- **OS Support**: RHEL (primary, with full package definitions in sqlite.json)
+
+### Performance Considerations
+- The benchmark is I/O-intensive, particularly with large table sizes and high concurrency.
+- WAL journaling mode is used for each database, which allows concurrent reads during writes.
+- Each process operates on its own independent database file, so contention is at the filesystem level rather than database lock level.
+- Larger table sizes (--table_entries) increase both I/O volume and memory pressure.
+- Higher process counts stress the I/O scheduler and filesystem journaling.
+
+### Insertion Data Caching
+- The script caches generated SQL insertion files as `sqlite-insertions_`.
+- Subsequent runs with the same table size reuse the cached file.
+- Delete cached files to regenerate with new random data.
+
+### WAL Journaling Mode
+Each database is created with `PRAGMA journal_mode='wal'`:
+- Write-Ahead Logging provides better concurrency than the default rollback journal.
+- Readers do not block writers, and writers do not block readers.
+- This is the recommended mode for concurrent SQLite workloads.
+
+### Performance Tips
+- Run multiple iterations (--iterations 3+) to verify consistency.
+- Ensure the system is idle (no other workloads) for best results.
+- Use a fast storage device (SSD/NVMe) for meaningful I/O benchmarking.
+- Consider the filesystem type (ext4, xfs, btrfs) as it affects journaling performance.
+- PCP monitoring (--use_pcp) provides detailed I/O and CPU metrics during the test.
+- For large table sizes, ensure sufficient disk space for all database files.
+
+### Troubleshooting
+- If the script fails to start, verify that sqlite3 is installed and in PATH.
+- If timing files are missing, check that `/bin/time` is available (the `time` package).
+- If results seem inconsistent, run more iterations and check system I/O load during testing.
+- Use --use_pcp to collect detailed performance counters for analysis.
+- Check `sqlite_timeing_*` files for detailed timing and error information.
+
+## References
+
+- SQLite Official Site: https://www.sqlite.org/
+- SQLite WAL Mode Documentation: https://www.sqlite.org/wal.html
+- test_tools Framework: https://github.com/redhat-performance/test_tools-wrappers
diff --git a/sqlite/openmetrics_sqlite_reset.txt b/sqlite/openmetrics_sqlite_reset.txt
new file mode 100644
index 0000000..b5d5c0a
--- /dev/null
+++ b/sqlite/openmetrics_sqlite_reset.txt
@@ -0,0 +1,12 @@
+iteration 0
+running 0
+numthreads 0
+runtime 0
+throughput 0
+latency 0
+table_entries 0
+numprocs 0
+sys_time 0
+user_time 0
+start_time 0
+end_time 0
diff --git a/sqlite/results_schema.py b/sqlite/results_schema.py
new file mode 100644
index 0000000..71778da
--- /dev/null
+++ b/sqlite/results_schema.py
@@ -0,0 +1,11 @@
+import pydantic
+import datetime
+
+class sqlite_Results (pydantic.BaseModel):
+ table_entries: int = pydantic.Field(gt=0)
+ procs: int = pydantic.Field(gt=0)
+ Real_time: float = pydantic.Field(gt=0, allow_inf_nan=False)
+ User_time: float = pydantic.Field(ge=0, allow_inf_nan=False)
+ System_time: float = pydantic.Field(ge=0, allow_inf_nan=False)
+ Start_Date: datetime.datetime
+ End_Date: datetime.datetime
diff --git a/sqlite/run_sqlite.sh b/sqlite/run_sqlite.sh
new file mode 100755
index 0000000..682711c
--- /dev/null
+++ b/sqlite/run_sqlite.sh
@@ -0,0 +1,420 @@
+#!/bin/bash
+#
+# License
+#
+#=================================================
+# Copyright (C)
+#=================================================
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# This script automates the execution of coremark. It will determine the
+# set of default run parameters based on the system configuration.
+#
+
+gl_iter=0
+commit="none"
+test_name="sqlite"
+test_version="v1.00"
+results_file=""
+arguments="$@"
+script_dir=$(realpath $(dirname $0))
+proc_list=""
+table_entries=5000
+
+#
+# Build the table entries to work with.
+table_entries_build()
+{
+ tbl_entries=$1
+ if [[ ! -f sqlite-insertions_${tbl_entries} ]]; then
+ #
+ # Min/max for random value.
+ #
+ min=1000000000000000
+ max=9999999999999999
+ range=$((max - min + 1))
+ for rec_numb in $(seq 1 1 $tbl_entries); do
+ random_val=$(( $(od -An -N8 -tu8 /dev/urandom) % range))
+ #
+ # We want the absolute value.
+ #
+ random_val=$(( random_val < 0 ? -random_val : random_val ))
+ let "random_val=${random_val}+${min}"
+ random_4_bytes=$(( $(od -vAn -N8 -t u8 < /dev/urandom) % 9000 ))
+ #
+ # We want the absolute value.
+ #
+ random_4_bytes=$(( random_4_bytes < 0 ? -random_4_bytes : random_4_bytes ))
+ let "random_4_bytes=${random_4_bytes}+1000"
+ echo "INSERT INTO 'pts1' ('I', 'DT', 'F1', 'F2') VALUES ('${rec_numb}', CURRENT_TIMESTAMP, '${random_4_bytes}', '${random_val}');" >> sqlite-insertions_${tbl_entries}
+ done
+ fi
+ cp sqlite-insertions_${tbl_entries} sqlite-insertions.txt
+}
+
+#
+# Execute the sqlite load. We will have one for each requested proc.
+#
+exec_db()
+{
+ DB=benchmark-$1.db
+ rm -f $DB
+ sqlite3 $DB "CREATE TABLE pts1 ('I' SMALLINT NOT NULL, 'DT' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 'F1' VARCHAR(4) NOT NULL, 'F2' VARCHAR(16) NOT NULL);"
+ sqlite3 $DB "PRAGMA journal_mode='wal';"
+ #
+ # Wait for all jobs to be ready.
+ #
+ until [ -f "ready_file" ]; do
+ sleep 1
+ done
+ echo "cat sqlite-insertions.txt | sqlite3 $DB" > runner_db_$DB
+ echo "cat sqlite-insertions.txt | sqlite3 $DB" >> runner_db_$DB
+ echo "cat sqlite-insertions.txt | sqlite3 $DB" >> runner_db_$DB
+ chmod 755 runner_db_$DB
+ start_time=$(retrieve_time_stamp)
+ /bin/time -o sqlite_timeing_iterations_${gl_iter}_entries_${3}_proc_${1}_of_${2}_procs.txt -f "%e %S %U" ./runner_db_$DB
+ rtc=$?
+ if [[ $rtc != 0 ]]; then
+ echo ./runner_db_$DB failed.
+ fi
+ end_time=$(retrieve_time_stamp)
+ echo "Start_time: $start_time" >> sqlite_timeing_iterations_${gl_iter}_entries_${3}_proc_${1}_of_${2}_procs.txt
+ echo "End_time: $end_time" >> sqlite_timeing_iterations_${gl_iter}_entries_${3}_proc_${1}_of_${2}_procs.txt
+ exit $rtc
+}
+
+execute_sqlite()
+{
+ rm -f runner_db_*
+ rm -f ready_file
+ proc_num=$1
+
+ pids=""
+ for i in $(seq 1 $proc_num)
+ do
+ exec_db $i $proc_num ${2} &
+ pids="$pids $!"
+ done
+ touch ready_file
+ wait $pids
+}
+
+exit_out()
+{
+ echo $1
+ exit $2
+}
+
+if [ ! -f "/tmp/${test_name}.out" ]; then
+ command="${0} $@"
+ echo $command
+ $command &> /tmp/${test_name}.out
+ rtc=$?
+ cat /tmp/${test_name}.out
+ rm /tmp/${test_name}.out
+ exit $rtc
+fi
+
+curdir=$(dirname $(realpath $0))
+if [[ $0 == "./"* ]]; then
+ chars=`echo $0 | awk -v RS='/' 'END{print NR-1}'`
+ if [[ $chars == 1 ]]; then
+ run_dir=`pwd`
+ else
+ run_dir=`echo $0 | cut -d'/' -f 1-${chars} | cut -d'.' -f2-`
+ run_dir="${curdir}${run_dir}"
+ fi
+elif [[ $0 != "/"* ]]; then
+ dir=`echo $0 | rev | cut -d'/' -f2- | rev`
+ run_dir="${curdir}/${dir}"
+else
+ chars=`echo $0 | awk -v RS='/' 'END{print NR-1}'`
+ run_dir=`echo $0 | cut -d'/' -f 1-${chars}`
+ if [[ $run_dir != "/"* ]]; then
+ run_dir=${curdir}/${run_dir}
+ fi
+fi
+cd $run_dir
+rm -rf sqlite_timeing_* results_${test_name}*
+
+show_usage=0
+
+TOOLS_BIN="$HOME/test_tools"
+export TOOLS_BIN
+
+usage()
+{
+ echo "Usage $1:"
+ echo "--table_entries : comma separated list of table sizes to create."
+ echo "--procs : comma separated list of procs to create."
+ source $TOOLS_BIN/general_setup --usage
+ exit $E_USAGE
+}
+
+attempt_tools_generic()
+{
+ method="$1"
+ if [[ ! -d "$TOOLS_BIN" ]]; then
+ $method ${tools_git}/archive/refs/heads/main.zip
+ if [[ $? -eq 0 ]]; then
+ unzip -q main.zip
+ mv test_tools-wrappers-main ${TOOLS_BIN}
+ rm main.zip
+ fi
+ fi
+}
+
+attempt_tools_git()
+{
+ if [[ ! -d "$TOOLS_BIN" ]]; then
+ git clone $tools_git "$TOOLS_BIN"
+ if [ $? -ne 0 ]; then
+ exit_out "Error: pulling git $tools_git failed." 101
+ fi
+ fi
+}
+
+install_test_tools()
+{
+ #
+ # Clone the repo that contains the common code and tools
+ #
+ tools_git=https://github.com/redhat-performance/test_tools-wrappers
+ found=0
+ for arg in "$@"; do
+ if [ $found -eq 1 ]; then
+ tools_git=$arg
+ found=0
+ fi
+ if [[ $arg == "--tools_git" ]]; then
+ found=1
+ fi
+
+ #
+ # We do the usage check here, as we do not want to be calling
+ # the common parsers then checking for usage here. Doing so will
+ # result in the script exiting with out giving the test options.
+ #
+ if [[ $arg == "--usage" ]]; then
+ show_usage=1
+ fi
+ done
+
+ #
+ # Check to see if the test tools directory exists. If it does, we do not need to
+ # clone the repo.
+ #
+ attempt_tools_generic "wget"
+ attempt_tools_generic "curl -L -O "
+ attempt_tools_git
+
+ if [ $show_usage -eq 1 ]; then
+ usage $1
+ fi
+}
+
+install_test_tools "$@"
+
+#
+# Variables set by general setup.
+#
+# TOOLS_BIN: points to the tool directory
+# to_home_root: home directory
+# to_configuration: configuration information
+# to_times_to_run: number of times to run the test
+# to_run_label: Label for the run
+# to_user: User on the test system running the test
+# to_sys_type: for results info, basically aws, azure or local
+# to_sysname: name of the system
+# to_tuned_setting: tuned setting
+#
+
+pushd $curdir 2> /dev/null
+source "$TOOLS_BIN/general_setup" "$@"
+popd 2> /dev/null
+# Gather hardware information
+$TOOLS_BIN/gather_data ${curdir}
+
+ARGUMENT_LIST=(
+ "procs"
+ "table_entries"
+)
+
+NO_ARGUMENTS=(
+ "usage"
+)
+
+# read arguments
+opts=$(getopt \
+ --longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")" \
+ --longoptions "$(printf "%s," "${NO_ARGUMENTS[@]}")" \
+ --name "$(basename "$0")" \
+ --options "h" \
+ -- "$@"
+)
+
+eval set --$opts
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --procs)
+ proc_list=$(echo $2 | sed "s/,/ /g")
+ shift 2
+ ;;
+ --table_entries)
+ table_entries=$(echo $2 | sed "s/,/ /g")
+ shift 2
+ ;;
+ --usage)
+ usage $0
+ ;;
+ -h)
+ usage $0
+ ;;
+ --)
+ break
+ ;;
+ *)
+ echo option not found $1
+ usage $0
+ ;;
+ esac
+done
+
+package_tool --no_packages $to_no_pkg_install --wrapper_config $curdir/sqlite.json
+
+if [[ $proc_list == "" ]]; then
+ cpus=$(nproc)
+ if [[ $cpus -lt 8 ]]; then
+ intervals=$cpus
+ else
+ intervals=8
+ fi
+ proc_list=$(${TOOLS_BIN}/generate_intervals --interval $intervals --max_value $cpus | sed "s/,/ /g")
+fi
+
+# Get PCP setup if we're using it
+if [[ $to_use_pcp -eq 1 ]]; then
+ source $TOOLS_BIN/pcp/pcp_commands.inc
+ setup_pcp
+ pcp_cfg=$TOOLS_BIN/pcp/default.cfg
+ pcpdir=/tmp/pcp_`date "+%Y.%m.%d-%H.%M.%S"`
+ start_pcp ${pcpdir}/ ${test_name} $pcp_cfg
+fi
+
+for gl_iter in $(seq 1 1 $to_times_to_run); do
+ for tb_entries in $table_entries; do
+ table_entries_build $tb_entries
+ for proc in $proc_list; do
+ if [[ $to_use_pcp -eq 1 ]]; then
+ start_pcp_subset
+ fi
+ start_time=$(date -u "+%Y%m%d%H%M%S")
+ execute_sqlite $proc $tb_entries
+ end_time=$(date -u "+%Y%m%d%H%M%S")
+ max_elpased_time=$(cut -d' ' -f 1 sqlite_timeing_iterations_${gl_iter}_entries_${tb_entries}_proc_*_of_${proc}_procs.txt | sort -n | tail -1)
+ max_sys=$(cut -d' ' -f 2 sqlite_timeing_iterations_${gl_iter}_entries_${tb_entries}_proc_*_of_${proc}_procs.txt | sort -n | tail -1)
+ max_user=$(cut -d' ' -f 3 sqlite_timeing_iterations_${gl_iter}_entries_${tb_entries}_proc_*_of_${proc}_procs.txt | sort -n | tail -1)
+#
+# DJV Need to do sum of user and system, average for elapsed.
+# echo 1,$tb_entries,$proc,$max_elpased_time,$max_sys,$max_user,$start_time,$end_time >> $results_file
+ if [[ $to_use_pcp -eq 1 ]]; then
+ max_elpased_time=$(echo $max_elpased_time | cut -d'.' -f1)
+ max_sys=$(echo $max_sys | cut -d'.' -f1)
+ max_user=$(echo $max_user | cut -d'.' -f1)
+ results2pcp_add_value "iteration:${gl_iter}"
+ results2pcp_add_value "table_entries:${tb_entries}"
+ results2pcp_add_value "runtime:${max_elpased_time}"
+ results2pcp_add_value "numprocs:${proc}"
+ results2pcp_add_value "sys_time:${max_sys}"
+ results2pcp_add_value "user_time:${max_user}"
+ results2pcp_add_value "end_time:${end_time}"
+ results2pcp_add_value "start_time:${start_time}"
+ results2pcp_add_value_commit
+ reset_pcp_om
+ stop_pcp_subset
+ fi
+ done
+ done
+done
+
+# Shutdown PCP and clean up after ourselves
+if [[ $to_use_pcp -eq 1 ]]; then
+ stop_pcp
+ shutdown_pcp
+fi
+#
+# Need to group files together.
+#
+
+entries=$(ls sqlite_timeing_iterations* | cut -d'_' -f 6 | sort -u)
+total_iters=$(ls sqlite_timeing_iterations* | cut -d'_' -f 4 | sort -u)
+
+reduce_data()
+{
+ tbl_entries=$1
+ tprocs=$2
+ real_time=0
+ system_time=0
+ user_time=0
+ iterations=0
+ local entries=0
+ start_time=""
+ end_time=""
+
+ for iters in $total_iters; do
+ let "iterations=${iterations}+1"
+ file_list=$(ls sqlite_timeing_iterations_${iters}_entries_${tbl_entries}_proc_*_of_${tprocs}_procs.txt)
+ for file in $file_list; do
+ data=$(grep -v Start_time $file | grep -v End_time)
+ if [[ $start_time == "" ]]; then
+ start_time=$(grep Start_time $file | cut -d' ' -f2)
+ end_time=$(grep End_time $file | cut -d' ' -f2)
+ fi
+ tmp=$(echo "$data" | cut -d' ' -f3)
+ user_time=$(echo "scale=2;${tmp}+${user_time}" | bc)
+ tmp=$(echo "$data" | cut -d' ' -f2)
+ system_time=$(echo "scale=2;${tmp}+${system_time}" | bc)
+ tmp=$(echo $data | cut -d' ' -f1)
+ real_time=$(echo "scale=2;${tmp}+${real_time}" | bc)
+ done
+ done
+ real_time=$(echo "scale=2;${real_time}/${iterations}" | bc)
+ echo $tbl_entries,$tprocs,$real_time,$user_time,$system_time,$start_time,$end_time >> $results_file
+}
+
+for tbl_entries in $entries;
+do
+ results_file="results_${test_name}_${tbl_entries}.csv"
+ $TOOLS_BIN/test_header_info --front_matter --results_file $results_file --host $to_configuration --sys_type $to_sys_type --tuned $to_tuned_setting --results_version $test_version --test_name $test_name --field_header "table_entries,procs,Real_time,User_time,System_time"
+ for tprocs in $proc_list;
+ do
+ reduce_data $tbl_entries $tprocs
+ done
+ ${TOOLS_BIN}/csv_to_json $to_json_flags --csv_file $results_file --output_file sqlite_verify.json
+ test_rtc=$?
+ if [[ $test_rtc -ne 0 ]]; then
+ exit_out "${TOOLS_BIN}/csv_to_json $to_json_flags --csv_file $results_file --output_file sqlite_verify.json returned an an error" $test_rtc
+ fi
+ ${TOOLS_BIN}/verify_results $to_verify_flags --schema_file $script_dir/results_schema.py --class_name sqlite_Results --file sqlite_verify.json
+ test_rtc=$?
+ if [[ $test_rtc -ne 0 ]]; then
+ echo Test failure detected: $results_file
+ fi
+done
+
+${TOOLS_BIN}/save_results --curdir $curdir --home_root $to_home_root --other_files "*_summary,*.txt,test_results_report,${pcpdir},*csv" --results $results_file --test_name sqlite --tuned_setting=$to_tuned_setting --version $test_version --user $to_user
+exit $E_SUCCESS
diff --git a/sqlite/sqlite.json b/sqlite/sqlite.json
new file mode 100644
index 0000000..c371ec2
--- /dev/null
+++ b/sqlite/sqlite.json
@@ -0,0 +1,27 @@
+{
+ "dependencies": {
+ "rhel": [
+ "tcl",
+ "tcl-devel",
+ "sqlite",
+ "sqlite-devel",
+ "wget",
+ "gcc",
+ "git",
+ "lksctp-tools-devel",
+ "bc",
+ "perf",
+ "zip",
+ "unzip",
+ "time",
+ "perl-FindBin",
+ "perl-IPC-Cmd",
+ "perl-Time-Piece",
+ "pcp-zeroconf",
+ "pcp-pmda-openmetrics",
+ "pcp-pmda-denki"
+ ],
+ "pip": [
+ ]
+ }
+}
diff --git a/sqlite/sqlite_verify.json b/sqlite/sqlite_verify.json
new file mode 100644
index 0000000..ac385ad
--- /dev/null
+++ b/sqlite/sqlite_verify.json
@@ -0,0 +1,11 @@
+[
+ {
+ "table_entries":5000,
+ "procs":8,
+ "Real_time":106.52,
+ "User_time":71249.11,
+ "System_time":703.33,
+ "Start_Date":"2026-07-30T19:41:47Z",
+ "End_Date":"2026-07-30T22:10:15Z"
+ }
+]
\ No newline at end of file