Files
documentdb/scripts/start_oss_server.sh
Vinod Sridharan 8514e44ac2 Merged PR 1817415: Fix up planning cost estimate for order by
### Does this PR have any customer impact?

### Type (Feature, Refactoring, Bugfix, DevOps, Testing, Perf, etc)

### Does it involve schema level changes? (Table, Column, Index, UDF, etc level changes)

### Are you introducing any new config? If yes, do you have tests with and without them being set?

### ChangeLog (Refer [Template](../oss/CHANGELOG.md))

### Description

Order by expressions have a filter for full scan that makes it so it can push down to the index. However the default selectivity of 1% kicks in at the time.  Instead ensure that It has a selectivity of 100%

Also fix list collections with distribution failing on views

----
#### AI description  (iteration 1)
#### PR Classification
Bug fix addressing errors in BSON range operator selectivity and index pushdown behavior.

#### PR Summary
This PR fixes issues with full scan detection and selectivity handling in BSON range queries while enhancing index pushdown and metadata listing tests. The changes improve the correctness of query planning and operator behavior in DocumentDB integrations.
- **`src/query/bson_dollar_selectivity.c` & `src/opclass/index_support.c`**: Added functions to detect full scans and correctly set selectivity (e.g., returning 1.0) for `$range` queries.
- **Test Files (`bson_composite_order_by_index_tests.out`, `list_metadata_cursor_tests.out`, and SQL scripts)**: Extended tests for composite order-by indexes and distributed metadata, ensuring proper index selection and query plans.
- **Configuration and Startup Scripts (`feature_flag_configs.c`, `start_oss_server.sh`)**: Introduced the `setSelectivityForFullScan` flag and updated extended RUM extension settings.
- **SQL Migration Scripts**: Altered operator restrict definitions to use updated selectivity functions for consistent operator handling.
<!-- GitOpsUserAgent=GitOps.Apps.Server.pullrequestcopilot -->

Signed-off-by: Shuai Tian <shuaitian@microsoft.com>
2025-09-29 22:38:08 -07:00

206 lines
7.2 KiB
Bash
Executable File

#!/bin/bash
# exit immediately if a command exits with a non-zero status
set -e
# fail if trying to reference a variable that is not set.
set -u
PG_VERSION=${PG_VERSION_USED:-16}
coordinatorPort="9712"
postgresDirectory=""
initSetup="false"
forceCleanup="false"
help="false"
stop="false"
distributed="false"
allowExternalAccess="false"
gatewayWorker="false"
useDocumentdbExtendedRum="false"
while getopts "d:p:hcsxegr" opt; do
case $opt in
d) postgresDirectory="$OPTARG"
;;
c) initSetup="true"
forceCleanup="true"
;;
h) help="true"
;;
s) stop="true"
;;
x) distributed="true"
;;
e) allowExternalAccess="true"
;;
p) coordinatorPort="$OPTARG"
;;
g) gatewayWorker="true"
;;
r) useDocumentdbExtendedRum="true"
;;
esac
# Assume empty string if it's unset since we cannot reference to
# an unset variabled due to "set -u".
case ${OPTARG:-""} in
-*) echo "Option $opt needs a valid argument. use -h to get help."
exit 1
;;
esac
done
if [ "${TERM:-}" == "" ] || [ "${TERM:-}" == "dumb" ]; then
red=""
green=""
reset=""
else
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
fi
if [ "$help" == "true" ]; then
echo "${green}sets up and launches a postgres server with extension installed on port $coordinatorPort."
echo "${green}start_oss_server -d <postgresDir> [-c] [-s] [-x] [-e] [-p <port>]"
echo "${green}<postgresDir> is the data directory for your postgres instance with extension"
echo "${green}[-c] - optional argument. FORCE cleanup - removes all existing data and reinitializes"
echo "${green}[-s] - optional argument. Stops all servers and exits"
echo "${green}[-x] - start oss server with documentdb_distributed extension"
echo "${green}[-e] - optional argument. Allows PostgreSQL access from any IP address"
echo "${green}[-p <port>] - optional argument. specifies the port for the backend"
echo "${green}[-g] - optional argument. starts the gateway worker host along with the backend"
echo "${green}[-r] - optional argument. use the pg_documentdb_extended_rum extension instead of rum"
echo "${green}if postgresDir not specified assumed to be /data"
exit 1;
fi
if ! [[ "$coordinatorPort" =~ ^[0-9]+$ ]] || [ "$coordinatorPort" -lt 0 ] || [ "$coordinatorPort" -gt 65535 ]; then
echo "${red}Invalid port value $coordinatorPort, must be a number between 0 and 65535.${reset}"
exit 1
fi
# Check if the port is already in use
if lsof -i:"$coordinatorPort" -sTCP:LISTEN >/dev/null 2>&1; then
echo "${red}Port $coordinatorPort is already in use. Please specify a different port.${reset}"
exit 1
fi
if [ "$distributed" == "true" ]; then
extensionName="documentdb_distributed"
else
extensionName="documentdb"
fi
preloadLibraries="pg_documentdb_core, pg_documentdb"
if [ "$distributed" == "true" ]; then
preloadLibraries="citus, $preloadLibraries, pg_documentdb_distributed"
fi
if [ "$gatewayWorker" == "true" ]; then
preloadLibraries="$preloadLibraries, pg_documentdb_gw_host"
fi
if [ "$useDocumentdbExtendedRum" == "true" ]; then
preloadLibraries="$preloadLibraries, pg_documentdb_extended_rum"
fi
source="${BASH_SOURCE[0]}"
while [[ -h $source ]]; do
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
source="$(readlink "$source")"
# if $source was a relative symlink, we need to resolve it relative to the path where the
# symlink file was located
[[ $source != /* ]] && source="$scriptroot/$source"
done
scriptDir="$( cd -P "$( dirname "$source" )" && pwd )"
. $scriptDir/utils.sh
if [ -z $postgresDirectory ]; then
postgresDirectory="/data"
fi
# Only initialize if directory doesn't exist, is empty, or doesn't contain a valid PostgreSQL data directory
# Check for PG_VERSION file which indicates a valid PostgreSQL data directory
if [ ! -d "$postgresDirectory" ]; then
# Directory doesn't exist, we need to initialize
echo "${green}Directory $postgresDirectory doesn't exist, will initialize PostgreSQL data directory${reset}"
initSetup="true"
elif [ ! -f "$postgresDirectory/PG_VERSION" ]; then
# Directory exists but no PG_VERSION file
if [ "$(ls -A "$postgresDirectory" 2>/dev/null)" ]; then
# Directory exists and is not empty but doesn't have PG_VERSION
# This might be a corrupted or incompatible data directory
echo "${red}Warning: Directory $postgresDirectory exists but doesn't appear to contain a valid PostgreSQL data directory.${reset}"
echo "${red}Use -c flag to force cleanup and re-initialization, or specify a different directory with -d.${reset}"
exit 1
else
# Directory exists but is empty, we can initialize
echo "${green}Directory $postgresDirectory is empty, will initialize PostgreSQL data directory${reset}"
initSetup="true"
fi
else
# Directory exists and has PG_VERSION, check if it's compatible
echo "${green}Found existing PostgreSQL data directory at $postgresDirectory${reset}"
fi
# We stop the coordinator first and the worker node servers
# afterwards. However this order is not required and it doesn't
# really matter which order we choose to stop the active servers.
echo "${green}Stopping any existing postgres servers${reset}"
StopServer $postgresDirectory
if [ "$stop" == "true" ]; then
exit 0;
fi
echo "InitDatabaseExtended $initSetup $postgresDirectory"
if [ "$initSetup" == "true" ]; then
InitDatabaseExtended $postgresDirectory "$preloadLibraries"
fi
# Update PostgreSQL configuration to allow access from any IP
postgresConfigFile="$postgresDirectory/postgresql.conf"
if [ "$allowExternalAccess" == "true" ]; then
hbaConfigFile="$postgresDirectory/pg_hba.conf"
echo "${green}Configuring PostgreSQL to allow access from any IP address${reset}"
echo "listen_addresses = '*'" >> $postgresConfigFile
echo "host all all 0.0.0.0/0 scram-sha-256" >> $hbaConfigFile
echo "host all all ::0/0 scram-sha-256" >> $hbaConfigFile
fi
if [ "$gatewayWorker" == "true" ]; then
setupConfigurationFile="$scriptDir/../pg_documentdb_gw/SetupConfiguration.json"
echo "documentdb_gateway.database = 'postgres'" >> $postgresConfigFile
echo "documentdb_gateway.setup_configuration_file = '$setupConfigurationFile'" >> $postgresConfigFile
fi
if [ "$useDocumentdbExtendedRum" == "true" ]; then
echo "${green}Configuring PostgreSQL to use pg_documentdb_extended_rum extension instead of rum${reset}"
echo "documentdb.rum_library_load_option = 'require_documentdb_extended_rum'" >> $postgresConfigFile
echo "documentdb.alternate_index_handler_name = 'extended_rum'" >> $postgresConfigFile
fi
userName=$(whoami)
sudo mkdir -p /var/run/postgresql
sudo chown -R $userName:$userName /var/run/postgresql
StartServer $postgresDirectory $coordinatorPort
if [ "$initSetup" == "true" ]; then
SetupPostgresServerExtensions "$userName" $coordinatorPort $extensionName
fi
if [ "$useDocumentdbExtendedRum" == "true" ]; then
psql -p $coordinatorPort -d postgres -c "CREATE EXTENSION documentdb_extended_rum"
fi
if [ "$distributed" == "true" ]; then
psql -p $coordinatorPort -d postgres -c "SELECT citus_set_coordinator_host('localhost', $coordinatorPort);"
AddNodeToCluster $coordinatorPort $coordinatorPort
fi
. $scriptDir/setup_psqlrc.sh